电子产品世界 » 论坛首页 » 基础知识 » 综合知识 » [学习会]一起学习C语言-phoenix的重修之路


共18条 2/2 1 2 跳转至
高工
2018-05-30 18:03:51    评分
11楼

汉字依然不能显示……

继续实践例程与做练习,发现我的电脑在使用\a后真的不会发出声音。还会有什么不一样的地方呢?


高工
2018-06-01 17:05:11    评分
12楼

终于可以显示汉字了,看下图

1-12-cmd.png

这都要感谢Mexn,话说Mexn大名是啥?

不能显示汉字 的原因是文本编辑器的问题,与编码有关吧,在使用devcpp进行文本编辑后,进行编译运行就不存在乱码的问题了。



高工
2018-06-05 22:28:11    评分
13楼

哎呀!!!被作业给难住了,一不小心就漏打卡了,赶紧先补交下作业。

前四题的答案公布

exam1-1

/*
1.	请在控制台实现如下功能。(20分)
*
**
***
****
*/
#include<stdio.h>
int main(void)
{
    puts(" *  ");
    puts(" ** ");
    puts("*** ");
    puts("****");
    return 0; 
}

exam1-1-cmd.JPG

exam1-2

/*
2. 效果与第一题结果相同,但是打印的行数有程序运行是确定。(25分)
*
**
***
****
*/
#include<stdio.h>
#include<limits.h>
void put_chars(unsigned int ch, unsigned int n)
{
     while ( n-- >0 )
      putchar(ch);
 }

int main(void)
{
    unsigned int no = 0;
    unsigned int nospace;
    unsigned int i;
    
    puts("输入数字以打印星星,输入的数字就是打印星星的行数,输入0结束程序。");
    printf("请输入数字:");
    scanf("%d", &no);
    
    while(no != 0)
    {
       if(no > 0 && no < UINT_MAX )
       {
           for( i = 1; i <= no; i++)
           {
                nospace = ((no - i ) / 2) + ((no - i ) % 2);
                put_chars(' ', nospace);
                put_chars('*', i);
                printf("\n");
           }
       }
       puts("输入数字以打印星星,输入的数字就是打印星星的行数,输入0结束程序。");
       printf("请输入数字:");
       scanf("%d", &no);
    };
    //endof while
    return 0; 
}//endof main

exam1-2-cmd.JPG


exam1-3

/*
3.请实现2个函数完成BCB码到二进制格式的转换和二进制到BCD转换功能,并自己编写测试。(28分)
*/
#include<stdio.h>
#include<limits.h>
 /* bcd转二进制,*/
unsigned char bcd2bin(unsigned char bcddata)
{
     unsigned char bindata;
     bindata = ((( bcddata >> 4) & 0x0f ) * 10) + ( bcddata & 0x0f);
     return bindata;
 }
 /* 二进制转bcd,二进制数值小于100*/
unsigned char bin2bcd(unsigned char bindata)
{
     unsigned char bcddata;
     bcddata = ((( bindata / 10 ) << 4 ) & 0xf0 ) + ( bindata % 10);
     return bcddata;
 }
/*显示bcd*/
void showbcd( unsigned char bcddata)
{
     printf( "%c%c", ((( bcddata >> 4) & 0x0f ) + '0'), (( bcddata & 0x0f) + '0'));
 }
int main(void)
{
    unsigned char cdata;
    unsigned char bcddata;
    unsigned char bindata;
    printf("请输入一个字符:");
    scanf("%c", &cdata);
    bcddata = bin2bcd(cdata);
    printf("BCD结果\n");
    printf("以字符显示:");showbcd(bcddata);putchar('\n');
    printf("以十六进制显示:%x\n", bcddata );
    printf("以整形显示:%d\n", bcddata );
    bindata = bcd2bin(bcddata);
    printf("bin结果\n");
    printf("以字符显示:%c\n", bindata);
    printf("以十六进制显示:%x\n", bindata );
    printf("以整形显示:%d\n", bindata );

    return 0; 
}//endof main

exam1-3-cmd.JPG


