全国计算机等级考试二级C语言上机考试试题详解 下载本文

到‘9’的个数都保存在数组bb[10]中。*p-'0'实现将字符‘0’的个数保存在bb[0]中,将字符‘1’的个数保存在bb[1]中,依此类推,直到将字符‘9’的个数保存在bb[9]中。【3】由于奇数数字字符的个数存于bb[1]、bb[3]、bb[5]、bb[7]、bb[9]中,所以for循环的目的是将这些元素分别赋给num[0]、nam[1]、num[2]、num[3]、num[4]。

改错题参考答案:错误1:for(i=0;i

分析:错误1:由于题目要求将最小数和次最小数分别与a[0]和a[1]中的数对调,因此这层循环只需循环两次。错误2:赋值语句的执行方向是从右向左,即把右边的值赋给左边的变量。

编程题参考答案:

int fun(int score[],int m,int up[]) { int i,j=0; float av=0.0; for(i=0;i

av=av+score[i]/m; /*求平均值*/ for(i=0;i

if(score[i]>av) /*如果分数高于平均分,则将此分数放入up数组中*/ p[j++]=score[i];

return j; /*返回高于平均分的人数*/ }

分析:该题第1个循环的作用是求出平均分av,第2个循环的作用是找出高于平均分的成绩并存入up数组中。

第7套

填空题参考答案:【1】*p 【2】default:b[10]++; 【3】p++; 分析:【1】根据switch语句中case后面的常量表达式,可以看出,switch后面括号中的表达式应该是字符串str中的各字符,而指针p就是指向字符串str。【2】和各个case后面的常量表达式不匹配的都属于其他字符,保存在b[10]中。【3】指针p指向字符串str,通过p自加1来移动指针,访问字符串中的所有字符。

改错题参考答案:错误1:ifhigh%==0 正确:if(high%j==0)

错误2:if(yes==0) 正确:if(yes)

分析:错误1:if语句的两侧要加括号。错误2:yes为1时,说明被判断的数为素数,要加入总和。

编程题参考答案:

void fun(int x,int pp[],int *n) { int i,j=0;

for(i=2;i<=x;i=i+2) /*i的初始值为2,步长为2,确保i为偶数*/ if(x%i==0) pp[i++]=i; /*将能整除x的数存入数组pp中*/ *n=j; /*传回满足条件的数的个数*/ }

分析:本题题干信息是:能整除x且不是奇数的所有整数。循环语句中i从2开始且每次增2,所以i始终是偶数。

第8套

填空题参考答案: 【1】\%ld\【2】 n=-n; 【3】\%ld\,n 分析:【1】本题考查对标准输入函数scanf()的调用格式,当输入为长整型数时,格式

控制字符串为“%ld”,输入的长整数存于变量n中。【2】当输入的数是负数时,则取它的相反数,即为它的绝对值。【3】本题考查对标准输出 函数pnntff)的调用格式,当输出为长整型数时,格式控制字符串为“%ld”。

改错题参考答案: 错误1:int fun(char t[]) 正确:void fun(char t[]) 错误2:t[j]=t[i++]; 正确:t[j]=t[i];

分析:错误1:该函数只是对一个字符串中的元素进行比较大小的操作,并没有具体的返回值,因此,函数的返回值类型应为void 。错误2:本题的思路是利用选择法对数组元素进行比较。所谓选择法,是依次用当前取得的元素和它后面的元素进行比较,在第一个元素和它后面的元素顺次比较时,可以借助中间变量来对两数进行交换,要保证这第一个元素始终存放数组中的最大数,以后依次挑出次大数,这样最终的数组就是有序的。解答本题,只要理解了选择法的思想,找到并改正错误就容易了。

编程题参考答案:

void fun(int m,int k,int xx[])

{ int i,j,n;

for(i=m+1,n=0;n

{ xx[n++]=i; /*如果不是素数,放入数组MX中*/ break; /*并跳出本层循环,判断下一个数*/ } }

分析:本题只要掌握了判断非素数和素数的算法即不难完成了,其实程序缺少部分也正是这部分。

第9套

填空题参考答案: 【1】\%s\【2】%c 【3】str2 分析:【1】本题考查对标准输入函数scanf()的调用格式,当输入字符串时,格式控制字符串为.“%s”,题目要求输入的字符串保存在str1中,所以地址表列应为字符串的首地址,即为str1。【2】本题考查对标准输出函数printf()的调用格式,当输出为字符型变量时,格式控制字符串为“%c”。【3】题目要求将str1中下标为偶数的字符保存在字符串str2中并输出,所以printf()函数的输出表列是str2。

改错题参考答案:错误1:while(x[i]==0) 正确:while(x[i]!=0)

错误2:sum=sum\\c; 正确:sum=sum/c;

分析:错误1:此处考查的是对循环条件的理解,当被判断的数组元素为0时,说明是数组的最后一个元素,此时要跳出循环。错误2:C语言中的除法运算符是“/”,而不是“\\”。

编程题参考答案:

int fun(int *s,int t;int *k) { int i;

*k=0; /*k所指的数是数组的下标值*/ for(i=0;is[i])

*k=i; /*找到数组的最小元素,把该元素的下标赋给k所指的数*/ return s[*k]; /*返回数组的最小元素*/ }

分析:本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始

应让*k的值为数组中的某一下标值,即*k=0。

第10套

填空题参考答案: 【1】\%d\,&n 【2】str2[i]=str1[i]; 【3】str2 分析:【1】本题考查对标准输入函数scanf()的调用格式,由后面的程序可以知道,变量n保存了要截取的字符数,注意在n前面不要忘了取址符‘&’。【2】截取前n个字符,就是将字符串str1的前n个字符依次赋给字符串str2的前n个字符。【3】本题考查对标准输出函数printf()的调用格式,根据题意,应输出截取后的字符串,即字符串str2。

改错题参考答案:

错误1:if((s[i]>='A'&&s[i]<='Z')&&(s[i]>='a'&&s[i]<='z')) 正确:if((s[i]>='A'&&s[i]<='Z') || (s[i]>='a'&&s[i]<='z')) 错误2:s[j]= \; 正确:s[j]='\\0';

分析:错误1:字母包括小写字母和大写字母,这里是“或”的关系,所以用“||”运算符。错误2:字符串的结束标志符为字符,而不是字符串。

编程题参考答案: int fun(int a[ ][N]) { int i,j;

for(i=0;i

a[i][j]=0; /*将数组右上半三角元素中的值全部置成0*/ }

分析:本题旨在考查控制数组中右上半三角元素的算法,也就是两个千篇一律的循环语句,希望学习者能够掌握消化。

第11套

填空题参考答案: 【1】n/100%10 【2】\【3】\分析:【1】由程序可以知道,变量g保存了整数的个位数,变量s保存了整数的十位数,所以变量b应该保存整数的百位数。将整数除以100再对10取余,则得到这个整数的百位数。【2】当个位数字和百位数字之和等于十位数字时,则返回,\。【3】当个位数字和百位数字之和不等于十位数字时,则返回\。

改错题参考答案:错误1:for(j=0;j

错误2:a[p]=t; 正确:a[j]=t;

分析:错误1:根据C语言语法,for循环中循环条件后不加分号,除非做空操作。错误2:将两数进行交换的常用语句,借助第三个变量。

编程题参考答案: int fun(int w[ ][N]) { int i,j,k=0; int s=0;

for(i=0;i

if(i==0||i==N-1||j==0||j==N-1)

s=s+w[i][j]*w[i][j]; /*将周边元素求平方和*/ return s; /*返回周边元素的平方和*/ }

分析:该题采用逐一判断的方式,周边元素的下标一定有一个是0或N-1,且只要下标中有一个为0或N-1,则它一定是周边元素。

第12套

填空题参考答案: 【1】n>1 【2】n-1 【3】n==1 分析:【1】求阶乘时采用递归的算法,n>1和n==1这两种情况的处理方法不同,需要分开考虑。【2】阶乘的算法是,当n>1时,n!=n*(n-1)!,即fun(n)=n*fun(n-1)。【3】n==1是递归的终止条件,因为1!=1,所以当n=1时,返回1。

改错题参考答案: 错误:if(('A'<=tt[i]||(tt[i]<='Z')) 正确:if(('A'<=tt[i]&&(tt[i]<='Z'))

分析:从ASCⅡ码表中可以看出,小写字母的ASCⅡ码值比对应大写字母的ASCⅡ码值大32。将字符串中的大写字母改为小写字母的方法是,从字符串第1个字符开始,根据ASCⅡ码值判断该字母是不是大写字母,若是,则ASCⅡ码值加32即可;重复执行以上过程直至字符串尾。本题可利用条件选择语句和循环语句来实现。

编程题参考答案: void fun(char *ss) { int i;

for(i=0;ss[i)!='\\0';i++) /*将ss所指字符串中下标为奇数的字母转换为大写*/ if(i%2==1&&ss[i]>='a'&&ss[i]<='z') ss[i]=ss[i]-32; }

分析:从C语言的学习中我们知道,只要将小写字母减去32则转成大写字母,将大写字母加上32则转成小写字母。该程序是用if语句实现该功能转化的。

第13套

填空题参考答案:【1】k=0 【2】(i%2==0)||(i%3==0) 【3】s[k]='\\0' 分析:【1】变量k声明时没有初始化,所以在使用前要对它初始化。因为k用作字符数组的下标,所以初始化为0。【2】如果当前字符的下标能被2或3整除,则不保存这个字符。【3】将所有字符下标能被2或3整除的字符从字符串中删除后,在字符串的最后还要加上结束标记符‘\\0’。

改错题参考答案: 错误:if(i+1%5==0) 正确:if((i+1)%5==0)

分析:本题除了考查循环语句以外,其实就是一道简单的数学题,循环条件if(i+1%5==0)是一个标准的语法错误,这跟题目考查的知识点毫无关系,也就是说,做这样的题,只要读懂了题干意思,问题便可迎刃而解。

编程题参考答案: fun(int a[][M1)

{ int i,j,max=a[0][0]; for(i=0;i<2;i++) for(j=0;j

max=a[i][j]; /*求出二维数组的最大值*/ return max;

}

分析:此类求最大值或最小值的C语言问题,我们可以采用逐个比较的方式。要求数组中的所有元素走动一遍,并从中找出最大、最小值,要注意一开始应使max存放数组中的第一个元素的值。可按逐行查找也可按逐列查找的方式,本题采用的是逐行查找的方式。即行下标在外层循环列下标在内层循环,因为在循环的嵌套中越在内层循环,循环变化就越快。

第14套

填空题参考答案:【1】m%k 【2】k 【3】aa 分析:【1】此语句是将十进制的整型数据m转换为k进制数据时,将余数保存在数组aa中。【2】此语句是将十进制的整型数据m转换为k进制数据时,每除一次k后,把商重新赋值给正整数m,以便重复取余。【3】在for循环之后,i即为转换成的k进制数的位数,所以根据题意要求,此语句应该是:"print("%d", aa[i-1]);"

改错题参考答案:错误1:if(p==' ') 正确:if(*p==' ') 错误2:*p=toupper(*(p-1)); 正确:*(p-1)=toupper(*(p-1));

分析:本题比较简单,重点考查toupper函数的用法,该函数是将ch字符转换成大写字母,该题较多地应用了字符串处理函数。

编程题参考答案:

int fun(STREC *a,STREC *b) { int i,j=0,max=a[0].s; for(i=0;i

if(max

b[j++]=a[i];/*找出成绩与max相等的学生的记录,存入结构体b中*/

return j; /*返回最高成绩的学生人数*/ }

分析:该程序使用循环嵌套,第1个for语句的作用是找出最大值。第2个循环的作用是找出与max相等的成绩,也即最高成绩的学生记录,并存入b中。

第15套

填空题参考答案:【1】i=1,j=0 【2】bb[j++]=i 【3】return j 分析:【1】题目要求找100以内的自然数,而自然数是从1开始的,所以i的初始值为1。变量j声明时没有初始化,所以在这里初始化为0,用来记录满足条件的自然数的个数。【2】将满足条件的自然数存于数组bb中,下标加1是为了下一次存储做准备。【3】题目要求fun()函数返回数组比元素的个数,所以函数返回j。

改错题参考答案:错误1:*t=calloc(m,sizeof(STU));

正确:t=calloc(m,sizeof(STU));

错误2:t[k].num=b[j].num; 正确:t[k]=b[j];

分析:calloc也用于分配内存空间。调用形式:(类型说明符*)calloc(n,size),功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符*)用于强制类型转换。calloc函数与malloc函数的区别仅在于一次可以分配n块区域。例如:ps=(street stu*)calloc(2,sizeof(struct stu));,其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配两块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。在本例中我们可别考虑那么复杂了,根据定义类型STU b[N],*t;就可以看出*t=calloc(m,sizeof(STU));中的错误,t[k].num=b[j].num;的错误旨在考查对结构体概念的掌握和灵活应用程度。

编程题参考答案:

fun(char (*a)[81],int num,char *max) { int i=0; max=a[0];

for(i=0;i