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

max=a[i];

return max; /*传回最长字符串的地址*/ }

分析:做本题之前,我们先应该明白ss是一个指向一维数组的指针变量,max是指向指针变量的指针变量。所以引用时要注意加上,我们不可能只用max,因为ss[0]是一个数组地址而不是一个指针的地址。

第16套

填空题参考答案:

【1】g==s&&s==b或者g==b&&s==b或者g==s&&g==b 【2】g+s*10+b*100 分析:【1】变量g表示三位数的个位数字,变量s表示三位数的十位数字,变量b表示三位数的百位数字。注意,表示三个数字都相等时,不能写成“g==s==b”,而要写成“g==s&&s==b”或者“g==b&&s==b”或者“g==s&&g==b”。【2】一个三位数等于百位数字乘以100加上十位数字乘以10,再加上个位数字。

改错题参考答案:错误1:int fun(char str[][10],int m,char *pt)

正确:void fun(char str[][10],int m,char *pt)

错误2:pt[i]=str[k,i]; 正确:pt[i]=str[k][i];

分析:本题中的两例错误我们已经在前面的讲解中详细阐述了,一般这样的字符串连接函数在C语言的考试中肯定不让使用slxcat函数,但是,直接用if和while的循环嵌套也很容易解决问题的。

编程题参考答案:

void fun (char *a,int n,int h,int e) { int i,j=0;

for(i=h;i

a[j++]=a[i];

a[j]='\\0'; /*在字符串最后加上结束标记*/ }

分析:注意循环变量i的初值(h)和终止值(n-e),由于h和e分别是a中的前导*和尾部:的个数,n是字符串的长度,所以从a[h]到a[n-e-1)之间的所有字符都要留下,而其他字符均删除。删除操作(即留下相应字符)现已由循环完成。 本题技巧部分:

void fun(char *a,int n,int h,int e ) { a[n-e]='\\0';

strcpy(a,a+h); }

另外,请注意,a[n-e]的作用是使最后一个字母后出现字符串结束符。本程序采用了strcpy()库函数。

第17套

填空题参考答案:【1】break; 【2】i++ 【3】'\\0' 分析:【1】while循环的作用是找到字符串str中与指定字符ch相同的字符。当找到的时候,就使用break语句跳出循环。【2】通过i++依次访问字符串str中的各个字符。【3】在字符串str中与指定字符ch相同的字符位置上赋值\\0’,这样输出字符串str时,就不会输出指定字符及其后面的所有字符了。

改错题参考答案:错误1:while(i>j) 正确:while(i

分析:这是一个字符串处理的较为混合的程序,将字符串倒序存放的方法一般是以字符串中央为中心,将两边对称位置的字符互相交换。可利用循环语句实现,但必须要注意两边对称位置元素的下标。该题是用指针配合循环的嵌套实现解题目的。

编程题参考答案:

void fun(int m, int *k, int xx[]) { int i,j,n=0;

for (i=4; i

*k=n; /*返回非素数的个数*/ }

分析:这道题是考查一个数是不是素数的简单延伸,只要掌握了判断素数的方法,问题便能顺利解决,请学习者以此题为例,搞清判断素数的方法。

第18套

填空题参考答案:【1】b!=0 【2】a%b; 【3】n*m/a 分析:【1】本题考查求最大公约数和最小公倍数的方法。变量a保存两数中较大着,变量b保存较小者,采用循环的方法求解最大公约数,循环结束条件是b等于0。【2】求解最大公约数的思路是,将a对b求余,如果余数为0,则b即为两数的最大公约数,如果余数不为0,则将b赋给a,余数赋给b,继续将a对b求余,如此循环,直到余数为0。【3】最小公倍数等于两数的乘积除以最大公倍数。

改错题参考答案:错误1:ifn==0 正确:if(n==0)

错误2:result*=n-- 正确:result*=n--;

分析:在做这道题之前,我们首先应该明白一个数学上的概念,一般判卷人员先要执行程序,如果结果正确,得满分,否则错一个扣分,再错再扣,本题考查5!即5!=5×4×3×2×1=120,要求输出double型结果。

编程题参考答案:

void fun(int *a, int *b) { int i,j;

for(j=0; j

b[j]=0; /*数组b初始化为0*/ for(i=0; i=100)

b[10]++; /*如果年龄大于等于100,b[10]自增1*/ else

b[a[i]/10]++; /*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/

}

分析:本题又是一个分段函数的问题,还是用两个循环来完成。第1个循环的作用是使b的所有元素值都为0。这个循环不能省略,因为若未对b元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]大于等于100时,按题意要将其统计到b[10]中,else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0至9时,a[i]/10的值为0,且0至9岁的人数正好要存入b[0]中。若a[i]为10至19岁时a[i]/10

的值为1,且10至19岁的人数正好要存Nb(1]中,依次类推。

第19套

填空题参考答案:【1】 fiag=1 【2】fiag=0 【3】aa[k++]=i 分析:【1】由后面的if语句可以看出,当flag为1时,当前数是素数,所以此处先假设当前数为素数,即置flag为1,再进行判断,如果不是素数,则再将flag清零。【2】如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。如果当前数不是素数,则将flag清零。【3】如果当前数是素数,则将它保存在数组bb中。 改错题参考答案:错误:c=aa[i]; 正确:ch=aa[i];

分析:对长度为n的数组元素进行排列,可先对数组的前m-1项进行排序,之后再对前m项进行排序,如此循环直到数组全部元素完成排序。对前m项的子数列进行排序的方法是,将该子数列的末尾元素与前m-1项的元素相比较,由于前m-1项已经完成排序,可以找到某一位置,使得将该末尾元素插入该位置之后,前m项仍然保持升序。这样循环后,就可以得到全部元素的排序。

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

double s=0.0;

for(i=1;i<=n;i++)

s=s+1.0/(i*(i+1)); /*求级数的和*/ return s; }

分析:解决数学序列的问题,我们的思路依然是“数学先行”,即先看清楚题目的数学逻辑,然后再根据C语言来“翻译”出来。本题中,年一项的值都是n,(叶1)的倒数。当输入n时,从1开始循环,注意,此处for(i=1;i<=n;i++)中的“=”号必须要有,另外,表达式1.0/(*(i+1))中的两对小括号一个都不能少。若写成1.O/i*(i+1)则相当于(i+1)/i,结果就差之千里。

第20套

填空题参考答案:【1】str1[i]!=' ' 【2】i++ 分析:【1】如果当前字符不为空格,则将它保存在字符串str2中。【2】在while循环中,通过i++取得字符串str1中当前字符的下一个字符,继续判断是否为空格。

改错题参考答案:错误1:int fun(int n) 正确:float fun(int n) 错误2:for(i=2;i

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

double s=0.0;

for (i=1; i<=n; i++)

s=s+(1.0/(2*i-1)-1.0/(2*i)); /*计算S的和*/ return s; }