exam1-4

/*
4.请利用宏来实现3题功能。(30分)
*/
#include<stdio.h>
#include<limits.h>
 /* bcd转二进制,*/

#define bcd2bin(bcddata) ((( (bcddata) >> 4) & 0x0f ) * 10) + ( (bcddata) & 0x0f)

 /* 二进制转bcd,二进制数值小于100*/

#define bin2bcd(bindata) ((( (bindata) / 10 ) << 4 ) & 0xf0 ) + ( (bindata) % 10);

/*显示bcd*/
void showbcd( unsigned char bcddata)
{
     printf( "%c%c", ((( bcddata >> 4) & 0x0f ) + '0'), (( bcddata & 0x0f) + '0'));
 }
int main(void)
{
    unsigned char cdata;
    unsigned char bcddata;
    unsigned char bindata;
    printf("请输入一个字符:");
    scanf("%c", &cdata);
    bcddata = bin2bcd(cdata);
    printf("BCD结果\n");
    printf("以字符显示:");showbcd(bcddata);putchar('\n');
    printf("以十六进制显示:%x\n", bcddata );
    printf("以整形显示:%d\n", bcddata );
    bindata = bcd2bin(bcddata);
    printf("bin结果\n");
    printf("以字符显示:%c\n", bindata);
    printf("以十六进制显示:%x\n", bindata );
    printf("以整形显示:%d\n", bindata );

    return 0; 
}//endof main

exam1-4-cmd.JPG




专家
2018-06-06 11:04:59    评分
14楼

高产啊,两天四道,不过偷偷的说,三四题跑题了,需要BCD和二进制之间转化,0101......


专家
2018-06-06 13:01:15    评分
15楼

发现回错了帖子...


根据百度百科:https://baike.baidu.com/item/BCD%E7%A0%81

BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;无权BCD码有余3码,余3循环码等。

在这里我们选用最常用的8421码吧,也就是 1000 0100 0010 0001 <==> 8421,用这个作为测试用例


高工
2018-06-11 18:03:33    评分
16楼

提交第5题作业。虽然可能赶不上评分,但还是放出来给大家批评批评吧

/*
5.请利用来实现一个抽象数据类型的链表,他可以存放任意自定义数据类型,至少实现指定位置插入和制定位置得到数据,以及制定位置删除。(32分)
*/
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>

#define elemtype int
#define sampleNo 10
 /* 链表数据类型*/
typedef struct link{
	elemtype data;
	struct link *next;
}linker;

/*查找第n个元素*/
linker *scanforNo(linker *linkdata, int no )
{
	int i=1;
	linker *tempdata;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while((i<(no+1)) && ((tempdata->next) != NULL))
    {
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\tdata = %d\n",no, tempdata->data);
	}
    if(i<(no+1)){
		//printf("超出链表长度!\n");
		tempdata = NULL;
	}
    return tempdata;
}

/*查找数据为data元素的位置*/
int scanforData(linker *linkdata, elemtype data)
{
	int i=0;
	linker *tempdata;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while(((tempdata) != NULL) && (tempdata->data != data))
    {
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\tdata = %d\n",no, tempdata->data);
	}
    if(tempdata == NULL)
    {
		//printf("链表中没有%d!\n", data);
		i = 0;
	}
    return i;
}

/*在第n位插入数据*/
void insertData(linker *linkdata, int no, elemtype data)
{
	int i=1;
	linker *tempdata;
	linker *temp;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while((i<(no)) && ((tempdata->next) != NULL))
    {
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\n",no);
	}
	//printf("%d\n",i);
	if(i>=(no-1)){
		temp = (linker *)calloc(1, sizeof(linker));
		temp->data = data;
		temp->next = tempdata->next;
		tempdata->next = temp;
	}else if(i<(no-1)){
		printf("超出链表长度!\n");
	}	
}

