虽然说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| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |