国家二级C语言机试.docx
第01套: 给定程序中,函数fun的功能是:在形参s所指字符串中的每个数字字符之后插入个*号。例如,形参s所指的字符串为:def35adh3kjsdf7o执行结果为:def3*5*adh3*kjsdf7*。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>void fun(char *s) int i, j, n;for(i=0; si!='0' i+)/* /* f o und* j if(si>='0'_1si<='9') n=0;/* found*/while(si+14-n!=2) n+ + ;for(j=i+n+l; j>i; j-) / * * * * * * * * * * f u n d * * * * * * /Sj+1=3 i=i+l;)main() char s80="ba3a54cd23a"printf("nThe original string is : %sn",s);fun(s);printf("nThe result is : %sn",s);解题思路:第一处:判断是数字,应该使用''与",所以应填:&&。第二处:判断字符串是否是字符串结束符,所以应填:'0。第三处:如果当前字符是数字字符,则把当前字符以后的所有字符往后一个位置,所以应 填:Sj.给定程序M0DI1.C中函数fun的功能是:根据整型形参m,计算如卜.公式的值。111 1y = 1 + +2*2 3*3 4*4 m*m例如,若m中的值为:5,则应输出:1.463611。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>double fun ( int m ) double y = 1.0 ;int i;for(i = 2 ; i < m ; i+) / * * * * * * * f 0 u n d * * * * * * * * * * / y += l/(i * i);return( y );main() printf( "nThe result is %lfn", fun ( n );解题思路:第一处:使用for循环计算公式,必须计算到m,所以应改为for(i=2; i<=m; i+)。第二处:在除法运算中,如果除数和被除数都是整数,所以所除结果也是整数,因此应改为 y+ = l./(i*i)。请编写函数fun,函数的功能是:实现B=A+A',即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main函数中输出。例如,输入下面的矩阵:其转置矩阵为:123147456258789369程序输出:2 6 106 10 14注意:部分源程序在文件PR0G1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>void fun ( int a33, int b33)main( ) /* 主程序 */ int a33 = «1, 2, 3, 4, 5, 6, 7, 8, 9», t33;int i, j ;fun(a, t);for (i = 0 ; i < 3 ; i+) for (j = 0 ; j < 3 ; j+)printf("%7d", tij);printf("n");?NONO ();)解题思路:本题考察考生如何实现矩阵的转置,然后执行两个矩阵中的元素值相加生成一个新的矩阵。矩阵转置实现上就是原行元素值变为列元素值,原列元素值变为行元素值。参考答案:void fun ( int a33, int b33) int c33;int i, j ;for(i = 0 ; i < 3 ; i+)for(j = 0 ; j < 3 ; j+) cij = aUi ; /* 矩阵的转置 */bij = aiU + ciU;第02套:给定程序中,函数fun的功能是:找出100999之间(含100和999)所有整数中各位上数字之和为x (x为正整数)的整数,然后输出;符合条件的整数个数作为函数值返回。例如,当x值为5时,100999之间各位上数字之和为5的整数有:104、113、122、131、140、203、212、221、230、302、311、320、401、410、500。共有15个。当X值为27时,各位数字之和为27的整数是:999o只有1个。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>fun(int x) int n, si, s2, s3, t;n=0;t=100;while(t< =_1_) /* found*/ sl=t%10; s2=(2_)%10; s3=t/100;/* fo und* / if(sl+s2+s3=3) printf("%d ",t);n+;t+;return n;?main() int x=-l;while(x<0) printf("Please input(x>0): "); scanf("%d",&x); printf("nThe result is: %dn",fun(x);)解题思路: 第一处:使用while循环找出100999之间所有整数,所以应填:999。第二处:S2是求十位数字,所以应填:t/10。第三处:各位数字之和为X,所以应填:Xo给定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。例如,当s中的数为:7654321时,t中的数为:642。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>void fun (long s, long t) long sl = 10;s/= 10;*t = s % 10;while ( s < 0) s = s/100;*t = s%10*sl + *t;si = si * 10;)main() long s, t;printf("nPlease enter s:"); scanf("%ld", &s);fun(s, &t);printf("The result is: %ldn", t);解题思路:第一处:在函数fun体中,t是一个指针型变量,因此定义形参时也应定义指针。第二处:条件应该s>0,所以应改为:while(s>0)o学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。注意:部分源程序在文件PROGLC文件中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>#define N 16typedef struct char num10;int s; STREC;int fun( STREC a)main() STREC sN = "GA005",85,"GA003",76,"GA002",69,"GA004",85),TAB TAB "GA001",91,"GA007",72,"GA008",64,"GA006",87),TAB TAB ("GA015",85,"GA013",91,"GA012",64,"GA014",91,TAB TAB "GA011",66,"GA017",64,"GA018",64,"GA016",72;int i;FILE *out ;fun( s );printf("The data after sorted :n");for(i=0;i<N; i+) if( (i)%4=0 )printf("n");printf("%s %4d ",si.num,si.s);printf("n");out = fopen("c:testout.dat","w");for(i=0;i<N; i+) if( (i)%4=0 && I) fprintf(out, "n");fprintf(out, "%4d ",si.s);fprintf(out,"n");fclose(out);解题思路:本题是按结构体中成绩s进行降序排列,其结果仍存入当前结构体中。参考答案:#include <stdio.h>#define N 16typedef struct char num10;int s; STREC;int fun( STREC a)STREC tmp;int ij;for(i = 0; i < N; i+)for(j = i+1; j < N; j+)if(ai.s < aj.s) tmp = ai;ai = aj;aj = tmp;第03套:给定程序中,函数fun的功能是:找出100至x (x<999)之间各位上的数字之和为15的所有整数,然后输出;符合条件的整数个数作为函数值返回。例如,当n值为500时,各位数字之和为15的整数有:159、168、177、186、195、249、258、267、276、285、294、339、348、357、366、375、384、393、429、438、447、456、465、474、483、492。共有 26 个。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>fun(int x) int n, si, s2, s3, t;n= 1 t=100;/* found*/ while(t<=_2_) sl=t%10; s2=(t/10)%10; s3=t/100;if(sl+s2+s3= = 15) printf("%d ",t);n+;return n;main() int x=-l;while(x>999| |x<0) printf("Please input(0<x<=999): "); scanf("%d"z&x); printf(HnThe result is: %dn"zfun(x);解题思路: 第一处:符合条件的整数个数n,必须进行初始化,所以应填:0。第二处:找出XS999,所以应填:X。第三处:循环控制变量t每循环一次t要加1,所以应填:t+ +。给定程序M0DI1.C中函数fun的功能是:先将s所指字符串中的字符按逆序存放到t所指字符串中,然后把s所指串中的字符按正序连接到t所指串的后面。例如:当s所指的字符串为:"ABCDE"时,则t所指的字符串应为:"EDCBAABCDE"。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h> #include <string.h> void fun (char *s, char *t)int i;si = strlen(s);for (i=0; i<sl; i+)ti = ssl-i;for (i=0; i<sl; i+)TAB tsl+i = si;t2*sl = *0'main() char s100z t100;printf(MnPlease enter string s:n); scanf(H%s"z s);fun(s, t);printf("The result is: %sn", t);解题思路:第一处:变量si没有定义。第二处:在C语言中,字符串开始位置从0开始的,所以应改为:ti = ssl-i-l;«函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。例如,当a=45, b=12o调用该函数后,c=1425o注意:部分源程序存在文件PR0G1.C中。数据文件IN.DAT中的数据不得修改。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>void fun(int a, int b, long *c)main()/* 主函数 */ int a,b; long c;printf("Input a, b:");scanf("%d%d", &a, &b);fun(a, b, &c);printf("The result is: %ldn", c);NONO();解题思路:本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。取a十位数字的方法:a/10取a个位数字的方法:a%10参考答案:void fun(int a, int b, long *c)(*c=(b/10)*1000+(a/10)*100+(b%10)*10+(a%10);)第04套:函数fun的功能是:从三个形参a, b, c中找出中间的那个数,作为函数值返回。例如,当a=3, b=5, c=4时,中数为4。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>int fun(int a, int b, int c)(int t;/* fo und* jt = (a>b) ? (b>c? b :(a>c?c:1) : (a>c)?2:(b>c)?c:-3);return t;main() int al=3, a2=5, a3=4, r;r = fun(al, a2, a3);printf("nThe middle number is : %dn", r);解题思路:第一处:给三个数进行比较大小,所以应填:a。第二处:给三个数进行比较大小,所以应填:a。第三处:给三个数进行比较大小,所以应填:b。给定程序M0DI1.C中函数fun的功能是:首先将大写字母转换为对应小写字母; 若小写字母为au,则将其转换为其后的第5个字母;若小写字母为vz,使其值减 21o转换后的小写字母作为函数值返回。例如,若形参是字母A,则转换为小写字母 f;若形参是字母W,则转换为小写字母bo请改正函数fun中指定部位的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>#include <ctype.h> char fun(char c) if( o='A, && c<='Z')C=C+32;if(c>='a' &&cv = 'iT) c=c-5;else if(o='v,&&c<=,z')c=c-21;return c;main() char cl,c2;printf("nEnter a letter(A-Z): "); cl=getchar();if( isupper( cl ) c2=fun(cl);printf("nnThe letter '%c' change to '%c'n", cl,c2);?else printf("nEnter (A-Z)!n");)解题思路:第一处:变量c错写成大写C 了。第二处:要求转换为其后的第5个字母,所以应改为:c=c+5;«请编写函数fun,其功能是:计算并输出例如,在主函数中从键盘给n输入20后,输出为:s=534.188884。注意:要求n的值大于1但不大于100。部分源程序在文件PR0G1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <math.h>#include <stdio.h>double fun(int n)main() int n; double s;printf("nnlnput n: "); scanf("%d",&n);s=fun(n);printf("nns=%fnn",s);NONO();)解题思路:本题是根据公式计算多项式的值。注意变量的取值范围。参考答案:double fun(int n)(int i;double fac=1.0;double sum=1.0;for(i=2;i<=n;i+) fac+=sqrt(i);sum+=fac;return sum;第05套:给定程序的功能是调用fun函数建立班级通讯录。通讯录中记录每位学生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作 为一个数据块写到名为myfile5.dat的二进制文件中。请在程序的下划线处填入正确的内容并把卜.划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>#include <stdlib.h>#define N 5 typedef struct int num;char name10;char tel10;STYPE;void check();/* fo und* jint fun(1*std)/* found*/2*fp; int i;if(fp=fopen("myfile5.dat","wb")=NULL) return(O);printf("nOutput data to file !n");for(i=0; i<N; i+) /* f o und* jfwrite(&stdi, sizeof(STYPE), 1,3);fclose(fp);return (1);main() STYPE s10= 1,"aaaaa","111111"),l,"bbbbb","222222"),l,"ccccc","333333", l,"ddddd","444444",l,"eeeee","555555"int k;k=fun(s);if (k= = l) printf("Succeed!"); check(); else void check() FILE *fp; int i;STYPE s10;if(fp=fopen("myfile5.dat"z"rb")= = NULL) printf("Fail !nn); exit(O); )printf(nnRead file and output to screen :nn);printf(nn num name teln");for(i=0; i<N; i+) fread(&si,sizeof(STYPE)zl/ fp);printf(H%6d %s %snMzsi.numzsi.name,si.tel);fclose(fp);)解题思路:本题是要求把指定的学生记录输出到指定的文件中。程序中共有三处要填上适当的内容,使程序能运行出正确的结果。第一处:结构定义自变量,因此应填写STYPE。第二处:在所填行的下面一行,使用fopen来创建一个二进制文件,但文件流的变量名fp 已经给出,这样,此处只能填写FILE。每三处:fwrite是把变量中的内容写入指定文件中,再根据fwrite参数的使用要求,所以 只能填写文件流变量fp。给定程序M0DI1.C中函数fun的功能是:先将在字符串s中的字符按正序存放到t串中,然后把s中的字符按逆序连接到t串的后面。例如:当s中的字符串为:"ABCDE"时, 则t中的字符串应为:"ABCDEEDCBA"。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h> #include <string.h> void fun (char *sz char *t) int i, si;si = strlen(s);for( i=0; i<=sl; i +) ti = si;for (i=0; i<sl; i+) TAB tsl+i = ssl-i-l;/ * * * * * * * * * * * * f u n d * * * * * * * I tsl = '0'main() < char s100, t100;printf("nPlease enter string s:"); scanf("%s", s);fun(s, t);printf(nThe result is: %sn"z t);解题思路: 第一处:变量si错写成了 si。第二处:新串t的字符串结束位置不正确,应该是两倍的si距离。函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的千位和十位上,b数的十位和个位数依次放在c数的百位和个位h»例如,当a=45, b=12时,调用该函数后,c=4152.注意:部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>void fun(int a, int b, long *c)(main() int a,b; long c;printf("Input a, b:"); scanf("%d,%d", &a, &b);fun(a, b, &c);printf("The result is: %dn", c);NONO();解题思路:本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。取a十位数字的方法:a/10取a个位数字的方法:a%10 参考答案:void fun(int a, int b, long *c)*c=(a/10)*1000+(b/10)*100+(a%10)*10+(b%10);第06套:给定程序中,函数fun的功能是:将形参s所指字符串中的所有数字字符顺序前移,其他字符顺序后移,处理后新字符串的首地址作为函数值返回。例如,s所指字符串为:asdl23fgh5#43df,处理后新字符串为:123543asdfgh#df。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>#include <string.h>#include <stdlib.h>#include <ctype.h>char *fun(char *s) int i, j, k, n; char *p, *t;n=strlen(s)+l;t=(char*)malloc(n*sizeof(char);p=(char*)malloc(n*sizeof(char);j=0; k=0;for(i=0; i<n; i+)/* f o und* IP_1=si; j+;)else/* f o und* j for(i=0; i<_2_; i+) pj+i= ti;pj+k=O;/* f o und* I return _3_;main() char s80;printf("Please input: "); scanf("%s",s);printf("nThe result is: %sn",fun(s);)解题思路: 第一处:函数中申请了两个内存空间,其p是存放数字字符串,t是存放非数字字符串,根 据条件可知,p依次存放数字字符串,其位置由j来控制,所以应填:j,第二处:利用for循环再把t中的内容依次追加到p中,其中t的长度为k,所以应填:ko 第三处:最后返回p的首地址即可,所以应填:p.给定程序M0DI1.C中函数fun的功能是:首先把b所指字符串中的字符按逆序存 放,然后将a所指字符串中的字符和b所指字符串中的字符,按排列的顺序交叉合 并到c所指数组中,过长的剩余字符接在c所指数组的尾部。例如,当a所指字符串 中的内容为"abcdefg”, b所指字符串中的内容为"1234"时,c所指数组中的内容应 该为"a4b3c2dlefg";而当a所指字符串中的内容为"1234", b所指字符串中的内容 为"abcdefg"时,c所指数组中的内容应该为"lg2f3e4dcba”。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h>#include <string.h>void fun( char *a, char *b, char *c )(int i , j; char ch;i = 0; j = strlen(b)-l;/*found*/while ( i > j ) ch = bi; bi = bU; bj = ch;i+; j-; while ( *a | *b ) /* found*/If ( *a ) < *c = *a; C+ + ; a+ + ; ) if ( *b ) *c = *b; C+; b+; *c = 0;main()(char sl100,s2100,t200;printf("nEnter si string : ");scanf("%s",sl);printf("nEnter s2 string : ");scanf("%s",s2);fun( si, s2, t);printf("nThe result is : %sn", t);解题思路:第一处:应该判断i是否小于j,所以应改为:while(i<j)0第二处:if错写成If。函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除,s所指串中剩余的字符形成的新串放在t所指的数组中。例如,若s所指字符串中的内容为"ABCDEFG12345",其中字符C的ASCH码值为 奇数,在数组中的下标为偶数,因此必须删除;而字符1的ASCH码值为奇数,在 数组中的下标也为奇数,因此不应当删除,其它依此类推。最后t所指的数组中的内容应是"BDF12345"。注意:部分源程序存在文件PROG1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。给定源程序:#include <stdio.h> #include <string.h>void fun(char *s, char t)(main()char s100, t100;printf("nPlease enter string S:"); scanf("%s", s);fun(s, t);printf("nThe result is: %sn", t);NONO();)解题思路:本题是从个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问题。参考答案:void fun(char *s, char t)int i, j = 0 ;for(i = 0 ; i < strlen(s) ; i+)if(!(i % 2) =0 && (si % 2) tj+ = si;tj = 0 ;) 第07套:给定程序中,函数fun的功能是计算下式 例如,若形参e的值为le-3,函数的返回值2.735678。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。注意:源程序存放在考生文件夹下的BLANK1.C中。不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h> double fun(double e) int i; double s, x;/*found*/ s=0; i=1 x=1.0;while(x>e) /*found*/x=(2.0*i-l)/(_3_)*(2.0*l);s=s+x;return s;main() double e=le-3;printf(nnThe result is: %fn"zfun(e);解题思路: 第一处:根据公式以及下面的程序,可以得出i应为0。第二处:根据公式以及i的初值为0,所以应填:i+。第三处:根据公式要求,所以应填:2.0*i。给定程序MODI1.C中函数fun的功能是:将s所指字符串的正序和反序进行连接,形成个新串放在t所指的数组中。例如,当s所指字符串为:"ABCD"时,则t所指字符串中的内容应为:"ABCDDCBA"«请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!给定源程序:#include <stdio.h> #include <string.h>void fun (char s, char t) int i, d;d = strlen(s);for (i = 0; i<d; i+) ti = si;for (i = 0; i<d; i+) td+i = sd-l-i;main()char s100, t100;printf("nPlease enter string S:"); scanf("%s", s);fun(s, t);printf("nThe result is: %sn", t);解题思路:第一处:从函数体fun中可知,两个均为字符指针型变量,应改为:void fun (char *s, char*t)o第二处:字符串结束位置错误,应改为:t2*d=0;。函数fun的功能是:将s所指字符串中除了下标为奇数、同时ASCH值也为奇数的字符之外,其余的所有字符都删除,串中剩余字符所形成的一个新申放在t所 指的数组中。例如,若s所指字符串中的内容为:"ABCDEFG12345”,其中字符A的ASCH码值虽为奇数,但所在元素的下标为偶数,因此必需删除;而字符1的ASCII码值为奇数,所在数组中的下标也为奇数,因此不应当删除,其它依此类推。最后t所指的 数组中的内容应是:"135"。注意:部分源程序存在文件PROG1.C中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。给定源程序:#include <stdio.h>#include <string.h> void fun(char *s