知ing

二级C语言程序设计试题50套

NCRE研究组 编 / 高等教育出版社

Pluto. 上传

查看本书

41套: 

给定程序中,函数fun的功能是:计算x所指数组中N个数的平均值(规定所有 数均为正数),平均值通过形参返回主函数,将小于平均值且最接近平均值的数作为函数值返回,在主函数中输出。 例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为: 30.500000 

主函数中输出:m=30.0 

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 

注意:源程序存放在考生文件夹下的BLANK1.C中。 

不得增行或删行,也不得更改程序的结构! 

给定源程序: 

#include <stdlib.h> 

#define N 10 

double fun(double x[],double *av) 

{ int i,j; double d,s; 

s=0; 

for(i=0; i<N; i++) s = s +x[i]; 

/**********found**********/ 

__1__=s/N; 

d=32767; 

for(i=0; i<N; i++) 

if(x[i]<*av && *av - x[i]<=d){ 

/**********found**********/ 

d=*av-x[i]; j=__2__;} 

/**********found**********/ 

return __3__; 

main() 

{ int i; double x[N],av,m; 

for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);} 

printf("\n"); 

m=fun(x,&av); 

printf("\nThe average is: %f\n",av); 

printf("m=%5.1f ",m); 

printf("\n"); 

解题思路: 

第一处:计算好的平均值通过形参av返回,所以应填:*av。 

第二处:计算小于平均值且最接近平均值的位置j,所以应填:i。 

第三处:返回该数,所以应填:x[j]。 

*************************************************** 

给定程序MODI1.C中函数fun的功能是:根据整型形参n,计算如下公式的值。 

例如,若 n=10,则应输出: 0.617977。 

请改正程序中的语法错误,使它能得出正确的结果。 

注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 

给定源程序: 

#include <stdio.h> 

/************found************/ 

int fun ( int n ) 

