知ing

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

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

Pluto. 上传

查看本书

34套: 

用筛选法可得到2nn<10000)之间的所有素数,方法是:首先从素数2开始,将所有2的倍数的数从数表中删去(把数表中相应位置的值置成0);接着从数表中找下一个非0数,并从数表中删去该数的所有倍数;依此类推,直到所找的下一个数等于n为止。这样会得到一个序列: 

23571113171923,…… 

函数fun用筛选法找出所有小于等于n的素数,并统计素数的个数作为函数值返回。 

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

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

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

给定源程序: 

#include <stdio.h> 

int fun(int n) 

{ int a[10000], i,j, count=0; 

for (i=2; i<=n; i++) a[i] = i; 

i = 2; 

while (i<n) { 

/**********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%15?"%5d":"\n%5d",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 <stdio.h> 

#include <math.h> 

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)以内能被59整除的所有自然数的倒数之和。 

例如,在主函数中从键盘给n输入20输出为: s=0.583333。 

注意要求n的值不大于100。 

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

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

给定源程序: 

#include <stdio.h> 

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)以内能被59整除的所有自然数的倒数之和。 

参考答案: 

double fun(int n) 

int i; 

double sum=0.0; 

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

if(i%5 == 0 || i%9 == 0) /* 59整除 */ 

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

#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<m; i++) { 

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

for(j= __2__ ; j<N-i; j++) 

a[i][j]=a[N-i-1][j]=i+1; 

for(k=i+1; k<N-i; 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<N; i++) 

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

printf("\n"); 

解题思路: 

第一处:建立一个N×N的矩阵,所以应填:[N]。 

第二处:j的起始变量值应i。 

第三处:也应该填写i+1。 

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

给定程序MODI1.C中函数 fun 的功能是将十进制正整数m转换成k(2k9) 

进制数并按高位到低位顺序输出。 

例如,若输入82,则应输出1000(即十进制数8转换成二进制表示是1000)。 

请改正 fun 函数中的错误,使它能得出正确的结果。 

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

给定源程序: 

#include <conio.h> 

#include <stdio.h> 

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

#include <string.h> 

fun(char(*a)[81],int num,char **max) 

/* 以下代码仅供参考 */ 

int i,k=0,len, maxlen; /* ka数组中最长串所在元素的下标初始为0maxlen为其串长 */ 

maxlen=strlen(a[k]); 

for(i=1;i<num;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; /* ka数组中最长串所在元素的下标,初始为0maxlen为其串长 */ 

maxlen=strlen(a[k]); 

for(i=1;i<num;i++) 

/* 以下完成查找最长串 */ 

if(strlen(a[i]) > maxlen) { 

maxlen = strlen(a[i]) ; 

k = i ; 

*max=a[k]; 

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



36套: 

给定程序中,函数fun的功能是:统计出带有头结点的单向链表中结点的个数,存放在形参n所指的存储单元中。 

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

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

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

给定源程序: 

#include <stdio.h> 

#include <stdlib.h> 

#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<N; 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所指字符串中最后一次出现的所指子字符串的地址,通过函数值返回,在主函数中输出从此地址开始的字符串若未找到,则函数值为NULL。 

例如,当字符串中的内容为:"abcdabfabcdx"t中的内容为:"ab"时, 输出结果应是:abcdx。 

当字符串中的内容为:"abcdabfabcdx"t中的内容为:"abd"时,则程序输出未找到信息:not be found!。 

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

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

给定源程序: 

#include <stdio.h> 

#include <string.h> 

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" ); 

解题思路: 

第一处:指向空指针错误,NullNULL。 

第二处:比较指针位置的值是否相等,所以应改为:if(*r==*p)。 

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

函数fun的功能是: 将s所指字符串中除了下标为偶数、同时ASCII值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的数组中。 

例如,若s所指字符串中的内容为:"ABCDEFG123456",其中字符AASCII码值为奇数,因此应当删除;其中字符BASCII码值为偶数,但在数组中的下标为奇数,因此也应当删除;而字符2ASCII码值为偶数,所在数组中的下标也为偶数,因此不应当删除,其它依此类推。最后t所指的数组中的内容应是:"246"。 

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

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

给定源程序: 

#include <stdio.h> 

#include <string.h> 

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

#include <string.h> 

#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<N;i++)puts(x[i]); printf("\n"); 

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

fun(x,str); 

解题思路: 

本题是根据给定的字符串数组中查找指定的字符串,如果存在,则显示。 

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

第二处:查找子串,子串由形参substr传递,所以应填:substr。 

第三处:试题要求,若没有找到,函数值为0,所以应填:0。 

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

给定程序MODI1.C中函数fun的功能是:求三个数的最小公倍数。 

例如,给主函数中的变量x1x2x3分别输入15 11 2, 

则输出结果应当是:330。 

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

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

给定源程序: 

#include <stdio.h> 

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

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<len-h-e) { 

a[j]=a[h+j]; 

j++; 

a[j]=0; 

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



查看更多