c语言易错知识点
每个语句以分号(;)结束,C语言的32个关键字和9种控制语句
C语言中函数的存储类型隐含为版全局的,因此默认为extern。
c语言编译过程 编译器检查源代码中的语法或结构错误,如果源代码无错误,则编译器将生成目标代码
默认情况下,所有的函数都是外部函数
c语言定义的全部变量,其作用域从文件的定义开始到本源文件结束
随机读写方式不适合文本文件
顺序读写方式适合于二进制文件
随机文件是以固定长度的记录为单位进行存储和访问的
文本文件由ASCLl码形式存储数据
结构化程序设计主要强调的是程序易读性
fprintf函数是格式化写入, fscanf 格式化读取
fread是以二进制的形式读取文件里的内容
fwrite函数是以二进制形式存储
fputs是ASCLL码的形式写入到文件
二进制文件适合顺序读写也适应随机读写
文本文件只适合顺序读写
数组名是一个指针,不能指向数组的任意元素(常量指针)
算数优先级高->低 ^ ,-(负数),*,/,%,+,-,&
c语言的构造类型数据有三种:数组,结构体,共用体类型;
typedef不能增加新类型,不能定义变量
结构体:成员中内存量最大者所需的容量整数倍
1.a *= a += a++;算完再+
int a = 5; a *= a += a++; printf("%d", a);//101 //错题二 int x = 0, y = 5, z = 3; while (z-- > 0 && ++x < 5)y = y - 1; //z=2,x=1,y=4 //z=1,x=2,y=3 //z=0,x=3,y=2 //z=-1 break //3 2 -1 printf("%d,%d,%d", x, y, z); int i, n = 0; for (i = 2; i < 5; i++) { do { if (i % 3)continue;//跳出当前while循环 n++; } while (!i); //continue 执行完之后,跳到这里来了 n++; printf("%d\n", n); } printf("%d", n);//4 //ABLMNP --->LBLMNP char a[80] = "AB", b[80] = "LMNP"; int i=0; strcat(a, b); puts(a); while (a[i++] != '\0')b[i] = a[i]; //注意i++变了值 puts(b);//b[0]还是L没有变
2.数据类型,scanf格式要看清
double d = 3.2; int x, y; x = 1.2; y = (x + 3.8) / 5.0; printf("%d\n", y); printf("%d\n", d * y); //3 错题 int a1 = 1, b; //1234567 scanf("%2d%2d", &a1, &b); printf("%d %d", a1, b); int i = 1, j = 10; do { if (i++ > --j)continue; } while (i < 5); printf("%d,%d", i, j);//5,6 int a = 257; printf("%x", a);//101 /16*16 16 1 struct { double a; char b; }m; //是结构体变量 char* s = "121"; int k = 0, a = 0, b = 0; do { k++; if (k % 2 == 0) { a = a + s[k] - '\0'; printf("a1=%d\n", a); continue; } b = b + s[k] - '\0'; a = a + s[k] - '\0'; } while (s[k + 1]); printf("%d\n", '\0'); printf("k=%d,a=%d,b=%d\n",k,a,b); //k=2,a=99,b=50
3.&&的优先级比||高
int a2 = 4, b2 = 5, c2 = 0, d2; d2 = !a2 && !b2 || !c2; //相当于(!a && !b ) 0||1 printf("%d", d2);
4.输出什么要注意
int x, i; for (i = 1; i <= 50; i++) { x = i; if (++x % 2 == 0) if (x % 3 == 0) if (x %7 == 0) printf("%d", i); }
5.循环几次要注意
int i = 0, a = 0; while (i < 20) { for (;;) { if ((i % 10) == 0)break; else i--; } i += 11; a += i; } printf("%d\n", a);
6.break跳出当前switch
int k = 5, n = 0; while (k > 0) { switch (k) { default:break; case 1:n += k; case 2: case 3:n += k; } k--; } printf("%d\n",n);
7.注意循环封号 ;
int s, i; for (s = 0, i = 1; i < 3; i++, s += i); printf("%d\n", s);
8.静态static全局和局部
int a = 2; //全局 int f(int n) { //局部静态 只在这个函数内有效 static int a = 3; //n=0, 局部a1=3 int t = 0;//每次进来初始化0 if (n % 2) { //n=0,没进来,n=1,进来了 t=0+4++=4, a2=5了 static int a = 4; t += a++; } else { //n=0 ,t=0+5=5,a3=6了 , n=2,t=0+6++=6, a3=7 static int a = 5; t += a++; } return t + a++; //n=0,t=5,return 5+3++=8, 这里的a1=4了 //n=1,t=4,return 4+4++=8, 这里的a1=5了 //n=2,t=6,return 6+5++=11,这里之后a1=6了 } int main() { int s = a, i; //这里的 s=2,全局变量 for (i = 0; i < 3; i++) { s += f(i); //i=0,s=2+f(0)=2+8=10; //i=1, s=5+f(1)=10+8=18 //i=2, s=18+f(2)=18+11=29 printf("%d\n", s); // 10 18 29 }; return 0; }
9.前20项之和
//1.1 int i; float sum = 0, fz = 2, fm = 1,temp; for (i = 0; i < 20; i++) { sum += fz / fm; temp = fz; fz = fz + fm; fm = temp; } printf("前20项之和:%f\n",sum); //32.660263 //2.1 double a = 2, b = 1, t, s = 0; int n = 0; while (n < 20) { s += a / b; t = a; a = a + b; b = t; n++; } printf("%f\n", s); //32.660261
10.1000以内能被7或11整除并且不能被7和11整除
//1.1答案 int num, n = 0; printf("1000以内能被7或11整除:\n"); for (num = 1; num <= 1000; num++) { if (num % 7 == 0||num%11==0) { if (!(num % 7 == 0 && num % 11 == 0)) { printf("%d\t", num); n++; if (n % 5 == 0)printf("\n"); } } } //2.1 自己写的 int i, k = 0; for (i = 1; i <= 1000; i++) { if (i % 7 == 0 || i % 11 == 0 && i % 77 != 0) { printf("%d\t", i); k++; if (k % 5 == 0)printf("\n"); } }
11求数组里出现最多的数
int a[11] = {-3,1,3,3,5,5,5,8,9,9,6}; int i, j, d, max=0, y=a[0]; for (i = 0; i < 11;i++) { d =0; for (j = 0; j < 11; j++) { if (a[i] == a[j])d++; } if (d>max) { max = d; //max=次数 y= a[i]; //t 就是当前数组次数的数 } } printf("次数最多:%d,次数:%d",y,max);
12.注意看for循环里的条件
char ch[7] = { "65ab21" }; int i, s = 0; for (i = 0; ch[i] >= '0' && ch[i] <= '9'; i += 2) { s = 10 * s + ch[i] - '0'; } printf("%d\n", s);
13.程序结果题(仔细一点)
int a[3][3] = { {1,2,9},{3,4,8},{5,6,7} }; int i, s = 0; for (i = 0; i < 3; i++) { s += a[i][i] + a[i][3 - i - 1]; } printf("%d\n",s); //注意输出第几个 int i, n[] = { 0,0,0,0,0 }; for (i = 1; i <= 4; i++) { n[i] = n[i - 1] * 2 + 1; printf("%d",n[i]); }
14 5个学生4门成绩,求出每个学生的平均成绩,从高到底排序输出
int i, j; float sum, t, ave[5] = { 0 }; float s[5][4] = { {78,90,32,55}, {78,90,32,55}, {90,23,55,33}, {90,23,55,33}, {90, 23, 55, 33}}; for (i = 0; i < 5; i++) { sum = 0; for (j = 0; j < 4; j++) { sum += s[i][j]; } ave[i] = sum / 4; } for (i = 0; i < 4; i++) { for (j = 0; j < 4 - i; j++) { if (ave[j]>ave[j+1]) { t = ave[j]; ave[j] = ave[j + 1]; ave[j + 1] = t; } } } printf("5个学生的平均成绩从高到低排序为:\n"); for (i = 0; i < 5; i++) { printf("%.2f\t",ave[i]); }
15.3行字符串,每行80个字符,分别统计出其中英文大写字母、小写字母、数字、空格、其他字符
char a[3][100] = {'\0'}; int i, j; int big, small, number, space, other; for (i = 0; i < 3;i++) { printf("请输入%d个字符串:\n", i + 1); gets(a[i]); big = small = number = space = other =j=0; while (a[i][j]) { if (a[i][j] >='A' && a[i][j]<='Z') big++; else if (a[i][j] >= 'a' && a[i][j] <= 'z')small++; else if (a[i][j] >= '0' && a[i][j] <= '9')number++; else if (a[i][j] ==' ')space++; else other++; j++; } printf("大写字母%d,小写字母:%d,数字:%d,空格:%d,其他字符:%d\n", big, small, number, space, other); }
16.内存循环多注意
int i, n = 0; for (i = 2; i < 5; i++) { do { if (i % 3)continue; n++; } while (!i); n++; } printf("n=%d\n",n);
17.二维数组(3×3)转置,行列互换
void inverse(int a[2][3],int b[3][2]) { int i, j; for (i = 0; i <= 1; i++) for (j = 0; j <= 2; j++) b[j][i] = a[i][j]; } void testInverse() { int a[2][3] = { 0 }, b[3][2], i, j; for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) scanf("%d", &a[i][j]); printf("\n"); } inverse(a, b); for (i = 0; i <= 2; i++) { for (j = 0; j <= 1; j++) printf("%5d", b[i][j]); printf("\n"); } }
18.判断素数
#inlcude <math.h> int isPrime(int n) { int flag,i,k; k = sqrt(n); for (i = 2; i <=k; i++) { if (n % i == 0) {break;} } if (i>k)flag = 1; else flag = 0; return flag; }
19.5个学生4门成绩,计算平均分,从高到低排序
void printF(int n,float a[]) { int i; for (i = 0; i < n; i++) printf("%.2f\t", a[i]); } int main() { int i,j; float ave[5] = {0}; float s[5][4] = { {78,93,82,74}, {91,82,72,76}, {100,90,85,72}, {67,89,90,65}, {77,88,99,45} }; for (i = 0; i < 5; i++) { for (j = 0; j < 4; j++) { ave[i] += s[i][j]/4; } } printF(5,ave); printf("\n排序后:\n"); for (i = 0; i < 4; i++) { for (j = 0; j < 4 - i; j++) { if (ave[j] < ave[j + 1]) { float t = ave[j]; ave[j] = ave[j + 1]; ave[j + 1] = t; } } } printF(5, ave); return 0; }
20.全局变量 (一变全变)
int sum = 2; int f(int* k) { sum += *k; return sum; } int main() { int a[10] = { 1,2,3,4,5,6,7,8 }; int i; for (i = 2; i < 4; i++) { sum += f(&a[i]); printf("%d ", sum); } return 0; }
21.注重循环结束条件
char* s = "121"; int k = 0, a = 0, b = 0; do { k++; if (k % 2 == 0) { a = a + s[k]-'0'; break; } b = b + s[k] - '0'; a = a + s[k] - '0'; } while (s[k + 1]); // k=0, 1 b=2,a=2 // s[2]=1 //k=2, a=2+1=3,break; //k=2,a=3,b=2 printf("k=%d a=%d b=%d\n", k, a, b);
22 20/3 结束为整数
double d; float f; long l; int i; i = f = l = d = 20 / 3; printf("%d %ld %f %lf",i,l,f,d);
23.一定要注意判断条件
static char a[] = "ABCDEFGH", b[] = "abCDefGh"; char* p1, * p2; int k; p1 = a; p2 = b; for (k = 0; k <= 7; k++) if (*(p1 + k) == *(p2 + k)) printf("%c", *(p1 + k)); printf("\n");
24.三个整数abc,要求按照大小顺序输出,函数改变3个变量的值
void swapS(int* a, int* b) { int t = *a; *a = *b; *b = t; } void exchange(int* q1, int* q2, int* q3) { if (*q1 < *q2)swapS(q1, q2); if (*q1 < *q3)swapS(q1, q3); if (*q2 < *q3)swapS(q2, q3); } int main() { int a, b, c,*pa,*pb,*pc; scanf("%d %d %d", &a, &b, &c); pa = &a, pb = &b, pc = &c; exchange(pa, pb, pc); printf("由大到小a:%d,b:%d,c:%d", a, b, c); return 0; }
25.一段字符串b从第5个到第17个字符树池在到a字符串第12字符以后。
void strcpySS(char *p1,char *p2) { int count = 0; p1 = p1+11; p2 = p2+4; while (count <=16) { *p1 = *p2; p1++; p2++; count++; } *p1 = '\0'; } int main() { char a[255] = "My name is Li jilin."; char b[255] = "Mr.Zhang HaoLing is very happy."; //My name is hang HaoLing is v strcpySS(a,b); puts(a); return 0; } /* 第二种 如果*p1=*p2&&count<n放到while条件中会出错,因为p2如果没有指向\0就不会结束。 void strcpySS(char *p1,char *p2,int n) { int count = 0; while (count < n) { *p1++ = *p2++; count++; } *p1 = '\0'; } strcpySS(&a[11],&b[4],17);
26.注意printf打印的内容
struct country { int num; char name[20]; }x[5] = {1,"China",2,"USA",3,"France",4,"EngLand",5,"Spanish"}; struct country* p; p = x + 2; printf("%d,%s", p->num, x[0].name);
27.输入三个字符串到文件,按照从小到大顺序
FILE* fp; char str[3][10], temp[10]; int i, j, k, n = 3; printf("Enter strings:\n"); for (i = 0; i < n; i++) { gets(str[i]); } for (i = 0; i < n - 1; i++) { k = i; for (j = i + 1; j < n; j++) if (strcmp(str[k], str[j]) > 0)k = j; if (k != i) { strcpy(temp,str[i]); strcpy(str[i],str[k]); strcpy(str[k],temp); } } if ((fp = fopen("string.data", "w")) == NULL) { printf("can't open file!\n"); exit(0); } printf("\n The new sequence:\n"); for (i = 0; i < n; i++) { fputs(str[i], fp); fputs("\n", fp); printf("%s\n", str[i]); }
28(*p)[4]数组指针 是二维的
int maxvalue(int(*p)[4]) { int i, j, min; min = **p; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { if (*(*p + j) < min)min = *(*p + j); } p++; } return min; } int main() { int arr[3][4] = { 4,2,7,2,9,1,-4,24,5,-8,12,16 }; int min; min = maxvalue(arr); printf("min=%d\n", min); return 0; }
29.选择排序
int a[10] = {12,-1,8,9,3,4,5,6,2,11}; int i, j, k,t; for (i = 0; i <9; i++) { k = i; for (j =i+1; j <10; j++) { if (a[k]<a[j]) { k = j; } } if (k != i) { t = a[k]; a[k] = a[i]; a[i] = t; } } for (i = 0; i <10; i++) { printf("%d\t", a[i]); }
30杨辉三角
int a[10][10],i,j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if (i == j || j == 0)a[i][j] = 1; } } //第二个->最后第二个 for (i =2; i < 10; i++) { for (j =1; j <i; j++) { a[i][j] =a[i-1][j-1]+a[i-1][j]; } } for (i = 0; i < 10; i++) { for (j = 0; j <=i; j++) { printf("%d\t", a[i][j]); } printf("\n"); }
31.汉洛塔
void hanoi_move(int n, char A, char B, char C) { if (n == 1) { printf("%c->%c\n", A, C); } else { hanoi_move(n-1,A,C,B); printf("%c->%c\n", A, C); hanoi_move(n-1,B, A, C); } } int main() { int n = 0; scanf("%d", &n); hanoi_move(n,'A','B','C'); return 0; }
32.ax*x + bx +c =0 的根
float x1, x2, disc, p, q; int a, b, c; printf("input ax*x+bx+c:\n"); scanf("%d %d %d", &a, &b, &c); printf("表达式为: %d*x^2+%d*x+%d = 0\n", a, b, c); disc = b * b - 4 * a * c; if (disc > 0) { x1 = (-b + sqrt(disc))/(2*a); x2 = (-b - sqrt(disc))/(2*a); printf("disc>0的根为: x1=%f x2=%f\n", x1, x2); } else if (disc == 0) { x1 = (-b + sqrt(disc)) / (2 * a); x2 = (-b - sqrt(disc)) / (2 * a); printf("disc>0的根为: x1=%f x2=%f\n", x1, x2); } else { p = -b / (2 * a); q = sqrt(-disc) / (2 * a); printf("disc<0的根为:x1=%f+%f x2=%f-%f\n", p, q, p, q); }
33.16进制格式
int a = 0xaa; char s = '\xba'; printf("%x\n", a); printf("%x\n", s); //注意 (int)是强转位置 float x = 123.4567; printf("%f\n",(int)(x*100+0.5)/100.0);
34.*p[3] 和 strlen遇到\0截止运算
int a[3][2] = { 1,2,3,4,5,6 }, * p[3]; p[0] = a[1]; printf("%d",*(p[0]+1)); //a[1][1] char s[] = "stop\0\n\""; printf("%d\n",strlen(s));
35.已有从小到大顺序排序好的一维数组,插入一个数,仍然按原来的顺序将其插入;
int arr[100] = { 99,5,2,1}; int n; scanf("%d", &n); for (int i = 0; i < 100; i++) { if (n > arr[i]) { int temp = arr[i]; arr[i] = n; n = temp; } } for (int i = 0; arr[i] != 0; i++) printf("%d\t", arr[i]);
一个数加上100是一个完全平方数,再加上168又是一个完全平方数,求该数
int n = 1, p = 0; while (n++) { int sum = n + 100; p = sqrt(sum); if (p * p == sum) { sum = sum + 168; p = sqrt(sum); if (p * p == sum) { p = n, n = 0; } } } printf("这个数是%d\n",p);
用牛顿迭代法求根。方程为 ax^3+bx^2 +cx+d=0
系数a,b,c,d的值依次为1,2,3,4,由主函数输人。求x在1附近的一个实根。求出根后由主函数输出 float solut(int a, int b, int c, int d) { float x = 1, x0, f, f1; do { x0 = x; f = ((a * x0 + b) * x0 + c) * x0 + d; f1 = (3 * a * x0 + 2 * b) * x0 + c; x = x0 - f / f1; } while (fabs(x - x0) >= 1e-3); return(x); } int main() { int a, b, c, d; printf("input a,b,c,d:"); scanf("%d %d %d %d", &a, &b, &c, &d); printf("x=%10.7f\n", solut(a, b, c, d)); return 0; }
用递归方法求n阶勒让德多项式的值,递归公式为
#include<stdio.h> double polya(int n,int x) { double result; if(n == 0) result = 1; if(n == 1) result = x; if(n>1) result = ((2*n-1)*x*polya(n-1,x)-(n-1)*polya(n-2,x))/n; return result; } int main() { int x,n; scanf("%d %d", &n, &x); printf("%.2f\n", polya(n,x)); return 0; }