2023年山东省泰安市全国计算机等级考试C语言程序设计模拟考试(含答案).docx
2023年山东省泰安市全国计算机等级考试C语言程序设计模拟考试(含答案)学校:班级:姓名:考号:一、2.填空题(10题)1.有以下程序:# include < stdio.h >main() int a口=1,234,5,6,7,8,9,10,2,12, *p=a+5, *q=NULL;*q=*(p+5);printf("d%drT,*p,*q);程序运行后的输出结果是【】。2 .设丫是int型变量,请写出判断Y为奇数的关系表达式【】。3 .对长度为10的线性表进行冒泡排序,对坏情况下需要比较的次数为4 .下程序的输出是【】。main()(char strl=nHow do you do*pl=strl;strcpy(strl+strlen(strl)/2/es shen);printf(u%snpl);)5 .汉字系统中,字库中的汉字是以【】码存在。26.请编写一个函数proc,它的功能是:求出1m(含m)能被7或11整除的所有整数放在数组a中,通过n返回这些数的个数。例如,若传给m的值为70,则程序输出:7 11 14 21 22 28 33 35 42 44 49 55 56 63 66 70注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数proc的花括号中填人所编写的若干语句。试题程序:#include<stdlib. h>#include<conio. h>#include<stdio . h>#define N 100void proc(int m, int*a, int*n)()void main(int arrN, n, k;system(nCLSn);proc(70, arr, &n);for(k=0; k<n; k+)if(k+1) % 20=0) / / 每行输出 20 个数 printf("%4d", arrk);printf(nnn);else printf("%4d", arrk);printf("n"); )27.使用VC+2010打开考生文件夹析下progl中的解决方案。此解决 方案的项目中包含一个源程序文件progl.c。在此程序中,编写程序, 实现矩阵(3行、3歹U)的转置(即行列互换)。例如,若输入下面的矩阵:100 200 300400 500 600700 800 900则程序输出:100 400 700200 500 800300 600 900注意:部分源程序在文件progl.c中。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun()的花 括号中填入你编写的若干语句。试题程序:11 #include < stdio . h >2 #include < conio.h >3 #include < stdlib.h >4 void fun (int array3 3)5678 void main ()9(10 FILE * wf;11 int i, j;12 int array 3 3 = 100,200,300, 400,500,600, 700,800,900;13 system(nCLSn);14 for (i=0;i<3;i+)15for(j=0;j<3; j+)16 printf (n% 7d n,arrayij);17printf(nn n);18 )19 fun(array);20 printf (nConverted array: n n);21 for (i=0;i<3;i+)22for(j=0;j<3;j+)23 printf("%7d ", arrayij);24 printf(!n n);25 )26 /*/27 wf = fopen(nout.datn/wn);28 for (i=0;i<3;i+)29for(j=0;j<3;j+)30 fprintf (wf/% 7d n, arrayij);31 fprintf(wf,nnM);32 33 fclose(wf);34/* und*/35 28.使用VC+2010打开考生文件夹下progl中的解决方案。此解决方 案的项目中包含一个源程序文件progl.c。在此程序中,请编写函数 fun(),它的功能是求出能整除x且不是偶数的整数,并将这些整数按从 小到大的顺序放在PP所指的数组中,总个数通过形参n返回。如x中 的值为30,则有4个数符合要求,它们是1、3、5、15。注意:部分源 程序在文件progl.c中。请勿改动主函数main()和其他函数中的任何内 容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:#include <conio.h >|2 #include < stdio.h >3: #include < stdlib>h >4 void fun (int xF int ppi r int n) 骞6.8 « void main ()9 ;适 FILE wf;漏 int xr aa 1000, nz i ;O system(WCLSM);jl printf (r,nPlease enter an integer number : n ");14scant (t,%dn/ &x);翼fun (x, aa, &n);16| for (i =0 ; i < n ; i+)17 printf (n%d ”,aa i);IS;printf (Mn M);W /found */2G wf = fopen ("out.datMrMwM);fun (30, aa, 6n);漆 for (i=0;i<n;if+)笠 fprintf (wf, "%d ”, aa L i);24 :fclose (wf);25 /* found * /« 29.请编写函数proc(),其功能是:将str所指字符串中下标为偶数的字 符删除,串中剩余字符形成的新串放在t所指数组中。例如,当str所指字符串中的内容为abcdefg,则在t所指数组中的内容 应是bdfo注意:部分源程序给出如下。请勿改动main。函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。试题程序:a irw Iwtir V .tdlih, h* *U tndudc Vcohkkifkludr >tdKK hl>s include <annc« li>raid proc<char Mr*ctMir t£) void ivuiifil)clvir >ir 10U|00) spr>ntf<*nPlc«9»e rtMer anti. »trt *>c*nf( * % b* *tr) 1 proc( wif »t>i pnniH -ftThe result utH>n * »t) t30 .假定输入的字符串中只包含字母和*号。请编写函数proc (),它的功能 是:将字符串中的前导*号全部删除,中间和后面的*号不删除。例如, 若字符串中的内容为*a*bc*def*g*,删除后,字符串中的内容则 应当是a*bc*def*g*。注意:部分源程序给出如下。请勿改动main()函数和其他函数中的任何内容,仅在函数proc ()的花括号中填入 所编写的若干语句。试题程序:3 rAcludcS Micludr Vconto. h) void proc<char Mr)end fiMiinC)rh«r wirttI Ji pntith 'Enter ge«4<xr>a proc< <ir>i pnntf( * The R(nn< after dek irdAD* > MIO . !1 1 ;四、2.程序修改题(10题)31 .下列给定的程序中,函数fun()的功能是:计算并输出k以内最大 的6个能被7或11整除的自然数之和。K的值由主函数传入,若k的 值为500,则函数的值为2925。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:#include < stdio . h > #include < conio . h > int fun(int k) int m=0, mc=0, j ;/kL*。1kL* *1/不不不不不不不不不不不不不tminri不不不不不不不不不不不不不/while(k > =2)&&(mc < 6)/kL* vL*1 *1* vL« vl* vL* kL*kL* /不不不不不不不不不不不不不tciinri不不不不不不不不不不不不不/ if(k%7=0)|(k%ll=0)m二k ;mc+ ; ) k-; ) return m ; ) main() clrscr();printf("%dn", fun(500); )32 .给定程序M0D11 . C中函数fun的功能是:输出M行M列整数方阵,然后求两条对角线上元素之和,返回此和数。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!include <stdio.h>#define M 53456789/founder ,/int fun(int n, int xx) int i, j 9 sumO;printf(MnThe %d x %d matrix:nHrM, M);for(i - 0; i < M; i+) for(j » 0; j < M; j+)10111213141516 !)printf(w%f ", xx(ij); printf("n");)for(1 - 0 ; i < n ; i+)sum " xxii*xxi(n-i-1; return(sum);181920 int aaM(4,3,2,1,0,6,7,8,9,0,(9,8,7,6,5),3,4,5,6,7;printf (wnThe sum of all elements on 2 diagnals is %d.fun(Mr aa);33.下列给定程序中,函数fun()的功能是:先从键盘上输入一个3行3列的矩阵的各个元素的值,然后输出主对角线元素之和。请改正函数fun()中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include < stdio.h >int fun()int a3 3,sum; int ij;/ 7,7,7,7,7,7,7,。 1 7" 7" 7" 7,7,7,7,7” 7, 7,/ /不小不不小不不不不小小小小tcii nd不小小不不不不不不不小不不不/sum=l;for (i=0;i < 3;i+) for(j=0;j <3;j+)/1 Kt* vl* vt* k!> kJ>k!>/不不不不不不不不不不不不不tci inri不不不不不不不不不不不不,、不/ scanf(''%d",aij);for(i=0;i < 3;i+) sum=sum+aii;printf(n Sum=%dnn, sum);)main()(fun();34 .给定程序MOD11 . c中函数fun的功能是;由形参给定n个实数, 输出平均值,并统计在平均值以上(含平均值)的实数个数。例如,n=8 时,输入:193 .199, 195 .673, 195 .757, 196 .051, 196 .092, 196 . 596, 196 . 579, 196 . 763所得平均值为:195 . 838745,在平均值以上的实数个数应为:5请改正程序中的错误,使程序能输出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!345689101112131415161718/*t* found return c;finclude <stdio.h> int fun(double x(, int n)int jr c,0, double xa-0.0;for (j«0; j<n;xa , x(j J/n;printf(wave "%fnw#xa);for (j-0; j<n; *)found, if (xj) -> xa)C+;main ()(double x( 100) - (193.199,195 673, 195.757,196.051,196,092,196»596r 196.579r196.763);printf(w%dnHr fun (x, 8);35 . N个有序整数数列已放在一维数组中,给定下列程序中,函数fun() 的功能是:利用折半查找算法查找整数m在数组中的位置。若找到,则 返回其下标值:反之,则返回-1。折半查找的基本算法是:每次查找前先确定数组中待查的范围:low和 high(low < high),然后把m与中间位置(mid)中元素的值进行比较。如果 m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之 后的元素中;反之,下次查找范围落在中间位置之前的元素中。直到low >high,查找结束。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:6.以下程序的运行结果是【】。main() int a=2,b=7,c=5;switch(a > 0)(case 1:switch (b < 0) case l:printf(nn); break;case 2:pnntf(H!H); break;)case 0:switch (c=5) case 0:pnntf("*"); break;case l:printf(n#n); break;case 2:printf(n$n); break;)default: printf(H&H);)printf(unn);)7 . mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回。请填空。int mystden(char *str) int i ;fo. (i=0;【】! ='0' ; i+);return(i);8 .数据的【】结构在计算机存储空间中的存放形式称为数据的存储结 构或物理结构。#include < stdio.h > #define N 10/ *J> *1> k1>k1> «J> «J> *1>=1 *1> «J> sf> *1>k!> k>k1> «j> /不个不不不不不不不不不不不ci me不不不不不不不不不不不不不不不不不不不不不/void fun(int a,int m) int low0,high=N-l,mid;while (low < =high) mid=(low+high)/2; if(m < amid) high=mid-1;/kL* vl* kL* kL* k|> vL*1 vl* L* vL* v£* k1* vl* kL* vl* vl* *£* k£* kL* *1* kL* k£* k(*1* /不不不不不不不不不不不不不tciind不不不不不不不不不不不不不不不不不不不不不/else if(m > =a mid)low=mid+l;else return(mid);)return(-l);)main () int i,aN=-3,4,7,9,13,24,67,89,100,180,k,m;printf("a数组中的数据如下:”); for(i=0;i < N;i+) printf(n%dai);printf ("Enter m: "); scanf (n%dn, &m);k=fun (a,m);if (k > =0) printf (nm=%d, index=%dnu,m, k);else printf(nNot be found!nn);36 .给定程序中函数fun的功能是:根据整型形参m,计算如下公式的值。例如,若m中的值为5,则应输出:1.463611。请改正程序中的错误,使它能得到正确结果。注意不要改动main函数,不得增行或删行,也不得更改程序的结构。试题源程序#include < stdiO.h > double fun(int m) double y=L0;int i;si#1st*/不个不不不不不不不不不不不ci me不不不不不不不不不个不不不/for(i=2; i < m; i+)/ vt* vt*vt*1/不不不不不不不不不不不不不tci inri不不不不不不不不不不不不不/y+=l/(i*i);return(y);)main() int n=5;printf(nnThe result is%lfn,f, fun(n);37 .下列给定程序中fun()函数的功能是将n个无序整数从小到大排序。请改正程序中的错误,使它能得出正确的结果。注意;不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include< conio.h >#include< stdio.h >#include< stdlib.h >fun(int n, int *a) int i,j,p,t;for (j=O;j < n-l;j+) P=j;/L_/不不不不不可不不不不不不不不不Tei inc不可不不不不不不不不不不不不不不不可不/for(i=j+l;i < n-l;i+)if (ap > ai)/vt* kL* kL* k!> vt> £"*1vt* kL* vt*vL* v!k!>vt* /年不不不下不不不不不不不不不不ci inc不不不不不不不不不不、不不不不不不不不/t=i;if (p!=j)t=aj;aj=ap;ap=t;)putarr( iht n,int *z)inti;for (i=l;i < =n;i+,z+) printf(n%4d*z);if(!(i%10) printf(Hnn); printf(nnn);)main ()int aa20= 9,3,0,4,1,2,5,6,8,10,7 ,n= 11;clrscr();printf(nnnBefore sorting %d numbers:nn,n); putarr(n,aa);fun(n,aa);printf(nnAfter sorting %d numbers:nn,n);putarr(n,aa);38 .给定程序中函数fun的功能是:将一个由八进制数字字符组成的字 符串转换为与其值相等的十进制整数。规定输入的字符串最多只能包含 5位八进制数字字符。例如,若输入:77777,则输出将是:32767。请改正程序中的错误,使它能得到正确结果。注意不要改动main函数,不得增行或删行,也不得更改程序的结构。试题源程序#include < stdio.h >#include < string.h > #include < stdlib.h >int fun(char *p) int n;/*found*/ n =*p-'o'p+;while(*p!=0)/ vt#1#-1 1* *1* *1* *L*/不不不不不不不不不不tci incl不不不不不不不不不不/n=n*8+*p-b;P+;) return n;) main() ( char s6; int i; int n; printf(nEnter a string(Ocatal digits):"); gets(s);if(strlen(s) > 5) printf(HError: String too longer!nnH);exit(O);)for(i=0; si; i+)if(si < 'O'|si > 7)(printf(nError: %c not is ocatal digits!nnH, si);exit(O);)printf(nThe original string:");puts(s);n=fun(s);printf(Hn%s iS convered to integer number: %dnnn, s, n); )39 .下列给定程序中,函数fun()的功能是:对N名学生的学习成绩,按 从高到低的顺序找出前叫mSO)名学生来,并将这些学生数据存放在一 个动态分配的连续存储区中,此存储区的首地址作为函数值返回。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构.试题程序:#include< conio.h >#include< string.h >#include< stdio.h >#include< alloc.h >#define N 10typedef struct sschar num10;int s; STU;STU * fun STU a, int m) STU bN ,*t;int i, j,k;/1*1 si* /不不不不不不不不不不不不不tciind不不不不不不不不不不不不不不/*t=calloc (m, slzeof (STU);for(i=0;i < N;i+) bi=ai;for(k=0; k < m; k+) for (i=j=0;i < N;i+)/ /不不不不不不不不不不不不不ci不不不不不不不不不不不不不不/tk.num=b j.num;tk.s=bj s;bj.s=O;)return t;)outresult(STU a,FILE *pf) int i;for (i=0; i < N; i+) fprintf(pf, nNo=%s Mark-%dn 二 a i .num, ai.s);fprintf(pf, nnn n);main () STU aN> nA01 81, nA02 ”,89, “A03 ”,66, “A04 ”,87, “A05 ”,77, nA06 90, nA07 ",79, “A08 ”,61, nA09 80), nA10 ”,71;STU *pOrder;int i, m;clrscr ();printf ("*THE RESULT* nn); outresult (a, stdout);printf (nnGive the number of the students who have better score: ");scanf (n%dn, &m);while (m > 10) printf(nlnGive the number of the students who have better score:"); scanf (n%dn,%m);pOrder=fun (a,m);printf。'* THE RESULT*kn"); printf(nThe top :nn);for (i=0; i < m; i+)printf(n%s %dnn,pOrderi.num, pOrder i. s);free (pOrder);40.下列给定程序中,函数fun()的功能是找出100n(n不大于1000)之 间百位数字加十位数字等于个位数字的所有整数,把这些整数放在s所 指的数组中,个数作为函数值返回。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include < stdio.h >#define N 100int fun(int *s, int n)(inti, j, k, a, b, c ;j=0;for(i=100 ; i < n ; i+)ri/不不不不不不不不不不不不不ci me不不不不不不不不不不不/ k=n ;a=k%10 ;V=10 ;b=k%10 ;c=k/10 ;if(a=b+c)/ 。1K.t> 7, 7, /不不不个不不不小不不不不,c nc不不个不可不干不个.sj=i;)return j ;) main()(int aN, n, num=0, i ;do (printf(nnEntern(<=1000):");scanf(n%dn, &n);while(n > 1000);num=fun(a, n);printf(nnnThe result : rT);for(i=0 ; i < num ; i+)printf("%5d", ai);printf("nn"); )五、程序改错题(2题)41.已知一个数列从。项开始的前3项为0, 0, 1,以后的各项都是其 相邻的前3项之和。下列给定的程序中,函数proc的功能是:计算并 输出该数列前n项的和sum。n的值通过形参传人。例如,当n=20 时,程序的输出结果应为42762. 0000000请修改程序中的错误,使它能得到正确结果。注意:不要改动maiil函数,不得增行或删行,也不得更改程序的结 构。试题程序:#include<stdlib. h>#include<conio. h>#include<stdio. h>double proc(int n) (double sum, sO, si, s2, s;int k;sum=l. 0;if(n<=2)sum=O. 0;s0=0. 0;sl=0. 0;s2=l. 0;* * * * found* * * *for(k=4 ; k<n; k+)s=s0+sl+s2;sum+=S:sO=sl;sl=s2;/* * * * found* * * *s2=s;return sum;)void main(int n;system("CLS");printf("Input N=");scanf("%d", &n J;printf(n% f rT, proc(n);42.下列给定程序中,函数proc的功能是计算正整数m各位上数字的平方和。例如,输入498,则输出应该是161。请修改程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的 结构。试题程序:#include<stdlib .h>#include<stdio.h>#include<conio.h>long proc(10ng m)! 1 * * * * found * * * * long sum= 1 ; do sum+=(m% 10)*(m% 10);m / =10;I I *found* * * ) while(m) return(sum);void main long n;system(nCLSn);9.存储结构的4种基本类型分别是顺序、链式、索引和【】。10.衡量软件的模块独立性使用耦合性和内聚性两个定性的度量标准,其中()是度量一个模块功能强度的一个相对指标。二、单选题(10题)H.C语言的逻辑表达式在特定情况下会产生“短路”现象。若有逻辑表达式“x+&&y+,”则以下叙述中正确的是()0A.若x的值为0,则“y+”操作被“短路”,y值不变B.若x的值为1,则“y+”操作被“短路”,y值不变C.若y的值为0,贝'&&"运算被“短路”,y值不变D.若y或x的值为0,则表达式值为0, “x+”和“y+”均不执行12 .(40)下列关于C语言数据文件的叙述中正确的是()。A)文件由ASCII码字符序列组成,C语言只能读写文本文件B)文件由二进制数据序列组成,C语言只能读写二进制文件C)文件由记录序列组成,可按数据的存放形式分为二进制文件和文本文件D)文件由数据流形式组成,可按数据的存放形式分为二进制文件和文本文件13 .下列不属于软件调试技术的是A.强行排错法B.集成测试法C回溯法D.原因排除法 printf(nPlease enter a number:");scanf("%Id”, &n);printf(" n % Id n", proc(n);六、操作题(2题)43 .请编写函数fun,函数的功能是:将大于形参m且紧靠m的k个素 数存入xx所指的数组中。例如,若输入17, 5,则应输出:19, 23,29, 31, 37o注意:部分源程序在文件PROGL C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花插2345678910111213141516171819202122232425262728293031号中填入你编写的若干语句。linclude <stdio.h>Void fun(int m, int k, int xx)Main()(int m, nr zz 1000 ;void NONO (); printf(nnPlease enter two integers:w);scanf(n%d;fun(m, n, zz);for(m 0 ; m < n ;printf(n%d ”, zz(m);printf(wnH);NONO();Void NONO ()(/*本函数用于打开文件,输入测试数据, 调用fun函数,输出数据,关闭文件./int m, n, zz 10009 i ;FILE *rfr *wf ;rf fopen(nin.datMrnrn);wf - fopen(wout.datH#nwM);for(i - 0 ; i < 10 ; i+) fscanf (rfrw%d %dwr &n);fun(mr n, zz);for (m - 0 ; m < n ; m+) fprintf (wf, "d ",zz(m);fprintf(wf, wnM);fclose(rf);fclose(wf);44 .设有如下宏定义#define MYSWAP(z, x, y)z=x ; x=Y ; Y=z ;)以下程序段通过宏调用实现变量a、b内容的交换,请填空。float a=5, b=16, c ;MYSWAP( , a, b);参考答案1 .运行后报错运行后报错 解析:指针q没有指向确定的存储单元,故不 能赋值。2 .丫%2=1或Y%2!=OY%2=1或丫2!=0解析:判断变量是否为奇数 可以用变量与2取模,判断结果是为1或下为0o本题具体做法如下: Y%2=1 或 丫2!=0。3 .在最坏情况下冒泡排序法需要比较的次数为n(n-l)/2。4 .How does sheHow does she 解析:strcpy(strl, si):字符串拷贝函数, 作用是将字符串si拷贝到字符数组strl中去。strlen(str):测试字符串 str的长度,函数的值为字符串中实际长度,不包括VW0V在内。本题中 strlen(strl)的值为 13 ,贝strcpy(str 1 +strlen(str 1 )/2,'es she');相 当 于 strcpy(strl+6,'es she');,因此可得答案为 How does sheo5 .字形字形6 .#&#&解析:首先看最外面的switch,其表达式为a >0,结果为真(即 1),从easel:标号处开始执行。这里又是一个switch语句,其表达式为 b<00,结果为假(即0),由于没有case0:或default :标号,所以直接跳 过此switch语句。因为没有遇到break ;语句,所以继续执行进入内部 第2个switch语句,其表达式为c=5,结果为真,从easel :标号处开 始执行,输出一个#,遇到break;语句,跳出该内部switch语句,最后 执行default:标号后的输出语句输出一个&后,整个外部switch语句执行 完毕。程序最后输出的换行符不会显示,所以本题应该填#&。7 .*(str+i)或stri*(str+i)或strij解析:str是指针变量,它指向字符型 数据,在循环过程中,用*(str+i)或stri来访问字符串的第i个元素,判 断是否是结束