全国计算机二级C题库第31--40套 |
本题目如果下载后发现有错误的地方,请联系网站管理员:QQ121431055
考试时,上机操作题目有三套,基本操作题、简单应用题、综合应用题
第31套: 给定程序中,函数fun的功能是:对形参s所指字符串中下标为奇数的字符按 ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符 数组中,形成一个新串。 例如,形参s所指的字符串为:baawrskjghzlicda,执行后p所指字符数组中 的字符串应为:aachjlsw。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include void fun(char *s, char *p) { int i, j, n, x, t; n=0; for(i=0; s[i]!='\0'; i++) n++; for(i=1; i /**********found**********/ ___1___; /**********found**********/ for(j=___2___+2 ; j if(s[t]>s[j]) t=j; if(t!=i) { x=s[i]; s[i]=s[t]; s[t]=x; } } for(i=1,j=0; i /**********found**********/ p[j]=___3___; } main() { char s[80]="baawrskjghzlicda", p[50]; printf("\nThe original string is : %s\n",s); fun(s,p); printf("\nThe result is : %s\n",p); } 解题思路: 第一处:取外循环的控制变量,所以应填:t=i。 第二处:内循环的起始变量,应该是i+2,所以应填:i。 第三处:新字符串处理完后应添加字符串结束符,所以应填:'\0'。 *************************************************** 给定程序MODI1.C中函数 fun 的功能是:用下面的公式求π的近似值,直到 最后一项的绝对值小于指定的数(参数num )为止: π 1 1 1 ┄┄≈1 - ┄┄ + ┄┄ - ┄┄ + ... 4 3 5 7 例如, 程序运行后, 输入0.0001, 则程序输出3.1414。 请改正程序中的错误,使它能输出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include float fun ( float num ) { int s ; float n, 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 ; return pi ; } main( ) { float n1, n2 ; printf("Enter a float number: ") ; scanf("%f", &n1) ; n2 = fun(n1) ; printf("% } 解题思路: 第一处:要判断t的最后一项绝对小于指定的数,由于t是实数,那么应改为 while(fabs(t)>=num)。 第二处:t是s除以n的值,而不是取余数,所以应改t=s/n;。 *************************************************** 请编写一个函数void fun (char a[],char b[],int n),其功能是:删除一 个字符串中指定下标的字符。其中, a指向原字符串, 删除指定字符后的字符串存 放在b所指的数组中,n中存放指定的下标。 例如,输入一个字符串: World,然后输入3,则调用该函数后的结果为: Word。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include #include #define LEN 20 void fun (char a[], char b[], int n) { } main( ) { char str1[LEN], str2[LEN] ; int n ; printf("Enter the string:\n") ; gets(str1) ; printf("Enter the position of the string deleted:") ; scanf("%d", &n) ; fun(str1, str2, n) ; printf("The new string is: %s\n", str2) ; NONO() ; } 解题思路: 本题是利用字符串拷贝和字符串连接来生成新的字符串。 参考答案: void fun (char a[], char b[], int n) { strncpy(b, a, n) ; b[n] = 0 ; strcat(b, a + n + 1) ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第32套: 给定程序中,函数fun的功能是:在形参ss所指字符串数组中,将所有串长超 过k的字符串中右边的字符删除,只保留左边的k个字符。ss所指字符串数组中共 有N个字符串,且串长小于M。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 5 #define M 10 /**********found**********/ void fun(char (*ss) __1__, int k) { int i=0 ; /**********found**********/ while(i< __2__) { /**********found**********/ ss[i][k]=__3__; i++; } } main() { char x[N][M]={"Create","Modify","Sort","skip","Delete"}; int i; printf("\nThe original string\n\n"); for(i=0;i fun(x,4); printf("\nThe string after deleted :\n\n"); for(i=0; i } 解题思路: 本题是根据给定的字符串数组中删除串长大于某个值的右边字符串。 第一处:函数的定义,试题中已用M作为字符串的长度,所以应填:M。 第二处:利用while循环,分别对字符串数组中的每个字符串置字符串结束符,程序中已经 给定了N个字符串,所以应填:N。 第三处:置字符串结束符,所以应填:0(或'\0')。 *************************************************** 给定程序MODI1.C中函数fun的功能是:根据以下公式求π值,并作为函数值 返回。 例如,给指定精度的变量eps输入0.0005时,应当输出Pi=3.140578。 π 1 1 2 1 2 3 1 2 3 4 ─=1+ ─ + ─×─ + ─×─×─ + ─×─×─×─+…… 2 3 3 5 3 5 7 3 5 7 9 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #include #include double fun(double eps) { double s,t; int n=1; s=0.0; /************found************/ t=0; while( t>eps) { s+=t; t=t * n/(2*n+1); n++; } /************found************/ return(s); } main() { double x; printf("\nPlease enter a precision: "); scanf("%lf",&x); printf("\neps=%lf, Pi=%lf\n\n",x,fun(x)); } 解题思路: 第一处: 初始化t的值,根据程序中的计算程序和试题的要求得出,t应为1。 第二处: 根据公式π/2得出,所以返回时应原有s的基础上乘以2作为返回值。 *************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字 符串的前导*号不得多于n个;若多于n个,则删除多余的*号; 若少于或等于n个, 则什么也不做,字符串中间和尾部的*号不删除。函数fun中给出的语句仅供参考。 例如,字符串中的内容为:*******A*BC*DEF*G****,若n的值为4,删除后, 字符串中的内容应当是:****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍 为:*******A*BC*DEF*G****。n的值在主函数中输入。 在编写函数时,不得使用 C语言提供的字符串函数。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun( char *a, int n ) { /* 以下代码仅供参考 */ int i=0,j,k=0; while(a[k]=='*') k++; /* k为统计*字符个数 */ if(k>n) { i=n;j=k; /* 以下完成将下标为k至串尾的字符前移k-n个位置 */ } } main() { char s[81]; int n; printf("Enter a string:\n");gets(s); printf("Enter n : ");scanf("%d",&n); fun( s,n ); printf("The string after deleted:\n");puts(s); NONO(); }
解题思路: 本题是考察字符串的操作。 利用for循环来判断a[j]的字符是否是字符串结束符,如果不是字符串结束符,则把a[j] 的字符依次存放到a[i]。其中,变量i是n的初始值,变量j是字符串前导的*号数。 参考答案: void fun( char *a, int n ) { /* 以下代码仅供参考 */ int i=0,j,k=0; while(a[k]=='*') k++; /* k为统计*字符个数 */ if(k>n) { i=n;j=k; /* 以下完成将下标为k至串尾的字符前移k-n个位置 */ for(; a[j] !=0 ; j++) a[i++]=a[j]; a[i] = 0; } } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第33套: 给定程序的功能是:调用函数fun将指定源文件中的内容复制到指定的目标 文件中,复制成功时函数返回值为1,失败时返回值为0。在复制的过程中,把复 制的内容输出到终端屏幕。主函数中源文件名放在变量sfname中,目标文件名放 在变量tfname中。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include int fun(char *source, char *target) { FILE *fs,*ft; char ch; /**********found**********/ if((fs=fopen(source, ___1___))==NULL) return 0; if((ft=fopen(target, "w"))==NULL) return 0; printf("\nThe data in file :\n"); ch=fgetc(fs); /**********found**********/ while(!feof(___2___)) { putchar( ch ); /**********found**********/ fputc(ch,___3___); ch=fgetc(fs); } fclose(fs); fclose(ft); printf("\n\n"); return 1; } main() { char sfname[20] ="myfile1",tfname[20]="myfile2"; FILE *myf; int i; char c; myf=fopen(sfname,"w"); printf("\nThe original data :\n"); for(i=1; i<30; i++){ c='A'+rand()%;fprintf(myf,"%c",c); printf("%c",c); } fclose(myf);printf("\n\n"); if (fun(sfname, tfname)) printf("Succeed!"); else printf("Fail!"); } 解题思路: 本题要求是把一个文件中的内容复制到另一个文件中。程序中共有三处要填上适当的内容, 使程序能运行出正确的结果。 第一处:要求打开一个读方式的源文件,因此可以填上"r"或"r+"。打开读文件操作的流是 fs。 第二处:用while循环来判断源文件是否已读到文件结束符,int feof(FILE *stream),因 此,此处只能填写fs。 第三处:把已经读取的字符写入目标文件中,打开写文件操作的流是ft,因此,此处只能 填写ft。 *************************************************** 给定程序MODI1.C中函数fun的功能是:将长整型数中每一位上为偶数的数依 次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。 例如,当s中的数为:87653142时,t中的数为:8642。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include void fun (long s, long *t) { int d; long sl=1; *t = 0; while ( s > 0) { d = s; /************found************/ if (d%2=0) { *t=d* sl+ *t; sl *= 10; } /************found************/ s \= 10; } } main() { long s, t; printf("\nPlease enter s:"); scanf("%ld", &s); fun(s, &t); printf("The result is: %ld\n", t); } 解题思路: 第一处:判断相等的条件是==。 第二处:整除的符号是/。 *************************************************** 函数fun的功能是:将两个两位数的正整数a、b合并形成一个整数放在c中。 合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上, b数的十位 和个位数依次放在c数的百位和个位上。 例如,当a=45,b=12时,调用该函数后,c=5142。 注意: 部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include 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: %ld\n", c); NONO(); } 解题思路: 本题是给出两个两位数的正整数分别取出各位上的数字,再按条件组成一个新数。 取a十位数字的方法:a/10 取a个位数字的方法:a 参考答案: void fun(int a, int b, long *c) { *c=(a)*1000+(b/10)*100+(a/10)*10+(b); } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第34套: 用筛选法可得到2~n(n<10000)之间的所有素数,方法是:首先从素数2开 始,将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0);接着从数 表中找下一个非0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下 一个数等于n为止。这样会得到一个序列: 2,3,5,7,11,13,17,19,23,…… 函数fun用筛选法找出所有小于等于n的素数,并统计素数的个数作为函数值 返回。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include int fun(int n) { int a[10000], i,j, count=0; for (i=2; i<=n; i++) a[i] = i; i = 2; while (i /**********found**********/ for (j=a[i]*2; j<=n; j+=___1___) a[j] = 0; i++; /**********found**********/ while (___2___==0) i++; } printf("\nThe prime number between 2 to %d\n", n); for (i=2; i<=n; i++) /**********found**********/ if (a[i]!=___3___) { count++; printf( count?"]":"\n]",a[i]); } return count; } main() { int n=20, r; r = fun(n); printf("\nThe number of prime is : %d\n", r); } 解题思路: 第一处:所有2的倍数的数从数表中删去,所以应填:a[i]。 第二处:找出下一个不是的a[i],所以应填:a[i]。 第三处:输出素数,只要判断a[i]不是0就是素数,所以应填:0。 *************************************************** 给定程序MODI1.C中函数fun的功能是: 为一个偶数寻找两个素数, 这两个素 数之和等于该偶数,并将这两个素数通过形参指针传回主函数。 请改正函数fun中指定部位的错误, 使它能得出正确的结果。 注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构! 给定源程序: #include #include void fun(int a,int *b,int *c) { int i,j,d,y; for(i=3;i<=a/2;i=i+2) { /**************found**************/ Y=1; for(j=2;j<=sqrt((double)i);j++) if(i%j==0) y=0; if(y==1) { /**************found**************/ d==a-i; for(j=2;j<=sqrt((double)d);j++) if(d%j==0) y=0; if(y==1) { *b=i; *c=d; } } } } main() { int a,b,c; do { printf("\nInput a: "); scanf("%d",&a); } while(a%2); fun(a,&b,&c); printf("\n\n%d = %d + %d\n",a,b,c); } 解题思路: 第一处:变量y错写成Y。 第二处:给变量d进行赋值,所以应改为:d=a-i;。 *************************************************** 请编写函数fun, 它的功能是:计算并输出n(包括n)以内能被5或9整除的所有 自然数的倒数之和。 例如,在主函数中从键盘给n输入20后, 输出为: s=0.583333。 注意: 要求n的值不大于100。 部分源程序在文件PROG1.C中。 请勿改动主函数main和其他函数中的任何内容, 仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include double fun(int n) { } main() { int n; double s; printf("\nInput n: "); scanf("%d",&n); s=fun(n); printf("\n\ns=%f\n",s); NONO(); } 解题思路: 本题是计算n(包括n)以内能被5或9整除的所有自然数的倒数之和。 参考答案: double fun(int n) { int i; double sum=0.0; for(i=1; i<=n; i++) if(i%5 == 0 || i%9 == 0) /* 被5或9整除 */ sum+=1.0/i; return sum; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第35套: 给定程序中,函数fun的功能是建立一个N×N的矩阵。 矩阵元素的构成规律 是:最外层元素的值全部为1;从外向内第2层元素的值全部为2;第3层元素的值 全部为3,…依次类推。例如,若N=5,生成的矩阵为: 1 1 1 1 1 1 2 2 2 1 1 2 3 2 1 1 2 2 2 1 1 1 1 1 1 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #define N 7 /**********found**********/ void fun(int (*a) __1__) { int i,j,k,m; if(N%2==0) m=N/2 ; else m=N/2+1; for(i=0; i /**********found**********/ for(j= __2__ ; j a[i][j]=a[N-i-1][j]=i+1; for(k=i+1; k /**********found**********/ a[k][i]=a[k][N-i-1]= __3__; } } main() { int x[N][N]={0},i,j; fun(x); printf("\nThe result is:\n"); for(i=0; i { for(j=0; j printf("\n"); } } 解题思路: 第一处:建立一个N×N的矩阵,所以应填:[N]。 第二处:j的起始变量值应i。 第三处:也应该填写i+1。 *************************************************** 给定程序MODI1.C中函数 fun 的功能是: 将十进制正整数m转换成k(2≤k≤9) 进制数, 并按高位到低位顺序输出。 例如,若输入8和2,则应输出1000(即十进制数8转换成二进制表示是1000)。 请改正 fun 函数中的错误,使它能得出正确的结果。 注意:不要改动 main 函数。不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include void fun( int m, int k ) { int aa[20], i; for( i = 0; m; i++ ) { /**********found**********/ aa[i] = m/k; m /= k; } for( ; i; i-- ) /**********found**********/ printf( "%d", aa[ i ] ); } main() { int b, n; printf( "\nPlease enter a number and a base:\n" ); scanf( "%d %d", &n, &b ); fun( n, b ); printf("\n"); } 解题思路: 第一处:应该取模而不是整除,所以应为:aa[i]=m%k;。 第二处:输出aa的位置不正确,所以应为:printf("%d",aa[i-1]);。 *************************************************** 编写一个函数,从num个字符串中找出最长的一个字符串,并通过形参指针max 传回该串地址。(注意: 主函数中用****作为结束输入的标志,函数fun中给出的 语句仅供参考。) 注意:部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include #include fun(char(*a)[81],int num,char **max) { /* 以下代码仅供参考 */ int i,k=0,len, maxlen; /* k为a数组中最长串所在元素的下标,初始为0,maxlen为其串 长 */ maxlen=strlen(a[k]); for(i=1;i { /* 以下完成查找最长串 */ } *max=a[k]; } main() { char ss[10][81],*ps; int n,i=0; printf("输入若干个字符串:"); gets(ss[i]); puts(ss[i]); while(!strcmp(ss[i],"****")==0) { i++; gets(ss[i]); puts(ss[i]); } n=i; fun(ss,n,&ps); printf("\nmax=%s\n",ps); NONO(); } 解题思路: 本题是考察考生怎样从已输入的字符串中找出长度最大的字符串。求字符串的长度可以使 用strlen函数。 参考答案: fun(char(*a)[81],int num,char **max) { /* 以下代码仅供参考 */ int i,k=0,maxlen; /* k为a数组中最长串所在元素的下标,初始为0,maxlen为其串长 */ maxlen=strlen(a[k]); for(i=1;i { /* 以下完成查找最长串 */ if(strlen(a[i]) > maxlen) { maxlen = strlen(a[i]) ; k = i ; } } *max=a[k]; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第36套: 给定程序中,函数fun的功能是:统计出带有头结点的单向链表中结点的个数, 存放在形参n所指的存储单元中。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; SLIST *creatlist(int *a); void outlist(SLIST *); void fun( SLIST *h, int *n) { SLIST *p; /**********found**********/ ___1___=0; p=h->next; while(p) { (*n)++; /**********found**********/ p=p->___2___; } } main() { SLIST *head; int a[N]={12,87,45,32,91,16,20,48}, num; head=creatlist(a); outlist(head); /**********found**********/ fun(___3___, &num); printf("\nnumber=%d\n",num); } SLIST *creatlist(int a[]) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i { q=(SLIST *)malloc(sizeof(SLIST)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } 解题思路: 本题是要求统计出带有头结点的单向链表中结点的个数。 第一处:对n所指的存储单元进行初始化,所以应填:*n。 第二处:指向p的下一个结点,所以应填:next。 第三处:函数调用,在主函数中已经给出了head,所以应填:head。 *************************************************** 给定程序MODI1.C中函数fun的功能是:求出s所指字符串中最后一次出现的t 所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串; 若未找到,则函数值为NULL。 例如,当字符串中的内容为:"abcdabfabcdx",t中的内容为:"ab"时, 输出结果应是:abcdx。 当字符串中的内容为:"abcdabfabcdx",t中的内容为:"abd"时, 则程序输出未找到信息:not be found!。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include char * fun (char *s, char *t ) { char *p , *r, *a; /************found************/ a = Null; while ( *s ) { p = s; r = t; while ( *r ) /************found************/ if ( r == p ) { r++; p++; } else break; if ( *r == '\0' ) a = s; s++; } return a ; } main() { char s[100], t[100], *p; printf("\nPlease enter string S :"); scanf("%s", s ); printf("\nPlease enter substring t :"); scanf("%s", t ); p = fun( s, t ); if ( p ) printf("\nThe result is : %s\n", p); else printf("\nNot found !\n" ); } 解题思路: 第一处:指向空指针错误,Null应NULL。 第二处:比较指针位置的值是否相等,所以应改为:if(*r==*p)。 *************************************************** 函数fun的功能是: 将s所指字符串中除了下标为偶数、同时ASCII值也为偶 数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的数组 中。 例如,若s所指字符串中的内容为:"ABCDEFG123456",其中字符A的ASCII码 值为奇数,因此应当删除;其中字符B的ASCII码值为偶数,但在数组中的下标为 奇数,因此也应当删除;而字符2的ASCII码值为偶数,所在数组中的下标也为偶 数,因此不应当删除,其它依此类推。最后t所指的数组中的内容应是:"246"。 注意: 部分源程序存在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include #include void fun(char *s, char t[]) { } main() { char s[100], t[100]; printf("\nPlease enter string S:"); scanf("%s", s); fun(s, t); printf("\nThe result is: %s\n", t); NONO(); } 解题思路: 本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问 题。 参考答案: void fun(char *s, char t[]) { int i, j = 0 ; for(i = 0 ; i < strlen(s) ; i += 2) if(s[i] % 2 == 0) t[j++] = s[i] ; t[j] = 0 ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第37套: 给定程序中,函数fun的功能是:在形参ss所指字符串数组中,查找含有形参 substr所指子串的所有字符串并输出,若没找到则输出相应信息。ss所指字符串 数组中共有N个字符串,且串长小于M。程序中库函数strstr(s1, s2)的功能是在 s1串中查找s2子串,若没有,函数值为0,若有,为非0。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 5 #define M 15 void fun(char (*ss)[M], char *substr) { int i,find=0; /**********found**********/ for(i=0; i< __1__ ; i++) /**********found**********/ if( strstr(ss[i], __2__) != NULL ) { find=1; puts(ss[i]); printf("\n"); } /**********found**********/ if (find==__3__) printf("\nDon't found!\n"); } main() { char x[N][M]={"BASIC","C langwage","Java","QBASIC","Access"},str[M]; int i; printf("\nThe original string\n\n"); for(i=0;i printf("\nEnter a string for search : "); gets(str); fun(x,str); } 解题思路: 本题是根据给定的字符串数组中查找指定的字符串,如果存在,则显示。 第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应 填:N。 第二处:查找子串,子串由形参substr传递,所以应填:substr。 第三处:试题要求,若没有找到,函数值为0,所以应填:0。 *************************************************** 给定程序MODI1.C中函数fun的功能是:求三个数的最小公倍数。 例如,给主函数中的变量x1、x2、x3分别输入15 11 2, 则输出结果应当是:330。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #include /************found************/ fun(int x, y, z ) { int j,t ,n ,m; j = 1 ; t=j%x; m=j%y ; n=j%z; while(t!=0||m!=0||n!=0) { j = j+1; t=j%x; m=j%y; n=j%z; } /************found************/ return i; } main( ) { int x1,x2,x3,j ; printf("Input x1 x2 x3: "); scanf("%d%d%d",&x1,&x2,&x3); printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3); j=fun(x1,x2,x3); printf("The minimal common multiple is : %d\n",j); } 解题思路: 第一处: 函数中形参的定义不正确,应改为:fun(int x,int y, int z)。 第二处: 程序中三个数的最小公倍数是用j处理的,所以应返回j的值。 *************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:只删 除字符串前导和尾部的*号,串中字母之间的*号都不删除。形参n给出了字符串的 长度, 形参h给出了字符串中前导*号的个数,形参e给出了字符串中最后*号的个 数。在编写函数时,不得使用C语言提供的字符串函数。 例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内 容应当是:A*BC*DEF*G。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun( char *a, int n,int h,int e ) { } main() { char s[81],*t,*f; int m=0, tn=0, fn=0; printf("Enter a string:\n");gets(s); t=f=s; while(*t){t++;m++;} t--; while(*t=='*'){t--;tn++;} while(*f=='*'){f++;fn++;} fun( s , m,fn,tn ); printf("The string after deleted:\n");puts(s); NONO(); } 解题思路: 本题是考察对字符串的操作。 1. 求出字符串的长度。 2. 利用循环把字符串中字符按要求仍存放在原字符串首址开始的位置上。 参考答案: void fun( char *a, int n,int h,int e ) { char *p=a ; int j=0,len=0; while(*p) {p++; len++;} while(j a[j]=a[h+j]; j++; } a[j]=0; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第38套: 函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、 a[1]、a[2]、……中,把偶数从数组中删除,奇数个数通过函数值返回。例如: 若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除偶数后a 所指数组中的数据为:9、1、3、5、7,返回值为5。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #define N 9 int fun(int a[], int n) { int i,j; j = 0; for (i=0; i /**********found**********/ if (a[i]%2==___1___) { /**********found**********/ a[j] = a[i]; ___2___; } /**********found**********/ return ___3___; } main() { int b[N]={9,1,4,2,3,6,5,8,7}, i, n; printf("\nThe original data :\n"); for (i=0; i n = fun(b, N); printf("\nThe number of odd : %d \n", n); printf("\nThe odd number :\n"); for (i=0; i } 解题思路: 第一处:判断a[i]是否是奇数,若是,则仍保留在原数组中a[j],所以应填:1。 第二处:数组a中的元素位置由j来控制,每增加一个元素,则j加1,所以应填:j++。 第三处:返回删除偶数后a所指数组中数据的元素j,所以应填:j。 *************************************************** 给定程序MODI1.C中函数fun的功能是:求出两个非零正整数的最大公约数, 并作为函数值返回。 例如,若给num1和num2分别输入49和21,则输出的最大公约数为7;若给num1 和num2分别输入27和81,则输出的最大公约数为27。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #include int fun(int a,int b) { int r,t; if(a /************found************/ t=a; b=a; a=t; } r=a%b; while(r!=0) { a=b; b=r; r=a%b; } /************found************/ return(a); } main() { int num1, num2,a; printf("Input num1 num2: "); scanf("%d%d",&num1,&num2); printf("num1= %d num2= %d\n\n",num1,num2); a=fun(num1,num2); printf("The maximun common divisor is %d\n\n",a); } 解题思路: 第一处:交换值的次序有问题,所以应改为:t=a;a=b;b=t;。 第二处:返回值错误,应改为:return(b);。 *************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除 字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。 例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内 容应当是:ABCDEFG。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun( char *a ) { } main() { char s[81]; printf("Enter a string:\n");gets(s); fun( s ); printf("The string after deleted:\n");puts(s); NONO(); } 解题思路: 本题是考察字符串的操作。 1. 利用循环扫描字符串中所有的字符是否是'*',如果不是'*',则把这些字符存放字符串 a首地址开始的位置上。 2. 最后给字符串a加上结束符。 参考答案: void fun( char *a ) { int j =0 ; char *p=a; while(*p) { if(*p != '*') a[j++]=*p ; p++ ; } a[j]=0; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第39套: 给定程序中,函数fun的功能是:在形参ss所指字符串数组中,删除所有串长 超过k的字符串,函数返回所剩字符串的个数。ss所指字符串数组中共有N个字符 串,且串长小于M。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 5 #define M 10 int fun(char (*ss)[M], int k) { int i,j=0,len; /**********found**********/ for(i=0; i< __1__ ; i++) { len=strlen(ss[i]); /**********found**********/ if(len<= __2__) /**********found**********/ strcpy(ss[j++],__3__); } return j; } main() { char x[N][M]={"Beijing","Shanghai","Tianjing","Nanjing","Wuhan"}; int i,f; printf("\nThe original string\n\n"); for(i=0;i f=fun(x,7); printf("The string witch length is less than or equal to 7 :\n"); for(i=0; i } 解题思路: 本题是根据给定的字符串数组中删除串长大于某个值的字符串。 第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应 填:N。 第二处:串长由形参k来传递,所以应填:k。 第三处:如果字符串ss[i]的串长小于k,则该字符串仍存在原字符串数组中,位置由变量j 来控制,所以应填:ss[i]。 *************************************************** 给定程序MODI1.C中函数fun的功能是:逐个比较p、q所指两个字符串对应位 置中的字符,把ASCII值大或相等的字符依次存放到c所指数组中,形成一个新的 字符串。 例如,若主函数中a字符串为:aBCDeFgH, 主函数中b字符串为:ABcd, 则c中的字符串应为:aBcdeFgH。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #include #include void fun(char *p ,char *q, char *c) { /************found************/ int k = 1; /************found************/ while( *p != *q ) { if( *p<*q ) c[k]=*q; else c[k]=*p; if(*p) p++; if(*q) q++; k++; } } main() { char a[10]="aBCDeFgH", b[10]="ABcd", c[80]={'\0'}; fun(a,b,c); printf("The string a: "); puts(a); printf("The string b: "); puts(b); printf("The result : "); puts(c); } 解题思路: 第一处: 存放字符串初始位置也是从0开始存放的,由于k是控制c字符串的位置值,所以k 值应为0。 第二处: 判断两个字符串中是否有字符串结束符产生,所以应改为:while( *p || *q ), 而不是两字符串中对应位置的值不相等。 *************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字 符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供 的字符串函数。函数fun中给出的语句仅供参考。 例如,字符串中的内容为:****A*BC*DEF*G*******,删除后, 字符串中的内 容应当是:****ABCDEFG。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include void fun( char *a ) { /* 以下代码仅供参考 */ int i=0,k; while(a[i]=='*') i++; k=i+1; while(a[i]!='\0') /* 以下程序段实现非*字符前移 */ { } a[i+1]='\0'; } main() { char s[81]; printf("Enter a string:\n");gets(s); fun( s ); printf("The string after deleted:\n");puts(s); NONO(); } 解题思路: 本题是考察字符串的操作。 1. 使用while循环语句求出字符串前导*号的个数。 2. 使用while循环语句判断a[i]是否是字符串结束符标志,如果不是字符串结束标志,则 再判断是否是字符*号,如果不是*号,则把a[i]字符存入a[k]中,如果是*号则跳过该*号,直 至字符串结束为止。 参考答案: void fun( char *a ) { /* 以下代码仅供参考 */ int i=0,k; while(a[i]=='*') i++; k=i; while(a[i]!='\0') /* 以下程序段实现非*字符前移 */ { if(a[i] != '*') a[k++]=a[i]; i++; } a[k]='\0'; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第40套: 给定程序中已建立一个带有头结点的单向链表,链表中的各结点按结点数据 域中的数据递增有序链接。函数fun的功能是:把形参x的值放入一个新结点并插 入到链表中,插入后各结点数据域的值仍保持递增有序。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结 果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 8 typedef struct list { int data; struct list *next; } SLIST; void fun( SLIST *h, int x) { SLIST *p, *q, *s; s=(SLIST *)malloc(sizeof(SLIST)); /**********found**********/ s->data=___1___; q=h; p=h->next; while(p!=NULL && x>p->data) { /**********found**********/ q=___2___; p=p->next; } s->next=p; /**********found**********/ q->next=___3___; } SLIST *creatlist(int *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i { q=(SLIST *)malloc(sizeof(SLIST)); q->data=a[i]; p->next=q; p=q; } p->next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf("\nThe list is NULL!\n"); else { printf("\nHead"); do { printf("->%d",p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main() { SLIST *head; int x; int a[N]={11,12,15,18,19,22,25,29}; head=creatlist(a); printf("\nThe list before inserting:\n"); outlist(head); printf("\nEnter a number : "); scanf("%d",&x); fun(head,x); printf("\nThe list after inserting:\n"); outlist(head); } 解题思路: 本题是要求在一个有序的链表中插入一个数,插入后各结点仍然是有序的。程序中共有三 处要填上适当的内容,使程序能运行出正确的结果。 第一处:在函数fun的开始处,已经对结构指针s分配了内存,其中data是一个整型变量, 实际要求填入一个整型数据。根据本题要求在一个链表插入一个整型数,该数已通过函数的形 参x传入,因此应填x。 第二处:使用一个while循环找出要插入一个数的位置,在循环体中q实际上保留当前链表p 位置的临时变量,如果x>p->data时,那么再移动链表指针到下一个结果,再进行判断是否符合 条件,如果仍大于,则仍q保留链表p的位置。因此,此处应填p。 第三处:当找到结点位置后,就要插入这个数,完成插入过程。由于函数体中分配了结构 指针s,s的next指针已经指向了p,所以,当前位置q的next指针就应该指向指针s完成链表的链 接。因此,此处应填s。 *************************************************** 给定程序MODI1.C中函数fun的功能是:计算正整数num的各位上的数字之积。 例如,若输入:252,则输出应该是:20。若输入:202,则输出应该是:0。 请改正程序中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include long fun (long num) { /************found************/ long k; do { k*=num ; /************found************/ num\=10 ; } while(num) ; return (k) ; } main( ) { long n ; printf("\Please enter a number:") ; scanf("%ld",&n) ; printf("\n%ld\n",fun(n)) ; } 解题思路: 第一处:由于在k定义时没有赋初值,所以k是一个随机数,根据试题要求,k应赋值为1。 第二处:整除的符号是/。 *************************************************** 请编写一个函数fun,它的功能是:计算n门课程的平均分,计算结果作为函 数值返回。 例如:若有5门课程的成绩是:90.5, 72, 80, 61.5, 55 则函数的值为:71.80。 注意: 部分源程序存在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include float fun ( float *a , int n ) { } main() { float score[30]={90.5, 72, 80, 61.5, 55}, aver; aver = fun( score, 5 ); printf( "\nAverage score is: % NONO ( ); } 解题思路: 本题是使用循环来计算平均值且结果由函数值返回。 参考答案: float fun ( float *a , int n ) { int i; float ave=0.0; for(i=0; i ave=ave/n; return ave; }
|