printf(\ 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
void fun(char (*ss)[M], char *substr)
{ int i,find=0;
for(i=0; i< __1__ ; i++)
if( strstr(ss[i], __2__) != NULL ) { find=1; puts(ss[i]); printf(\if (find==__3__) printf(\found!\\n\ }
main()
{ char x[N][M]={\langwage\ess\ int i;
printf(\ for(i=0;i printf(\\ fun(x,str); } 解题思路: 本题是根据给定的字符串数组中查找指定的字符串,如果存在,则显示。 第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应填:N。 第二处:查找子串,子串由形参substr传递,所以应填:substr。 第三处:试题要求,若没有找到,函数值为0,所以应填:0。 *************************************************** 给定程序MODI1.C中函数fun的功能是:求三个数的最小公倍数。 例如,给主函数中的变量x1、x2、x3分别输入15 11 2, 则输出结果应当是:330。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 给定源程序: #include while(t!=0||m!=0||n!=0) { j = j+1; t=j%x; m=j%y; n=j%z; } return i; } main( ) { int x1,x2,x3,j ; printf(\x1 x2 x3: \scanf(\ printf(\x2=%d, x3=%d \\n\ j=fun(x1,x2,x3); printf(\minimal common multiple is : %d\\n\ } 解题思路: 第一处: 函数中形参的定义不正确,应改为: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(\ t=f=s; while(*t){t++;m++;} t--; while(*t=='*'){t--;tn++;} while(*f=='*'){f++;fn++;} fun( s , m,fn,tn ); printf(\string after deleted:\\n\ 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]=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 int fun(int a[], int n) { int i,j; j = 0; for (i=0; i a[j] = a[i]; ___2___; } return ___3___; } main() { int b[N]={9,1,4,2,3,6,5,8,7}, i, n; printf(\ for (i=0; i printf(\ n = fun(b, N); printf(\number of odd : %d \\n\ printf(\ for (i=0; i printf(\ } 解题思路: 第一处:判断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 r=a%b; while(r!=0) { a=b; b=r; r=a%b; } return(a); } main() { int num1, num2,a; printf(\num1 num2: \scanf(\ printf(\%d num2= %d\\n\\n\ a=fun(num1,num2); printf(\maximun common divisor is %d\\n\\n\ } 解题思路: 第一处:交换值的次序有问题,所以应改为:t=a;a=b;b=t;。 第二处:返回值错误,应改为:return(b);。 *************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。 例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:ABCDEFG。 注意: 部分源程序在文件PROG1.C中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入 你编写的若干语句。 给定源程序: #include } main() { char s[81]; printf(\ fun( s ); printf(\string after deleted:\\n\ 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 int fun(char (*ss)[M], int k) { int i,j=0,len; for(i=0; i< __1__ ; i++) { len=strlen(ss[i]); if(len<= __2__) strcpy(ss[j++],__3__); } return j; } main() { char x[N][M]={\ianjing\ int i,f; printf(\ for(i=0;i printf(\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 void fun(char *p ,char *q, char *c) { int k = 1; while( *p != *q ) { if( *p<*q ) c[k]=*q; else c[k]=*p; if(*p) p++; if(*q) q++; k++; } } main() { char a[10]=\b[10]=\ fun(a,b,c); printf(\ printf(\ printf(\ } 解题思路: 第一处: 存放字符串初始位置也是从0开始存放的,由于k是控制c字符串的位置值,所以k值应为0。 第二处: 判断两个字符串中是否有字符串结束符产生,所以应改为:while( *p || *q ), 而不是两字符串中对应位置的值不相等。 *************************************************** 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供 的字符串函数。函数fun中给出的语句仅供参考。 例如,字符串中的内容为:****A*BC*DEF*G*******,删除后, 字符串中的内容应当是:****ABCDEFG。 注意: 部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include int i=0,k; while(a[i]=='*') i++; k=i+1; while(a[i]!='\\0') /* 以下程序段实现非*字符前移 */ { } a[i+1]='\\0'; } main() { char s[81]; printf(\ fun( s ); printf(\string after deleted:\\n\ 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 typedef struct list { int data; struct list *next; } SLIST; void fun( SLIST *h, int x) { SLIST *p, *q, *s; s=(SLIST *)malloc(sizeof(SLIST)); s->data=___1___; q=h; p=h->next; while(p!=NULL && x>p->data) { q=___2___; p=p->next; } s->next=p; q->next=___3___; } SLIST *creatlist(int *a) { SLIST *h,*p,*q; int i; h=p=(SLIST *)malloc(sizeof(SLIST)); for(i=0; i p->next=0; return h; } void outlist(SLIST *h) { SLIST *p; p=h->next; if (p==NULL) printf(\list is NULL!\\n\ else { printf(\ do { printf(\p=p->next; } while(p!=NULL); printf(\ } } main() { SLIST *head; int x; int a[N]={11,12,15,18,19,22,25,29}; head=creatlist(a); printf(\list before inserting:\\n\ printf(\a number : \scanf(\ fun(head,x); printf(\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 k; do { k*=num ; num\\=10 ; } while(num) ; return (k) ; } main( ) { long n ; printf(\enter a number:\; scanf(\ printf(\ } 解题思路: 第一处:由于在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( \score is: %5.2f\\n\ NONO ( ); } 解题思路: 本题是使用循环来计算平均值且结果由函数值返回。 参考答案: float fun ( float *a , int n ) { int i; float ave=0.0; for(i=0; i ※※※※※※※※※※※※※※※※※※※※※※※※※ 第41套: 给定程序中,函数fun的功能是:计算x所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回主函数,将小于平均值且最接近平均值的数作为函数值返回,在主函数中输出。 例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为: 30.500000 主函数中输出:m=30.0 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include double fun(double x[],double *av) { int i,j; double d,s; s=0; for(i=0; i for(i=0; i if(x[i]<*av && *av - x[i]<=d){ d=*av-x[i]; j=__2__;} return __3__; } main() { int i; double x[N],av,m; for(i=0; i printf(\ m=fun(x,&av); printf(\ printf(\ printf(\ } 解题思路: 第一处:计算好的平均值通过形参av返回,所以应填:*av。 第二处:计算小于平均值且最接近平均值的位置j,所以应填:i。 第三处:返回该数,所以应填:x[j]。 *************************************************** 给定程序MODI1.C中函数fun的功能是:根据整型形参n,计算如下公式的值。例如,若 n=10,则应输出: 0.617977。 请改正程序中的语法错误,使它能得出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include main( ) { int n ; printf(\ scanf(\ printf(\ } 解题思路: 第一处:函数的返回是浮点型数,所以应改为:float fun(int n)。 第二处:for的终止条件应是i<=n。 *************************************************** 程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能是:使数组右上三角元素中的值乘以m 。 例如:若m的值为2,a 数组中的值为 | 1 9 7 | | 2 18 14| a = | 2 3 8 | 则返回主程序后a数组中的值应为 | 2 6 16| | 4 5 6 | | 4 5 12| 注意: 部分源程序存在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include int fun ( int a[][N], int m ) { } main ( ) { int a[N][N], m, i, j; printf(\ for ( i =0; i { a[i][j] = rand() ; printf( \a[i][j] ); } printf(\ } do m = rand() ; while ( m>=3 ); printf(\ fun ( a ,m ); printf (\ for ( i =0; i { for ( j =0; j NONO ( ); } 解题思路: 本题是利用两重循环给二维数组右上三角元素中的值乘以m。 参考答案: int fun ( int a[][N], int m ) { int i, j; for(i = 0 ; i < N ; i++) for(j = i ; j < N ; j++) a[i][j] *= m ; } ※※※※※※※※※※※※※※※※※※※※※※※※※ 第42套: 给定程序中,函数fun的功能是: 将s所指字符串中的所有数字字符移到所有非数字字符之后,并保持数字字符串和非数字字符串原有的先后次序。例如,形参s所指的字符串为:def35adh3kjsdf7。执行结果为:defadhkjsdf3537。 请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLANK1.C中。 不得增行或删行,也不得更改程序的结构! 给定源程序: #include void fun(char *s) { int i, j=0, k=0; char t1[80], t2[80]; for(i=0; s[i]!='\\0'; i++) if(s[i]>='0' && s[i]<='9') { t2[j]=s[i]; ___1___; } else t1[k++]=s[i]; t2[j]=0; t1[k]=0; for(i=0; i main() { char s[80]=\ printf(\original string is : %s\\n\ fun(s); printf(\ } 解题思路: t2是存放数字字符串,t1是存放非数字字符串。 第一处:t2存放数字字符串的位置是由j来控制的,每添加一个,j必须加1,所以应填:j++。第二处:利用for循环把t1字符串添加到原字符串s中,所以应填:s[i]=t1[i]。 第三处:利用for循环把t2字符串添加到原字符串s的尾部,其中数字字符串的长度为j,所 以应填:j。 *************************************************** 给定程序MODI1.C中函数 fun 的功能是:用冒泡法对6个字符串按由小到大的顺序进行排序。 请改正程序中的错误,使它能得出正确的结果。 注意: 不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include for (i = 0 ; i < 5 ; i++ ) { for (j = i + 1, j < 6, j++) { if(strcmp(*(pstr + i), *(pstr + j)) > 0) { p = *(pstr + i) ; *(pstr + i) = pstr + j ; *(pstr + j) = p ; }