/*删除第n位数据*/
void deleteData(linker *linkdata, int no)
{
	int i=1;
	linker *tempdata;
	linker *temp;
	
     //printf("no = %d\n",no);
	    tempdata = linkdata;
    while((i<(no+1)) && ((tempdata->next) != NULL))
    {
            temp = tempdata;
    		tempdata = tempdata->next;
    		i++;//printf("%d\t",i);printf("no = %d\n",no);
	}
	//printf("%d\n",i);
	if(i>=(no+1)){
		temp->next = tempdata->next;
	}else if(i<(no+1)){
		printf("超出链表长度!\n");
	}
}
/*打印整个链表*/
void printData(linker *linkdata)
{
	linker *pt;
	pt = linkdata;
	while( pt->next != NULL)
	{
		pt = pt->next;
		printf("%d\t", pt->data );
	}
	printf("\n打印链表结束!\n");
	printf("------------------------------\n");
}
/*打印命令界面*/
void drawUI(void)
{
    //printf("\n-------------------------\n");
	printf("添加新数据请输入1:\n");
	printf("按位置查找请输入2:\n");
	printf("按数据查找请输入3:\n");
	printf("删除数据请输入4:\n");
	printf("结束程序请输入9:\n");
	printf("请输入命令字以继续:");
}
/*建立样表*/
void creatSample(linker *linkdata)
{
	int i;
	for(i = 0; i < sampleNo; i++)
	{
		insertData(linkdata, (i+1),(i+1));
	}
}
/*命令相关*/
void cmd0(linker *linkdata)//加载样表
{
	creatSample(linkdata);
	printData(linkdata);
}
void cmd1(linker *linkdata)//添加新数据
{
     elemtype data;
     int no;
     printf("请输入要插入数据:");scanf("%d",&data); 
     printf("请输入要插入位置:");scanf("%d",&no);
     insertData(linkdata, (no),(data));
	printData(linkdata);
}
void cmd2(linker *linkdata)//按位置查找
{
     linker *temp;
     int no;
     
     printf("请输入要查找的位置:");scanf("%d",&no);
     temp = scanforNo(linkdata, no);
     if(temp != NULL)
     {
         printf("第%d位的数据是:%d。\n", no, temp->data);
     }else
     {
          printf("输入位置超出当前链表长度!\n");
      }
	printData(linkdata);
}
void cmd3(linker *linkdata)//按数据查找
{
     linker *temp;
     int no;
     elemtype data;
     
     printf("请输入要查找的数据:");scanf("%d",&data);
     no = scanforData(linkdata, data);
     if(no != 0)
     {
         printf("数据%d在链表中第%d位。\n", data, no);
     }else
     {
          printf("链表中没有%d!\n", data);
      }      
	printData(linkdata);
}
void cmd4(linker *linkdata)//删除数据
{
     int no;
     
     printf("请输入要删除数据位置:");scanf("%d",&no);
     deleteData(linkdata, no);
	printData(linkdata);
}
int cmd9(void)
{
	return 0;
}
/*主函数*/
int main(void)
{
	linker *header;
	linker *finder;
	int cmd;
	int holdOn = 1;
	header = (linker *)calloc(1, sizeof(linker));
	header->next = NULL;
	printf("加载样表请输入0:\n");
	while( holdOn )
	{
		drawUI();
		scanf("%d", &cmd);
		switch(cmd)
		{
			case 0:cmd0(header);break;//加载样表
			case 1:cmd1(header);break;//添加新数据
			case 2:cmd2(header);break;//按位置查找
			case 3:cmd3(header);break;//按数据查找
			case 4:cmd4(header);break;//删除数据
			case 9:holdOn = cmd9();break;
			default:printf("无此命令,请重新输入!\n");
            printf("------------------------------\n");break;
		}
	}//endof while
    return 0; 
}//endof main



高工
2018-06-11 18:11:10    评分
17楼

第5题各命令效果如下:




高工
2018-06-18 21:48:05    评分
18楼

跳跃了一下,这次先把文件部分给看了,做了下例程

ch13-10.JPG

感觉这本书真好啊。叫做入门篇也真不错,能够从一开始到最后做出一点实用的东西。现在要再回头把前面漏掉的给补完,慢慢的消化一下。


共18条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]