国家二级C语言机试(操作题)模拟试卷7(共27题)_第1页
国家二级C语言机试(操作题)模拟试卷7(共27题)_第2页
国家二级C语言机试(操作题)模拟试卷7(共27题)_第3页
国家二级C语言机试(操作题)模拟试卷7(共27题)_第4页
国家二级C语言机试(操作题)模拟试卷7(共27题)_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家二级C语言机试(操作题)模拟试卷7(共9套)(共27题)国家二级C语言机试(操作题)模拟试卷第1套一、程序填空题(本题共1题,每题1.0分,共1分。)1、函数fun的功能是:从三个形参a,b,c中找出中间的那个数,作为函数值返回。例如,当a=3,b=5,c=4时,中数为4。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANKl.C中。不得增行或删行,也不得更改程序的结构!#includeintfun(inta,intb,intC){intt;/**********found***********/t=(a>b)?(b>c?b:(a>c?c:___1___)):((a>c)?___2___:((b>c)?C:____3___));returnt;}main(){inta1=3,a2=5,a3=4,r;r=fun(a1,a2,a3);printf(“\nThemiddlenumberis:%d\n”,r);}标准答案:(1)a(2)a(3)b知识点解析:fun函数的功能是求得三个数中间的数。第一空:语句“(a>b)?(b>c?”表示a>b>c,根据题目要求,则中间值为b,若只是满足第一个“?”前面的条件,而c>b,则选择执行“(a>c?c:___1___)”,当a>c时取值c,所以ac)?”是对a、c的比较选择,第三空处的“(b>c)?c”根据b、c的判断,题目已经给出了c,所以这里应该是a。第三空:第三空中对于b、c的判断选择缺少b,所以这里填“b”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定函数MODll.C中函数fun的功能是:将一个由八进制数字字符组成的字符串转换为与其面值相等的十进制整数。规定输入的字符串最多只能包含5位八进制数字字符。例如,若输入:77777,则输出将是:32767。请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#include#include#includeintfun(char*P){intn;/**********found***********/n=*P一‘O’;p++;while(*P!=0){/**********found***********/n=n*8+*P一’o’;p++;}returnn;}main(){charS[6];inti;intn;printf(“Enterastring(Ocataldiqits):”);gets(s);if(strlen(s)>5){printf(“Error:Stringtoolonger!\n\n”);exit(0);}for(i=0;s[i];i++)if(s[i]<‘0’||s[i]>‘7’){printf(“Error:%cnotisocataldigits!\n\n”,s[i]);exit(0);}printf(“Theoriginalstring:”);puts(s);n=fun(s);Printf(“\n%Sisconveredtointegernumber:%d\n\n”,s,n);}标准答案:(1)n=*p一‘0’;(2)n=n*8+*p一‘0’;知识点解析:函数功能是实现八进制到十进制的转换。(1)第一个标识下面:语句“n=*p-‘o’;”中的‘0’不是数字零,而是字母‘o’,根据前面的分析因此改为:“n=*p—’o’;”。(2)第二个标识下面:语句“n=n*8+*P-’o’”,首先进行同(1)相同的修改,变量P没有定义,根据题意要求这里应该是“*p一’0’”,所以此句改为:“n=n*8+*一’0’;”。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写函数fun,其功能是:计算并输出下列多项式的值:例如,在主函数中从键盘给n输入50后,输出为:s=1.718282。注意:要求n的值大于1但不大于100。部分源程序在文件PROGl.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includedoublefun(intn){}NONO(){/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/FTLE*rf,*wf;intn,i;doubles;rf=fopen(“in.dat”,“r”);wf=fopen(“out.dat”,“w”);for(i=0;i<10;i++){fscanf(rf,“%d”,&n);s=fun(n);fprintf(wf,“%lf\n”,s);}fclose(rf);fclose(wf);}main(){intn;doub2es;printf(“\nInputn:”);scanf(“%d”,&n);s=fun(n);printf(“\n\ns=%f\n\n”,s);NONO();}标准答案:doubles=0,t=1;inti;for(i=1;i<=n;i++){t*=i;s+=1./t;}returns;知识点解析:该程序功能是计算并输出多项式值。根据题干中给出的数列,首先推出每一项的表达武,然后再对多项式进行累加求和。[解题思路](1)根据题干中给出的数列,推出每一项分母是在前一项分母的基础上乘当前项数,第n项的项数为n。(2)在循环中求得每一项,然后对其进行累加求和。国家二级C语言机试(操作题)模拟试卷第2套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中已建立一个带有头结点的单向链表,在main函数中将多次调用fun函数,每调用一次fun函数,输出链表尾部结点中的数据,并释放该结点,使链表缩短。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!1#include<stdio.h>2#include<Stdlib.h>3#defineN84typedefstructlist5{intdata;6struct1ist*next;7}SLIST;8voidfun(SLIST*p)9{SLIST*t,*e;10t=p->next;s=p;11while(t->next!=NULL)12{s=t;13/**********found**********/14t=t->___1___;15}16/**********found**********/17printf(’’%d’’,___2____);18s->next=NULL;19/**********found**********/20free(___3____);21}22SLIST*creatlist(int*a)23{SLIST*h,*p,*q;iti;24h=p=(SLIST*)malloc(sizeof(SLIST));25for(i=0;i<N;i++)26{q=(SLIST*)malloc(sizeof(SLIST));27q->data=a[i];p->next=q;p=q;28}29p->next=0;30returnh;31}32voidoutlist(SLIST*h)33{SLIST*p;34p=h->next;35if(p==NULL)printf(’’\nThelistisNULL!\n’’);36else37{printf(’’\nnead’’);38do{printf(’’->%d’’,p->data);p=p->next;}while(p!=NULL);39printf(’’->End\n’’);40}41}42main()43{SLIST*head;44inta[N]={11,12,15,18,19,22,25,29};45head=creatlist(a);46printf(’’\nOutputfromhead:\n’’);outlist(head);47printf(’’\nOutputfromtail:\n’’);48while(head->next!=NULL){49fun(head);50printf(’’\n\n’’);51printf(’’\nOutputfromheadagain:\n’’);outlistIhead);52}53}标准答案:(1)next(2)t->data(3)t知识点解析:fun函数的功能是输出链表尾部结点中的数据,并释放该结点,使链表缩短。由于链表是单向的,找到链表尾部结点需要利用循环从头结点开始查找,直至找到最后一个,找到之后输出尾部结点的数据,然后删除尾结点。第一空:fun函数中的循环目的是找到尾结点“while(t->next!=NULL)”,利用结点变量s和t,s指向当前节点,t不断指向下一个结点,因此,第一空处应该是“t=t->next;”。第二空:这里是输出尾结点中的数据,已经利用循环找到了尾结点t,t的数据是t->data,因此,第二空处应该为“printf(’’%d’’,t->data),”。第三空输出尾结点数据之后删除尾结点,使用free,又因为尾结点是t,因此,第三空处应该为“flee(t);”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODI1.C中函数fun的功能是:将字符串中的字符按逆序输出,但不改变字符串中的内容。例如,若字符串为abed,则应输出:dcba。请改正程序中的错误,使它能计算出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!1#include<stdio.h>2/************found************/3fun(chara)4{if(*a)5{fun(a+1);6/************found************/7printf(’’%c’’*a);8}9}10main()11{chars[10]=’’abcd’’;12printf(’’处理前字符串=%s\n处理后字符串=’’,s);13fun(s);printf(’’\n’’);14}标准答案:(1)voidfun(char*a)(2)printf(’’%c’’,*a);知识点解析:本题中函数的功能是将字符串中的内容逆序。题干中给出的fun函数通过递归调用自身,实现字符串的逆序。(1)主函数中“fun(s);”语句中的s是数组名,所以在fun函数中参数的定义应该是指针型,“fun(chara)”改为“voidfun(char*a)”。(2)printf函数的调用形式是:printfif格式字符串,输出项表),在格式字符串和输出项表之间有“,”,因此,第二个标识处应该是“printf(’’%c’’,*a);”。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。例如,输入beijing<CR>shanghai<CR>(<CR>为回车键),函数将返回shanghai。注意:部分源程序存在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。1#include<stdio.h>2char*fun(char*s,char*t)3{4}5main()6{chara[20],b[20];7voidNONO();8printf(’’Input:1thstring:’’);9gets(a);10printf(’’Input2thstring:’’);11gets(b);12printf(’’%s\n’’,fun(a,b));13NONO();14}15voidNONO()16{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/17FILE*fp,*wf;18inti;19chara[20],b[20];20fp=fopen(’’in.dat’’,’’r’’);21wf=fopen(’’out;dat’’,’’w’’);22for(i=0;i<10;i++){23fscanf(fp,’’%s%s’’,a,b);24fprintf(wf,’’%s\n’’,fun(a,b));25}26fclose(fp);27fclose(wf);}标准答案:1inti;2char*p=s,*q=t,3intn=0,m=0;4while(*p)//计算串s的长度n,其中p为临时指针5{n++;6p++;7}8while(*q)//计算串t的长度m,其中q为临时指针9{m++;10q++;11}12if(n>=m)//比较m和n的值,设置p指向较大的指针13p=s;14else15p=t;16returnp;知识点解析:该程序功能是比较两个字符串的长度。解题过程是首先分别求得两个字符串的长度,然后对这两个值进行判断,实现两个字符串长度的比较。进入fun函数,根据前面的分析:(1)首先求得字符串的长度,设变量n和m分别用来求字符串的长度,初值设为0,把字符串中的字符逐个访问,每访问一个字符,n和m分别加1,直到字符串结束;(2)使用两个临时指针变量p、q分别作为访问字符串的变量;(3)根据m和n的值返回串,设置指针p,指向返回串的开始地址。国家二级C语言机试(操作题)模拟试卷第3套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中,函数fun的功能是:在任意给定的9个正整数中找出按升序排列时处于中间的数,将原数据序列中比该中间数小的数用该中间数替换,位置不变,在主函数中输出处理后的数据序列,并将中间数作为函数值返回。例如,有9个正整数:1572387582145按升序排列时的中间数为:8处理后主函数中输出的数列为:8882387882145请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!试题程序:1#inclucte<stdio.h>2#defineN93intfun(intx[])4{inti,j,k,t,mid,b[N];5for(i=0;i<N;i++)6b[i]=x[i];7for(i=0;i<=N/2;i++)8{k=i;9for(j=i+l;j<N;j++)10if(b[k]>b[j])k=j;11if(k!=i)12{13/*********found*********/14t=b[i];b[i]=【1】;15b[k]=t;16}17}18/*********found*********/19mid=b[【2】];20for(i=0;i<N;i++)21/*********found*********/22if(x[i]【3】mid)x[i]-mid;23returnmid;24}25main()26{inti,x[N]={1,5,7,23,87,5,8,21,45};27for(i=0;i<N;i++)28printf(’’%d’’,x[i]);29printf(’’\nThemiddatais:%d\n’’,fun(x));30for(i=0;i<N;i++)31printf(’’%d’’,x[i]);32printf(’’\n’’);33}标准答案:(1)b[k](2)4或N/2(3)<知识点解析:数组中的9个数任意排列,要找到按升序排列时处于中间位置的数,应首先对数组进行升序排列。因为只需找到中间位置的数即可,故不必对整个数组进行排序,只需要排列出数组的前半部分。找到中间数后,遍历原数组,将小丁中问数的冗素进行替换。填空1:利用选择算法排序,先指定一个元素为最小,用这个数与其后的所有数进行比较,若找小于此数,则进行替换。此处考查替换操作。填空2:元素mid存放中间位置的数,数组长度为9,因此中间元素数为b[4]。填空3:遍历数组,当元素小于中间位置的数(即mid)时,进行替换。二、程序修改题(本题共1题,每题1.0分,共1分。)2、下列给定程序中,函数fun的功能是:给定n个实数,输出平均值,并统计平均值以上(含平均值)的实数个数。例如,n=8时,输入193.199、195.673、195.757、196.051、196.092、196.596、196.579、196.763、所得平均值为195.838745,在平均值以上的实数个数应为5。请改正程序中的错误,使其能得出正确的结果。注意:部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:1#include<stdlib.h>2#include<conio.h>3#include<stdio.h>4intfun(floatx[],intn)5/*********found*********/6intj,c=0;floatxa=0.0;7for(j=0;jxa)13c++;14returnc;15}16main()17{floatx[100]={193.199,195.673、195.757、196.051、196.092、196.596,196.579,196.763};18system(’’cls’’);19printf(’’%d\n’’,fun(x,8));20}标准答案:(1){intj,c=0;floatxa=0.0;(2)if(x[j]>=xa)知识点解析:(1)本题着重考查考生对C语言基本语法以及比较运算符的掌握情况。(2)本题中的第一个错误:在C语言中,{}应成对出现,所以程序中的语句”intj,c=0;floatxa=0.0;’’应改为’’{intj,c=0;floatxa=0.0;’’或相同作用的语句;本题中的第二个错误:在C语言中,判断大于或等于的运算符应为>=,所以程序中的语句’’if(x[j]=>xa)’’应改为’’if(x[j]>=xa)’’或相同作用的语句。三、程序设计题(本题共1题,每题1.0分,共1分。)3、编写函数fun,其功能是:将S所指字符串中ASCII码值为奇数的字符删除,剩余字符形成的新串放在t所指数组中。例如,若s所指字符串中的内容为“ABCDEFGl2345”,其中字符A的ASCII码值为奇数,字符1的ASCII码值也为奇数,都应当删除,其他依此类推。最后t所指的数组中的内容应是“BDF24”。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:1#include<conio.h>2#include<stdio.h>3#include<string.h>4voidfun(char*s,chart[])5{67}8main()9{10chars[100],t[100],Msg[]=’’Pleaseenterstrings:’’;11printf(Msg);12scanf(’’%s’’,s);13fun(s,t);14printf(’’\nTheresuitis:%s\n’’,t);15}标准答案:1voidfun(char*s,chart[])2{3inti,j=0,n;4n=strlen(s);5/*遍历整个数组*/6for(i=0;i知识点解析:要删除ASCII码值为奇数的字符,也就是要保留ASCII码值为偶数的字符,由于最终是要求出剩余字符形成的新串,所以本题的算法是对原字符串从头到尾扫描,找出ASCII码值为偶数的字符并依次存入数组。国家二级C语言机试(操作题)模拟试卷第4套一、程序填空题(本题共1题,每题1.0分,共1分。)1、函数fun的功能是:把形参a所指数组中的最大值放在a[0]中,接着求出a所指数组中的最小值放在a[1]中;再把a所指数组元素中的次大值放在a[2]中,把a数组元素中的次小值放在a[3]中;其余以此类推。例如:若a所指数组中的数据最初排列为:1、4、2、3、9、6、5、8、7,则按规则移动后,数据排列为:9、1、8、2、7、3、6、4、5。形参n中存放a所指数组中数据的个数。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!#include#defineN9/*********found**********/voidfun(int【1】,intn){inti,j,max,min,px,pn,t;/*********found**********/for(i=0;ia[j]){min=a[j];pn=j;}}if(px!=i){t=a[i];a[i]=max;a[px]=t;if(pn==i)pn=px;}if(pn!=i+1){t=a[i+l];a[i+l]=min;a[pn]=t;}}}main(){intb[N]={l,4,2,3,9,6,5,8,7},i;printf("\nTheoriginaldata:\n");for(i=0;i标准答案:(1)*a(2)2(3)i+1知识点解析:第一空:主函数内fun函数的调用“fun(b,N);”,其中,b为整型数组名,故fun函数的第一参数为整型指针,又根据“max=a[j]”可知第一个参数名为a,故第一空处为“*a”。第二空:根据题意a所指数组中的最大值放在a[0]中,接着求出a所指数组中的最小值放在a[1]中;再把a所指数组元素中的次大值放在a[2]中,把a数组元素中的次小值放在a[3]中,升序排序和降序排序的下标变化是每次在前一次的基础上+2,即a[0]、a[2]、a[4]…降序排序,a[1]、a[3]、a[5]…升序排序,故第二空应为“2”。第三空:选择排序法中的升序排序,首先从数组中挑选一个最小的元素,把它和第一元素交换,接着从剩下的n-1个元素中再挑出一个最小的元素,把它和第二个元素交换,不断重复以上过程,直到比较完最后两个元素。故内层循环变量j应该从i+1开始,因此,第三空处应为“i+1”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODI1.C中函数fun的功能是:按顺序给s所指数组中的元素赋予从2开始的偶数,然后再按顺序对每五个元素求一个平均值,并将这些值依次存放在w所指的数组中。若s所指数组中元素的个数不是5的倍数,多余部分忽略不计。例如,s所指数组有14个元素,则只对前10个元素进行处理,不对最后的4个元素求平均值。请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#include#defineSIZE20fun(double*s,double*w){intk,i;doublesum;for(k=2,i=0;i标准答案:(1)sum=0.0;(2)if((i+1)%5==0)知识点解析:(1)在第一标识下“sun=0.0;”,根据题意,这是给sum赋值,而sun没有定义编译时会提示错误,应改为“sum=0.0;”。(2)错误标识下的if判断语句是依顺序取5个字符,if中的逻辑表达式语法有误,由于1%5恒等于1,所以i+1%5也就等价于i+1了,所以将“if(i+1%5==0)”改为“if((i+1)%5==0)”,此处主要注意的是运算符的优先级。三、程序设计题(本题共1题,每题1.0分,共1分。)3、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#defineN8typedefstruct{charnum[10];doubles;}STREC;doublefun(STREC*a,STREC*b,int*n){}main(){STRECs[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87}};STRECh[N],t;FILE*out;inti,j,n;doubleave;ave=fun(s,h,&n);printf("The%dstudentdatawhichislowerthan%7.3f:\n",n,ave);for(i=0;ih[j].s){t=h[i];h[i]=h[j];h[j]=t;}for(i=0;i标准答案:inti;doubleave=0.0;*n=0;for(i=0;i知识点解析:(1)首先,通过循环求总分,然后求得平均分。(2)在循环中,进行平均分与每个成绩进行比较,并将满足条件的数据存入数组及对其进行累加。国家二级C语言机试(操作题)模拟试卷第5套一、程序填空题(本题共1题,每题1.0分,共1分。)1、下列给定程序中,函数fun的功能是:将形参a所指数组中的前半部分元素中的值与后半部分元素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。例如,若a所指数组中的数据为:1,2,3,4,5,6,7,8,9,则调换后为:6,7,8,9,5,1,2,3,4。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构!试题程序:#include<stdio.h>#defineN9voidfun(inta[],intn){inti,t,p;/*********found*********/p=(n%2==0)?n/2:n/2+【1】;for(i=0;i<n/2;i++){t=a[i];/*********found*********/a[i]=a[p+【2】];/*********found*********/【3】=t;}}main(){intbin]={1,2,3,4,5,6,7,8,9),i;printf("\nTheoriginaldata:\n");for(i=0;i<N;i++)printf("%4d",b[i]);printf("\n");fun(b,N);printf("\nThedataaftermoving:\n");for(i=0;i<N;i++)printf("%4d",b[i]);printf("\n");}标准答案:(1)1(2)i(3)a[p+i]或*(a+p+i)知识点解析:条件运算符组成条件表达式的一般形式:表达式17表达式2:表达式3。其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。填空1:该处是判断数组元素的个数是奇数还是偶数,为奇数时要使当前位置加1,使p指向数组中间位置。填空2和填空3:这里是一个比较常见的数组位置调换程序,应填入i和a[p+i]或*(a+p+i)。变量交换算法:如果变量a、b互换,需借助第3个变量temp完成,即temp=a;a=b;b=temp;。二、程序修改题(本题共1题,每题1.0分,共1分。)2、下列给定程序中函数fun的功能是:把从主函数中输入的3个数,最大的数放在a中,中间的数放在b中,最小的数放在c中。例如,若输入的数为:551234,输出的结果应当是:a=55.0,b=34.0,c=12.0。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include<stdio.h>voidfun(float*a,float*b,float*c){/*********found*********/float*k;if(*a<*b){k=*a;*a=*b;*b=k;}/*********found*********/if(*a>*c){k=*c;*c=*a;*a=k;}if(*b<*c){k=*b;*b=*c;*c=k;}}main(){floata,b,c;printf("Inputabc:");scanf("%f%f%f",&a,&b,&c);printf("a=%4.1f,b=%4.1f,C=%4.1f\n\n",a,b,c);fun(&a,&b,&c);printf("a=%4.1f,b=%4.1f,C=%4.1f\n\n”,a,b,c);}标准答案:(1)noatk;(2)if(*a<*c)知识点解析:本题考查:变量定义,根据给定程序语句确定变量类型;if语句条件表达式。(1)观察程序中的k,在赋值语句中,k是以变量的形式进行赋值而非指针,所以将k定义为指针是错误的。(2)此处if语句是为了将小于*c的值放入*c中,所以改为if(*a<*c)。三、程序设计题(本题共1题,每题1.0分,共1分。)3、学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组S中,请编写函数fun,其功能是:把分数最高的学生数据放在b所指的数组中。注意:分数最高的学生可能不止一个,函数返回分数最高的学生人数。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#inClude<stdio.h>#defineN16typedefStruct{charhum[10];ints;}STREC;intfun(STREC*a,STREC*b){}voidmain(){STRECs[N]={{"GA005",85),{"GA003",76},{"GA002",69),{"GA004",85},{"GA001",91},{"GA007",72},{"GA008",64),{"GA006",87},{"GA015",85},{"GA013",91},{"GA012",64),{"GA014",91),{"CA011",77),{"C|A017",64},{"GA018",64},{"GA016",72}},STRECh[N];inti,n;n=fun(s,h);printf("The%dhighestscore:\n",n);for(i=0;i<n;i++)printf("%s%4d\n",h[i].num,h[i].s);/*输出最高分学生的学号和成绩*/printf("\n");}标准答案:intfun(STREC*a,STREC*b){inti,j=0,max=a[0].s;for(i=0;i<N;i++)if(max<a[i].s)/*找出最大值*/max=a[i].s;for(i=0;i<N;i++)if(max==a[i].s)b[j++]=a[i];/*找出成绩与max相等的学生的记录,存入结构体b中*/returnj;/*返回最高成绩的学生人数*/}知识点解析:本题考查:结构体数组操作;用循环判断结构查找数组中的最大值。该程序使用两个循环判断语句,第1个循环判断语句的作用是找出最大值;第2个循环判断语句的作用是找出与max相等的成绩(即最高成绩)的学生记录,并存入b中。对于如何找出数组中最大值(多个相等)的方法,我们已经不陌生。如何对结构体数组进行类似操作呢?掌握以下语句:for(i=0;i<N;i++)if(max<a[i].s)max=a[i].s;国家二级C语言机试(操作题)模拟试卷第6套一、程序填空题(本题共1题,每题1.0分,共1分。)1、下列给定程序中,函数fun的功能是:从形参ss所指字符串数组中,删除所有串长超过k的字符串,函数返回剩余字符串的个数。ss所指字符串数组中共有N个字符串,且串长小于M。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。注意:部分源程序给出如下。不得增行或删行,也不得更改程序的结构!试题程序:#include<stdio.h>#include<string.h>#defineN5#defineM10intfun(char(*ss)[M],intk){inti,j=0,len;/*********found*********/for(i=0;i<【1】;i++){len=str1en(ss[i]);/*********found*********/if(1en<=【2】)/*********found*********/strcpy(ss[j++],【3】);}returnj;}voidmain(){charx[N][M]={"Beijing","Shanghai","Tianjin","Nanjing","Wuhan");inti,f;printf("\nTheoriginalstring\n\n");for(i=0;i<N;i++)puts(x[i]);printf("\n");f=fun(x,7);printf("ThestringwitchlengthislessthanOEequalto7:\n");for(i=0;i<f;i++)puts(x[i]);printf("\n");}标准答案:(1)N(2)k(3)ss[i]知识点解析:本题考查:for循环语句;if语句条件表达式;字符串复制函数strcpy的使用。填空1:for循环语句的作用是遍历字符串数组中的每一个字符串,所以循环变量i的循环条件是i<N。填空2:题目要求删除串长度大于k的字符串,所以if条件语句的条件表达式是len<=k。填空3:通过字符串复制函数将串长不大于k的字符串另存,并记录个数。字符串复制函数strcpy,其格式为:strcpy(字符数组名1,字符数组名2)功能:把字符数组2中的字符串复制到字符数组1中。字符串结束标识‘\0’也一同复制。字符数组名2,也可以是一个字符串常量,这时相当于把一个字符串赋予一个字符数组。二、程序修改题(本题共1题,每题1.0分,共1分。)2、下列给定程序中函数fun的功能是:逐个比较p、q所指两个字符串对应位置上的字符,并把ASCII值大或相等的字符依次存放到c所指的数组中,形成一个新的字符串。例如,若主函数中a字符串为“aBCDeFgH”,b字符串为“ABed”,则c中的字符串应为“aBcdeFgH”。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!试题程序:#include<stdio.h>#include<string.h>voidfun(char*p,char*q,char*c){/*********found*********/intk=1;/*********found*********/while(*p!=*q){if(*P<*q)c[k]=*q;elsec[k]=*p;if(*p)P++;if(*q)q++;k++;}}main(){chara[10]="aBCDeFgH",b[10]="ABcd",c[80]:{’\0’);fun(a,b,c);printf("Thestringa:");puts(a);printf("Thestringb:");puts(b);printf("Theresult:");puts(c);}标准答案:(1)intk=0;(2)while(*p||*q)知识点解析:本题考查:变量初始化,需要根据题意确定变量含义,然后对其进行初始化操作;while循环语句。(1)变量k存放数组c的下标,因此应初始化为0。(2)while循环语句的循环条件是判断两个字符串是否到达结尾。三、程序设计题(本题共1题,每题1.0分,共1分。)3、规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为“****A*BC*DEF*G*******”,删除后,字符串中的内容应当是“****ABCDEFG”。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容。仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<string.h>#include<stdio.h>#include<conio.h>voidfun(char*a){}main(){chars[81];printf("Enterastring:\n");gets(s);fun(s);printf("Thestringafterdeleted:\n");puts(s);}标准答案:voidfun(char*a){inti=0;char*p=a;/*单独处理字符串前缀为’*’的情况*/while(*p&&*p==’*’){a[i]=*p;i++;p++;}/*循环判断当前指向的字符是否’*’如果不是保存*/while(*p){if(*p!=’*’)/*保存非*的字符串,并将指针移到下一个位置*/{a[i]=’p;i++;}p++;}a[i]=’\0’;}知识点解析:本题考查:指针型变量定义;while循环语句;if语句条件表达式;字符串结束标识‘\0’。函数fun的功能:除了字符串前导的*号之外,将串中其他*号全部删除。解答本题,首先定义一个临时指针p,初始指向原串首地址;其次利用循环语句把字符串前导*号复制到原串;然后继续移动指针,把串中和串尾的非*号字符复制到原串;最后为修改后的字符串赋结束字符‘\0’。要删除字符串中的指定字符,通常采用保留非指定字符的方法。可以将非指定字符保留在原串,即将需要保留的字符从原串的起始位置重新赋值;也可以保留到新串,即新建一个字符串,存放要保留的字符。国家二级C语言机试(操作题)模拟试卷第7套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中,函数fun的作用是:不断从终端读入整数,由变量a统计大于0的个数,用变量c来统计小于0的个数,当输入0时结束输入,并通过形参pa和pb把统计的数据传回主函数进行输出。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!#includevoidfun(int*px,int*py){/**********found**********/int【1】;scanf("%d",&k);/**********found**********/while【2】{if(k>0)a++;if(k<0)c++;/**********found**********/【3】;}*px=a;*py=c;}main(){intx,y;fun(&x,&y);printf("x=%dy=%d\n",x,y);}标准答案:(1)a=0,c=0,k(2)(k!=0)(3)scanf("%d",&k);知识点解析:第一空:“int(1);”这一空出现在fun函数最开始的定义阶段,我们可以看到这里定义的是int整型数据,而在这下面的一步为“scanf("%d",&k);”即让我们输入k的数据,再根据题意,就可以知道这里的k是我们不断输入的整数,而整个程序也仅仅需要这一个数据的输入,所以这一空定义的就是我们需要输入的数据k,同时下面出现在a,c也都没有定义,所以这一空应该填“a=0,c=0,k”。第二空:“while(2);”这一空出现在fun函数中的while循环中,是要给出while循环的条件语句。根据题意我们就可以知道,这里循环是只要数字不0就一直进行,而while循环内部也能看到k>0和k<0时的统计步骤,所以这里while循环应该就是while循环的终止条件,k不等于即可,即这一空应该填“(k!=0)”(注意这里应该加上条件语句应有的括号)。第三空:“……(3);……”这一空在while循环中,此while循环是数字的判定函数。这一空前面已经有了对于数字大于0或者小于0的判断,也有相应的a++和c++来进行个数统计,但是我们会发现这里功能已经齐全,只不过没有达到题目要求的不断的输入,所以这里循环还要继续输入k的值才能实现题目所达到的要求,所以这一空应该填的是“scanf("%d",&k);”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序modil.c的主函数中,将a、b、c三个结点链成一个单向链表,并给各结点的数据域赋值,函数fun()的作用是:累加链表结点数据域中的数据作为函数值返回。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#includetypedefstructlist{intdata;structlist*next;}LTST;intfun(LIST*h){LTST*p;/**********found**********/intt;p=h;/**********found**********/while(*p){/**********found**********/t=t+p.data;p=(*p).next;}returnt;}main()(LISTa,b,c,*h;a.data=34;b.data=51;c.clara=87;c.next=’\0’;h=&a;a.next=&b;b.next=&c;printf("总和=%d\n",fun(h));}标准答案:(1)intt改为intt=0;(2)while(*p)改为while(p)(3)t=t+p.data;改t=t+(*p).data知识点解析:(1)第一个错误在定义t时,t是数据结果,但是在一开始定义时,t应该定义为0的,这样才不会影响后面的数据结果,以免程序出现不必要的错误所以这里应该讲intt改为“intt=0”。(2)第二个错误在fun函数中执行while条件时while的条件语句。这里用“*p”,我们都知道这是指针的形式,而“*p”的意义是指针变量p所指向的变量的值,所以这里“*p”是一个具体的变量,而while(*p)的意义是“*p”不为空时就一直执行,但是这里根据题意我们需要的链表的地址来进行题目需要的链表的计算,而单向链表的结束的标志就是链尾,链尾的特征则是指向为空,这里指向为空指的是地址比阿娘,所以这里的终止条件不应该是p所指向的值为0,而是p的地址为空,所以“while(*p)”应该改为“while(p)”。(3)第三个错误在fun()函数中的计算。我们都知道,链表与结构体是紧密相连的,这一题同样用到了,而且我们进行的也是链表结点的运算,自然要用到结构体成员变量的运算。但是在“t=t+p.data”这个运算时,“p.data”的意义是“p.data”这个指针变量,也就是说这是指针变量的运算,指针变量是跟结点变量不同的,我们需要的是结点的数据,而不是指向它的指针的数据,所以这里的运算是完全错误的,为了符合题意,我们应该要使用结点的结构体变量。即“=t+p.data”应该改为“t=t+(*p).data”。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写函数fun,其功能是分别统计形参t所指二维数组中字母A和C的个数。注意:部分源程序存在PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。#include#include#defineM14voidNONO();voidfun(char(*t)[M],int*a,int*c){}voidget(char(*s)[M])(inti,j;for(i=0;i标准答案:voidfun(char(*t)[M],int*a,int*c){inti,j;*a=0;*c=0;for(i=0;i知识点解析:本题首先需要一个二维数组,二维数组的大小在程序开始就进行了定义“define=14”,这个大小比较合适,然后利用gets函数得到数组,然后数据就可以进入fun函数中进行处理应用。进入fun函数,fun函数首先肯定需要for循环语句将二维数组中的数据进行排序使用,然后需要条件语句进行判断处理,这两步是一体,见程序第9~11行,for循环保证全部使用了二维数组中数据,并且是依次使用,if语句判断了字母是否为A或者C或者都不是,并且进行了统计相加得到了A的个数a,C的个数c,这样循环完成后,A和C的个数a、c就能继续返回主函数进行输出了,见程序26行,最终得到结果。国家二级C语言机试(操作题)模拟试卷第8套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中,函数fun的功能是将带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1C中。不得增行或删行,也不得更改程序的结构!#include#include#defineN6typedefstructnode{intdata;structnode*next;}NODE;voidfun(NODE*h){NODE*p,*q;intt;/**********found**********/p=___1___;while(P){/**********found**********/q=___2___;while(q){/**********found**********/if(p->data____3___q->data){t=p->data;P->data=q->data;q->data=t;)q=q->next;}p=p->next;}}NODE*creatlist(inta[]){NODE*h,*P,*q;inti;h=(NODE*)malloc(sizeof(NODE));h->next=NULL;for(i=0;idata=a[i];q->next=NULL;if(h->next==NULL)h->next=p=q;else(p->next=q;P=q;)}returnh;}voidoutlist(NODE*h){NODE*P;p=h->next;if(p==NULL)printf("ThelistisNULL!\n");else{printf("\nHead");do{printf("->%d",P->data);p=p->next;)while(P!=NULL);printf("->End\n");}}main(){NODE*head;inta[N]={0,10,4,2,8,6};head=creatlist(a);printf("\nTheoriginallist:\n");outlist(head);fun(head);printf("\nThelistaftersorting:\n");outlist(head);)标准答案:(1)h->next(2)p->next(3)>=知识点解析:函数fun的功能是将带头节点的单向链表结点数据域中的数据从小到大排序,在fun函数内采用的是选择法排序。第一空:由审题分析可知,q从h的下一个元素开始寻找最小值,故第一空为“h->next”。第二空:由审题分析可知,while循环是在剩下的元素当中找最小值,剩下的结点是由q指向的链表,q从p的后一个结点开始,故第二空处应为“p->next”。第三空:“if(p->data__3__q->data)”是比较p结点和q结点数据的大小,如果p结点的数据比q结点的数据大,那么应该将p结点和q结点的数据进行交换,故第三空处应为“>=”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODI1.C是建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。函数fun的作用是求出单向链表结点(不包括头结点)数据域中的最大值,并且作为函数值返回。请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!#include#includetypedefstructaa{intdata;struct,aa*next;}NODE;intfun(NODE*h){intmax=-1;NODE*p;/**********found**********/p=h;while(P){if(P->data>max)max=p->data;/**********found**********/p=h->next;}returnmax;}outresult(ints,FILE*pf){fprintf(pf,"\nThemaxinlink:%dkn",s);}NODE*creatlink(inth,intm){NODE*h,*P,*s;inti;h=p=(NODE*)malloc(sizeof(NODE));h->data=9999;for(i=l;i<=n;i++){s=(NODE*)malloc(sizeof(NODE));s->data=rand()%m;s->next=p->next;P->next=s;p=p->next;}P->next=NULL;returnh;}outlink(NODE*h,FILE*pf){NODE*P;p=h->next;fprintf(pf,"\nTHELIST:\n\nHEAD");while(P){fprintf(pf,"->%d",p->data);p=p->next;)fprintf(pf,"\n");}main(){NODE*head,intm,head=creatlink(12,100);optlink(head,stdout);m=fun(head);printf("\nTHERESULT:\n"),outresult(m,stdout);}标准答案:(1)p=h->next;(2)p=p->next;知识点解析:函数功能是求单向链表结点(不包括头结点)数据域中的最大值。其中,单链表查找最大值及最小值的方法主要是对单链表的遍历,并在遍历过程中将初始化的最大值、最小值与链表中的每一个结点的数据域进行比较。(1)根据题干中求得除了头结点之外的结点数据域中的最大值,头指针h,工作指针p指向头结点的下一个结点,所以第一个标识下的“p=h;”指向头结点应该改为指向下一个结点“p=h->next;”。(2)工作指针p,利用p实现对链表的遍历,p表示指向链表的当前结点,所以指向下一个结点应该是“p=p->next;”。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写函数fun,函数的功能是:将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。例如,二维数组中的数据为:333333334444444455555555则一维数组中的内容应是:333333334444444455555555。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includevoidfun(int(*s)[10],int*b,int*n,intmm,intnn){}main(){intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;inta[100]={0),n=0;voidNONO();printf("Thematrix:\n");for(i=0;i<3;i++){for(j=0;j<4;j++)printf("%3d",w[i][j]);printf("\n");}fun(w,a,&n,3,4);printf("TheAarray:\n");for(i=0;i标准答案:inti,j;for(i=0;i知识点解析:该程序功能是将M行、N列的二维数组中的数据,按行的顺序依次放到一维数组中。本题中首先要清楚数组元素在通常情况下是按行存放的,而如果要实现按行存放,其对应关系应为:s[0][0],s[0][1],s[0][2],…,s[0][M-1],s[1][0],s[][1],…,s[N-1][M-1]。国家二级C语言机试(操作题)模拟试卷第9套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中,函数fun的功能是:统计出带有头结点的单向链表中结点的个数,存放在形参n所指的存储单元中。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行。也不得更改稗序的结构!#include#include#defineN8typedefstruct1ist{intdata;struct1ist*next;)SLIST;SLIST*creatlist(int*a);voidoutlist(SLIST*);voidfun(SLIST*h,int*n){SLIST*P;/**********found**********/___1___=0;P=h->next;while(P){(*n)++;/**********fo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论