虽然说C一直也没有放下,但也说不上是真正的应用,所以说c的水平吧可能也就是入门级,功能都能实现,但什么优化啊,效能啊……之类的应该都谈不上。
这不,刚好碰到一个新项目,觉得应该把旧有的一些不稳定因素和缺陷都给彻底给清除了,所以就趁此机会也把c水平提高一下。
当然更好的是刚好我的亲爱的猫猫发起了这个超赞的活动,怎么能不参加?!!
虽然说活动是要到18号才开始,但一个周末怎么能光等不看书呢?
先看看笔记吧,因为是第一遍泛读,所以就蜻蜓点水了啦
总体来说,对于入门篇是名副其实的,按照书中的例子,一步一步由浅入深,确实可以入门。要说缺点,只有一,就是这个入门不是针对任何一个人说的,而以针对有计算机基础的人来说,至少需要知道怎么配制编程环境,怎么编译,……,不过对于在这里的大家,应该都不成问题对吧?!
快快的看到第6章,发现自己吸取到了几点精华:
原来在做除法的时候,对于有一个数是负数时,其结果依赖于编译器,这一点可真的是完全不知道啊。但细想一下,应该是要知道的……此处省略5K字;
格式化输出的形式。因为之前并没有在显示上做多少工作,所以并没有完全的了解格式化输出的每个参数的意义,这次赶紧get起来;
对operator的单目、双目加深了理解。以前只是用,根本不去关注单目、双目什么的;
眼下这么多吧,具体的内容在深入学习时再做补充。
刚好抽点时间,把C的编译环境给配制了一下,毕竟光说不练是不行的,要学以致用。
总体上用了VC6.0+notepad++。大神用的VS毕竟太大了,**派需要电视,……所以还是在win的环境选择了较小的体积,并且也不需要再看dos的界面了。嗯……也不错,先用着
第一个程序,经典的helloword
首先是用notepad++写好程序,并保存为.c文件。
接着是对刚保存的.c文件进行编译,如下图中2所示,运行完毕后看到如3的提示,并在.c文件的目录下看到如下一张图中所示多了的两个同名文件,一个是.exe,一个是.obj。
如果这时运行命令(如图中4所示)执行.exe文件,会看到结果(如图中5所示)。
如果直接在文件夹下双击运行.exe文件,也可以执行,但因为程序会一闪而过,可能你什么也看不到。如果想看到结果的话,后面会给出一种简单方式。
第二个例程的时候就出现了异常,出现了C1071的错误,
查找了问题原因,发现是因为中文注释(这里注释用的是/**/形式)的原因,说是中文+“*”会使编译器识别错误。解决的问题是在“*”与中文隔开的地方加入一个空格就没有问题了。
疑问:前后两个程序,同样的注释方法,前一个没出现问题,而后一个出现问题,换名话说,不加空格的话不一定会出现问题,而加空格的话则一定不会出现问题,所以在明确知道哪些字会出现问题之前,先全部加空格好了。
上面这个注释可以成功通过编译。
上面这个注释需要在末尾的“值”与“*”之间加入空格才能通过编译。
哎呀!!!被作业给难住了,一不小心就漏打卡了,赶紧先补交下作业。
前四题的答案公布
exam1-1
/* 1. 请在控制台实现如下功能。(20分) * ** *** **** */ #include<stdio.h> int main(void) { puts(" * "); puts(" ** "); puts("*** "); puts("****"); return 0; }
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-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-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
提交第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
有奖活动 | |
---|---|
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
【有奖活动】智能可穿戴设备AR/VR如何引领科技新潮流! | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
【有奖活动】震撼来袭!这场直播将直击工程师的心灵! |
打赏帖 | |
---|---|
如何实现基于NXPiMX.RT1021的BH1730采集被打赏5分 | |
玩转“DFRobot盖革计数器模块”准备工作认识模块知识分享被打赏30分 | |
【换取手持数字示波器】AHT10温度检测分享被打赏40分 | |
【换取手持数字示波器】ACM32F070开发板点亮LCD屏和触控按键,串口,ADC被打赏40分 | |
【换取手持数字示波器】ACM32F070LCD屏和触控按键功驱动蜂鸣器分享被打赏40分 | |
【换取手持数字示波器】国民技术PWM功能知识分享被打赏40分 | |
【换取手持数字示波器】放大器运放知识分享被打赏40分 | |
【分享评测,赢取加热台】+开关电源AC输入知识分享被打赏30分 | |
【换取手持数字示波器】N32G430点亮数码管与串口打印、ADC被打赏40分 | |
老胖子聊电路--分析一个反馈电路被打赏50分 |