编译器是UTF-8,汉字编码和ascii不一样,直接复制会导致汉字乱码。
1.上机调试
(1)F(2)T(3)T(4)T(5)T
c98不能用变量声明数组。但是自c11就已经可以了,更何况现在c14、c17广泛运用,c23都已经在编写了,只能说是背八股。
const 声明常变量,可以视作常量,同上。
#define声明常量,和const一样(有其他差别,不讨论)。
变量相加不影响
(6)
又没学指针,考虑这个干什么?
下标从0开始,n-1结束,因为指针地址从第一个数开始,a[i]对应 *(p + i)。
2.阅读程序
(1)
为什么不用 s += ?
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[] = {1,2,3,4,5}; 6 int j = 1,s = 0; 7 for(int i=4;i>=0;--i)//循环内符号不空格坏习惯,别学。--i和i--一样(此处) 8 { 9 s += a[i] * j; 10 j *= 10; 11 } 12 printf("s=%d\n",s); 13 return 0; 14 }
s = 5 + 40 + 300 + 2000 + 10000;

(2)
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[3][3] = {9,8,7,6,5,4,3,2,1}; 6 for(int i=0;i<3;++i) printf("%d\n",a[i][2-i]); 7 return 0; 8 }
a[0][2] = 7;
a[1][1] = 5;
a[2][0] = 3;

(3)
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int x = 0,y = 0,m; 6 int a[3][3] = {1,-2,0,4,-5,6,2,4}; 7 m = a[0][0];//1; 8 for(int i=0;i<3;++i) 9 { 10 for(int j=0;j<3;++j) 11 { 12 if(a[i][j] > m) 13 { 14 m = a[i][j]; 15 x = i; 16 y = j; 17 } 18 printf("(%d,%d) = %d\n",x,y,m); 19 } 20 } 21 return 0; 22 }

没意思
3.完成程序
(1)
都没必要用数组
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int k = 0,n; 6 int num[16] = {0}; 7 printf("输入:"); 8 scanf("%d",&n); 9 printf("\n转换后:"); 10 do 11 { 12 num[k] = n % 2;//answer 13 n /= 2;//answer 14 k++; 15 } 16 while(n != 0); 17 for(k=15;k>=0;--k) printf("%d",num[k]); 18 return 0; 19 }

(2)
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[10] = {10,9,8,7,6,5,4,3,2,1}; 6 int k,s,i; 7 double ave; 8 for(i = 0,k = s = 0;i<10;i++) 9 /*不能理解的连续赋值*/ 10 { 11 if(a[i] % 2 == 0) continue;//answer 12 s += a[i];//answer 13 k++; 14 } 15 if(i != 0) 16 { 17 ave = s / k; 18 printf("%d %f\n",k,ave); 19 } 20 return 0; 21 }

(3)
没必要降难度吧
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[11],i; 6 for(i = 1;i<=10;i++) a[i] = i;//answer 7 for(i=1;i<=10;i++) printf("%d",a[i]);//answer 8 printf("\n"); 9 for(i=1;i<=5;i++) a[11-i] = a[i];//answer 10 for(i=1;i<=10;i++) printf("%d",a[i]);//answer 11 return 0; 12 }

真无聊啊
(4)
又是不用数组就行的题
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int x[10],a[9],i; 6 for(i=0;i<10;i++) scanf("%d",&x[i]); 7 /*循环内不打空格别学*/ 8 for(i=1;i<10;++i) a[i-1] = x[i] + x[i-1];//answer 9 for(i=0;i<9;++i) printf("%d ",a[i]); 10 printf("\n"); 11 return 0; 12 }

(5)
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int i,j,t,a[4][4]; 6 printf("\n输入 a:\n"); 7 for(i=0;i<4;++i) 8 for(j=0;j<4;++j) scanf("%d",&a[i][j]); 9 for(i=0;i<4;++i) 10 for(j=0;j<i;++j) 11 { 12 t = a[i][j]; 13 a[i][j] = a[j][i];//answer 14 a[j][i] = t; 15 } 16 for(i=0;i<4;++i) 17 { 18 for(j=0;j<4;++j) printf("%5d",a[i][j]); 19 printf("\n"); 20 } 21 return 0; 22 }

(6)
面向结果编程不就行
#include<stdio.h> int main(void) { int num[4][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}},i,j; for(i=0;i<4;i++) { for(j=1;j<=i;j++) printf(" "); for(j=i;j<4;++j) printf("%4d",num[i][j]);//answer printf("\n"); } return 0; }

4.调试程序
(1)
行号都不对怎么标?
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[4] = {0,0,0,0};//此处 6 int i; 7 for(i=0;i<4;++i) scanf("%d",&a[i]); 8 for(i=1;i<4;++i) a[0] += a[i]; 9 printf("%d",a[0]); 10 return 0; 11 }

(2)
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[11],i;//a[0]未初始化 6 a[0] = 0; 7 for(i=1;i<=10;i++) scanf("%d",&a[i]);//此处无下标 8 for(i=1;i<=10;++i) a[0] += a[i]; 9 printf("Sum=%d\n",a[0]); 10 return 0; 11 }

(3)
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int i,n = 10,a[10];//n未赋值 6 double av = 0.0;//应为浮点型 7 for(i=0;i<n;++i) scanf("%d",&a[i]);//缺少取地址符& 8 for(i=0;i<n;++i) 9 { 10 printf("%d ",a[i] ); 11 if(i % 3 == 2) printf("\n");//这样才能从开始三个一输出 12 } 13 for(i=0;i<n;++i) av += a[i]; 14 printf("\nav=%f\n",av/n);//未除以10 15 return 0; 16 }

不用c++好难受