{ float A=1; int i; 

/************found************/ 

for (i=2; i<n; i++) 

A = 1.0/(1+A); 

return A ; 

main( ) 

{ int n ; 

printf("\nPlease enter n: ") ; 

scanf("%d", &n ) ; 

printf("A%d=%f\n", n, fun(n) ) ; 

解题思路: 

第一处函数的返回是浮点型数所以应改为float fun(int n) 

第二处:for的终止条件应是i<=n。 

*************************************************** 

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun,函数的功能是:使数组右上三角元素中的值乘以。 

例如:若m的值为2数组中的值为 | 1 9 7 |  | 2 18 14|  | 2 3 8 | 则返回主程序后a数组中的值应为 | 2 6 16|  | 4 5 6 |  | 4 5 12| 

注意部分源程序存在文件PROG1.C文件中。 

请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。 

给定源程序: 

#include <stdio.h> 

#include <stdlib.h> 

#define N 5 

int fun ( int a[][N], int m ) 

 

main ( ) 

{ int a[N][N], m, i, j; 

printf("***** The array *****\n"); 

for ( i =0; i<N; i++ ) 

{ for ( j =0; j<N; j++ ) 

{ a[i][j] = rand()%20; printf( "%4d", a[i][j] ); } 

printf("\n"); 

do m = rand()%10 ; while ( m>=3 ); 

printf("m = %4d\n",m); 

fun ( a ,m ); 

printf ("THE RESULT\n"); 

for ( i =0; i<N; i++ ) 

{ for ( j =0; j<N; j++ ) printf( "%4d", a[i][j] ); 

printf("\n"); 

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 <stdio.h> 

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') 

/**********found**********/ 

t2[j]=s[i]; ___1___; 

else t1[k++]=s[i]; 

t2[j]=0; t1[k]=0; 

/**********found**********/ 

for(i=0; i<k; i++) ___2___; 

/**********found**********/ 

for(i=0; i<___3___; i++) s[k+i]=t2[i]; 

main() 

{ char s[80]="ba3a54j7sd567sdffs"; 

printf("\nThe original string is : %s\n",s); 

fun(s); 

printf("\nThe result is : %s\n",s); 

解题思路: 

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 <stdio.h> 

#include <string.h> 

#define MAXLINE 20 

fun ( char *pstr[6]) 

{ int i, j ; 

char *p ; 

for (i = 0 ; i < 5 ; i++ ) { 

/**************found**************/ 

for (j = i + 1, j < 6, j++) 

if(strcmp(*(pstr + i), *(pstr + j)) > 0) 

 

p = *(pstr + i) ; 

/**************found**************/ 

*(pstr + i) = pstr + j ; 

*(pstr + j) = p ; 

main( ) 

{ int i ; 

char *pstr[6], str[6][MAXLINE] ; 

for(i = 0; i < 6 ; i++) pstr[i] = str[i] ; 

printf( "\nEnter 6 string(1 string at each line): \n" ) ; 

for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ; 

fun(pstr) ; 

printf("The strings after sorting:\n") ; 

for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ; 

解题思路: 

第一处:for循环语句中缺少分号。 

第二处:应该把pstr+j位置上的值赋值给*(pstr+i)上,所以应改为: 

*(pstr+i)=*(pstr+j);。 

*************************************************** 

请编写函数fun,它的功能是:求出ss所指字符串中指定字符的个数,并返回此值。 

例如,若输入字符串: 123412132,输入字符为: 1,则输出:3。 

注意部分源程序在文件PROG1.C中。 

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 

给定源程序: 

#include <stdio.h> 

#include <string.h> 

#define M 81 

int fun(char *ss, char c) 

main() 

{ char a[M], ch; 

printf("\nPlease enter a string:"); gets(a); 

printf("\nPlease enter a char:"); ch = getchar(); 

printf("\nThe number of the char is: %d\n", fun(a, ch)); 

NONO ( ); 

 

解题思路: 

本题是考察考生怎样从字符串中找出指定字符的个数。使用while循环语句来字符串是否结束,如果没有结束,则判断当前字符是否是指定的字符,如果是指定的字符,则个数cnt1,直至字符串结束为止,最后由函数返回。 

参考答案: 

int fun(char *ss, char c) 

int cnt = 0 ; 

char *p = ss ; 

while(*p) { 

if(*p == c) cnt++ ; 

p++ ; 

return cnt ; 

※※※※※※※※※※※※※※※※※※※※※※※※※ 




43套: 

给定程序中,函数fun的功能是:在形参ss所指字符串数组中查找与形参t所指字符串相同的串,找到后返回该串在字符串数组中的位置(下标值),未找到则返回-1ss所指字符串数组中共有N个内容不同的字符串,且串长小于M。 

请在程序的下划线处填入正确的内容并把下划线删除使程序得出正确的结果。 

注意:源程序存放在考生文件夹下的BLANK1.C中。 

不得增行或删行,也不得更改程序的结构! 

给定源程序: 

#include <stdio.h> 

#include <string.h> 

#define N 5 

#define M 8 

int fun(char (*ss)[M],char *t) 

{ int i; 

/**********found**********/ 

for(i=0; i< __1__ ; i++) 

/**********found**********/ 

if(strcmp(ss[i],t)==0 ) return __2__ ; 

return -1; 

main() 

{ char ch[N][M]={"if","while","switch","int","for"},t[M]; 

int n,i; 

printf("\nThe original string\n\n"); 

for(i=0;i<N;i++)puts(ch[i]); printf("\n"); 

printf("\nEnter a string for search: "); gets(t); 

n=fun(ch,t); 

/**********found**********/ 

if(n== __3__) printf("\nDon't found!\n"); 

else printf("\nThe position is %d .\n",n); 

解题思路: 

本题是考察在字符串查找指定的子串。 

第一处:利用for循环,从几个字符串中进行查找,程序中已经给定了N个字符串,所以应填:N。 

第二处:在字符串已经找到,则返回字符串数组中的位置(下标值),所以应填:i。 

第三处:如果没有发现,则显示没有找到信息,所以应填:-1。 

*************************************************** 

给定程序MODI1.C中函数fun的功能是:从整数155之间,选出能被3整除、且有一位上的数是5的那些数,并把这些数放在b所指的数组中,这些数的个数作为函数值返回。规定,函数中a1放个位数,a2放十位数。 

请改正程序中的错误,使它能得出正确结果。 

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 

给定源程序: 

#include <stdio.h> 

fun( int *b ) 

{ int k,a1,a2,i=0; 

for(k=10; k<=55; k++) { 

/************found************/ 

a2=k/1O; 

a1=k-a2*10; 

if((k%3==0 && a2==5)||(k%3==0 && a1==5)) 

{ b[i]=k; i++; } 

/************found************/ 

return k; 

main( ) 

{ int a[100],k,m; 

m=fun( a ); 

printf("The result is :\n"); 

for(k=0; k<m; k++) printf("%4d",a[k]); printf("\n"); 

解题思路: 

第一处取当前变量k的十位数字上的数,所以应改为:a2=k/10;。 

第二处要求统计个数并存入变量i中,最后返回i,所以应改为:return i;。 

*************************************************** 

假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串尾部的*号全部删除,前面和中间的*号不删除。 

例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:****A*BC*DEF*G。在编写函数时,不得使用C语言提供的字符串函数。 

注意部分源程序在文件PROG1.C文件中。 

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 

给定源程序: 

#include <stdio.h> 

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. 使用while循环语句和字符串指针p扫描出尾部的*号。 

2. 定义两个字符串中间变量st,其中s是存放*号后面的字符串,t是存放*号字符串。 

3. 最后利用字符串拷贝和连接,重新组成字符串a。 

参考答案: 

void fun( char *a ) 

char *p = a ; 

while(*p) p++ ; p-- ; 

while(*p == '*') p-- ; 

p++ ; 

*p = 0 ; 

※※※※※※※※※※※※※※※※※※※※※※※※※ 



44套: 

函数fun的功能是进行数字字符转换。若形参ch中是数字字符'0''9', '0'转换成'9','1'转换成'8''2'转换成'7',……,'9'转换成'0';若是其它字符则保持不变;并将转换后的结果作为函数值返回。 

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。 

注意:源程序存放在考生文件夹下的BLANK1.C中。 

不得增行或删行,也不得更改程序的结构! 

给定源程序: 

#include <stdio.h> 

/**********found**********/ 

___1___ fun(char ch) 

/**********found**********/ 

if (ch>='0' && ___2___) 

/**********found**********/ 

return '9'- (ch-___3___); 

return ch ; 

main() 

{ char c1, c2; 

printf("\nThe result :\n"); 

c1='2'; c2 = fun(c1); 

printf("c1=%c c2=%c\n", c1, c2); 

c1='8'; c2 = fun(c1); 

printf("c1=%c c2=%c\n", c1, c2); 

c1='a'; c2 = fun(c1); 

printf("c1=%c c2=%c\n", c1, c2); 

解题思路: 

第一处:要求返回处理好的字符,所以应填:char。 

第二处:判断该字符是否是数字,所以应填:ch<='9'。 

第三处:只要减去'0'ASCII值,即可得到要求的结果,所以应填:'0'。 

*************************************************** 

给定程序MODI1.C中函数fun的功能是:将p所指字符串中的所有字符复制到中,要求每复制三个字符之后插入一个空格。 

例如,在调用fun函数之前给a输入字符串:ABCDEFGHIJK, 

调用函数之后,字符数组b中的内容则为:ABC DEF GHI JK。 

请改正程序中的错误,使它能得出正确结果。 

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。 

给定源程序: 

#include <stdio.h> 

 

void fun(char *p, char *b) 

{ int i, k=0; 

while(*p) 

{ i=1; 

while( i<=3 && *p ) { 

/**********found**********/ 

b[k]=p; 

k++; p++; i++; 

if(*p) 

/**********found**********/ 

b[k++]=" "; 

b[k]='\0'; 

main() 

{ char a[80],b[80]; 

printf("Enter a string: "); gets(a); 

printf("The original string: "); puts(a); 

fun(a,b); 

printf("\nThe string after insert space: "); puts(b); printf("\n\n"); 

解题思路: 

第一处:把指针p所指的值赋值给b[k]中。 

第二处:把空格字符赋值给b[k++]中,而不是一个空格的字符串。 

*************************************************** 

N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。请编写函数fun,它的功能是:求出平均分,由函数值返回。 

例如,若学生的成绩是:8576698591726487, 则平均分应当是:78.625。 

注意部分源程序在文件PROG1.C中。 

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 

给定源程序: 

#include <stdio.h> 

#include <stdlib.h> 

#define N 8 

struct slist 

{ double s; 

struct slist *next; 

}; 

typedef struct slist STREC; 

double fun( STREC *h ) 

 

STREC * creat( double *s) 

{ STREC *h,*p,*q; int i=0; 

h=p=(STREC*)malloc(sizeof(STREC));p->s=0; 

while(i<N) 

{ q=(STREC*)malloc(sizeof(STREC)); 

q->s=s[i]; i++; p->next=q; p=q; 

p->next=0; 

return h; 

outlist( STREC *h) 

{ STREC *p; 

p=h->next; printf("head"); 

do 

{ printf("->%4.1f",p->s);p=p->next;} 

while(p!=0); 

printf("\n\n"); 

main() 

{ double s[N]={85,76,69,85,91,72,64,87},ave; 

STREC *h; 

h=creat( s ); outlist(h); 

ave=fun( h ); 

printf("ave= %6.3f\n",ave); 

NONO(); 

解题思路: 

本题是计算链表结构中成绩的平均分。具体操作请看答案程序中的说明。 

参考答案: 

#include <stdio.h> 

#include <stdlib.h> 

double fun( STREC *h ) 

STREC *p=h->next; /* 由于头结点中没有存放数据 */ 

double av=0.0; /* 对计算成绩平均值的变量进行初始化 */ 

int n = 0 ; 

while(p!=NULL) { /* 判断链表是否结束 */ 

av = av + p->s ; /* 对成绩进行累加 */ 

p=p->next; /* 到下一个结点位置 */ 

n++; /* 人数加1 */ 

av /= n ; /* 计算成绩平均值 */ 

return av ; /* 返回成绩平均值 */ 

※※※※※※※※※※※※※※※※※※※※※※※※※ 



查看更多