C语言课设完成之后的总结
程序的大体框架
-
我使用的是while循环,里面的参数是提前设置好的标志整个main函数由好几个while循环构成,在每个循环的进入和出去都会涉及到标志的改变,以实现限制只能进入某些循环,不能进入某些循环
-
大致代码如下
int main( ){
int i , .... //需要的标志在这里定义
while( ){ //这里是主要大循环,所有的结构都在第循环里面
while(){
//在每个循环最后可以询问是否出循环,以及修改标志
}
while( ) { }//不同的结构或者功能
}
}
关于输入缓存区的问题
- 在多次输入之后就会出现自动跳过输入语句的情况,查询后知道这是缓存区的问题,关于缓存区的具体介绍请点击http://blog.csdn.net/shrdlu/article/details/48929865 搜索后所知道的避免方法有两种:
- 使用 fflush(stdin); 函数,但此函数并非C语言标准库的函数,所以在使用的时候可能报错就不奇怪了
- 手动清空缓存区,使用getchar()函数;如下:
while ((ch = getchar()) != EOF && ch != ‘\n’) ;
但此函本人在使用过程中有时会出现需要多输入一次的现象,只有在发现输入语句被跳过时使用才是正常的,具体情况不太清楚,如果有大牛,希望解答一下
关于输入限制的问题
-
在想要从键盘上得到一个数据时,存在用户随意输入的问题,此时就需要对得到的这些数据进行判断,一个简单的函数如下 :
char choice(){
char ch;
do{
printf("\b \b");
ch = getche();
}while( !(ch == '1' || ch == '2' || ch == '3' ));
return ch;
} -
这样子就会只有当用户输入的是限定的几个数字之后才会跳出循环。
- 还发现一个小秘密,汉字在内存中如果用整形查看的话是两个负数(因为汉字占两个字节,所谓宽字节),这时候如果你需要限制输入的只能是汉字的话就可以用判断负数来进行选择
-
还有在涉及到分数的输入时,如果遇到不良用户乱输入汉字或者字母的话就会很尴尬,因为我们定义的浮点型此时只能读到内存中此块内存原有的数据,所以结果就是不可预料的,在此我使用了一个将字符串转换成数字的函数大致代码如下:
float change(){
char a[20];
int jj = 0,tt = 0;
int xiaoshu = 0;//小数部分
int dian = 0; //记录小数点出现的次数
int xiaoshudianhou = 1;
gets(a);
float num = 0;
int i = 0;
while( a[i] != '\0' ){
if( a[i] == '.'){
jj = 1;
}
if( tt == 1 && a[i] == '.'){
return -1;
}
if( jj == 1 ){
tt = 1;
}
i++;
}
if( i > 8 ){
return -1;
}
for(i = 0; a[i] != '\0' && xiaoshudianhou < 3; i++){ //第二个判断条件。限制小数点的位数
switch(a[i]){
case '0':if(xiaoshu == 0){
num *= 10;
}else{
num = xiaoshudian(num,xiaoshudianhou,0);
xiaoshudianhou++;
}break;
case '1':if(xiaoshu == 0){
num = num*10+1;//从最高位开始读,多读一位前一位扩大百倍,加上现在的数字
}else {
num = xiaoshudian(num,xiaoshudianhou,1);//小数部分的处理
xiaoshudianhou++;//小数点位数的记录
}break;
case '2'://此处与上方类似,就不一一展示
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':if( dian == 0){/小数点出现一次,改变小数点的标志
dian = 1;
xiaoshu = 1;
}else {//如果再次出现,则不符合标准,退出
return -1;
}break;
default :return -1;//出现非数字字符,非法,退出
}
}
if( num > 150 || num < 0)
return -1;
return num;
}
//小数部分处理函数
float xiaoshudian(float num,int t,int i){
switch(t){
case 1:num += 0.1*i;break;
case 2:num += 0.01*i;break;
case 3:num += 0.001*i;break;
}
return num;
}
关于链表指针的注意点
- 尽可能的用带头结点的链表,这会让你在后面的操作省去很多麻烦,同时也让出错率大大降低
- 如果采用尾插法的话,那么在涉及链表结点变化的函数后面,记得要另起函数将尾结点重新赋值,不然在其他操作尾结点的地方就会有可能出错
- 理论上在申请结点的时候都需要进行申请成功与否的判断,因为计算机的内存是有限的,不可能一昧的申请
- 其次如果程序中出现崩盘的现象,第一反应就是使用了不可用的内存或者指针只想的空间无效,查看头结点指针是否指空,指针需慎用
小白初驾到,各位大神请鼠标下留情,有什么不对的欢迎提出,希望大家一起进步