1.在输出浮点数时有相关的运算时,应特别注意除法中是否为包含小数位。
如:5/9=0应该是浮点数应改为5.0/9.0
如:5/9=0应该是浮点数应改为5.0/9.0
2.引用函数时所包含的语句一般为一句,多句应该加上大括号
3.是否有返回值,容易遗忘
如:return 0;
4.在printf中%m.nf,m表示指定数据的输出宽度(包括符号位喝小数点),n表示输出浮点型数据时保留n位小数
如:%6.2f
5.变量在进行运算时,判断是否需要赋予初始值
如:product=product*i;(double product=1)
6.对于if语句小括号里面的关系表达式易错点:
如:if(1<=n<=10)
这并不是数学上的[1,10]的意思,这实际是一个运算符的优先级的问题,很容易出错,
无论你填什么进去他都是成立的。(可以运用逻辑运算符来解决:&&,||,!)
可以改为:if((1<=n)&&(n<=10)).
应为逻辑运算符的优先级小于关系运算符,所以可以把括号去掉变成:
if(1<=n && n<=10)
7.在switch中case后面跟的是:而不是;,这个容易出错.
8.%d%c%d,&a,&op,&b中容易把其中的位置放错而出错.
8.再一次犯:
if(flag=0)--> if(flag==0)
10.switch语句中最后一个default之前容易漏掉一个break,从而导致多输出一段;
11.对于调用函数,引用时要注意把它的实参和形参都要一起移动,容易忘记形参的书写导致调用
失败而没用反应;
12.检查程序错误需要细心和充足的耐心,沉得住气,
13.重点:scanf(“%d”,&&&&&&&yournumber);(多次漏掉!!!花了这么久,都没搞出来!!!)
14.函数调用的返回类型是什么类型的,要注意:
void sum(int i) /*函数的调用是没有返回类型的,如果是int,那就是返回整型类型的,如果不是会发生强势转化*/
15.函数调用是传值,每个函数之间的变量是单独的。
16.易错的一个会导致出现乱码:
double a; scanf("%f",a); /*要注意这里是%f而不是%d,易出错*/
内容:
17.定义变量的生命周期和作用域(只在块内,块:就是在大括号里面;)
if(a<b) { int i; /*i的作用域取决与if里的条件,生命周期也是在这个块里面*/ }
18.int main中的return 0;是有意义的也是有必要的,电脑里面的操作系统可能会需要;
19.scanf漏&;
20.printf多&;(真不错)
21.if(是一个关系表达式);里面的有等号的话是==;
22.函数调用在返回主函数时是否有变量接受他的返回值,易出错;、
(局部变量)
/*且这里没有变量接受调用函数的返回值*/**</u>
fun(int a, int b, int c) { c = a * b; } int main(void) { int c; fun(2, 3, c); /*且这里没有变量接受调用函数的返回值*/ printf("%d\n", c); return 0; } A.0 B.1 C.6 D.无法确定 答:D
但是不影响 main() 中变量 c 的值。main() 中的打印变量 c 的值,还是最初系统分配的那个随机值。
23.考察全局变量和局部变量的关系,根据 C 语言的规则,当一个函数中,局部变量和全局变量名相同的时候,那么函数中操作的是局部变量,所以打印的是 main() 里面定义的局部变量 x 的值为 3,而 y,在main() 没有定义,那么自然就是全局变量 y 值为 7。
**/*且这里没有变量接受调用函数的返回值*/******
nt x = 5, y = 6; void incxy() { x++; y++; } int main(void) { int x = 3; incxy(); /*且这里没有变量接受调用函数的返回值*/ printf("%d,%d\n", x, y); return 0; } A.3,6 B.4,7 C.3,7 D.6,7 答:C
24.在for循环中,最后一个i++会增加后再判断是否符合条件,易错!
25.认真仔细观察printf中所包含的内容不要遗
26.ox表示整数,如0x123,十六进制的数 /x表示字符,如/41为字符‘A’;
27.~取反,^异或(相同为假,异或为真);
28.sizeof(int)的值为2,说明有两个字节,一个字节有八位二进制位;即最大值位2^15-1;
29.按照原码,反码,补码的规则,整数的原码,反码,补码都相同,即符号位是0,其余各位表示数值。负数的原码:符号位是1,其余各位表示是数值的绝对值。反码:符号位是1,其余各位原码取反。补码:反码加1。
(注):负数的值比正数多1;
如:2个字节的范围:[2^15,2^15-1];
30.用min来保存数组a[i]的最小值更容易理解,但是需要多设置一个变量用来记录其下标,直接设下标会更加便利,因为设置下标既可以表示下标也可以表示相对应的数组量。
/*找出数组的最小值和它对应的最小下标*/ #include<stdio.h> int main() { int i,n,min,sub;/*用min来保存数组a[i]的最小值更容易理解,但是需要多设置一个变量用来记录其下标,直接设下标会更加便利*/ int a[10]; printf("输入n的值:"); scanf("%d",&n); printf("输入%d个数字:",n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } if(n>=1 && n<=10) { min=a[0]; /*min用来保存最小值*/ sub=0; /*sub为最小值的下标*/ for(i=1;i<n;i++) { if(a[i]<min) { min=a[i]; sub=i; } } printf("最小值是:%d\t下标为:%d\n",min,sub); } else { printf("无效输入,请重新输入n的值!\n"); } return 0; }
/*找出数组的最小值和它对应的最小下标*/ #include<stdio.h> int main() { int i,n,index=0; int a[10]; printf("输入n的值:"); scanf("%d",&n); printf("输入%d个数字:",n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } if(n>=1 && n<=10) { for(i=1;i<n;i++) { if(a[i]<a[index]) { index=i; } } printf("最小值是:%d\t下标为:%d\n",a[index],index); } else { printf("无效输入,请重新输入n的值!\n"); } return 0; }
31.数组的定义和数组元素的引用
定义数组是方括号里不能用变量来代表数长度,即使变量在先前已经赋值,因为数组的长度为不可变值,变量虽然初始化赋值,但有可能会改变,故不允许变量来定义长度。
但是数组元素的引用可以用变量来表示。
注:不能让数组下标越界,有可能造成不可预料的运行结果。
但是可以定义宏定义来表示。
32.注意换行时要注意的地方,应该是在同一个if里面,在外面就会出错
如:
while(i<200) { if((i%7==0&&i%2==0)||(i%17==0&&i%2==0)) { printf("%6d",i); count++; sum=sum+i; if(count%5==0) { printf("\n"); } } i++; }
33.pirntf中换行可以放到句子的前面
如:
printf("\nsum=%d");
34.要注意中间变量的使用:如:temp来防止改变前后不能改变的量
#include<stdio.h> int main() { int n,i; /*且要注意a,b,c应该为实型*/ double item=2.0,sum=0,a=2.0,b=1.0,temp; /*a为分子,b为分母,c为中间变量*/ scanf("%d",&n); for(i=1;i<=n;i++) { sum=sum+item; temp=a; a=a+b; b=temp; item=a/b; } printf("s=%.2f",sum); return 0; }
35.(1)要特别注意有相除的时候要特别留意是否需要double型 来,易出错。
(2)还有这里的x是不能变的,要细心观察是否前后的量改变;
#include<stdio.h> #include<math.h> double fact(int n) { int i; double result; result=1; for(i=1;i<=n;i++) { result=result*i; } return result; } int main() { int i; double sum,item,x,b,a; scanf("%lf",&x); i=2; b=1; sum=0; item=x/b; while(fabs(item)>=0.00001) { sum=sum+item; a=pow(x,i); /*此处不能用x来代替a*/ b=fact(i); item=a/b; i++; } printf("s=%.2f",sum); return 0; }
36.二分查找法
优点:当一个数组元素量很大时,效率高;
缺点:前提时素组元素必须是有序。
可以利用选择排序和冒泡排序等排序方法一起并用,先排序在利用二分查找,但是这样排序时所需要的空间和时间又会增加,还需具体情况具体使用。
37.顺序查找法
优点:简单明了;
缺点:从头到尾进行遍历,一旦数组元素量很大,效率就不高。
38.另外,如果在给数组赋值时,把每个字符单独用引号括起来。也会丢失'\0'。
如: u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};
如果希望数组以'\0'结束,则要么写成: u8 str1[]={"cxjr.21ic.org"};
要么写成(人工添加'\0'): u8 str1[]={'c','x','j','r','.','2','1','i','c','.','o','r','g','\0'};
要么写成(故意给数组预留一个空位): u8 str1[14]={'c','x','j','r','.','2','1','i','c','.','o','r','g'};
.输出几年几月几日的程序中for循环条件yearday>tableap中yearday打错成了year。
39.指针计算两个数的和与差中double的输入和输出格式出错导致出错。
40.作为实参传给指针时,没有传到地址过去;/实数拆分/
41.数组下标的处理不够细节,导致了数组下标越界!(分治法求a[m]~a[n]中最大最小的递归函数)
xxxxxxxxxx /用二级指针指向二维数组来比较字符串长度/#include<stdio.h>#include<string.h>int main(){ int n,i,j; char temp[30]; char str20; scanf("%d",&n);// getchar(); /特别注意:这里的回车会被gets中读取,会少一次输入,导致出错!!!/ for( i=0; i<n; i++ ) { scanf("%s",str[i]); /如果用scanf到不用getchar()/ // gets(str[i]); } for( i=1; i<n; i++ ) { for( j=0; j<n-i; j++ ) { if( strlen(str[j])>strlen(str[j+1]) ) { strcpy(temp,str[j]); strcpy(str[j],str[j+1]); strcpy(str[j+1],temp); } } } printf("Sorted result:\n"); for( i=0; i<n; i++ ) { printf("%s\n",str[i]); } return 0; }
42.stray ’\241‘in programe; : 源程序中有非法字符;(在其他空白地方打错了或打多了,检查一遍);
43.单链表中注意删除后的长度变化,在循环中容易忽略,应用LIstLength来计算表长来控制循环;
44.双指针的运用遗漏:在使用malloc函数申请空间时,接收的指针忘记*号;
-
(L)->next=NULL; /链尾标记NULL*/
错误的写成了(L)->next==NULL;导致了后面的出错;
调试中出现:program received signal sigsegv,Segmentation fault;