国家计算机二级C语言上机题库(一).docx
t=*n%_1_;result*=n-retumx*t;/* nd */relumresult;)if(t%2!=_2_)main。/*主函数*/x=x+t*i;i=i*10;main()(chars6J;*n=*n/10;(intn;longn;)printfCInputN:");printfC'EnterastringAn");/*R)und*/scanf("d”,&n);gets(s);*n=_3_;printf("nn%d!=%lfnn",n,fun(n);n=fun(s);)printf("kin”,n);main()解题思路:unsignedlongn=-1;第一处:条件语句书写格式错误,应改为:NONOO;while(n>99999999lln<0)if(n=0)o)(printf(,Pleaseinput(O<n<l(X)(X)(X)(X):',);sca第二处:语句后缺少分号。NONOOnf(M%ldMt&n);/*本函数用于打开文件,输入数据,调用fun(&n);函数,输出数据,关闭文件。*/printf(MnTheresultis:%ldn,',n);HLE*fp,*wf;)*inti;解题思路:*chars|20;第一处:t是通过取模的方式来得到*n的个请编写个函数fun,它的功能是:将一个longn;二级C语言上机试题汇编第01套:给定程序中,函数fun的功能是:将形参n 所指变量中,各位上为偶数的数去除,剩余的数按原来从高位到低位的顺序组 成一个新的数,并通过形参指针n传回 所指变量。例如,输入一个数;27638496,新的数: 为 739。请在程序的下划线处填入正确的内容并把 下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK 1.C 中。不得增行或删行,也不得更改程序的结构! 给定源程序:#include<stdio.h>voidfun(unsignedlong*n) unsigncdlongx=Oj;intt;i=l;while(*n)位数字,所以应填:10。第二处:判断是否是奇数,所以应填:0。第三处:最后通形参n来返回新数x,所以 应填:Xo给定程序MODI1.C中函数fun的功能是:计算n!o例如,给n输入5,则输出120.000000。请改正程序中的错误,使程序能输出正确 的结果。注意:不要改动main函数,不得增行或删 行,也不得更改程序的结构!给定源程序:#include<stdio.h>doublefun(inln)doubleresult=1.0;ifn=Oreturn 1.0;while(n> I&&n< 170) 数字字符串转换为一个整数(不得 调用C语言提供的将字符串转换为整数的 函数)。例如,若输入字符串"-1234”,则函数把它转换为整数值-1234。函数fun中 给出的语句仅供参考.注意:部分源程序存在文件PROG1.C文件 中。请勿改动主函数main和其它函数中的任何 内容,仅在函数fun的花括号中填 入你编写的若干语句。给定源程序:#include<stdio.h>#include<string.h> longfun(char*p) (产以下代码仅供参考*/为串长,t为正负标识*/longx=0;len=strlen(p);if(pO='-') t=-l;len-;p+;elset= 1;/*以下完成数字字符串转换为一个数字*/fp=fopen("c:testin.dat,'/'r");fprintf(fp/'%s%d%An,s,a,f);wf=fopen(',c:testout.dat,"w");FILE*fp,*wf;fclose(fp);for(i=0;i<10;i+)(inti;fp=fopen(,'filel.txt";'rH);fscanf(fp,H%s",s);chars 20;printfCAnlheresult :nnM);n=fun(s);longn;ch=fgetc(fp);fp=fbpen(Hc:teshin .datM,"rM);/*foun(j* */wf=fopcn(,'c:testout.dat,wH);while(!feof(_2_)fclose(fp);for(i=0;i<10;i+)/*foun(j* */fclose(wf);fscanf(fp,"%sH,s);putchar(_3_);ch=fgetc(fp);)n=fun(s);putcharCXn');解题思路:fprintf(wf,',%ldn",n);fclose(fp);本题是将一个数字字符串转换为一个整)数。fclose(fp);main()参考答案:fclose(wf);chara|10="Hello!,;intb=12345;#include<stdio.h>)doublec=98.76;#include<string.h>fun(a,b,c);longfun(char*p)注意:由于NONO0这个函数是改卷人用(的,与考生没有什么关系,故下面从第2芦以下代码仅供参考*/inti,len,ty*len为串长,t为正负标识*/套试题开始均省略NONO0longx=();Ien=strlen(p);if(p01='-')elset= 1;/*以下完成数字字符串转换为一个数字*/ while(*p)x=x* l(L48+(*p+);retumx*t;)main(y*主函数*/chars6;longn;printf(MEnterastring:n");gets(s);n=fun(s);printf(,'%ldn",n);NONO();)NONO()/*本函数用于打开文件,输入数据,调用 函数,输出数据,关闭文件。*/第02套:给定程序中,函数fun的功能是将形参给定 的字符串、整数、浮点数写到文本文件中,再用字符方式从此文本文件中逐 个读入并显示在终端屏幕上。请在程序的下划线处填入正确的内容并把 下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK 1.C 中。不得增行或删行,也不得更改程序的结构! 给定源程序:#include<stdio.h>voidfun(char*s,inta.doublef)(charch;fp=fopen("filel.txt","w");解题思路:本题是考察先把给定的数据写入到文本文 件中,再从该文件读出并显示在屏幕上。第一处:定义文本文件类型变量,所以应 填:FILE*。第二处:判断文件是否结束,所以应填:fp。 第三处:显示读出的字符,所以应填:ch。给定程序MODI1.C中函数fun的功能是: 依次取出字符串中所有数字字符,形 成新的字符串,并取代原字符串.请改正函数fun中指定部位的错误,使它能 得出正确的结果。注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构!给定源程序:#include<stdio.h>voidfun(char*s)intij;for(i=0j=0;si!='0'i-H-)if(si>=,0'&&si<='9')voidfun(charsN,char*b)/* found * * */()sU=si;inti,j,n=O;bn=AO'/* fou nd*/for(i=0;i<N;i+)/*请填写相应语句完成其)sU=M0"功能*/11main()charitem80;bn=V)'第03套:printf(''nEnterastring:");gets(item);程序通过定义学生结构体变量,存储了学printf(,'nnThestringis:"%s"n",item);main()生的学号、姓名和3门课的成绩。所fun(item);chara100LwMN=,W;,W1,W,;W'4,S,有学生数据均以二进制方式输出到文件printf(,'nnThestringofchangingis:V,%sV'n'i中。函数fun的功能是重写形参filenametern);所)printfCThematrixAn'*);指文件中最后一个学生的数据,即用新的解题思路:fbr(i=0;i<M;i+)学生数据覆盖该学生原来的数据,其它学第一处:要求是取出原字符串中所有数字字for(j=0;j<N ;j+)printf(M%3cM,wij);生的数据不变。符组成一个新的字符串,程序中是使用变printf(MnM);请在程序的下划线处填入正确的内容并把量j下划线删除,使程序得出正确的结来控制新字符串的位置,所以应改为:fiin(w,a);果。s|j+=si;»printf("ThcAstring:n");puts(a);第二处:置新字符串的结束符,所以应改为:printf("nnH);NONOO;注意:源程序存放在考生文件夹下的*)BLANK 1.C 中。*不得增行或删行,也不得更改程序的结构!请编写函数fun,函数的功能是:将M行N列解题思路:给定源程序:的二维数组中的字符数据,按列的本题是把二维数组中的字符数据按列存放#include<stdio.h>顺序依次放到一个字符串中。到一个字符串中。#(JefineN5例如,二维数组中的数据为:1.计算存放到维数组中的位置。ty pedefstructstudent WWWW2.取出二维数组中的字符存放到一维数组longsno;SSSS(已计算出的位置)中。chamame| 10;HHHH参考答案:floatscore3;则字符串中的内容应是:WSHWSHWSH。voidfun(charsN,char*b)(STU;注意:部分源程序在文件PROG 1.C中。(voidfun(char*filename,STUn)请勿改动主函数main和其它函数中的任何FILE*fp;内容,仅在函数fun的花括号中填入/*found*/你编写的若干语句。inli,j,n=();fp=fopen(_l_;'rb+H);给定源程序:for(i=0;i<N;i+)/*请填写相应语句完成其/*f()u nd* */#include<stdio.h>功能*/fseek(_2_rl L*sizeof(STU),SEEK_END);#defineM3(/*f()und* */#defineN4for(j=0;j<M;j+)(fwrite(&n,sizeof(STU), 1 > _3_);bn=sji;fclose(fp);n=i*M+j+l;main()STUtN= (10001:'MaChao",9K92J7h 1OOOZ/'CaoKai",75,60,88),10003;'LiSi",85,70,78M 10004,"FangFang" ,90,82,87,IOOO5,"ZhangSan",95,8O,88;STUn=10006;'ZhaoSi'5570,68),ssN;intij;FILE*fp;fp=fopen(,student.dat'"wb'');fwrite(t,sizeof(STU),N,fp);fclose(fp);fp=fopcn("student.dat","rb");fread(ss,sizeof(STU),N,fp);fclose(fp);printftnTheoriginaldataAnVn");for(j=0;j<N;j+)printf("nNo:%ldName:%-8sScores:",ssj.s no,ssj.name);for(i=0;i<3;i+)printf(M%6.2r,ssj.scorei);printf(Mn");)fun("student.dat",n);printf(,'nThedataaftermodifing:nn,');fp=fopen(,'student.dat",',rb");fread(ss,sizeof(STU),N,fp);fclose(fp);for(j=0;j<N;j+)printf("nNo:%klName:%8sScores:",ssjls no,ssj.name);for(i=0;i<3;i+)printf(',%6.2fssj.score(i);printRAn");解题思路:本题是考察如何从文件中读出数据,再把 结构中的数据写入文件中。第一处:从指定的文件中读出数据,所以 应填:filename o第二处:读取文件fp的最后一条记录,所 以应填:fpo第三处:再把读出的记录,写入文件fp指 定的位置上,所以应填:fp。给定程序MODI 1 .C中的函数Creatlink的功能是创建带头结点的单向链表,并为各结点数据域赋0到m-1的值。请改正函数Creatlink中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构!给定源程序:#include<stdio.h>#include<stdlib.h>typcdefstructaa(intdata;structaa*next;JNODE;NODE*Creatlink(intnjnlm)NODE*h=NULL,*p,*s;inti;p=(NODE)malloc(sizeof(NODE);h=p;p->next=NULL;fbr(i=l;i<=n;i-H-)s=(NODE* )malloc(sizeof(NODE);s->data=rand()%m;s->next=p->next;p->next=s;p=p->next;retump;outlink(NODE*h)(NODE*p;p=h->next;printf("nnTHELJST:nnHEAD");while(p)(printf("->%d,p->data);p=p->next;)pnntf("n");)main()(NODE*hcad;head=CreatIink(8,22);outlink(head);)解题思路:第一处:指向刚分配的结构指针,所以应改 为:p=(NODE*)malloc(sizeof(NODE);第二处:在动态分配内存的下一行语句是, 使用临时结构指针变量h保存p指针的初 始位置,最后返回不能使用p,是因为p的位置已经 发生了变化,所以应改为返回h。请编写函数fun.函数的功能是:统计一行字 符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有 单词由小写字母组成,单词之间由若干 个空格隔开,一行的开始没有空格。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其它函数中的任何 内容,仅在函数fun的花括号中填入 你编写的若干语句。给定源程序:#include<stdio.h>#include<string.h>#defineN80intfun(char*s)()main()charlineN;intnum=O;printf("Enterastring:n");gets(1ine);num=fun(line);printf("Thenumberofwordis:%dnn",num);NONOO;解题思路:本题是统计字符串中的单词数。1 .利用while循环语句和指针变量,当字符 为空格时,则单词数k加1。2 .循环结束返回k。参考答案:intfun(char*s)(intk= 1;while(*s)if(*s=")k+;s+;)retumk;) 第(M套:程序通过定义学生结构体变量,存储了学 生的学号、姓名和3门课的成绩。所有学生数据均以二进制方式输出到文件 中。函数fun的功能是从形参filename所指 的文件中读入学生数据,并按照学号从小 到大排序后,再用二进制方式把排序后的 学生数据输出到filename所指的文件中, 覆盖原来的文件内容。请在程序的下划线处填入正确的内容并把 下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的 BLANK 1.C 中。不得增行或删行,也不得更改程序的结构! 给定源程序:#include<stdio.h>#defineN5ty pedefstructstudent longsno;chamameflO;floatscore3;)STU;voidfiin(char*filcnamc)FILE*fp;intij;STUsN,t;/* * fou nd * */fp=fopen (filename,_ 1 _);fread(s,sizeof(STU),N,fp);fclose(fp);for(i=0;i<N-l;i+)fbi(j=i+l;j<N;j+)if(si.sno_2_s|j.sno)(t=sli;si|=sj;sj=t; fp=fbpcn(filename/'wb");_3_(s,sizeof(STU),N,fjp);/* 二进制输出*/ fclose(fp);)main()STUtN=l(X)05, “ZhangSan”,95,80,88,10003. “LiSi”,85,70.78,(10002:'CaoKaiH,75,60,884 10(X)47'FangFang”,90,82,87,10001 ,"MaChaoH,91,92,77 ,ssN;intij;FlLE*fp;fp=fopen("student.dat'"wb");fwrite(t,sizeof(STU),5,fp);fclose(fp);printf("nnTheoriginaldata:nn");for(j=0;j<N;j4-+)(printf("nNo:%ldName:%-8sScores:H,tj.sn o,tjlname);for(i=0; i<3;i+)printf(M%6.2f',t|j .scorei);printf(,'n,');)fun(*'student.dat");prinlf(,nnThedataaftersorting:nn,');fp=fopen("sludenl.dat"Jrb");fread(ss,sizeof(STU),5,fp);fclose(fp);for(j=0;j<N;j-H-)printf("nNo:%ldName:%-8sScores:'ss|j.s no,ssj.name);for(i=0;i<3;i+)printf("%6.2f'ssj.scorei); printf(*'n");)解题思路:本题是考察把结构中的数据写入文件。第一处:建立文件的类型,考虑到是把结 构中的数据(结构中的数据包含不打印的 字符)从文件中读出,所以应填:第二处:判断当前学号是否大于刚读出的 学号进行相比,如果大于,则进行交换, 所以应填:>。第三处:把已排序的结构数据,重新写入 文件,所以应填:fwriteo给定程序MODI1.C中函数fun的功能是: 在字符串的最前端加入n个*号,形成 新串,并且覆盖原串。注意:字符串的长度最长允许为79o请改正函数fun中指定部位的错误,使它能 得出正确的结果。注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构!给定源程序:#include<stdio.h>#include<string.h>voidfun(chars,intn)(chara80,*p;inti;S=p;for(i=0;i<n;i+)ai='*'do(ai=*p;i+;1/*nd */while(*p+)ai=O;strcpy(s,a);)main()intn;chars80;printf(MnEnterastnng:");gets(s);printf("nThestringV'%sMn,s);printf(,'nEntem(numberof*):',);scanf(,%d, &n);fun(s,n);printf("nThestringafterinsert:"%s"iT,s);)解题思路:第一处:指针p应指向s,所以应改为:p=s;o 第二处:死循环,当dowhile循环执行一次, 临时变量p应该指向字符串的下一位置, 所以应改为:while(*p+);<>请编写函数fun,函数的功能是:统计各年龄 段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;要 求函数把0至9岁年龄段的人数放在d0 中,把10至19岁年龄段的人数放在dl中, 把20至29岁年龄段的人数放在d2中, 其余依此类推,把100岁(含100)以上年龄的 人数都放在d10中。结果在主函数中输出。注意:部分源程序在文件PROG 1.C中。请勿改动主函数main和其它函数中的任何 内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include<stdio.h>#defineN50#defineMllvoidfiin(int*a,int*b)()doublemd()statict=29,c=217,m= 1024,r=0;r=(r*t+c)%m;retum(double)r/m);)main()intage|N|,i,d|M|;for(i=0;i<N;i+)agei=(int)( 115*md();printf(,Theoriginaldata:nn);for(i=0;i<N;i+)printf(i+l)% 10=0?"%4<in ,:,%4<i,age|i);printf("nn");ftin(age,d);for(i=0;i<10;i+)printf(H%4d%4d:%4dnH, i*10J*10+9,di);printf(,OverlOO:%4dn,d 101);NONO(d);解题思路:本题是统计各年龄段的人数。1 .初始化各年龄段人数为0。2 .使用for循环以及求出各年龄的十位数字 作为存放人数的地址,如果大于值大于10, 则存入310中(大于110岁的人参考答案:voidfun(int*a,int*b)(intij;for(i=0;i<M;i+)b|i=0;for(i=0;i<N:i+)j=ai/10;if(j>10)bM-l+;elscbj+;)doublernd()(statict=29,c=217,m= 1024,r=0;r=(r*t+c)%m;retum(double)r/m);I 第05套:给定程序中,函数fun的功能是将参数给定 的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中 逐个读入,并调用库函数atoi和atof将 字符串转换成相应的整数、浮点数,然后 将其显示在屏幕上。请在程序的下划线处填入正确的内容并把 下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK 1.C 中。不得增行或删行,也不得更改程序的结构! 给定源程序:#include<stdio.h>#include<stdlib.h>voidfun(char*sjnta,doublef)(charstr 100,strl 100,str2 100;intal;doublefl;fp=fopen("file l.txt'"w");fprinlf(fp,%s%d%fn,s,a,f);_2_;fp=fo pen ("file l.txt,',"rn);/* fou nd */fscanf(_3_/,%s%s%s,str,str 1 ,str2);fclose(fp);al=atoi(strl);fl=atof(str2);printf("nTheresult :nn%s%d%fnfstr,a 1 ,f 1);)main()charal 0=HHello!H;intb=12345;doublec=98.76;fun(a,b,c);)解题思路:本题是考察先把给定的数据写入到文本文 件中,再从该文件读出并转换成相应的整 数、浮点数显示在屏幕上.第一处:定义文本文件类型变量,所以应 填:FILE*。第二处:关闭刚写入的文件,所以应填: fclose(fp)o第三处:从文件中读出数据,所以应填:fp。给定程序MODI1.C中函数fiin的功能是: 对N名学生的学习成绩,按从高到低的 顺序找出前m(mW10)名学生来,并将这些 学生数据存放在一个动态分配的连续存 储区中,此存储区的首地址作为函数值返 回。请改正函数fun中指定部位的错误,使它能 得出正确的结果。注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构! 给定源程序:#include<stdio.h>#include<alloc.h>#include<slring.h>#defineN10typedefstructsschamum IO;ints;)STU;STU*fun(STUa|Jnlm)STUbN,*t;inti,j,k;/* * *found * */ t=(STU*)calIoc(sizeof(STU),m) for(i=0;i<N;i+)bi=ai;fdr(k=O;k<m ;k+)for(i=j=0;i<N;i+) if(bil.s>bU.s)j=i;t(k)=b(j);bj.s=O;)retumt;Ioutresult(STUa| ,FILE*pD(inti;for(i=0;i<N;i+)fprintf(pf,'No=%sMark=%dn,ai.num,a|i|.s);fprintf(pf,"nnM);main()STUaN= MA01 M,81 )4MA02M,89)4 HA03H ,66, MA04M,87),( HA05M,77),“ A06” .90, “ A07” ,79, “ A08” ,61, “ A09”,STU*pOrder;printf("*TheOriginaldata*n");outresult(a,stdout);printf("nGivethenumberofthestudenlswhoha vebetterscore:n);scanf(,%d,&m);while(m>10)printf("nGivethenumberofthestudentswhoh avebetterscore:H);scanf("%d",&m);)pOrder=fun(a,m);printfC*THERESULT*n");printfCThetopiXn1');fbr(i=O;i<m;i+)printf("%s%dn,pOrderi.num,pOrdcri.s);free(pOrdcr);)解题思路:第一处:语句最后缺少分号。第二处:应该使用方括号,而不是圆括号。像此类,使用编译,即可发现。请编写函数fun,函数的功能是删去一维数 组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列, 函数返回删除后数组中数据的个数。例如,一维数组中的数据是 2223445666677899101010。删除后,数组中的内容应该是:2345678910。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其它函数中的任何 内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include<stdio.h>#defineN80intfiin(intaJntn) main()intaN= 2,2,2,3,4,45,6,6,6,6,7,7,8,9,9,10,10,10J0,i,n=20;printf("Theoriginadata:n*');for(i=0;i<n;i+)printf(',%3d',a|i);n=fun(a,n);printfCAnXnThedataafterdeletedAn");fbr(i=0;i<n;i+)printf(,%3<i,a|i);printf(',n n");NONO();解题思路:本题是删除已排序过数组中的相同数。1 .取出数组中的第1个数存放在临时变量k 中,再利用for循环来依次判断所有的数.2 .如果取出的数和k相比,如果不相同,则 仍存放在原数组中,其中存放的位置由j 来控制,接着把这个数重新存入k。如果相同,则取 下一数。参考答案:intfun(inta.intn)(intij=l,k=aO;for(i=l;i<n;i+)if(k!=ai)(aj+4-=ai;k=ai;)aj=O;retumj;) 第06套:给定程序中,函数fun的功能是根据形参i 的值返回某个函数的值。当调用正 确时,程序输出:x l=5.000(XM),x2=3.0(X)(X)0,x 1 *x 1+x I *x2=4() .00000()请在程序的下划线处填入正确的内容并把 下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK 1.C 中。不得增行或删行,也不得更改程序的结构! 给定源程序:#include<stdio.h>doublefl (doublex)(retumx*x;Jdoublef2(doublex,doubley) retumx*y;J/* * fou nd */ _1_fun(inti,doublex ,doublcy) if(i=D/*found* */ return_2_(x);else/* * *found * */ retum_3_(x,y);)main()doublex I=5,x2=3,r;r=fun(l,xl,x2);r+=fun(2.x l,x2);printf("nx I=%f,x2=%f,x l*xl+xl *x2=%fn n'xl,x2,r);)解题思路:本题是根据给定的公式来计算函数的值。第一处:程序中使用双精度double类型进 行计算,所以函数的返回值类型也为 double,所以应填:double o第二处:当i等于1时,则返回fl函数的 值,所以应填:fl。第三处:如果i不等于1,则返回f2函数的 值,所以应填:f2o给定程序MODI1.C中函数ftin的功能是: 比较两个字符串,将长的那个字符串 的首地址作为函数值返回。请改正函数fun中指定部位的错误,使它能 得出正确的结果。注意:不要改动main函数,不得增行或删行, 也不得更改程序的结构!给定源程序:#include<stdio.h>charfun(char*s,char*t)intsl=O,tl=O;char*ss,*tt;ss=s;tt=t;while(*s