《2022-2023学年山东省莱芜市全国计算机等级考试C语言程序设计真题一卷(含答案).docx》由会员分享,可在线阅读,更多相关《2022-2023学年山东省莱芜市全国计算机等级考试C语言程序设计真题一卷(含答案).docx(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2022-2023学年山东省莱芜市全国计算机等 级考试C语言程序设计真题一卷(含答 案)学校:班级:姓名:考号:一、单选题(12题)1.有以下程序:#include#define S(x)4*(x)*x+1main ()int k=5, j=2;printf(n%dn, S(k+j);程序运行后的输出结果是()o A. 197 B.143 C.33 D.282 .以下关于顺序存储结构的叙述中,()是不正确的。A.存储密度大B.逻辑上相邻的结点物理上不必邻接C.可以通过计算机直接确定第i个结点的存储地址D.插入、删除运算操作不方便3 .若函数中有定义语句:int a ;,则()0A.系统将自动给
2、a赋初值为0 B.系统将自动给a赋初值一1 C.这时a中 的值无意义D.这时a中无任何值值乘以m。例如,若m的值为2, a数组中的值为a=l 927则返回主程序后a数组的值应为2 182 14注意:部分源程序给出如下.请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include #include #define N 5 int fun(int a N, int m) main()(int aN N,m, i, j;clrscr ();printf *The arrayn);for (i=O; i N; i+)/*输出一
3、个随机的5x5矩阵*/ for(j=0;j =3); /*产生一个上于3的随机数*/ printf (m=%4dn, m);fun (a,m);printf (THE RESULTnH);for (i=0; i N; i+)for(j=0;j N;j+)printf (,%4d,ai j); printf (n) )29.学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入 结构体数组s中,请编写函数fun(),它的功能是:把指定分数范围内的 学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。 例如,输入的分数是60和69,则应当把分数在60到69的学生数据进 行输出,包含6
4、0分和69分的学生数据。主函数中把60放在low中, 把69放在heigh中o注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括 号中填入所编写的若干语句。试题程序:#include #define N 16 typedef struct char num10; int s ;STREC;int fun (STREC *a, STREC *b, int l,inth) main ()(STREC s N= nGA005M, 85 , nGA003; 76 , GA002, 69, nGA004H, 85, “GA001,96 , “GA007”, 72
5、, “GA008,64, “GA006,87 , GA015,85, HGA013, 94, nGAO 12, 64 , ,GA014,1,91, nGA0UM,90, ,GA017,64 , nGA018,64 , nGA016, 72 ) ;STREC h N, tt;FILE *out;int i, j, n, low, heigh, t;printf(uEnter 2 integer number low & heigh: );scanf(H%d%d ,&low, &heigh);if (heigh low)t=heigh;heigh=low; low=t; n=fun (s,h, l
6、ow, heigh);printf (The students data between %d%d: n , low, heigh);for (i=O; i n; i+)printf(n%s %4dn n,hi .num, hi.s);/*输出指定分数范围内的学生记录*/printf(Hn );ut=fopen (Hout74.dat, nw)fprintf(out, n%dn M,n)- n=fun (s,h, 80, 98);for (i=0; i n-1; i+)/*分数在8098之间的学生记录按他数从低到高排序*/for (j=i+l; j hj .s)tt=h i ;h ii =h
7、j ;h j =tt; for (i=0; i n; i+)fprintf(out, %4dn H,hi .s);fprintf(out, nn ); fclose (out);30.函数fun的功能是:将s所指字符串中除了下标为奇数、同时ASCII 值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成 的一个新串放在t所指的数组中。例如,若s所指字符串中的内容为:“ABCDEFG12345G其中字符A的 ASCII码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字 符1的ASCII码值为奇数,所在数组中的下标也为奇数,因此不应当删 除,其他依此类推。最后t所指的数组中的内容应
8、是:“135”。注意:部分源程序存在文件PROG1 . C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括 号中填入你编写的若干语句。1234567891011121314include tinclude void fun(char *s, char t()main ()(char s(100, t 100 ;void NONO ();printf(nnPlease enter string S:M); scanf(H%sMr s);fun(sr t);printf(wnThe result is:%snwrt);NONO O ;)15161718void NONO ()
9、本函数用于打开文件,输入数据,调用函 数,编出数据,关闭文件.*/char s (100), t 100;FILE *rf# *wf ;19 int i ;20212223242526272829rf , fopen(in.dat,rw); wf fopen(Mout.dat,nww); for(i - 0 ; i 10 ; i+)( fscanf(rf, n%sn, s); fun(s, t);fprintf(wfrw%snw/ t);fclose(rf);fclose(wf);31.请编写一个函数fun,它的功能是:找出一维整型数组元素中最大的 值和它所在的下标,最大的值和它所在的下标通过
10、形参传回。数组元素 中的值已在主函数中赋予。主函数中x是数组名,n是x中的数据个数,max存放最大值,index存 放最大值所在元素的下标。3456789101112131415161718192021222324252627注意:部分源程序存在文件PROGI . C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。finclude linclude void fun (int a (, int n , int *max, int *d) main ()(int 1, x20 t max , index, n - 10; void NONO (
11、);for (iO/i n;i+*) (x(i) - rand() %50; printf(M%4dwr x(i);)printf(nw);fun(x, n , &max, aindex);printf (MMax -%5d , Index %4dnr max, index);NONO();void NONO ()(/*本函数用于打开文件,输入数据,调用函 数,输出数据,关闭文件./FILE *fp, *wf ;int i, x20, max, index, n=10, j;fp - fopen(in.datrr);wf fopen(out.datrw);for(i = 0 ; i 10 ;
12、i+)(for(j - 0 ; j n ; j+) fscanf(fp, %d, &xj);fun (x, n , &max, index);fprintf(wfrMMaxa%drIndex-%dnHr max, index);fclose(fp);fclose(wf);28 32.函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的 整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c 的千位和十位上,b中的十位和个位数依次放在变量c的个位和百位上。 例如,当a=45,例12。调用该函数后,c=4251o注意:部分源程序存在文件PR0G1 . C中。数据文件IN . DA
13、T中的数 据不得修改。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括 号中填入你编写的若干语句。12345678910111213linclude void fun (int a, int b, long *c)void NONO ()/*本函数用于打开文件,输入数据,调用 函数,输出数据,关闭文件./FILE *rfr *wf ;int I, a,b ; long c ;rf - fopen(win.datHrHr);wf - fopen(out.datwrHww);for(i - 0 ; i 10 ; i+) fscanf (rf r *d,*d”, &a, &b);1
14、41617181920212223242526fun(a, b, &c);fprintf(wfr a-%d,b-%d,c-%ldn, a, b, c);)fclose(rf);fclose(wf);)main() int a,b; long c;void NONO (); printf(Input a, b:M);scanf(%d%dnr &a, &b); fun(a, b, &c);printf(The result is:%ldn,c); NONO O ;27 i )33.请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素 数存入xx所指的数组中。例如,若输入17, 5,则应输出
15、:19, 23,29, 31, 37o注意:部分源程序在文件PROGL C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花插2345678910111213141516171819202122232425262728293031号中填入你编写的若干语句。finclude Void fun(int m, int k, int xx()Main()(int m, n, zz 1000 ;void NONO (); printf(HnPlease enter two integers:M);scanf(%d %dw, &m, &n);fun(m, n, zz);for(m 0
16、 ; m Void NONO ()/*本函数用于打开文件,输入测试数据, 调用fun函数,输出数据,关闭文件.*/int m, n, zz 1000, i ;FILE *rf, *wf ;rf - fopen(in.datMrr);wf - fopen(out.dat/w);for(i 0 ; i 10 ;(fscanf (rf, %d %d, &m, &n);fun (m, n, zz);for (m - 0 ; m n ; m+) fprintf (wf, H%d , zz(m);fprintf(wf, wnM);)fclose(rf);fclose(wf);34.请编写函数fun(),其
17、功能是:将所有大于1小于整数m的素数存入xx所指数组中,素数的个数通过k传回。例如,输入25,则应输出2 3 5 7 11 13 17 1923O注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include #include void fun(int m, int *k, int xx)( main()(int m, n, zz100;clrscr();printf(/nPlease enter an integer number between 10 and 100 :);scanf(u%d, &n);fun
18、(n, &m, zz);printf(HnnThere are%d prime numbersless than %d : , m, n);for(n=0 ; n m ; n+)printf(nn %4d”,zznj);)(28)以下对C语言中联合类型数据的正确叙述是(四、单选题(0题)35.4插入和删除只能在一端进行线性表,称为0。A.队列B.循环队列C.栈D.循环栈5 .设 x=011050,则 x=X&01252 的值是()。A.0000001000101000B.C.0000001011100010D. 6 .结构化程序所要求的基本结构不包括A.顺序结构B.GOTO跳转C.选择(分支)
19、结构D.重复(循环)结构7 .由权值分别为3,8,6,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为 OA.24 B.48 C.72 D.538 .在位运算中,操作数每右移一位,其结果相当于()A.操作数乘以2 B.操作数除以2 C.操作数除以16 D.操作数乘以169 .有以下程序:#include main()(int k=5;while(k)printf(“d”,k-=3);printf(n”);A)定义了联合变最后,即可引用该变量或该变量中的任意成员B) 一个联合变量中可以同时存放其所有成员C)联合中的各个成员使用共同的存储区域D)在向联合中的一个成员进行赋值时,联合中其他成员的
20、值不会改变五、单选题(0题)36.有以下程序段 intn=0, p /io scanf(%d”, &p) ;n+ ; while (p!=12345& n 3);此处do-while循环的结束条件是A.P的值不等于12345并且n的值小于3B.P的值等于12345并且n的值大于等于3C.P的值不等于12345或者n的值小于3D.P的值等于12345或者n的值大于等于3六、单选题(0题)(16)当a=l、b=2、c=3、d=4时,执行下面程序段后,x的值是(iftab)if(cd) x=l;elseif(ac)if(bd) x=2;else x=3;else x=6;else x=7;37 A)
21、 1B) 6C) 3D) 2参考答案LB此程序考查带参数的宏定义,S(k+j)展开后即4*(k+j)*k+j+l,所以结果 为143,答案为B。2.B3 .C用血方法定义变量时,编译器仅为变量开辟存储单元,并没有在存储 单元中放任何值,此时变量中的值是无确定的,称变量值“无意义 因此,本题正确答案为c。4 .C5 .A本题考查按位与运算,按位与就是相同为1,不同为0,把x=011050 化成二进制为把01252化成二进制为 0000001010101010,两者相与得 OOOOOOlOOOlOlOOOo6.BB【解析】1966年Boehm和JaCopini证明了程序设计语言仅仅使用 顺序、选择
22、和重复三种基本控制结构就足以表达出各种其他形式结构的 程序设计方法。7.D8.B9 .A“-k”是先自减再使用,所以第1次判断条件即while(4),条件为真输 出k的值,k=4-3,结果为1 ;第2次判断条件即while(0),条件为假, 结束循环,输出回车换行符。故本题答案为A选项。10 .D11.C 12.C学号是学生表S的主键,课号是课程表C的主键,所以选课表SC 的关键字就应该是与前两个表能够直接联系且能唯一定义的学号和课 号,所以选择C项。13.1 3 21 3 2解析:本题考核的知识点是for循环与switch语句的综合 运用。主函数中用了一个for循环,for循环里嵌套了一个s
23、witch语句, for循环了三次,当i=9时,i/10=0,执行switch语句中case。分支,m 和n的值各加1,变为1和1,然后遇到breake语句,退出switch语句; 当i=10, i/10=l,执行switch语句中default分支,使k和n的值各加 1,变为1和1,退出switch语句:当仁11时,i/10=l,执行switch语 句中default分支,k和n的值各加1变,为2和3,退出switch语句, 循环结束。故该空格处应该填1 3 2。14.视图表视图表解析:关系数据库中通常有3种关系,即基本关系(又 称基本表或基表)、查询表和视图表。基本表是在机器中实际存储数据
24、的 表。查询表是查询的结果所对应的临时表。视图表是由基本表或其他视 图表导出的表,是不实际存储数据的表。视图表是一个虚表。15.2 5 8 11 142 5 8 11 14解析:本题通过while和if语句,求得出1 15之间与3取模为2的整数,并依次输出。16.00解析:已知a=10, b=20,所以逻辑表达式ab的值为true,即为 1,在这个表达式前面有一个逻辑运算符!,表示反操作,所以整个语句 的值应当为false,即为0。17.5858解析:本题中处理二维数组元素用了两重循环,外循环变量i表 示数组的行,内层循环变量j表示数组的列。在第二重循环中首先判断 数组元素的值是否小于0,若是
25、则处理该行的下一个元素:若不是则判 断田的值是否等于0,若等于0则退出内层循环开始处理下一 行;其他情况下,把的值加到变量s中。所以本程序段的功能是 把每行值为0的元素前面的所有大于。的元素值加到变量s中。18.11解析:if else语句的功能是:若表达式的值为真,执行语句1,并 跳过其他语句,执行if else语句的下一条语句,若表达式的值为假,跳 过语句1,执行语句2,依次往下判断。题中,x=3, y=2,第一个if语 句的控制条件x 0 为真,执行 d=b ;因为 c.name=Anhua,d.name= Shangxian,所以 strcmp(c.name,d.name) 0 不成立
26、,不执行 d二c ;最后输 出 d.sno 和 d.name 的值分别为 2002, Shangxiano21 .4 5 994 5 99解析:本题是一个陷阱题,以书写格式来考查考生对if 语句的理解开语句只对紧跟其后的一条语句或语句块产生作用。因此, 题目中两条if语句只有t=a ;和t=b是if的子句。第I条if语句中b a为假,所以跳过语句匚a;,执行a=c;c=t;后,a=5、b=4、c=99。第2 条if语句的判断条件ac&bc为真,所以后面三条语句都被执行, 这三条语句构成一次a和b的内容交换。所以最后输出的结果是:4 5 99 o23.s%10*sl+t24 .完整性控制完整性控
27、制25 .void fun(char. *a) int i j=0; for (i=0;a i !=,0;i+) if (ai I) a u+曰i; /*若不是要删除的字符的则留下*/ a UI = O; /*最后加上字符 结束符*7 Jvoid fun(char. *a)rn rn int i, j=O;rn for (i=0;a i !=W;i+)rn if(ai l=*)rn a j+=a i; /*若不是要删除的字符*则 留下*/1用=0,;/*最后加上字符结束符尔/3解析:同样的问题 我们在前面也碰到过,本题中是删除多余字符(*)。所以用循环从字符 串的开始往后一个一个进行比较,若不
28、是要删除的字符(用ifai!二田)来 控制)则留下。注意下标变量j要从0开始,最后还要加上字符串结束符 WOo12345678926.10double s 1,0,y x ;int i ;long kl;for(i w 1 ; i - n ; i+)( kk*i;s + y / k ;y x ;解析:该程序功能是计算return s ;并输出多项式值。根据题干中给出的数列,首先推出每一项的表达式, 然后再对多项式进行累加求和。1 i long w;2 w-hw1000+5;27.3 ! return(float)w/1000; 解析:该程序功能是进行四舍五入。 其中,通常求实数x保留m位小数,
29、首先将x扩大倍,扩大后的 x加上5后,进行截取判断,最后进行恢复。28.int fun(int a N int m) int ij; for (i=0; i N; i+) for (j=i;j N; j+) a i j =a i j *m; /*右上半三角元素中的值乘以 m*/ int fun(int a N, int m)rn rn int ij;rn for (i=0; i N; i+)rn for (j=i; j N; j+)rn a ij U =a i j *m; /*右上半三角元素中的值乘以m*/rn 解析:本题考查 表示右上关三角元素的算法。行下标肯定是从。到N-1,而列下标要根
30、据行下标来定,当到第i行时列下标要从第i列开始,所以我们在编写 程序时,第2个for()中有j=i(不是1);若要表示左下半三角元素时,行 下标也是从。到N-1,列下标也是从0开始,但当到第i行时列只到i。 所以要把上述的第2个for。改成ford=0;j 4+)。29.int fun (STREC *a STR EC *b int 1 int h ) int i j=0; for (i=0; i -1&a ij. s =h) /*将分数高于1低于h的学生记录存在于结 构体数组b中*/bj+=ai; returnj;/*返回分数范围内的学生人数*/ int fun (STREC *a, STR
31、EC *b, int 1, int h )rn rn int i, j=0;rn for (i=0; i -l&a i. s =h) /*将分数高于 1,低于 h 的学生 记录存在于结构体数组b中* Arn bfj+=afi;rn return j; /*返回分数范 围内的学生人数*Arn解析:处理此类分段统计问题,可采用多分支选 择语句或条件选择语句。此处采用条件选择语句解答,具体见参考答案。 使用条件选择语句进行分段统计时应当注意分段范围。int i, j-0;for(i-1; Kstrlen(s); i32) if (i%20 “解析:该程序功能是将字符串中除了下标为奇数、ASCII值也
32、为奇数的字符外,其余的全都删 除。解题过程利用if判断表达式选择符合条件的字符,然后将符合条件 的字符放入指定的字符串。123 45631.7int 1;*max-a (0; *d-0; /* 把*1组的第 1 个元 素值跋值给最大值变量*max */ for(i-1; in;if (max1),所以判别n是否 为素数,只要用2n-1这些数逐个去除n,判断余数是否为0即可。只要有一次余数为0, n就不是素数,否则n为素数。它的解题思路,可以分解为以下几步:判断是否为素数一判断素数个 数是否满足要求一存储素数到指定的数组。(2)从己给部分源程序的main主函数开始入手,核心函数“fun(m, n
33、, zz);”中的参数由题目可知,zz存放素数,n为要求的素数个数。34.void fun(int mint *kint XX) int ijtn=0 ; for(i=2;i m;i+) 3找出大 于 1 小于整数 m 的素数*/ 曰;forQ=2 ; ji ; j+) if(i%j=0) t=0 ; break ; if(t=l)xxn+=i ; *k=n ; /*返回素数的个数*/ void fun(int m, int*k, intXX)rn rn inti, j, t, n=0 ; rn for(i=2;i m;i+)/*找 出大于 1 小于整数 m 的素数*Arn rn t=l ;
34、rn for(j=2 ; j i ; j+) rn if(i%j=0)rn rn t=0 ; rn break ; rn rn if(t=l)rn xxn+=i ; rn rn *k=n ; /*返回素数的个数*/rn 解析:这道题是考查一个数 是不是素数,只要掌握了判断素数的方法,问题便能顺利解决,请以此 题为例,掌握判断素数的方法。35.C36.D解析:本题考查的知识点是do-while循环结构循环执行条件的判 断.使用do-while语句必须注意以下几点:先执行语句,后判断表达式。所以,无论一开始表达式的值为“真”还是 “假: 循环体中的语句至少执行一次,这一点与while不同,如果do
35、-while语句循环体部分是由多个语句组成,则必须用花括号括起 来,使其形成复合语句。C语言中的do-while语句是在表达式“真”时重复执行循环体。在本题中,循环执行判断条件为while后面括号里的表达式即 p!=12345&n3(意思为p不等于12345且n小于3)是否为“真 由此 可得循环结束的条件为:P大于12345或者p小于12345又或者n大于 等于3。选项A的意思是:p的值不等于12345并且n的小于3和while 后面括号里的表达式等价是循环执行的条件而不是循环结束的条件,所 以选项A不正确;选项B的意思是:p的值等于12345并且n的值大于 3,不是循环结束的条件一个子集,所
36、以选项B不正确;选项C的意思 是:P的值不等于12345或者n的值小于3前一半是结束条件的子集, 后一部分不是结束条件,所以选项C不正确;选项D描述的意思是:p 的值等于12345或者你的大于等于3是结束条件的子集,所以选项D满 足题意。所以4个选项中D正确。37.A程序运行后的输出结果是()OA.l B.2 C.4 D.死循环(31)以下语句定义正确的是(A) intal4= 1,2,3,4,5;B) floata3=l,2,3);C) longa23= I,1,2,1,2,3,0,0; D) doublea3=0;11 .设“inta=15,b=26;”,则加屈矍%5%(1声力);的输出结
37、果是()。A.l5 B.26,15c.i5,26 D.2612 .设有表示学生选课的三张表,学生S(学号,姓名,性别,年龄,身份 证号),课程C(课号,课名),选课SC(学号,课号,成绩.,则表SC的 关键字(键或码)为0A.课号,成绩B.学号,成绩C.学号,课号D.学号,姓名,成绩二、2.填空题(12题)13 .以下程序运行后的输出结果是omain()(int i, m=0, n=0, k=0 ;for(i=9 ; i=ll ; i+)switch(i/10)(case 0 : m+ ; n+ ; break ;case 10 : n+ ; break ;default : k+ ; n+
38、;printf(H%d %d%dn, m, n, k); )14 .关系可以有3种类型,即基本关系(又称基本表或基表)、查询表和 o15 .以下程序的输出结果为【】。main() int k=l;white(k =15)if(+k%3! =2)continue;else printf(n%d ”,k);printf(nn); )16 .若a=10, b=20,则表达式!(a b)的值是o17 .若有以下程序main ()int a4 4=l,2;-3,-4,0,-12,-13,14 , 21,23,0,-24,-31,32,-33;0;int i,j,s=0;for(i=0;i 4;i+) f
39、or(j=0;j 4;j+)if(aij 0) continue;if(aij=0) break;s+=aijj;)pnntf(H%dnu,s);执行后输出结果是18 .下列程序的输出结果是 #include main() int x=3,y=2,z=l;if(x y) if(y 0) z=0;else z+=l; prinlf(dn”,z);)19 .程序的运行结果为【】。main() charcl-a,c2=,b,c3-c,;printf(a%cb%ctc%cn,c 1 ,c2,c3);)20 .在算法的4个特性中,算法必须能在执行有限个步骤之后终止指的是算法的 特性。21 .以下程序的运
40、行结果是【】。#include #include typcdef struct student char name10;long sno;float score;)STU;main() STU a= uZhangsan;2001,95 ,b= nShangxianH,2002,90),c= Anhua”,2003,95 ,d 产 p=&d;d=a;if(strcmp(a.name,b.name) 0) d=b;if(strcmp(c. name, d. name) 0)d=c;printf(%ld%sn,d.sno,p- name); )22 .以下程序运行后的输出结果是omain() int a=3, b=4, c=5, t=99 ;i(b a & a C) t=a ; a=c ; c=t ;if(a c & b C)