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

下载本文档

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

文档简介

国家二级(C语言)机试模拟试卷29(共9套)(共27题)国家二级(C语言)机试模拟试卷第1套一、程序填空题(本题共1题,每题1.0分,共1分。)1、函数fun的功能是:计算直到。若x=2.5,函数值为:1.917915。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的RLANKI.C中。不得增行或删行,也不得更改程序的结构!#include#includedoublefun(doublex){doublef,t;intn;f=1.0+x;/***************found***************/t=【1】;n=1;do{n++;/***************found***************/t*=(一1.0)*x/【2】;f+=t;}/***************found***************/while(【3】>=le-6);returnf;}main(){doublex,y;x=2.5;y=fun(x);printf("\nTheresultis:\n");printf("x=%-12.6fy=%-12.6f\n",x,y);}标准答案:(1)x(2)n(3)fabs(t)知识点解析:第一空:“f=1.0+x;"f的初始化为级数的前两项之和,dowhile循环从第三项x2/2开始计算,第一空处是给t赋初值,t表示级数项,“n++;t*=(-1.0)*x/【2】;"即第一次进入do循环之后n的值为2,故t的初值应该为x,第一空处应为“x"。第二空:由审题分析可知,后一项乘以(-1)*x除以n,故第二空处应为“n"。第三空:循环的终止条件是(xn/n!)的绝对值小于le-6,即只要(xn/n!)大于等于le-6,do循环就执行,故第三处应为“labs(t)",fabs函数的功能是求绝对值。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODll.C中函数fun的功能是:在p所指字符串中找出ASCⅡ码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。例如,调用fun函数之前给字符串输入:ABCDeFGH,调用后字符串中的内容为:eABCDFGH。请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#includevoidfun(char*p){charmax,*q;inti=0;max=p[i];while(p[i]!=0){if(maxp){*q=*(q-1);q--;}p[0]=max;}main(){charstr[80];printf("Enterastring:");gets(str);printf("\nTheoriginalstring:");puts(str);fun(str);printf("\nThestringaftermoving:");puts(str);printf("\n\n");}标准答案:q=p+I;while(q>p)知识点解析:(1)在C语言中语句以分号“;”结束,在第一个标识下语句“q=p+i”没有用分号结尾,应改为“q=p+I;”。(2)根据题意第二标识下是利用循环来将移走的字符前的原字符向后顺序移动,第二标识下“wihle(q>p)”wihle不是C语言关键字,应改成“while(q>p)”,利用while循环来实现字符移动。三、程序设计题(本题共1题,每题1.0分,共1分。)3、假定输人的字符串中只包含字母和*号。请编写函数proc(),它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言的字符串函数。例如,若字符串中的内容为****a*bc*def*g****,删除后,字符串中的内容应当是abcdefg****。注意:部分源程序给出如下。请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的花括号中填入所编写的若干语句。试题程序:#include#includevoidproc(char*str,char*p){}voidmain(){charstr[81],*t;printf(”Enterastring:\n”);gets(str);t:==str0while(*t)t++;t--;//指针t指向字符串尾部while(*t一=’*’)t--;//指针t指向最后一个字母proc(str,t);printf(”Thestringafterdeleted:\n”);puts(str);}标准答案:voidproc(char*str,char*p){char*t=str;for(;t<=p;t++)if(*t!=’*’)//把前面不是*号的字符放到a数组,通过t的移动来实现*(str++)=*t;for(;*t!=’\0’;t++)*(str++)=*t;//把尾部的*号接到其后面,当*t为’\0’,时结束*str=’\0’;//题目要求a数组中存放字符,因此用’\0’作为结束标志知识点解析:题目中要求除了尾部的*号之外,将字符串中其他*号全部删除。首先将所有不是*的字符放在字符串str中,然后将尾部的*接在字符的后面,最后为字符串str加上结束符。国家二级(C语言)机试模拟试卷第2套一、程序填空题(本题共1题,每题1.0分,共1分。)1、请补充main函数,该函数的功能是:打印届1~1000中满足:个位数字的立方等于其本身所有数。本题的结果为;164125216729注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数main的横线上填入所编写的若干表达式或语句。试题程序:#include<stdio.h>main(){inti,g;clrscr();for(i=1;i<1000;i++){g=【】;if(【】)printf("%4d",i);}}标准答案:i%10g*g*g==i知识点解析:第一空:将一个整数对10求余,就得到这个数的个位数字,并存于变量g中。第二空:如果个位数字的立方等于这个数本身,则将这个数输出。二、程序修改题(本题共1题,每题1.0分,共1分。)2、下列给定程序中,函数fun()的功能是:首先把b所指字符串中的字符按逆序存放,然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串中的内容为abcdefg,b所指字符串中的内容为1234时,c所指数组中的内容应该为a4b3c2dlefg;而当a所指字符串中的内容为1234,b所指字符串中的内容为abcdefg时,c所指数组中的内容应改为1g2f3e4dcba。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序#include<conio.h>#include<stdio.h>#include<string.h>voidfun(char*a,char*b,char*c){inti,j;charch;i=0;j=strlen(b)-1;/*************found**************/while(i>j}{ch=bill;b[i]=b[j];b[j]=ch;i++;j--;}while(*a||*b){if(*a){*c=*a;c++;a++;}if(*b){*c=*b;c++;b++;}}/*************found**************/*c=0;}main(){chars1[100],s2[100],t[200];clrscr();printf("\nEnters1string:");scanf("%s",s1);printf("\nEnters2string:");scanf("%s",s2);fun(s1,s2,t);printf("\nTheresultis:%s\n",t);}标准答案:(1)错误:while(i>j)正确:while(i<j)(2)错误:*c=0;正确:*c=’\0’知识点解析:这是一个字符串处理的较为混合的程序,将字符串倒序存放的方法一般是以字符串中央为中心,将两边对称位置的字符互相交换。可利用循环语句实现,但必须要注意两边对称位置元素的下标。该题是用指针配合循环的嵌套实现解题目的。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写函数fun(),该函数的功能是:实现B=A+A’,即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main()函数中输出。例如,输入下面矩阵:123456789其转置矩阵为:147258369则程序输出:261061014101418注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<stdio.h>#include<conio,h>voidfun(inta[3][3],intb[3][3]){}main(){inta[3][3]={{1,2,3},{4,5,6},{7,8,9}},t[3][3];inti,j;clrscr();fun(a,t);for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%7d",t[i][j]);printf("\n");}}标准答案:voidfun(inta[3][3],intb[3][3]){inti,j;for(i=0;i<3;i++)for(j=0;j<3;j++)b[i][j]=a[i][j]+a[j][i];/*把矩阵a加上a的转置,存放在矩阵b中*/}知识点解析:在《线性代数》里面有矩阵转置的概念,行列数相等的二维数组的转置就是行列互换。即转置后的第i行第j列正好对应原矩阵的第j行第i列。若要将矩阵a转置后还存入a中可用程序:inti,j,t;for(i=0;i<N;i++)for(j=i;j<N;j++){t=a[i][j];a[i][j]=a[j][i];a[j][ii=t;}注意第2个循环的初值。若要将矩阵a转置后存入c中:inti,j;for(i=0;i<N;i++)for(j=0;j<N;j++)c[i][j]=a[j][i];注意数组c和a的下标。国家二级(C语言)机试模拟试卷第3套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中,函数fun的功能是:把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注:字符串的长度大于等于2)。例如,形参s所指的字符串为:abcdefgh,执行结果为:ahcbedgf。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANKl.C中。不得增行或删行,也不得更改程序的结构!#includevoidfun(char*s){inti,n,k;charc;n=0;for(i=0;s[i]!=’\0’;i++)n++;/**********found**********/if(n%2==0)k=n-【1】;elsek=n-2;/**********found**********/c=【2】;for(i=k-2;i>=1;i=i-2)s[i+2]=s[i];/**********found**********/s[1]=【3】;}main(){chars[80]="abcdefgh";printf("\nTheoriginalstringis:%s\n",s);fun(s);printf("\nTheresultis:%s\n",s);}标准答案:1s[k]c知识点解析:第一空:“for(i=0;s[i]!=’\0’;i++)n++;”n记录了数组s的长度,“if(n%2==0)”如果长度n是偶数,那么最右边被移出的字符的下标是在n-1,如果n是奇数,那么最右边被移出的字符的下标是n-2,因此第一空处应为“1”。第二空:题目要求最右边被移出字符串的字符绕回放到第一个奇数位置,因此最右边被移出的字符是s[k],在s[k]被替换之前必须先把s[k]保存在其他变量中,故第二空处应为“s[k]”,将s[k]保存在c中。第三空:此处是把最右边被移出字符串的字符绕回放到第一个奇数位置,最右边被移出字符保存在c,第一奇数位置是s[1],故第三处应为“c”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODII.C中函数fun的功能是:逐个比较P、q所指两个字符串对应位置中的字符,把ASCII值大或相等的字符依次存放到c所指数组中,形成一个新的字符串。例如,若主函数中a字符串为:aBCDeFgH,主函数中b字符串为:ABcd,则c中的字符串应为:aBcdeFgH。请改正程序中的错误,使它能得出正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。#include#includevoidfun(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);}标准答案:intk=0;aBCDeFgH知识点解析:(1)第一个标识下面的“intk=1;”在题目中要求将字符放在数组c,如果数组中有n个元素,应该从c[0]到c[n-1]。所以,应将k的初始化定义改为从0开始,即“intk=0;”。(2)第二个标识下面的判断条件,是根据题目要求逐个比较两个数组对应字符的ASCII值的大小,所以判断条件应该是直到两个字符数组所有元素比较完毕,而不是数组对应元素不相等。其中,该题主要考查变量的初始化,逻辑关系。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写函数fun,函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。例如,二维数组中的数据为:则字符串中的内容应是:WsHWSHwSH。注意:部分源程序在文件PROGl.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#defineM3#defineN4voidfun(chars[][N],char*b){inti,j,n=0;for(i=0;i标准答案:{for(j=0;j知识点解析:(1)利用两重循环,依次取矩阵中的元素。(2)其中注意指针数组与数组指针的区别,其中数组指针b,它指向包含4个元素的一维数组。(3)最后,在一维数组字符处理完毕后,一定要使其尾元素赋值为串结束符’\0’。国家二级(C语言)机试模拟试卷第4套一、程序填空题(本题共1题,每题1.0分,共1分。)1、人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中。函数fun的功能是:找出指定出生年份的人员,将其数据放在形参k所指的数组中,由主函数输出,同时由函数值返回满足指定条件的人数。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANKl.C中。不得增行或删行,也不得更改程序的结构!#include#defineN8typedefstruct{intnum;intyear,month,day;}STU;intfun(STU*std,STU*k,intyear){inti,n=0;for(i=0;i标准答案:std[i].yearstd[i]n知识点解析:第一空:比较结构体的出生年份是否等于year,std是结构体指针,指向结构体数组的首地址,因此访问一个结构体的year成员是std[i].year,因此第一空处应为“if(std[i].year==year)”。第二空:这里是将找到的数据放在形参k所指的数组中,k是指针变量,k指向结构体数组的首地址,std[i]是结构体的地址,因此等号左边也应该是地址,故第二空处应为“k[n++]=std[i];”。第三空:fun函数的返回值是满足指定条件的人数n,故第三空处是“return(n);”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODll.C中函数fun的功能是:求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!#include#defineN20intfun(int*a,intn){inti,m,t,k;for(i=0;i<2;i++){/**********found**********/m=0;for(k=i+1;ka[m])t=a[i];a[i]=a[m];a[m]=t;}}main(){intx,b[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;for(i=0;i标准答案:m=i;if(a[k]>a[m])m=k;知识点解析:(1)第二个标识符下for循环逐个对m个数据进行选择判断,原题中“m=0;”语句将m值设置为0,在循环中m值始终是0,不会改变,根据“for(i=0;i<2;i++)”语句中的循环条件,“m=0;”改为“m=i;”。(2)如果“if(a[k]>a[m])”,a[k]比a[m]大,m记录下下标值k,内层循环结束的时候a[m]值就是本次循环找到的最大值(如果m=0,a[m]是数组中的最大值;如果m=1,a[m]数组中的次最大值),即m记录最大值的下标值,因此第二标识下应该是“if(a[k]>a[m])m=k;”。三、程序设计题(本题共1题,每题1.0分,共1分。)3、假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后的一个字母。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:ABCDEFG*******。注意:部分源程序在文件PROGI.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includevoidfun(char*a,char*p){}main(){chars[81],*t;voidNONO();printf("Enterastring:\n");gets(s);t=s;while(*t)t++;t--;while(*t==’*’)t--;fun(s,t);printf("Thestringafterdeleted:\n");puts(s);NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*in,*out;inti;chars[81],*t;in=fopen("in.dat","r");out=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(in,"%s",s);t=s;while(*t)t++;t--;while(*t==’*’)t--;fun(s,t);fprintf(out,"%s\n",s);}fclose(in);fclose(out);}标准答案:{char*q=a;intj=0;while(*q&&q知识点解析:(1)首先,主函数中使指针移到字符串的最后一个字符,对字符串由串尾开始进行操作。(2)然后,指针由尾开始向头移动,查找第一个非“*”号字符,指针t指向后一个非“*”,即从最后一个非“*”,字符开始的字符都不需要删除,将前面的其它“*”号全部删除后,将尾部的“*”字符往前移动即可。(3)确定了字符数组的最后一个字符非“*”后,调用fun函数,在fun函数中,将原串中由起始位置的字符开始到最后一个非“*”逐个查询该字符是否是“*”字符,如果是则删除,并将后面的字符往前移动;然后将t之后的字符移动到前面,最后在字符串的后面添加“’\0’”即可。国家二级(C语言)机试模拟试卷第5套一、程序填空题(本题共1题,每题1.0分,共1分。)1、给定程序中,函数fun的功能是:在带有头结点的单向链表中,查找数据域中值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回0值。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANKl.C中。不得增行或删行。也不得更改程序的结构!#include#include#defineN8typedefstructlist{intdata;structlist*next;}SLIST;SLIST*creatlist(char*);voidoutlist(SLIST*);intfun(SLIST*h,charch){SLIST*p;intn=0;p=h->next;/**********found**********/while(p!=【1】){n++;/**********found**********/if(p->data==ch)return【2】;elsep=p->next;}return0;}main(){SLIST*head;intk;charch;chara[N]={’m’,’p’,’g’,’a’,’w’,’x’,’r’,’d’};head=creatlist(a);outlist(head);printf("Enteraletter:");scanf("%c",&ch);/**********found**********/k=fun(【3】);if(k==0)printf("\nNotfound!\n");elseprintf("Thesequencenumberis:%d\n",k);}SLIST*creatlist(char*a){SLIST*h,*p,*q;inti;h=p=(SLIST*)malloc(sizeof(SLIST));for(i=0;idata=a[i];p->next=q;p=q;}p->next=0;returnh;}voidoutlist(SLIST*h){SLIST*p;p=h->next;if(p==NULL)printf("\nThelistisNULL!\n");else{printf("\nHead");do{printf("->%c",p->data);p=p->next;}while(p!=NULL);printf("->End\n");}}标准答案:0nhead,ch知识点解析:第一空:这里是补充循环结束条件,链表是单向有限的,最后一个结点的指针域指向NULL,因此可以用这个来作为循环结束条件,在p指向的结点的指针域不是NULL时表明还有下一个结点,因此第一空处应该是“while(p!=NULL)”。第二空:在循环当中n用来记录顺序号,如果“if(p->data==ch)”成立,则已经找到数据域中值为ch的结点,返回顺序号,即“returnn;”。第三空:fun函数的调用形式是:fun(SLIST*h,charch),第一个参数是头结点地址,第二个参数是需要寻找的ch值,因此第三空处应该是“k=fun(head,ch);”。二、程序修改题(本题共1题,每题1.0分,共1分。)2、给定程序MODll.C中函数fun的功能是:判断ch中的字符是否与str所指串中的某个字符相同;若相同,什么也不做,若不同,则将其插在串的最后。请改正程序中的错误,使它能进行正确的操作。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!#include#include/**********found*********voidfun(char*str,charch)*/voidfun(charstr,charch){while(*str&&*str!=ch)str++;/**********found*********if(*str!=ch)*/while(*str!=ch){str[0]=ch;/**********found*********str[1]=’\0’;*/str[1]=’0’;}main(){chars[81],c;printf("\nPleaseenterastring:\n");gets(s);printf("\nPleaseenterthecharactertosearch:");c=getchar();fun(s,c);printf("\nTheresultis%s\n",s);}标准答案:voidfun(char*str,charch)if(*str!=ch)str[1]=’\0’;知识点解析:(1)第一个标识下,“voidfun(charstr,charch)”根据主函数中的fun函数的调用“fun(s,c)”,知道s为数组名,传的应该是数组地址,所以应改为“voidfun(char*str,charch)”。(2)while循环中对ch与str进行匹配检查,第二个标识下,是当不同时执行连接操作,那么判断*str与ch是否不同的表达式应该是“if(*str!=ch)”。(3)第三个标识下,连接后的新串要添加结尾符,所以正确的表达是将“str[1]=’0’;”改为“str[1]=’\0’;”。三、程序设计题(本题共1题,每题1.0分,共1分。)3、编写函数fun,它的功能是:求Fiboncci数列中大于t的最小的一个数,结果由函数返回。其中Fibonacci数列F(n)的定义为:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2)例如:当t=1000时,函数值为:1597。注意:部分源程序在文件PROGl.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includeintfun(intt){}main()/*主函数*/{intn;voidNONO();n=1000;printf("n=%d,f=%d\n",n,fun(n));NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*fp,*wf;inti,n,s;fp=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(fp,"%d",&n);s=fun(n);fprintf(wf,"%d\n",s);}fclose(fp);fclose(wf);}标准答案:{intf0=0,f1=1,f;do{f=f0+f1;f0=f1;f1=f;}while(f知识点解析:(1)在循环中求得数列,并对数列的值进行判断,看是否符合题干要求。(2)如果求得的数列值不满足题干要求,将当前值赋值给前一项,将前一项赋给前一项的前一项,继续求下一项的数列值,直到满足条件。国家二级(C语言)机试模拟试卷第6套一、程序填空题(本题共1题,每题1.0分,共1分。)1、请补充函数fun(),该函数的功能是:计算下面公式的值(k<50):例如:当k=5时,s=338.215158。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数函数fun()的横线上填入所编写的若干表达式或语句。试题程序:#include<conio.h>#include<stdio.h>doublefun(intn){doubles=【】;doublef=0.0;doublep=0.0;inti=0;intk;for(k=1;【】;k++){f=2*k-1;p=2*k+l;for(i=1;i<2*k+l;i++)f*=2*k-1;for(i=1;i<2*k-1;i++)p*=2*k+1;【】;}returns;}main(){intk=0;doubles;clrscr();printf("\nPleaseinputk(k<50):");scanf("%d",&k);s=fun(k);printf("\nS=%lf",s);}标准答案:1k<=ns*=f/p知识点解析:第一空:变量s存放最后的计算结果,由公式可知,计算结果为多个数的乘积,所以s应该初始化为1。第二空:for循环的次数为n,由公式可知,k的取值应该从1到n。第三空:for循环求出的f为(2k-1)2k+l,for循环求出的p为(2k+1)2k-1,由公式可知,每—项即为f/p,所以此处应填s*=f/p。二、程序修改题(本题共1题,每题1.0分,共1分。)2、下列给定程序中,函数fun()的功能是:利用插入排序法对字符串中的字符按从大到小的顺序进行排序。插入法的基本方法是:先对字符串中的头两个元素进行排序,然后把第3个字符插入到前两个字符中,插入后前3个字符依然有序;再把第4个字符插入到前3个字符中,待排序的字符串已在主函数中赋予。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<string.h>#include<stdio.h>#defineN80voidinsert(char*aa){inti,j,n;charch;n=strlen(aa);for(i=1;i<n;i++){ch=aa[i];j=i-1;/*************found*************/while((j>=0)||(ch>aa[j])){aa[j+1]=aa[j];j--;}/*************found*************/aa[j]=ch;}}main(){chara[N]="JRTYDFKLIOPQWEGHMNBVCUASXZ";inti;printf("Theoriginalstring:%S\n",a);insert(a);printf("Thestringaftersorting:%S\n\n",a);}标准答案:(1)错误:while((j>=0)||(ch>aa[j]))正确:while((j>=0)&&(ch>aa[j]))(2)错误:aa[j]=ch;正确:aa[j+1]=ch;知识点解析:错误1:此处的两个条件要同时满足,是“与”的关系,而不是“或”的关系。错误2:对长度为n的数组元素进行排列,可先对数组的前m-1项进行排序,之后再对前m项进行排序,如此循环直到数组全部元素完成排序。对前m项的子数列进行排序的方法是,将该子数列的末尾元素与前m-1项的元素相比较,由于前m-1项已经完成排序,可以找到某一位置,使得将该末尾元素插入该位置之后,前m项仍然保持降序。这样循环后,就可以得到全部元素的排序。掌握了这个方法,这行的错误就很容易找出来了。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写函数fun(),它的功能是计算:s=(1-In(1)-In(2)-In(3)-…-1n(m))2s作为函数值返回。在C语言中可调用log(n)函数求In(n)。log函数的引用说明是doublelog(doublex)。例如,若m的值为15,则fun()函数值为723.570801。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<math.h>doublefun(intm){}main(){clrscr();printf("%f\n",fun(15));}标准答案:doublefun(intm){inti;doubles=1.0;for(i=1;i<=m;i++)s=s-log(i);/*计算s=l-In(1)-In(2)-In(3)-…-In(m)*/return(s*s);/*对s求平方并返回*/}知识点解析:首先,题目要求计算1依次减去1到M的对数,可用从1到M的循环,每次循环都减一个数的对数。该题需要注意,log()函数的形式参数应浩如烟海double型变量,用于循环的基数变量为整数,需要进行强制转换。最后在返回的时求平方。国家二级(C语言)机试模拟试卷第7套一、程序填空题(本题共1题,每题1.0分,共1分。)1、请补充函数fun(),该函数的功能是判断一个数是否为素数。该数是素数时,函数返回字符串:yes!,否则函数返回字符串:no!,并在主函数中输出。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun()的横线上填入所编写的若干表达式或语句。试题程序:#include"conio.h"#include"stdio.h"【】{inti,m;m=1;for(i=【】;i<n;i++)if(【】){m=0;break;}if(m==1&&n>1)return("yes!");elsereturn("no!");}main(){intk=0;clrscr();printf("Input:");scanf("%d",&k);printf("%s\n",fun(k));}标准答案:char*fun(intn)2n%i==0或!(n%i)知识点解析:第一空:根据main()中调用的函数fun(k),可知函数fun的形参为int型变量,函数的返回值为字符型指针。第二空:判断一个数是否为素数时,也就是判断这个数是否有除了1和其自身之外的因子,所以for循环的变量从2开始,直到这个数的前一个数。第三空:如果一个数能被除了1和其自身之外的数整除,即余数为0,则这个数不是素数。二、程序修改题(本题共1题,每题1.0分,共1分。)2、下列给定的程序中,函数fun()的功能是;将s所指字符串中出现的n所指字符串全部替换成t2所指字符串,所形成的新的字符串放在w所指的数组中。在此处,要求t1和t2所指字符串的长度相同。例如:当s所指字符串中所指的内容为abcdabfab,t1所指字符串中的内容为ab,t2所指字符串中的内容为99时,结果在w所指的数组中的内容应为99cd99f99。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include<conio.h>#include<stdio.h>#include<string.h>/*************found**************/intfun(char*s,char*t1,char*t2,char*w){inti;char*p,*r,*a;strcpy(w,s);while(*w){p=w;r=t1;/*************found**************/while(r)if(*r==*p){r++;p++;}elsebreak;if(*r==’\0’){a=w;r=t2;/*************found**************/while(*r){*a=*r;a++;r++}w+=strlen(t2);}elsew++;}}main(){chars[100],t1[100],t2[100],w[100];clrscr();printf("\nPleaseenterstringS:");scanf("%s",s);printf("\nPleaseentersubstringt1:");scanf("%s",t1);printf("\nPleaseentersubstringt2:");scanf("%s",t2);if(strlen(t1)==strlen(t2)){fun(s,t1,t2,w);printf("\nTheresultis:%s\n",w);}elseprintf("Error:strlen(t2)\n");}标准答案:(1)错误:intfun(char*s,char*t1,char*t2,char*w)正确:voidfun(char*s,char*t1,char*t2,char*w)(2)错误:while(r)正确:while(*r)(3)错误:r++正确:r++;知识点解析:在intfun(char*s,char*t1,char*t2,char*w)中,用int型定义指针数组。ANSI标准要求动态分配系统返回void指针。void指针具有一般性,它们可以指向任何类型的数据。但目前绝大多数C编译所提供的这类函数都返回char指针。无论以上两种情况的哪一种,都需要强制类型转换的方法把char指针转换成所需的类型。该程序段应该是voidfun(char*s,char*t1,char*t2,char*w),另外,while(r)和r++都是简单的逻辑和语法错误,只要加强了C语言的基础,这样的错误明显是“送分”的。三、程序设计题(本题共1题,每题1.0分,共1分。)3、下列程序定义了N×N的二维数组,并在主函数中自动赋值;请编写函数fun(inta[][N]),该函数的功能是:使数组左下半三角元素中的值全部置成0。例如a数组中的值为a=197238456则返回主程序后a数组中的值应为097008000注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<stdlib.h>#defineN5intfun(inta[][N]){}main(){inta[N][N],i,j;clrscr();printf("*****Thearray*****\n");for(i=0;i<N;i++)/*产生—个随机的5*5矩阵*/{for(j=0;j<N;j++){a[i][j]=rand()%10;printf("%4d",a[i][j]);}printf("\n");}fun(a);printf("THERESULT\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j));printf("\n");}}标准答案:intfun(inta[][N]){inti,j;for(i=0;i<N;i++)for(j=0;j<=i;j++)a[i][j]=0;/*将数组左下半三角元素中的值全部置成0*/}知识点解析:本题旨在考查控制数组中左下半三角元素的算法,也就是两个千篇一律的循环语句,希望学习者能够掌握消化。国家二级(C语言)机试模拟试卷第8套一、程序填空题(本题共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所指数组中数据的个数。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANKl.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+1];a[i+1]=min;a[pn]=t;}}}main()(intb[N]={1,4,2,3,9,6,5,8,7},i;printf(”\nTheoriginaldata:\n”);for(i=0;i标准答案:*a2i+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、给定程序MODll.C中函数fun的功能是:用下面的公式求π的近似值,直到最后一项的绝对值小于指定的数(参数num)为止:π/4=1-1/3+1/5-1/7^例如,程序运行后,输入0.0001,则程序输出3.1414。请改正程序中的错误,使它能输出正确的结果。注意:不要改动smain函数,不得增行或删行,也不得更改程序的结构!#include#includefloatfun(floatnum){ints;floatn,t,pi;t=1;pi=0;n=1;s=1;/*********found*********/while(t>=num){pi=pi+t;n=n+2:s=-s;/********found***********/t=s%n;}pi=pi*4;returnpi;}main(){floatn1,n2;printf("Enterafloatnumber:");Scanf("%f",&n1);n2=fun(n1);printf("%6.4f\n",n2);}标准答案:(1)while(fabs(t)>=num)(2)t=s/n;知识点解析:(1)题干中要求进行循环的条件是绝对值小于某范围,可以调用C语言提供的取绝对值函数fabs对t取绝对值。所以将“while(t>=num)"改为“while(fabs(t)>=num)"。(2)表达式s%n中,n是浮点型,而%运算符只能用于整数运算,且要进行的是除法运算而不是求余运算。所以,第二个标识下“t=s%n;"应该改为“t=s/n;"。三、程序设计题(本题共1题,每题1.0分,共1分。)3、请编写程序fun,函数的功能是:实现B=A+A’,即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main函数中输出。例如,输入下面的矩阵:其转置矩阵为:程序输出:注意:部分源程序在文件PROGl.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includevoidfun(inta[3][3],intb[3][3]){}main()/*主程序*/{inta[3][3]=({1,2,3},{4,5,6},{7,8,9}},t[3][3];inti,j;voidNONO();fun(a,t);for(i=0;i<3;i++){for(j=0;j<3;j++)printf("%7d",t[i][j]);printf("\n");}NONO();}voidNONO(){/*本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/inti,j,k,a[3][3],t[3][3];FILE*rf,*wf;rf=fopen("in.dat","r");wf=fopen("out.dat","w");for(k=0;k<5;k++){for(i=0;i<3;i++)fscanf(rf,"%cl%d%d",&a[i][0],&a[i][1],&a[i][2]);fun(a,t);for(i=0;i<3;i++){for(j=0;j<3;j++)fprintf(wf,"%7d",t[i][j]);fprintf(wf,"\n");}}fclose(rf);fclose(wf);}标准答案:intc[3][3];inti,j;for(i=0;i<3;i++)for(j=0;j<3;j++){c[i][j]=a[j][i];//矩阵的转置b[i][j]=a[i][j]+c[i][j];}知识点解析:(1)首先,将a所指数组元素中的值进行转置并放到c所指数组中。(2)矩阵相加是指把两个矩阵中下标相同的元素的值一一对应相加。国家二级(C语言)机试模拟试卷

温馨提示

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

评论

0/150

提交评论