《2021年湖北省宜昌市全国计算机等级考试C语言程序设计真题(含答案).docx》由会员分享,可在线阅读,更多相关《2021年湖北省宜昌市全国计算机等级考试C语言程序设计真题(含答案).docx(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2021年湖北省宜昌市全国计算机等级考试C语言程序设计真题(含答案)学校:班级:姓名:考号:一、单选题(12题)1 .在一个链式队列中,假设f和r分别为队头和队尾指针,则插入S所指结点的运算是()。A.f-next=s;f=s;B.r-next=s;r=s;C.S-next=rr=s;D.r-next=f;f=s;2 .以下涉及字符串数组、字符指针的程序段中,没有编译错误的是 ()OA.char *str, name 1; str=Helk)”;B.char * str, namel; name=uHellov;C.char strl 10=exl.c, str26; str2=strl;D.
2、char head linef ; head_line=0;3 .下列不属于软件调试技术的是。A.强行排错法B.集成测试法C.回溯法D.原因排除法4 .若在线性表中采用折半查找法查找元素,该线性表应该()A.元素按值有序B.构采用顺序存储结C.元素按值有序且采用顺序存 储结构D.元素按值有序且采用链式存储结构JSTREC ;STREC fun(STREC *a, int b)() main()(STREC sN)=6GA005,I 76, “GA003”, 89, printf(tThe original data : n);“GA002,64,“GA007”, 65,“GA015”, 85,
3、“GA014”,60,“GA018”, 98,STREC h ;int m ;int i, n ;FILE *out ;“GA004”, 75,“CA008,96,“GA013”, 78),“GAO 11,73,“GA016”, 94“GA001”,88,“GA006”,69,(GA012”, 62,“GAO 17”, 72,for(i=0 ; iN ; i+) if(i%4=0)prin氓叭n”);/*每行输出4个学生记录可printf(s%3d”,si . num, si.s); printfl(4tnnEnter the score :);scanf(d”, &m);h=fun(S, m
4、); printf(fciThe data :);printf(n%s %4dn,h.mum, h.S);printf(“n”);ut=fopenC4out24.dat,I “W”);h=fun(s, 85);fprintf(out, S %4dn”, h.num, h.S);fclose(out); )29.请编写函数fun(),其功能是:计算并输出给定10个数的方差。s=l(x,-x,2)/io 产其中r=(xT)/!o /I例如,给定的 10 个数为 95.0, 89.0, 76.0, 65.0, 88.0, 72.0, 85.0,81.0, 90.0, 56.0,则输出为 S=11.7
5、30729。注意;部分源程序给出如下.请勿改动主函数mam和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include double fun(double x10) main() (double s,xiO=95.0,89.0,76.0,65.0,88.0,72.0,85.0,81.0,90.0,56.0;int i;printf(nThe original data is:nH);for(i=0;i 10;i+)printf(n%6.1fu,xij);printf(Hnn n);s=fun(x);printf(s=%fnn ,s);)30
6、.请编写一个函数int fun (int *s, int t, int *k),用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元中。例如,输入如下整数:234 345 753 134 436 458 100 321 135 760则输出结果为6, 100。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include int fun(int *s, int t, int *k)( ) main()int aL10J=234, 345, 753, 134, 436, 458,100,
7、321,135, 760), k ;clrscr();fun(a, 10, &k);printf(n%dr %dn, k, ak); )31.请编写函数fun(),函数的功能是求出二维数组周边元素之和,作为 函数值返回。二维数组中的值在主函数中赋予。例如:若二维数组中的值为13 5 7 9299946999813 5 70则函数值为61。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include #define M 4#define N 5int fun( int a MN)main() i
8、nt aaMN= 1,3,5,7,9,2,9,9,9,4), 6,9,9,9,8, l,3,5,7,0;intij, y;clrscr();printf (The original data is :n *);for(i=0; i N;i+)for(j=0;jN;j+)printf(M%6d H,aaij);printf(nn );)y=fun(aa);printf(nThe sun:%dn n,y);printf(nnn);32.程序定义了 NxN的二维数组,并在主函数中自动赋值。请编写函数fun(intaNL intn),该函数的功能是使数组左下半三角元素中的值加上n。例如:若n的值为3,
9、 a数组中的值为a=2 5 41 69537则返回主程序后a数组中的值应为55449986 10注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数full的花括号中填入所编写的若干语句。试题程序:#include #include #include #define N 5fun(int aJN, int n)( main()(intaINJIN, n. i, j ;clrscr();printff* The array *n);for(i=0 ; iN ; i+)/*产生一个随机5*5矩阵*/(ford=O ;j =5);printf(n=%4dn, n);fun
10、(a, n);printf(*THE RESULT*n”);for(i=0 ; iN ; i+)(for(j=0 ; jN ; i+)printf(n%4d; aij);printf(nnn);) )33 .请编写一个函数void fun(inlm, intk, int xx),该函数的功能是将大于整数m且紧靠m的k个非素数存入所指的数组中。例如,若输入15, 5,则应输出16, 18, 20, 21, 220注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include void fun(in
11、t m, int k, int xxlJ)( ) main()(int m, n, zz 10001 ;clrscr();printf(HnPlease enter two integers :);scanf(u%d%dM, &m, &n);fun(m, n, zz);for(m=0 ; m n ; m+)printf(d”, zzm);printf(Hn);)34 .请编写一个函数voidfun(intm, intk, intxx),该函数的功能是:将大于整数m且紧靠m的k个素数存入所指的数组中。例如,若输入17, 5,则应输出19, 23, 29, 31, 370注意:部分源程序给出如下。
12、请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include void fun(int m, int k, int xx) () main()(int m,n, zz1000;clrscr();printf(nnPlease enter two integers:);scanf(u%d%dn,&m,&n);fun(m,n,zz);for(m=O;m n;m+)printf(%d *,zzm);printf(nn );四、单选题(0题)35 .以下程序中函数reverse的功能是将a所指数组中的内容进行逆置。void r
13、everse(int a , int n) int i, t; for(i=0;i n/2;i+) t=ai; ai =an-l- i;an-l-i=t; main() int b10= 1,2,3,4,5,6,7,8,9,10; int i, s=0; reverse(b,8); for(i=6;i 10;i+) s+=bi; printf(%dn s);程序运行后的输出结果是A.22 B.10C.34 D.30五、单选题(0题)36 .(33)有以下程序:.#include #include string.hvoid fun(char *s,int n) char *t;int ij;fb
14、r(i=0;in-l;i-H-)fbr(j=i+ljstrlen(sj) t=si;si=sj;sj=t;main()(char*ss)=bcc”,”bbcc*“xy,“aaaacc”,“aabcc“;fiin(ss,5);printf(%s,%sn,ss0,ss4);程序的运行结果是( )oA) xy,aaaaccB) aaaacc,xy C) bcc,aabcc D) aabcc,bcc六、单选题(0题)37 .有以下程序:#includestruct stu int num; char name10; int age; ; void fun(struct stu*p) printf(,%
15、sn, p-name); main () struct stu x31= 01, Zhang1, 20), 02, Wang, 19, 03,nZhaOn, 18;fun(x+2); )程序运行后的输出结果是()o A.Zhang B.Zhao C.Wang D.19参考答案LB2.AC语言中,字符指针变量可以直接使用字符串赋值,而字符数组不能 直接使用字符串或字符数组赋值,选项B、C、D错误,选项A正 确。故本题答案为A选项。3.B解析:我们严格区分调试与测试,调试是已知有错误而来找错误, 是被动的;测试有很多种,比如未发现错误但不能保证程序没错而来找 BUG,还比如我们运行测试程序是否符合
16、用户的要求,是主动的。所以 答案是选项B。A、C、D都是具体的程序调试方法,而B是宏观的程5 .二维数组A按行顺序存储,其中每个元素占1个存储单元。若All 的存储地址为420, A33的存储地址为446,则A55的存储地址为A.470B.471 C.472 D.4736 .顺序查找法适合于存储结构为()的线性表。A.散列存储B.顺序存储或链式存储C.压缩存储D.索引存储7 .P指向线性链表中某一结点,则在线性链表的表尾插入结点s的语句 序列是0。A.while(p-next!=NULL)p=p-next;p-next=s;s-next=NULL;B.while(p!=NULL)p=p-nex
17、t;p-next=s;s-next=NULL;C.while(p-next!=NULL)p=p-next;s-next=p;p-next=NULL;D.while(p!=NULL)p=p-next-next;p-next=s;s-next=p-next;8 .以下程序中,while循环的循环次数是main() int i=0 ;while(i 10) if(i =0&si =48&si =57 或 si =si&,0, =si或O =si或 si =48 或 57 =si&48 =sisi =V&si =48&si =57 或 si 或9 =si&,0, =sij 或O =sij 或 si =
18、48 或 57 =si&48 =si或 48 =si解析:字符数组的初始化,字符串的输入和输出的应用。C语言没 有字符串变量,字符串不是存放在一个变量中而是存放在一个字符型数 组中,因此为了存放字符串,常常在程序中定义字符型数组;字符串存 放在字符数组中,但字符数组与字符串可以不等长,C语言规定以“0” 字符作为字符串结束标志。本题中,char s80, d80;定义了两个字符型数组,可以放入80个字 符。gets函数是c语言提供的一个专门用于读字符串的函数,它读入全 部字符(包括空格),直到遇到回车为止。本题中,读入字符串S后,开 始比较S中的每个字符是否为数字字符,因为字符数据在内存中以相
19、应 的ASCII码存放,所以只需比较相应的ASCII码值是否在48(0的ASCII 代码)与57(9的ASCII代码)之间,或者直接与O. 9进行比较,如果是 数字字符则将此字符存入d数组中,不是则继续进行下一字符的比较, 直至s结束(即。的出现)。将卬0。字符作为字符串d结束标志,最后调 用puts函数输出d。所以在空格处应填入比较语句sij =10,&si =48&si =57 或 si =O或9 =si&0, = si或 si = 48 或&48 = si。14.1030010300解析:本题的scanf()函数要求用户输入三个十进制整 数,但只接受第一和第三个到函数的第二和第三个参数所
20、指的内存地址 中。所以本题的输出为:10 30 0。15 .arowcol max 或 arowcolj =max 或 max =arowcolK max alrowjcol) max max 或 max =maxarowcol max 或 arowcol =max 或 max =arowcol或 max arowcol) rnmax max 或 max =max 解析:本题有两层for循环,主函数中定义了整型变量row、col、max 和min,其中row用来存放外循环中的循环次数,col用来存放内循环 中的次数,max记录每行中的最大值,min记录所有行中最大值中的最 小值。在内循环中,首
21、先给max赋初值为每行的第。列元素值,然后从 第一列开始依次与max进行比较。如果大于max则将其值赋给max. 当每一行循环结束,max记录了每一行的最大值。所以第一个空应该填 arowcol max arowcol =max0退出内循环,在第一次退出内 循环时,将min赋初值为第。行的max,然后在每次退出内循环时,将 min和每行的max比较,如果大于max,则将max值赋min,所以第二 个空应该填maxmin或mm max,当退出外循环时,min为所有行中 的最大值的最小值。16 .可重用性可重用性解析:继承的优点:相似的对象可以共享程序代 码和数据结构,从而大大成少了程序中的冗余,
22、提高软件的可重用性。17 .软件危机的出现软件危机的出现18 .数据库概念设计数据库概念设计解析:数据库概念设计的目的是分 析数据间内在语义关联,在此基础上建立一个数据的抽象模型。19 .p+=2*(p+)p+=2, *(p+)解析:由题可知a2=3,因此只要使指针p 指向a3,然后再引用指针的值就可以了。20 .实体实体解析:在E-R图中用矩形表示实体;椭圆形表示属性;菱形 表ZF联系。21 .软件开发22 .数据存储数据存储23.sjfi;j+;sj=si;j+;解析:本题中相当于字符串s中存储着含有 空格的字符,当发现空格的时候就用这个空格字符后面的字符前移覆盖 这个空格字符,依次类推向
23、后继续。因此,应填sj=s用;j+ ;两条语句。24 .一对多一对多解析:由于一个项目主管可以管理多个项目,而一个 项目只能有一个项目主管,“项目主管”这个实体与“项目”这个实体的管理关系嘱于一对多。25 .double fun(int n) int i j=0; double s=0; for (i=3; i =n;i+) for(j=2; j i; j+) if(i%j=O) break; if(j=i) s=s+sqrt(i); return s; Jdouble fun(int n)rn rn int i,j=0;rn double s=0;rn for(i=3; i =n;i+)rn
24、 rn for(j=2; j i;j+)rn if(i%j=0)rn break;rn if(j=i)rn s=s+sqrt(i);rn rn return s;rn 26 .void fun(char *wint m) int ij ; chart ; for(i=l ; i =m ; i+) /*进行 m 次的循环左移*/ t=w0 ; for(j=l/wjl!=Or; j+) /*从第 2 个字符开 始以后的每个字符都依次前移一个字符*/wU-l=wj ; wU-l=t;/*将 第1个字符放到最后一个字符中*/ 1 void fun(char *w, int m)rn rn inti,
25、j ;rn chart ;rn for(i=l ; i =m ; i+)/*进行 m 次的循环左移*Arn t=w0 ; rn for(j=l/w|j!=W ; j+) /*从第2个字符开始以后的每个字 符都依次前移一个字符*八3wj-l=wj ; rn wfj-l=t ; /*将第1个字 符放到最后一个字符中*/rn rn 解析:我们在学习C语言的时候, 应该广泛地应用到循环的方法,本题应采用“循环左移”的算法。即从第 2个字符开始以后的每个字符都依次前移一个字符,而原来的第1个字 符放在串中的最后一个字符。当要平移m个字符时,则要进行m次的 循环左移。内嵌的循环的作用是完成从第2个字符开始
26、以后的每个字符 都依次前移一个字符,wU-U=t的作用是将第1个字符放到最后一个字 符中。27 .void fun(char *s/char t) int ij=0 ; for(i=0 ; si!=0* ; i+) if(i%2=0 & sfil%2!=0) tj+=sfi ; /*将下标为偶数同时ASCII码值为奇数的 字符放入数组t中*/*在字符串最后加上结束标志位*/ voidfun(char *s/char t)rn int i, j=0 ; rn for(i=0 ; si!=O ; i+)rn if(i%2=0 & si%2!=0)rn t|j+=si ; /*将下标为偶数同时 AS
27、CII 码值为奇数的字符放入数组t中*/rn尸(Y ; /*在字符串最后加上结 束标志位*八巾解析:本题要求除了下标为偶数同时ASCII码值为奇 数的字符之外,其他字符都删除。即要留下下标为偶数同时ASCII码值 为奇数的字符。所以,在if的条件语句中应使用if(i%2=0&sH%2!=0)。 28.STRECfun(STREC*aintb) inti ;STRECstr=t40,-l) ;/*若没找到 指定的成绩在结构体变量中给学号置空串给成绩置-1*/ for(i=0 ;iN; i+) if(ai . s=b)/*找到指定成绩的学生记录*/str=ai ; return str ; /*
28、返回学生记录*/ STREC fun(STREC *a, int b)rn rn int i ; rn STREC -1) ;/*若没找到指定的成绩,在结构体变量中给学号置空串,给成绩置-l*Arn for(i=0 ;i N ;i+)rn if(ai . s=b)/*找到指定成绩的 学生记录*Arn str=ai ; rn relurn sir ; /*返回学生记录*Arn )解析:本 程序一开始先使结构休变量str的学号为空出,成绩为-1。题中循环体的 功能是搜索所有学生的成绩并判断是否有成绩与b所指定的成绩相同 (即找到),若找到则给str重新赋值(str=ai),若没找到则str成员的值
29、还 是原有值(即未找到时学号返回空串,成绩返回1)。29.double fun(double x101) double xl=0.0s=0.0; int i; for(i=0;i 10;i+) xl=xl+xi;xl-xl/10;/*求 10 个数的平均值*/ for(i=0;i 10;i+) s=s+(xi-xl)*(xi-xl); return sqrt(s/10);/*求 10 个数的方差*/ Jdouble fun(double x10)rn rn double xl=0.0,s=0.0;rn int i;rnfor(i=0;i10;i+)rnxl=xl+xfil;rnxl-xl/lO
30、;u3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOO u3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOO u3OOOu3OOOu3OOO/* 求 10 个数的平均值*Arn for(i=0;i 10;i+)rn s=s+(xi-xl)*(xi-x l);rnreturnsqrt(s/10);u3000u3000u3000u3000u3000u3000u3000u3000u3000u30 OOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3OOOu3O
31、OO/* 求 10个数的方差*Arn )解析:又是一道算式表达题,程序中用第1个循 环来完成求10个数的总和,接着再用xl=xl/10来求出平均值。30.int fun(int *sint tint *k) int i; *k=0 /*k 所指的数是数组的下标值*/ for(i=0;i si) *k=i; /*找到数组的最小元素把该元素的 下标赋给k所指的数刃return s*k; /*返回数组的最小元素*/ int fun(int *s, intt, int *k)rn rn int i;rn *k=0/*k 所指的数是数组的下标值*Arn for(i=0;i si)rn *k=i; /*找
32、至擞组的最小元素,把该 元素的下标赋给k所指的数*Arn return s*k; /*返回数组的最小元素*/ rn 解析:本题中直接使用指针变量k,但在使用时要注意对k的指 针运算,此外,一开始应让*k的值为数组中的某一下标值勤,即*k=0。3 Lint fun( int a MJ NJ) int ijsum=0; for(i=0;i M;i+) for(j=0;i N;j+) if(i=0|i=M-l|j=0|j=N-l) /*只要下标中有一个为 0 或 M-1 或 N-1 则 它一定是周边元素*/ sum=sum+ai皿;/*将周边元素相加*/ return sum; int fun( i
33、nt a M N)rn rn int i,j,sum=0;rn for(i=0;i M;i+)rn for(j=0;i N;j+)rn if(i=0|i二二M-l|U二0|二N-1) /*只要下标中有一个 为。或M-1或N-1,则它一定是周边元素*Arn sum=sum+aij; /*将周 边元素相加*Arn return sum;rn 解析:本题采用逐一判断的方式,周 边元素的下标一定有一个是。或M-1或N-1,且只要下标中有一个为0 或M-1或N-1,则它一定是周边元素。32 .fun (int a N int n) int ij; for(i=0; i N; i+) for(j=0; j
34、 i; j+) 使数组左下半三角元素中的值加上n*/ fun (int a N, int n)rn rn int i,j;rn for(i=0; i N; i+)rn for(j=0; j i; j+)rn aij=aij+n/*使数组左下半三角元素中的值加上n*八rn 解析:首 先从数组中找出要被加上n的那部分元素,找的过程其实就是找出将被 挑出的那部分元素在原数组中的分布规律的过程。通过观察得出,要被 处理的那部分元素的下标值的范围是每行中从第一个元素开始,直到列 数等于该行行数时为止。找到这个规律后,依次从数组中取得合乎要求 的元素,然后再加上n。33 .void fun(int m i
35、nt k int xx) int ijn; for(i=m+ln=0 ; n k;i+) / *找 大于m的非素数循环k次即找出紧靠m的k个非素数*/ forG=2;j i;j+) /*判断一个数是否为素数*/ if(i%j=O) xxn+=i; /*如果不是素数 放入数组xx中*/ break ; /*并跳出本层循环判断下一个数*/ ) void fun(int m, int k, int xxJ)rn rn int i,j,n;rn for(i=m+l, n=0 ; n k;i+) /*找大于m的非素数,循环k次,即找出紧靠m的k个非素数*/rn for(j=2;j i;j+) /* 判断
36、一个数是否为素数* / rn if(i%j=O)rn rn xxn+=i; / *如果不是素数,放入数组xx中* / rn break ; /*并跳出 本层循环,判断下一个数*/rnrn解析:本题只要掌握了判断非素 数和素数的算法即不难完成了,其实程序缺少部分也正是这部分。34 .void fun(int m int k int xx) int ijn; for (i=m+ln=0;n k;i+) /*找大于 m的素数循环k次即找出紧靠m的k个素数*/ for(j=2;j =i) /*如果是素数放入数组 xx 中*/ xxn+=i; void fun(int m, int k, int xx)
37、rn rn int i,j,n;rn for (i=m+l,n=0;n k;i+) /*找大于 m 的素数,循环k次,即找出紧靠m的k个素数*Arnfor(j=2;j =i) /*如果是素数,放入数组 xx 中*Arn xxn+=i;rn kn 解析:本题只要掌握了判断素数的算法即不难完成 了,其实程序缺少部分也正是这部分。35 .A解析:本题考查的知识点是数组名作为函数参数及函数调用。 reverse。数的功能是将具有n个元素的数组a反序存放。在主函数中调 用语句是“reversed. 8)广,实现的功能是把b数组的前八个元素逆置, 所以b数组中依次存放的值为“8, 7, 6, 5, 4, 3, 2, 1, 9, 10”。for循 环了 4次,分别把b6、b7、b和b9的值(分别是2、1、9、10)加 到了 s中,s的结果是22,所以最后输出的s值为22。所以4个选项中 A正确。36 .A37.Bfun(x+2)表示的是结构体数组中的第3个元素即03, “Zhao”, 18),而 输出的是name元素,所以答案为B。B.scanf(u%s, rec.title);C.scanf(t%s, (*ptr).title);D.scanf(%s”, ptr-title);10 .若有定义int a=5, b=7 ;,则表达式a%=(b%2)运算后,a的值为(
限制150内