发布时间 : 星期二 文章2011年计算机二级考试C语言十套上机题汇总更新完毕开始阅读4e20a327482fb4daa58d4b7b
int i, n=0; int g, s;
for(i=0;i
main() {int xx[N]; int yy[N]; int
num=0,n=0,i=0; printf(\number :\\n\ do { scanf(\num]); }
while(xx[num++]!=0);
n=fun(xx,yy,num); printf(\ for(i=0;i }答案及评析:【1】xx[i] 【2】 bb[n++]=xx[i] 【3】n 【解析】填空1:将一个整数对10取余,则得到这个整数的个位数,将一个整数除以10再对10取余,则得到这个整数的十位数。由程序可以看出,变量s保存了整数的十位数,所以应该将整数的个位数保存于变量g中。填空2:当整数的个位与十位的数字之和大于5时,则将这个整数存于数组bb中,同时, q--; 变量n记录了满足条件 } 的无符号整数的个数。 p[0]=min; 填空3:题目要求满足} 条件的无符号整数的main() 个数由fun函数返回,{ char str[80]; 所以函数返回n。 printf(\2. 改错题 string: \ 下列给定程序中,函数 gets(str); fun()的功能是:在字符 printf(\串str中找出ASCⅡ码original string: \ 值最小的字符,将其放 puts(str); 在第一个位置上,并将 fun(str); 该字符前的原字符向 printf(\后顺序移动。例如,调after moving: \ 用fun()函数之前给字 puts(str); 符串输入fagAgBDh, printf(\调用后字符串中的内} 容为AfaggBDh。 答案及评析:(1)错误:请改正程序中的错误,void fun(char p)正确:使它能得到正确结果。 void fun(char *p)(2)注意:不要改动main错误:p=q+i;正确:函数,不得增行或删q=p+i; 行,也不得更改程序的【解析】错误:由于本结构。 题中函数的功能是对试题程序: 字符串进行处理,而不#include ASCII码最小的字符 void fun(char p) 本题解答需要3个步{ 骤: char min, *q; (1)找到字符串中 int i=0; ASCII码值最小的字 min=p[i]; 符,并保存。 while (p[i]!=0) (2)将该字符复制, { 并将该字符前面的字 if (min>p[i]) 符串顺次后移。 { (3)将ASCII码值最/*******************小的字符赋给字符串***found***********的第1个字符。找到************/ ASCII码值最小的字 p=q+i; 符可以通过定义一个 min=p[i]; 字符min,该字符初始 } 时等于字符串的第1个 i++; 字符,若字符串的下一 } 个字符小于min,则将 while(q>p) 下一个字符赋给min, {*q=*(q-1); 如此循环到字符尾,即第 9 页 共 13 页 可得到ASCII码值最小的字符,同时令指针q指向最小字符。之后对最小字符前面的子串顺次后移,可采用while语句实现。 此题需要熟练掌握和灵活应用C语言的字符与整型变量的关系以及字符串操作。 3. 编程题 N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun(),它的功能是:找出学生的最低分,由函数值返回。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include struct slist { double s; struct slist *next; }; typedef struct slist STREC; double fun(STREC *h) { } STREC * creat (double *s) { STREC *h,*p,*q; int i=0; h=p=(STREC*)malloc(sizeof(STREC)); p->s=0; while(i /*产生8个节点的链表,各分数存入链表中*/ {q=(STREC*) malloc(sizeof(STREC)); p->s=s[i]; i++; p->next=q; p=q; } p->next=NULL; return h; /*返回链表的首地址*/ } outlist(STREC *h) { STREC *p; p=h; printf(\ do {printf(\\ /*输出各分数*/ while(p!=NULL); printf(\} main() { double s[N]={56,89,76,95,91,68,75,85}, min; STREC *h; h=creat(s); outlist(h); min=fun(h); printf(\\} 答案及评析: double fun(STREC *h) { double min=h->s; while(h!=NULL) /*通过循环找到最低分数*/ {if(min>h->s) min=h->s; h=h->next; } return min; }【解析】在本题中,hscanf(\ 为一个指向结构体的 printf(\指针变量,若要引用它 printf(\所指向的结构体中的The result 某一成员时,要用指向*******\\n\运算符\。由于是链 表,所以要使h逐一往printf(\后移动,使用的是num)); h=h->next。 } 模拟试题(八) 1.填空题 答案及评析:【1】请补充函数fun(),该函n/100 【2】″数的功能是判断一个yes!″ 【3】″no!″ 数的个位数字和百位【解析】填空1:由程数字之和是否等于其序可以知道,变量g保十位上的数字,是则返存了整数的个位数,变回“yes!”,否则返回量s保存了整数的十位“no!”。 数,所以变量b应该保注意:部分源程序给出存整数的百位数。将整如下。 数除以100再对10取请勿改动主函数main余,则得到这个整数的和其他函数中的任何百位数。填空2:当个内容,仅在函数fun()位数字和百位数字之的横线上填入所编写和等于十位数字时,则的若干表达式或语句。 返回″yes!″。填空3:试题程序: 当个位数字和百位数#include { 下列给定的程序中,函 int g,s,b; 数fun()的功能是:用选 g=n; 择法对数组中的n个元 s=n/10; 素按从大到小的顺序 b=【1】; 进行排序。 请改正程序中的错误, b=n/100; 使它能得到正确结果。 if((g+b)==s) 注意:不要改动main return【2】; 函数,不得增行或删 行,也不得更改程序的 else 结构。 return【3】; 试题程序: } #include { void fun(int a[],int n) int num=0; { clrscr(); int i,j,t,p; /*******************printf(\***found***********data *******\\n\************/ 第 10 页 共 13 页 for(j=0;j for(i=j;i /**********************found***********************/ a[p]=t; } } main() { int a[N]={11,32,-5,2,14},i,m=5; printf(\排序前的数据:\ for(i=0;i printf(\ fun(a,m); printf(\排序后的顺序:\ for(i=0;i printf(\} 答案及评析:(1)错误:for(j=0;j 【解析】错误1:根据C语言语法,for循环中循环条件后不加分号,除非做空操作。 错误2:将两数进行交换的常用语句,借助第三个变量。 3. 编程题 下列程序定义了N×N的二维数组,并在主函数中赋值。请编写函数 fun(),函数的功能是:求出数组周边元素的平方和并作为函数值返回给主函数中的s。例如:若a 数组中的值为 a=0 1 2 7 9 1 11 21 5 5 2 21 6 11 1 9 7 9 10 2 5 4 1 4 1 则返回主程序后s的值应为310。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include main() {int a[N][N]={0,1,2,7,9,1,11,21,5,5,2,21,6,11,1,9,7,9,10,2,5,4,1,4,1}; int i, j; int s; clrscr(); printf(\array*****\\n \ for (i=0; i printf(\ } s=fun(a); printf(\RESULT*****\\n \ printf(\的若干表达式或语句。 is : %d\\n \试题程序: } #include return s; for(i=0;i 第 11 页 共 13 页 2. 改错题 下列给定程序中,函数fun()的功能是:依次取出字符串中所有的字母,形成新的字符串,并取代原字符串。 请改正程序中的错误,使它能得到正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include for(i=0,j=0; s[i]!= '\\0'; i++) /**********************found***********************/ if((s[i]>= 'A'&&s[i]<= 'Z')&&(s[i]>= 'a'&&s[i]<= 'z')) s[j++]=s[i]; /**********************found***********************/ s[j]= \} main() { char item[80]; clrscr(); printf(\string: \ gets(item); printf(\ string is:\\%s\\n\ fun(item); printf(\string of changing is :\\%s\\n\} 答案及评析:(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:字符串的结束标志符为字符,而不是字符串。 3. 编程题 下列程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N]),该函数的功能是:使数组右上半三角元素中的值全部置成0。例如a数组中的值为 a=4 5 6 1 7 9 3 2 6, 则返回主程序后a数组中的值应为 0 0 0 1 0 0 3 2 0 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include int fun (int a[][N]) { } main() { int a[N][N],i,j; clrscr(); printf(\如,当str1=“cdefghij”,array*****\\n\ 则str2=“cegi”。 for(i=0;i 矩阵*/ 请勿改动主函数main 和其他函数中的任何{ for(j=0;j 的横线上填入所编写{a[i][j]=rand(); 的若干表达式或语句。 试题程序: printf(\#include #include { printf(\ char RESULT\\n\ str1[LEN],str2[LEN]; for(i=0;i *p1=str1,*p2=str2; { for(j=0;j clrscr(); printf(\ printf(\ printf(\string:\\n\ } scanf(【1】); } 答案及评析: “%s”,strl1 int fun (int a[][N]) printf(\{ origial string***\\n\ int i,j; while(*(p1+j)) for(i=0;i } 【解析】本题旨在考查 for(i=0;i } 请补充main函数,该答案及评析: 函数的功能是:从键盘【1】″%s″,str1输入一个字符串并保 【2】%c 【3】存在字符str1中,把字str2 符串str1中下标为偶【解析】填空1:本题数的字符保存在字符考查对标准输入函数串str2中并输出。例scanf()的调用格式,当第 12 页 共 13 页 输入字符串时,格式控制字符串为″%s″,题目要求输入的字符串保存在str1中,所以地址表列应为字符串的首地址,即为str1。填空2:本题考查对标准输出函数printf()的调用格式,当输出为字符型变量时,格式控制字符串为″%c″。填空3:题目要求将str1中下标为偶数的字符保存在字符串str2中并输出,所以printf()函数的输出表列是str2 2. 改错题 在主函数中从键盘输入若干个数放入数组中,用0结束输入并放在最后一个元素中。下列给定程序中,函数fun()的功能是计算数组元素中值为负数的平均值(不包括0)。 例如:数组中元素的值依次为43,-47,-21,53,-8,12,0,则程序的运行结果为-25.333333。 请改正程序中的错误,使它能得到正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序: #include double sum=0.0; int c=0, i=0; /**********************found***********************/ while(x[i]==0) { if(x[i]<0) { sum=sum+x[i]; c++; } i++; } /**********************found***********************/ sum=sum\\c; return sum; } main() {int x[1000]; int i=0; clrscr(); printf(\some data(end with 0) :\ do { scanf(\ }while(x[i++]!=0); printf(\} 答案及评析:(1)错误:while(x[i]==0)正确:while(x[i]!=0)(2)错误:sum=sum\\c;正确:sum=sum/c; 【解析】错误1:此处考查的是对循环条件的理解,当被判断的数组元素为0时,说明这是数组的最后一个元素,此时要跳出循环。 错误2:C语言中的除法运算符是\,而不是\\\。 3. 编程题 请编写一个函数int fun(int *s,int t,int *k),用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元中。 例如,输入如下整数: 234 345 753 134 436 458 100 321 135 760 则输出结果为6,100。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include main() { int a[10]={234,345,753,134,436,458,100,321,135,760},k; clrscr(); fun(a, 10, &k); printf(\%d\\n \k, a[k]); } 答案及评析: int fun(int *s,int t,int *k) { int i; *k=0; /*k所指的数是数组的下标值*/ for(i=0;i return s[*k]; /*返回数组的最小元素*/} 【解析】本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应让*k的值为数组中的某一下标值,即*k=0。 第 13 页 共 13 页