2021年山西省运城市全国计算机等级考试C语言程序设计预测试题(含答案).docx
2021年山西省运城市全国计算机等级考试 C语言程序设计预测试题(含答案)学校:班级:姓名:考号:一、2.填空题(10题)1 .软件是程序、数据和【】的集合。2 .数据库系统的主要特点为数据集成性、数据的高 和低冗余性、数据独立性和数据统一管理和控制。3 .以下程序中函数huiwen的功能是检查一个字符串是否是回文,当字 符串是回文时,函数返回字符串:yes!,否则函数返回字符串:no!,并 在主函数中输出。所谓回文即正向与反向的拼写都一样,例如:adgda。 请填空。#include < string.h > char*huiwen(char *str) char *pl,*p2 ; int i,t=0 ;pl=str ; p2=;for(i=0;i < =strlen(str)/2;i+)if(*p 1 + !=*p2)t= 1 ;bteak;if( )retum("yes!");else return(nno!n);main()号中填人所编写的若干语句。试题程序:mclwde <Bidb(x k>,define M 1( iyp<def tfruci(idur nufnIOiim aSTREC, irn proHSTREC a. STREl, b同 I. mt h )Eid mam ()STREC(;Anos*.S5l.<"(;Aoo3"1 MAOOZ' .81 . < <aGAOOr<8aie<*GAOOTe«74h <wGAOM*.B5t.rGAOO«e«B9L <GAOl$.9O)JGAO】.S3). CGAO -GAOILW. GAO 11 川 J GA017.69) <'GAOIL.64 KAO】6 .84” .STREC MMinf i. n. low. he<h» tiprintfC *Emef 2 mieger number low Abngftis *>|«afd(*HdS4B.&k>w.lkhncb>iif< het<b< low)hrigbi hn.h- low tow")n* pcoc(»ttf «h«iowe hetgh>iprxit(< * The 9tudefit *» <hu (Mil ,d K<iso . .low. heigh.pruitfC * M*hi . num. hd'h,由指定分数范*内的学叟吧25 .使用VC+2010打开考生文件夹下progl中的解决方案。此解决方案 的项目中包含一个源程序文件progl.co在此程序中,请编写函数fun(), 其功能是将一个数字字符串转换成一个整数(不得调用C语言提供的将 字符串转换成整数的函数)。例如,若输入字符串“-1234”,则函数把它 转换成整数值-1234。注意:部分源程序给出如下。请勿改动主函数main。和其他函数中的任何内容,仅在函数fun()的花 括号中填入你编写的若干语句。试题程序:#include <stdio.h>#include < string.h> long fun (char * p) ( )void main ()(char s 6;long n;printf ("Enter a string :rT);gets (s);n=fun (s);printf(“ldn”,n); )26 .请编写一个函数voidproc (char*str),其功能是:将字符串str中所有 下标为偶数位置上的字母转化为大写(若该位置上不是字母,则不转换)。 例如,若输入字符串:“thankyou6verymuch”,则应输出:0函数和其他函数中的任何内容,仅在函数proc ()的花括号中填入 所编写的若干语句。试题程序:g include Vcociic* b> 衽 include Vzdio. b> S includeh>raid proc< char sir)21d (Mint )etui, ”3】:eystmiC "C1«S* )i printf( enter cltaracier Mnng wit Ima $0)Iget*< tt) ipetcii« ai)fiA(tcf cKangingubr >iringaSs*«tt) i proc(tt>iprmtf( eKnbcnxmXn Ha"«)i27 .实现字符串拷贝的函数strcpy为()。28 .使用VC +2010打开考生文件夹夹下progl中的解决方案。此解决 方案的项目中包含一个源程序文件progl.c。在此程序中,请编写函数 fun(),该函数的功能是删除一维数组中所有相同的元素,使之只剩一个。 数组中的元素已按由小到大的顺序排列,函数返回删除后数组中元素的 个数。例如,若一维数组中的元素是2223445666677899 10 10 10删除后,数组中的元素应该是23456789 10注意:部分源程序给出如下。请勿改动主函数main()和其他函数中的任何内容,仅在函数fun ()的花括号中填入你编写的若干语句。试题程序:#include <stdio.h>#define N 80int fun (int a , int n)()void main ()(int aN=2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10, i, n=20;printf ("The original data:n");for (i=0;i<n;i+)< p=nnx/n;i+)<>printf(n%3d, ai);n=fun(a, n);printf ("nnThe data after deleted:rT);for(i=0;i<n;i+)< p=nnx/n;i+)<>printK"3d;ai); printf ("nn");29编写函数fun(),其功能是计算:S作为函数值返回。在C语言中可调用log(n)函数求ln(n)o log函数的引用说明为:double log(double x)。例如,若m的值为20,则fun()函数值为6. 506583。注意:部分源程序给出如下。请勿改动main。函数和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。试题程序:s mcivck Vadlh h>s include <eon®o» K>s tt)clu3c Vzdio, h> H tneludr <math. h> ifoubk lun<mt m>raid main ()y,tn ( eCLS" ) iprifiiK * K fn M«fun(20)> :30.请编写一个函数intproc (int*s, intt, int*k),用来求出数组的最小元素 在数组中的下标并存放在k所指的存储单元中。例如,输入如下整数: 273 934 453 624 89 342 111 831527 246 则输出结果为 4, 89o注意:部 分源程序给出如下。请勿改动main ()函数和其他函数中的任何内容,仅在函数proc ()的花括号中填入所编写的若干语句。试题程序:£ inclvdr Vadhb. h>9 include Vcorwcx h>市 include Vadid ii)void proc< int »«knt t«mt It) bM HMinC)lot273. 934 .453 624S9 342 .111831« 527*CLS*) iproc<arr« IO> &>k)ipnntf(e Kd« %* k. irrk>i四、2.程序修改题(10题)31 .下列给定程序中,函数fun()的功能是:依次取出字符串中所有的字母,形成新的字符串,并取代原字符串。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include < stdio . h > #include < conio . h >void fun(char*S)(inti, j ;for(i=0, j=0 ; si! =,0,; i+)/。,1*1* /不不不不不不不不不不不不不tc m不不不不不不不不不不不不/if(si > ='A'&&si卜=,Z,)&&(si > ='a'&&Si < ='z',) sj+=si;/ | /不不不不不不不不不不不不予Tei ind不不不不不不不不不可不不不/sj="O" ;) main()(char item80;clrscr();printf(6CnEnter a string : ");gets(item);printf(CnnThe string is : %Snn, item);fun (item);printf(nnnThe string of changingis : %Sn item);32 .以下程序可把输入的十进制数以十六进制数的形式输出。请在横线上填上适当的内容并把横线删除,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序;main () char b 17=n0123456789ABCDEFn;intc64 ,d,i=0,base=16;long n;printf(uEnter a number:nn);scanf(n%ld &n);do / vl* *1*1* «£«1*J-* 1* si* *1*/不不不不不不不不不不不不不不不不不ci 不不不不不不不不不不不不不不不不/ci=;i+; n=n/base; while (n!=0);printf(uTransmite new base:nn);for(i;i > =0;-i)/kL* vt*vt*1 vL* vt>vt*kV*Kt> /不不不不不不不不不不不不不不不tciind不t不不不不不不不不不不不不不不不不/);) d=ci;printf(f,%cn,b printf(unn);)33 .下列给定的程序中,函数hn()的功能是:为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。请改正函数fun()中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include < stdio.h > #include < math.h > void fun(int a, int *b, int *c) int ijdy;for (i=3;i < =a/2;i=i+2) /* f)und* * */ y=0;for (j=2;j < =sqrt(double)i);j+)if (i%j=0) y=0;if (y=l)/*砧und*/ d=i-a;for (j-2;j < =sqrt(double)d);j+)if (d%j=O) y=0;if (y=-i)*b=i; *c=d;)main () int a,b,c;do printf(nnlnput a:");scanf(u%d &a); while (a%2);fun (a, &b, &c);printf (nnn%d=%d+%dnn, pb,c);34 .下列给定程序中,函数fun()的功能是:在字符串的最前端加入n个*号,形成新串,并且覆盖原串。注意:字符串的长度最长允许79。请改正函数fun()中的错误,使它能得出正确的结果。试题程序;#include < stdio.h >#include< strzng.h >#include< conio.h >/* * fbund* * */ void fun(char s, int n) char a80, *p ;int i;/kL* vt* kL* kL* kJ*kL* *1 vt* vl*1 *1* vt*1* *1* *1* !> *1* 1* *L* /不不不不不不不不不不不不不不不不不Ie】 me不不不不不不不不不不不不不不不/S二P;for(i=0; i < n; i+) ai='*';do ai=*p ;/ *1> /不不不不不不不不不不不不不不不不不fci 不不不不不不不不不不不不不不不/i+;while(*p);ai=0 ;strcpy(s,a);)main() int n;char s8OJ ;clrscr();printf(HnEnter a string:n);gets(s);printf(nnThc string%snn,s);printf(nnEnter n(number of*):");scanf ("%cT, &n);fun(s,n);printf(nnThe string after inster: %snn,s);35.下列给定程序中,函数fun()的功能是:从N个字符串中找出最长的 那个中,并将其地址作为函数值返回。各字符串在主函数中输入,并放 入一个字符串数组中。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 试题程序:#include < string.h > #include < stdio.h > #define N 5#define M 81/ vl*1vt* 1* /不不不不、不不不不不不下不ci i n不不,、,下不不不小不不不不,/fun(char (*sq) N)int i; char *sp;sp=sq0;fori=0;i < N;i+) if(strlen(sp) < strlen(sqi) sp=sqi;/1/不不不不不不不不不不不不不tm小不不不不不不不不不不小不不/return sq;)main ()char strNM, "longest; int i;printf(nEnter %d lines:n n,N);for(i=0;i < N;i+) gets(stri);printf(nnThc %d string :n ",N); for(i=0;i < N;i+) puts(stri);longest=fun(str);printf(nnThe longest string :n "); puts(longest); char sb50; printf(nInput:n); scanf(H%sH,str);ptintf(H%snf; );4 . E-mail地址由用户名和域名两部分组成,这两部分的分隔符为】。5 .以下程序运行后的输出结果是【】。#include < stdio.h >main() char m;m='B'+32;printf(,%cnn,m);)6 .函数fun的返回值是【】fun(char *a,char *b) int num=0,n=0;while(*(a+num)!=,0,)mm+;while(bn) *(a+num)=bn ;num+;n+; return num;)7 .在面向对象方法中,类的实例称为8 .以下程序的运行结果是【】。int k=0 ;void fun (int m)m+=k; k+=m ;36 .给定程序M0D11 . C中函数fun的功能是:计算小于形参k的最大 的1。个能被13或17整除的自然数之和。k的值由主函数传入,若k的 值为500,则函数值为4622。请改正程序中的错误,使程序能输出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!1 23 45 67tinclude <stdio.h> int fun(int k) int m-0r mc-0 ;while (k >» 2) && (me < 10)891011121314151617 k; mc+;)return m;,foundmain ()printf (,%dnwr fun (500); )if (<k%13 -0)| (k%17 = 0)37 .下列给定程序中,函数fun()的功能是:计算S=f(-n)+f(-n+1)+ .+f(0)+f(l)+f(2)+. f(n)的值。例如,当n为5时,函数值应为10.407143。f(x)函数定义如下:x>0x=0 或 x=2x<0(xHy(x-2)取)1o一 (x-iy(x-2)请改正程序中的错误,使它能得山正确的结果。试题程序:#include < conio. h > #include < stdio. h > #include < math, h >/kJ*17,/个个个个个不干不个个个个个个ci inc不不不不不不不不不不不不不不不/ f (double x) return 0.0;if (x=0.0x=2.0)else if (x < 0.0) return (x-1) / (x-2); elsereturn (x+1) / (x-2);)double fun(int n)(int i; double s=0.0,y;for (i=-n; i < =n; i+) y=f(1.0*i); s+=y;/.!*.I* vt*。1 kL* kL* vl*vL* vt#vl* vl* /下不下不不不不不不不不不不不Tei inC不不不不不不不不不不不不不不/return s main() clrscr();printf(n%fnn,fun (5);)38 .下列给定程序中,函数fun()的功能是求出数组中最小数和次最小数,并把最小数和a0中的数对调,次最小数和al中的数对调。请改正程序中的错误,使它能得到正确结果。注意不要改动main函数,不得增行或删行,也不得更改程序的结构。试题源程序#include < stdio.h > #include < conio.h > #define N 20 void fun(int *a, intn)int i, m, t, k;for(i=0; i < n; i+)m=i;for(k=i; k < n; k+)if(ak < am)k=m;t=ai;ai=am; am=t;39 .给定程序MODH C中函数fun的功能是 对N名学生的学习成绩, 按从高到低的顺序找出前m(mS10)名学生来,并将这些学生数据存放在 一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!23456789101112131415161718192021222324252627282930313233343536373839404142434445464748tinclude <stdio.h>(include <stdlib.h>#include <string.h>define N 10typedef struct ss(char num10;int 3; STU;STU fun(STU a), int m)STU bNrt;int k;/*«* found* * * * * /t-(STU *) calloc(sizeof(STU)rm) for(i»0; i<N; i+) b(i«a(i;for(k«0; k<m; k+)(for (i-j-0; i<N; i+) if(b(i.s > bj.s) j-i; /*found*/b( j.8-0; return t;outresult(STU a, FILE *pf) int i;for(i»0; i<N; ix)fprintf (pf r "No - %s Mark - %dnwr ai.numrais);fprintf(pfrwnnn);main()(STUaN-rA01”,81, “A02”,89), (*A03R,66h (wA04-r87r wA05wf77b (RA06wr90rA07-,79,A08L61, “A09”,80,RAlO-,71 );STU wpOrder;int ir m;printf(* The Original data *nR);outresult(a, stdout);printf ("nGive the number of the students who have better score: ");scanf(H%dRr &m);while(m>10) printf (wnGive the number of the students who have better score: ");scanf;pOrderfun (a,m);printf(w* THE RESULT * nw);printf("The top :nw);for(i«0; i<m; i+)printf (H %s %dnnfpOrderi. num , pOrderi.s);free(pOrder);40 .下列给定程序中,函数fun()的功能是:用选择法对数组中的n个元素按从小到大的顺序进行排序。请改正程序中的错误,使它能得到正确结果。注意不要改动main函数,不得增行或删行,也不得更改程序的结构。试题源程序#include < stdio.h > #define N 20 void fun(int a, int n) int i,j, t, p;for(j=0; j < n-1; j+)/7,7,7" 7" T" 7,"1 7,7" 7" 7" 7,7,7" 7" 7" 7,/不不不不不不不不不不不 n a不不不小小不不不小不不/p=jfor(i=j; i < n; i+) if(ai < ap)/7" 7,t1 7“ 7,7” 7,7,/不不不不不不不不不不不八na不不不不小不不小不不不/P二j;t=aP;ap=aj;aj=t;)msin() int a N=(9, 6, 8, 3, -1), i, m=5;printff排序前的数据 for(i=0; i < m; i+)printf(u%dn, ai);printf(nnn);fun(a, m);printff排序后的数据for(i=0; i < m; i+)printf(n%d ai);printf(nnH);)五、程序改错题(2题)41 .由N个有序整数组成的数列已放在一维数组中,下列给定程序函数fun ()的功能是:利用折半查找法查找整数m在数组中的位置。若找到,返回其下标值;否则,返回一1。折半查找的基本算法是:每次查找前先 确定数组中待查的范围low和high (10w%high) 0然后用m与中间位 置(mid)上元素的值进行比较。如果m的值大于中间位置元素的值, 则下一次的查找范围落在中间位置之后的元素中;反之,下一次的查找 范围落在中间位置之前的元素中,直到low> ; high,查找结束。请改 正程序中的错误,使它能得出正确的结果。注意:不要改动main () 函数,不得增行或删行,也不得更改程序的结构!试题程序:5 include <stdio. h># define N 10/* found void fun( inf aj» int m )ini low = 0.high = N - I .mid: whilr( low< = high > mid =( low 4 high)/2 t if( hixh=mid I: / found * * else if( m > amid j) low mid 4-1 : else rcturn(mid) i>returni - 1) tvoid main ()( mt i.-3 1,7. 9. 13. 15. 67.89. 100.180) k«miprintf ("数组中的数据如下,)i for(ixaO:i<Nii+ +) prin<f("%d "ij) i print f(M Enter mJ, scanf(w %d" Hrnhk - fun(6.m>i if(k>»0)printf(*'01= %d index = %dn".mk> 1 else pnntf(MNot be found! n") 142 .下列给定程序中,函数ptoc的功能是:利用插入排序法对字符串中 的字符按从小到大的顺序进行排序。插入法的基本方法是:先对字符 串中的头两个元素进行排序,然后把第3个字符插入前两个字符中, 插入后前3个字符依然有序;再把第4个字符插入前三个字符中,待 排序的字符串已在主函数中赋予。构。试题程序:#include<strin9. h>#include<stdiO. h>#define M 80 void proc(char*arr) int i, j, n; char ch;n=strlen(arr):for(i=l ; i<n; i+)/* * * * found* * * * c=arri;j 二 i-l;while(j>=o)& &(ch<arrj) arrj+l=arrj;j-5 airj+l=ch;) ) void main (char aM=nQWERTYUIOPASDFGHJKLMNBVCXZn;printf(nThe original string:%s ' n”, a);proc(a);printf(uThe string after sortin9 :%snn", a);六、操作题(2题)43 .设有下列程序:#include < stdio.h >#include < string.h >main() int i ;chars10,t10;gets(t);for(i=0;i < 2;i+) gets(s);if(strcmp(t,s) < O)strcpy(t,s);)printf("%sn",t); 程序运行后,从键盘上输入(<CR>代表回车符):DEF <CR> BADEP<CR> QTHRG <CR> ,则程序的输出结果是。44 .下列程序的运行结果是o#define POW(r) (r)*(r)main() int x=3,y=2,t;t=POW(x+y);pr 血f(”dn”,t);参考答案1 .文档文档解析计算机软件是计算机系统中与硬件相互依存的另一部 分,是包括程序、数据以及相关文档的完整集合。2 .共享性共享性解析:数据库系统中的数据能被不同的应用程序使用, 实现了数据的高度共享,从而降低了数据的冗余,这也是数据库的主要 目的。3.str+strlen(pl)-l 或 str+strlen(str)-1 或 str-l+strlen(str)或 str-l+strlen(pl) t=0 或!t 或 t='0' huiwen(str)str+strlen(p 1)-1 或 str+strlen(str)-1 或 str- 1+stiien(str)或 str-1 +strlen(p 1 )rnt=O 或!t 或 t='O'rnhuiwen(str)解析: 函数huiwen中开始定义了两个字符指针pl和p2,并让pl指向sb的开 始位置,所以p2应该指向str的尾部,即&strstrlen(str)-l或写成 str+strlen(str)-l或者其他等价形式。然后使用一个循环,循环str的长度 的一半次数,比较pl和p2的内容,并分别递增和递减这两个指针。若 有不同,则让标志t为1,并跳出循环。所以最后一个if语句应该为判 断标志t是否为1,即应该填t=0或者其它等价形式。在主函数中,应 该输出huiwen()函数的返回结果,即最后一空应该填huiwen(str)0 4.5 .bb解析:本题实现的功能是把大写字母转换为小写字母。小写字母的 ASCII码值比相应的大写字母的ASCII码值大32O6 .字符串a和b的长度之和字符串a和b的长度之和 解析:本题首先通 printf("m=%d k=%d", m, k+) )main()int i=4 ;fun(i+);printf("i=%d k=%dn", i, k); )9 .顺序存储方法是把逻辑上相邻的结点存储在物理位置的存储单元中。10 . Jackson方法是一种面向的结构化方法。二、单选题(10题)11 . x, y, z被定义为int型变量,若从键盘给x, y, z输入数据,正确 的输入语句是A.INPUTx、v、z ;B.scanf("%d%d%d", &x, &y, &z);C.scanf("%d%d%d", x, y, z);D.read("%d%d%d", &x, &y, &z);12 .有以下程序:#include <stdio. h> 过第一个while循环计算字符串a的长度,再通过第二个循环,将字符串a 和b相连,最后返回连接后的总长度。7 .对象对象解析:类描述的是具有相似性质的一组对象。例如,每本具 体的书是一个对象,而这些具体的书都有共同的性质,它们都属于更一 般的概念“书”这一类对象。一个具体对象称为类的实例。8 .m=4 k=4 i=5 k=5m=4 k=4 i=5 k=5 解析:main。函数首先定义了 1 个变 量i,并初始化为4。然后用表达式i+的值为实参调用函数fun(),因为 后缀”表达式的值为增1之前的值,故此时传递给函数的参数m值为4。 fun()函数中,首先让形参m自增k,由于此时k还是0,所以m不变, 然后让k自增m,执行后k的值和m相同为4。最后fun()函数输出m 和k廿的值,两个值都是4,故首先输出了“m=4k=4",输出完后,k自 增l(k变为5)。fun()函数执行完毕,返回main()函数中,此时i会被自 增1变为5,故接着又输出的i和k的值都是5。故最终输出结果是“m=4 k=4 i=5 k=5,o9 .相令防目邻10 .数据结构数据结构解析:Jackson方法是一,种面向数据结构的结构 化方法。H.B解析:scanf函数的一般格式是:scanf(格式控制,地址表列)该格式中,地址表列中应是变量地址,而不是变量名。注意:调用putchar 和getchar函输出和输入字符。12.BFunl是输出局部变量的值,fun2是把全局变量的值改成3和4,所以输出的结果是5634。13 .D本题考查if-else语句的使用。if-else语句可以在条件为“真”或为“假”时 执行指定的动作,由if引导条件为“真”时执行的操作;由else引导条 件为“假”时执行的操作。else语句要与上面最近的if语句进行匹配, 如果要嵌套调用if-else语句,需要将嵌套部分用括起来,避免程序 报错。题目中给出了一个if语句和一个if-else语句,if-else语句为第 一个if语句的子语句。首先执行外层if语句,执行条件为x>y,由于 x=l, y=2,故该条件为假,不执行if的子语句,直接执行语句 printf("%dn", x+);,该语句先输出x的值,然后进行x+操作。x的 初始值为1,输出结果为1。14 .A解析:数据流图从数据传递和加工的角度,来刻画数据流从输入到 输出的移动变换过程。数据流图中的主要图形元素有:加工(转换)、数 据流、存储文件(数据源)、源和潭。15.B在第1次外层for循环中,首先x+得到x=l。进入到内层for循环, 只有循环j的值为奇数时,变量x的值才自加1,所以在内层for循环 执行过程中,变量x的值自加两次,当退出内层for循环时,x=3,然 后执行x+,得到x=4。在进入执行第2次外层for循环中,首先x+ 得到x=5。进入到内层for循环,只有循环变量j的值为奇数时,变量 x的值才自加1,所以在内层for循环执行过程中,变量X的值自加1两次,当退出内层for循环时,x=7,然后执行x+,得到x=8,所以 打印输出变量x的值为8。16 .A解析:C语言中的函数可以进行递归调用,但不能在函数中定义函 数,即函数不能嵌套定义。函数可以没有返回值,若有返