知ing

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

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

Pluto. 上传

查看本书

30套: 

程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。例如:a所指变量中的学号、姓名、 

和三门课的成绩依次是:10001"ZhangSan"958088,则修改后输出b中的数据应为:10002"LiSi"958088。 

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

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

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

给定源程序: 

#include <stdio.h> 

#include <string.h> 

struct student { 

long sno; 

char name[10]; 

float score[3]; 

}; 

void fun(struct student a) 

{ struct student b; int i; 

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

b = __1__; 

b.sno = 10002; 

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

strcpy(__2__, "LiSi"); 

printf("\nThe data after modified :\n"); 

printf("\nNo: %ld Name: %s\nScores: ",b.sno, b.name); 

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

for (i=0; i<3; i++) printf("%6.2f ", b.__3__); 

printf("\n"); 

main() 

{ struct student s={10001,"ZhangSan", 95, 80, 88}; 

int i; 

printf("\n\nThe original data :\n"); 

printf("\nNo: %ld Name: %s\nScores: ",s.sno, s.name); 

for (i=0; i<3; i++) printf("%6.2f ", s.score[i]); 

printf("\n"); 

fun(s); 

解题思路: 

本题是对结构体变量中的值进行修改。 

第一处:要修改的结构体变量是由形参a来传递的,所以应填:a。 

第二处:对结构体中的成员name进行替换,所以应填:b.name。 

第三处:分别输出结构体中的成绩,所以应填:score[i]。 

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

给定程序MODI1.C中函数fun的功能是:从s所指字符串中删除所有小写字母c。 

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

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

给定源程序: 

#include <stdio.h> 

void fun( char *s ) 

{ int i,j; 

for(i=j=0; s[i]!='\0'; i++) 

if(s[i]!='c') 

 

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

\TAB s[j]=s[i]; 

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

s[i]='\0'; 

main() 

{ char s[80]; 

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

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

fun(s); 

printf("The string after deleted : "); puts(s);printf("\n\n"); 

解题思路: 

第一处新字符串的位置值是由变量j来控制的,但程序中字符赋值后没有对j进行增量的语句,所以应改为:s[j++]=s[i];。 

第二处对新字符串添加字符串结束符,由于程序中使用变量j对新字符串来控制的,所以应改为:s[j]=0;。 

假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。函数fun中给出的语句仅供参考。 

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

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

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

给定源程序: 

#include <stdio.h> 

void fun( char *a ) 

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

char *p,*q; 

int n=0; 

p=a; 

while(*p=='*') /* 统计串头'*'个数n */ 

{n++; p++;} 

q=a; 

/* 向前复制字符串,请填写相应的语句完成其功能 */ 

for(;n>0;n--) /* 在串尾补n'*' */ 

*q++='*'; 

*q='\0'; 

main() 

{ char s[81],*p; int n=0; 

printf("Enter a string:\n");gets(s); 

fun( s ); 

printf("The string after moveing:\n");puts(s); 

NONO(); 

 

解题思路: 

本题是考察字符串的移动。具体操作请看参考源程序。 

参考答案: 

void fun( char *a ) 

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

char *p,*q; 

int n=0; 

p=a; 

while(*p=='*') /* 统计串头'*'个数n */ 

{n++; p++;} 

q=a; 

/* 向前复制字符串,请填写相应的语句完成其功能 */ 

while(*p) { 

*q=*p; 

p++;q++; 

for(;n>0;n--) /* 在串尾补n'*' */ 

*q++='*'; 

*q='\0'; 

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



31套: 

给定程序中,函数fun的功能是:对形参s所指字符串中下标为奇数的字符按ASCII码大小递增排序,并将排序后下标为奇数的字符取出,存入形参p所指字符数组中,形成一个新串。 

例如,形参s所指的字符串为:baawrskjghzlicda,执行后p所指字符数组中 

的字符串应为:aachjlsw。 

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

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

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

给定源程序: 

#include <stdio.h> 

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<n-2; i=i+2) { 

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

___1___; 

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

for(j=___2___+2 ; j<n; j=j+2) 

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<n; i=i+2, j++) p[j]=s[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 <math.h> 

#include <stdio.h> 

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("%6.4f\n", n2) ; 

解题思路: 

第一处:要判断t的最后一项绝对小于指定的数,由于t是实数,那么应改为while(fabs(t)>=num)。 

第二处:ts除以n的值,而不是取余数,所以应改t=s/n;。 

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

请编写一个函数void fun (char a[],char b[],int n),其功能是:删除一个字符串中指定下标的字符。其中, a指向原字符串删除指定字符后的字符串存放在b所指的数组中,n中存放指定的下标。

例如,输入一个字符串: World,然后输入3,则调用该函数后的结果为: Word。 

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

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

给定源程序: 

#include <stdio.h> 

#include <string.h> 

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

#include <string.h> 

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

fun(x,4); 

printf("\nThe string after deleted :\n\n"); 

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

解题思路: 

本题是根据给定的字符串数组中删除串长大于某个值的右边字符串。 

第一处:函数的定义,试题中已用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 <math.h> 

#include <stdio.h> 

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

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]。其中,变量in的初始值,变量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 <stdio.h> 

#include <stdlib.h> 

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()%25;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 <stdio.h> 

void fun (long s, long *t) 

{ int d; 

long sl=1; 

*t = 0; 

while ( s > 0) 

{ d = s%10; 

/************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的功能是:将两个两位数的正整数ab合并形成一个整数放在c中。 

合并的方式是:将a数的十位和个位数依次放在c数的十位和千位上,b数的十位和个位数依次放在c数的百位和个位上。 

例如,当a45b=12时,调用该函数后,c=5142。 

注意部分源程序存在文件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: %ld\n", 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); 

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



查看更多