### 福建省计算机二级考试C语言上机题库知识点解析 #### 一、计算1~100之间的所有偶数之和 **题目要求:** 修改给出的C语言程序,使其能够正确地计算出1~100之间所有偶数的总和。 **原代码分析:** ```c #include <stdio.h> #include <math.h> void main( ){ int i=1; int sum=2; while(i++,i<=100) { if( i==(i/2)*2 ) continue; sum+=i; } printf("Sum is %d\n",sum); getch(); } ``` **问题解析:** 1. **循环控制变量i初始化为1**:这会导致程序在判断是否为偶数时出现问题,因为从1开始,第一个数值就是奇数。 2. **条件判断语句** `i==(i/2)*2`:该表达式用于判断i是否为偶数,但其逻辑存在缺陷。应该使用`i%2==0`来更准确地判断。 3. **while循环的条件和更新方式**:`while(i++,i<=100)`这种方式不规范,容易导致错误。正确的做法是先进行判断再进行自增操作。 4. **sum初始值为2**:虽然最终结果不会受到很大影响,但为了程序的通用性和清晰度,最好将其初始化为0。 **改进后的代码:** ```c #include <stdio.h> void main( ){ int i = 2; // 从2开始确保是偶数 int sum = 0; while(i <= 100){ sum += i; i += 2; // 每次增加2确保下一个数也是偶数 } printf("Sum is %d\n", sum); getchar(); // 替换getch()以兼容标准C } ``` --- #### 二、修改二维数组方阵左下半三角各元素加4,右上半三角各元素乘2 **题目要求:** 修改给出的C语言程序,实现在一个5x5的二维数组中,左下半三角(不含对角线)的元素加上4,右上半三角(含对角线)的元素乘以2。 **原代码分析:** ```c #include <stdio.h> #define N 5 void main(){ int a[N][N],i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=i*5+j+11; printf("\nArray a is:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("%3d ",a[i][j]); printf("\n"); } for(i=0;i<N;i++) for(j=0;j<=i;j++) a[i][j]+=4; for(i=0;i<N;i++) for(j=i+1 ;j<N;j++) a[i][j]*=2; printf("\nArray a is turned:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("%3d ",a[i][j]); printf("\n"); } getchar(); } ``` **问题解析:** 1. **数组初始化方式**:`a[i][j]=i*5+j+11;` 这种初始化方式是合理的,但不是题目要求的核心部分。 2. **左下半三角元素加4**:`for(j=0;j<=i;j++)` 这里的逻辑是正确的,但对于左下半三角的定义应该排除对角线元素。 3. **右上半三角元素乘2**:`for(j=i+1 ;j<N;j++)` 这里的逻辑也是正确的,符合题目要求。 **改进后的代码:** ```c #include <stdio.h> #define N 5 void main(){ int a[N][N],i,j; for(i=0;i<N;i++) for(j=0;j<N;j++) a[i][j]=i*5+j+11; printf("\nArray a is:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("%3d ",a[i][j]); printf("\n"); } // 修改左下半三角元素 for(i=0;i<N;i++) for(j=0;j<i;j++) // 修改这里以排除对角线 a[i][j]+=4; // 修改右上半三角元素 for(i=0;i<N;i++) for(j=i+1 ;j<N;j++) a[i][j]*=2; printf("\nArray a is turned:\n"); for(i=0;i<N;i++){ for(j=0;j<N;j++) printf("%3d ",a[i][j]); printf("\n"); } getchar(); } ``` --- #### 三、计算满足条件的整数n的最大值 **题目要求:** 修改给出的C语言程序,计算满足2^2 + 4^2 + 6^2 + …… + n^2 < 1000条件的整数n的最大值。 **原代码分析:** ```c #include <stdio.h> #include <math.h> void main(){ int n=0, sum=0; while(sum<1000); { sum+=n^2; n++,n++; } printf("n=%d\n",n-2); getchar(); } ``` **问题解析:** 1. **无效的while循环**:`while(sum<1000);` 这里有一个分号,导致循环体永远不会执行。 2. **幂运算符错误**:`n^2` 在C语言中并不是幂运算,而是异或操作。应该使用`pow(n, 2)` 或者 `n*n` 来表示平方。 3. **n的递增方式**:`n++,n++;` 这种方式会导致n每次增加2,但应该只增加2而不是增加两次。 **改进后的代码:** ```c #include <stdio.h> #include <math.h> void main(){ int n=0, sum=0; while(sum<1000){ n += 2; // 每次增加2 sum += pow(n, 2); // 使用pow函数计算平方 } printf("n=%d\n",n-2); // 减2是因为最后的n已经超过了条件 getchar(); } ``` --- #### 四、从字符串中截取子串 **题目要求:** 修改给出的C语言程序,实现从键盘输入一串字符,并在字符串中从第m个字符串开始截取n个字符。 **原代码分析:** ```c #include <stdio.h> #include <string.h> void main(){ char str[100],sub[100]; int m,n,len,i; printf("Enter string:"); gets(str); printf("\nEnter m n:"); scanf("%d%d",&m,&n); len=strlen(str); if( m-1+n>len ) printf("Can't run with %d and %d!\n",m,n); else{ i=0; while(i<=n) sub[i]=str[m+i]; sub[i]='\n'; printf("sub string is:%s\n",sub); } getchar(); } ``` **问题解析:** 1. **使用gets函数**:`gets(str)` 不安全,建议使用`fgets`替代。 2. **子串复制逻辑**:`while(i<=n)` 这里使用小于等于n,会导致复制多一个字符。 3. **字符串结束符**:`sub[i]='\n';` 应该使用`'\0'`作为字符串的结束符。 **改进后的代码:** ```c #include <stdio.h> #include <string.h> void main(){ char str[100],sub[100]; int m,n,len,i; printf("Enter string:"); fgets(str, sizeof(str), stdin); printf("\nEnter m n:"); scanf("%d%d",&m,&n); len=strlen(str); if( m-1+n>len ) printf("Can't run with %d and %d!\n",m,n); else{ i=0; while(i<n) // 修改这里 sub[i]=str[m+i-1]; // 注意下标调整 sub[n]='\0'; // 添加字符串结束符 printf("sub string is:%s\n",sub); } getchar(); } ``` --- #### 五、计算二维数组中的最大值与最小值之差 **题目要求:** 修改给出的C语言程序,计算一个整型二维数组中数组元素的最大值与最小值的差。 **原代码分析:** ```c #include <stdio.h> #define ROW 3 #define COL 4 void main(){ int a[ROW][COL],max,min,i,j,result; clrscr(); printf("Enter array a:\n"); for(i=0;i<ROW;i++) for(j=0;j<COL;j++) scanf("%d",&a[i][j]); max=min=0; for(i=0;i<ROW;i++) for(j=0;j<COL;j++) {if(min<a[i][j]) min=a[i][j]; if(a[i][j]>max) max=a[i][j] } printf("Result= %d\n",max-min); getchar(); } ``` **问题解析:** 1. **初始化max和min**:`max=min=0;` 这样初始化可能会导致后续比较出错,应使用数组中的第一个元素作为初始值。 2. **min的赋值逻辑**:`if(min<a[i][j])` 这里应该是`if(min>a[i][j])`,即找到最小值。 3. **max的赋值逻辑**:`max=a[i][j]` 缺少分号。 **改进后的代码:** ```c #include <stdio.h> #define ROW 3 #define COL 4 void main(){ int a[ROW][COL],max,min,i,j,result; printf("Enter array a:\n"); for(i=0;i<ROW;i++) for(j=0;j<COL;j++) scanf("%d",&a[i][j]); max=a[0][0]; min=a[0][0]; for(i=0;i<ROW;i++) for(j=0;j<COL;j++) {if(min>a[i][j]) min=a[i][j]; if(a[i][j]>max) max=a[i][j]; } printf("Result= %d\n",max-min); getchar(); } ``` --- 通过以上五个题目的分析和改进,我们可以看到在编写C语言程序时需要注意的一些细节,如循环控制、数组操作、字符串处理以及数学运算等。这些知识点都是C语言学习中的基础内容,掌握它们对于后续的学习和发展至关重要。
剩余18页未读,继续阅读
- 粉丝: 30
- 资源: 5万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助