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

#include #include #define N 80

void insert (char *aa) { int i, j, n; char ch; n=strlen (aa);

for (i=1; i

********************************** { c=aa[i]; j =i-1;

while ((j>=0) && (ch

main ( )

{ char a [N] = \ int i;

printf(\:%s\\n\ insert (a);

printf(\:%s\\n\\n\}

编程题:编写函数fun(),它的功能是:计算和输出下列级数的和。 S=1/(1×2)+1/(2×3)+...+1/(n×(n+1)) 例如,当n=10时,函数值为0.909091。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序:

#include #include double fun(int n) { } main()

{ printf(\第20套

填空题:请补充main函数,该函数的功能是:把字符串strl中的非空格字符拷贝到字符串str2中。

例如,若Str1=“glad to see you!”,则str2=“gladtoseeyou!”。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。

试题程序:

#include #define N 80 main ( )

{ static char str1[N]=\ char str2 [N]; int i=0, j=0;

printf(\ while (str1 [i] ) { if(【1】)

str2 [j++]=strl [i]; 【2】; }

printf(\ for (i=0; i

printf (\}

改错题 :下列给定程序中,函数fun()的功能是:根据整型形参n,计算如下公式的值。

A1=1,A2=1/(1+A1),A3=1/(1+A2),…,An=1/(1+A(n-1)) 例如,若n=10,则应输出0.617977。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include #include

********************************** int fun(int n)

{ float A=l;int i;

********************************** for(i=2;i

{ int n;

printf(\:\ scanf (\

printf (\}

编程题:

请编写函数fun(),其功能是:计算并输出下列多项式值。 S=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/2n)

例如,若主函数从键盘给n输入8后,则输出为S=0.662872。 注意:部分源程序给出如下。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:

#include double fun(int n) { }

main ( )

{ int n; double s;

printf(\ scanf (\ s=fun (n);

printf(\}

第8章 全国计算机等级考试二级C语言上机考试试题详解

第1套

填空题参考答案: 【1】j=0 【2】*(pf+j)-32 【3】j++ 分析:【1】变量j声明时没有初始化,而后面程序用到j,所以在这里对j初始化为0。【2】将小写字母转换为对应的大写字母的方法是,小写字母的ASCⅡ码减去32,得到对应的大写字母的ASCⅡ码。【3】如果当前字符不是小写字母,则不做任何处理,使指针指向下一个字符,准备进行判断。

改错题参考答案: 错误1:{if(*p<=*q) 正确:{if(*p>=*q) 错误2:K++ 正确:k++;

分析:错误1:依题意,把ASCⅡ值小或相等的字符存放到c数组中,故if语句的关系运算符应为“>=”。错误2:C语言规定,每个语句要用分号结束。

编程题参考答案:

void fun(int a,int b,long*c)

{ *c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;}

分析:语句“*c=(b%10)*1000+(b/10)*100+(a%10)*10+a/10;”是将a数的十位和个位数依次放在c数个位和十位上,b数的十位和个位数依次放在c数的百位和千位上。注意“/”和“%”的用法。

第2套

填空题参考答案:【1】disc<0 【2】(-b+sqrt(disc))/(2*a) 【3】(-b-sqrt(disc))/(2*a) 分析:【1】题目要求当判别式disc小于0时,要重新输入a、b、c的值,所以do--while

2

循环的执行条件是disc<0。【2】方程ax+bx+c=0的一个实数根是:x=(-b+b2 -4ac)/(2a) 。

2

【3】方程ax+bx+c=0的另一个实数根是:x=(-b-b2 -4ac)/ (2a) 。

改错题参考答案: 错误1:int j=1; 正确:double j=1.0;

错误2:y+=1/(i*i);正确:y+=j/(i*i);

分析:错误1;为了做后面的除法运算,j要定义为实型数,否则除得的结果将为整数。错误2:题中公式是加减相间的运算,通过j来实现。

编程题参考答案:

void fun(int tt[M][N],int PP[N])

{ int i,j,max; for(j=0;j

{ max=tt[0][j]; /*假设各列中的第一个元素最大*/ for(i=0;i

if(tt[i][j]>max)/*如各列中有大于最大值的元素,则为当前该列中最大元素*/

max=tt[i][j];

PP[j]=max; /*将各列的最大值依次放入pp数组中*/ } }

分析:本题中函数的功能是求出二维数组中每列的最大元素。首先,假设各列中的第一个元素最大,然后利用行标值的移动来依次取得各列中其他元素的值,并与假设的最大值进行比较,如果遇到更大的,则把这个更大的元素看做当前该列中最大的元素,继续与该列中其他元素比较。

第3套

填空题参考答案:【1】 xx[i] 【2】 bb[n++]=xx[i] 【3】 n 分析:【1】变量b存放了三位数的百位数字,所以变量g应该存放三位数的个位数字,将这个三位数对10求余,则得到这个数的个位数字。【2】将个位数字与百位数字相等的整数存于数组bb中。【3】变量n记录了个位数字等于百位数字的整数的个数,题目要求个数由函数fun()返回,所以应返回n。

改错题参考答案: 错误1:int fun(int n) 正确:double fun(int n) 错误2:result*=n++; 正确:result*=n--;

分析:错误1:函数的返回值为实型数据,所以函数的返回类型应为double。错误2:根据阶乘的概念,从n开始,每递减1的数相乘,直到1,因此此处n递减,而不是递增。

编程题参考答案: double fun(int n)

{ double s=0.0;int i; for(i=0;i

s=sqrt(s); /*对s求平方根*/ return s; }

分析:本题的解题思路是逐个取得从0~n之间的所有数,对每次取得的数进行条件判断,条件是既能被5整除同时又能被11整除,注意:这两个条件要求同时成立,因此用到了“&&”运算符。满足条件,该数就被累加到s中去,求出所有符合条件的数后,用sqrt()函数(包含于头文件中)对s求平方根。

第4套

填空题参考答案:【1】!= 【2】str[1] 【3】s,c 分析:【1】fun函数中先设置了二个循环从字符串str中寻找字符ch,如果找到则中断循环并保留字符ch的地址,否则一直循环到串尾。因此通过判断*str的内容即可判断是否已找到字符ch。【2】如果没有找到字符ch,则在while循环后str指针指向串结束符ox00,此时应将字符ch写入这里并在下一地址写入一个串结束符ox00,所以应该是“str[1]=0;”语句。【3】此句是调用fun()函数,括弧中是其实际参数。

改错题参考答案:错误1:long k==1; 正确:long k=0;

错误2:while(num) 正确:while(num);

分析:错误1:k用来存放各位数字的平方和,初值应为0。错误2:do-while语句的语法,while()后加分号。

编程题参考答案: int fun(int t)

{ int a=1,b=1,c=0,i;

do

{ c=a+b;a=b;b=c;

} while(c

c=a; /*此时数c的前一个Fib0nacci数为小于指定比较的数的最大的数*/ eturn c; }

分析:根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把c看成是前两项之和(即第n项),而a始终代表第n-2项,b始终代表第n-1项(通过不断地重新赋值来实现)。应注意,退出循环时得到的数c是大于指定比较的数的最小的数,而它的前一个数就是小于指定比较的数的最大的数。 第5套

填空题参考答案:【1】 j-- 【2】 *(p2+n)='\\0' 【3】 *p2 分析:【1】while循环执行后,变量j中保存了字符串str2的长度,而后面的for循环是将字符串str2倒置,即将第一个字符与最后一个字符对调,第二个字符与倒数第二个字符对调,如此循环直到中间的字符。第一次执行循环时,*(p2+j)指向最后一个字符,所以j要减1,并将未减1之前的数赋给n。【2】将字符串str2倒置后,在字符串的最后要加上结束标记符,'\\0'。【3】当*p2所指的字符为'\\0'时,说明已经将倒置后的字符串str2都接在字符串str1后面了,for循环应该结束。当*p2所指的为其他字符时,for循环要继续执行。

改错题参考答案:错误1:k=n; 正确:k=i;

错误2:s[j]=i; 正确:s[j++]=i;

分析:错误1:k就是当前要被判断的数,是随着i值的变化而变化的。错误2:在循环中,j是数组的下标要递增。

编程题参考答案:

fun(int a[][N],int n) { int i,j;

for(i=0;i

for(i=0;j<=i;j++)

a[i][j]=a[i][j]+n; /*使数组左下半三角元素中的值加上n*/ } 分析:首先从数组中找出要被加上n的那部分元素,找的过程其实就是找出将被挑出的那部分元素在原数组中的分布规律的过程。通过观察得出,要被处理的那部分元素的下标值的范围是每行中从第一个元素开始,直到列数等于该行行数时为止。找到这个规律后,依次从数组中取得合乎要求的元素,然后再加上n。

第6套

填空题参考答案:【1】*p 【2】bb[*p-'0']++ 【3】num[j]=bb[i] 分析:【1】通过移动指针p,指向字符串tt中的各个字符,当指针p所指的字符为'\\0'时,即指向字符串tt的最后一个字符,while循环结束。【2】将字符串中的数字字符‘0’