知ing

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

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

Pluto. 上传

查看本书

05套: 

给定程序中,函数fun的功能是将参数给定的字符串、整数、浮点数写到文本文件中,再用字符串方式从此文本文件中逐个读入,并调用库函数atoiatof将字符串转换成相应的整数、浮点数,然后将其显示在屏幕上。 

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

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

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

给定源程序: 

#include <stdio.h> 

#include <stdlib.h> 

void fun(char *s, int a, double f) 

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

__1__ fp; 

char str[100], str1[100], str2[100]; 

int a1; double f1; 

fp = fopen("file1.txt", "w"); 

 

fprintf(fp, "%s %d %f\n", s, a, f); 

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

__2__ ; 

fp = fopen("file1.txt", "r"); 

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

fscanf(__3__,"%s%s%s", str, str1, str2); 

fclose(fp); 

a1 = atoi(str1); 

f1 = atof(str2); 

printf("\nThe result :\n\n%s %d %f\n", str, a1, f1); 

main() 

{ char a[10]="Hello!"; int b=12345; 

double c= 98.76; 

fun(a,b,c); 

解题思路: 

本题是考察先把给定的数据写入到文本文件中,再从该文件读出并转换成相应的整数、浮点数显示在屏幕上。 

第一处:定义文本文件类型变量,所以应填:FILE *。 

第二处:关闭刚写入的文件,所以应填:fclose(fp)。 

第三处:从文件中读出数据,所以应填:fp。 

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

给定程序MODI1.C中函数fun的功能是N名学生的学习成绩,按从高到低的顺序找出前m(m10)名学生来并将这些学生数据存放在一个动态分配的连续存储区中此存储区的首地址作为函数值返回。 

请改正函数fun中指定部位的错误使它能得出正确的结果。 

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

给定源程序: 

#include <stdio.h> 

#include <alloc.h> 

#include <string.h> 

#define N 10 

typedef struct ss 

{ char num[10]; 

int s; 

} STU; 

STU *fun(STU a[], int m) 

{ STU b[N], *t; 

int i,j,k; 

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

t=(STU *)calloc(sizeof(STU),m) 

for(i=0; i<N; i++) b[i]=a[i]; 

for(k=0; k<m; k++) 

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

if(b[i].s > b[j].s) j=i; 

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

 

t(k)=b(j); 

b[j].s=0; 

return t; 

outresult(STU a[], FILE *pf) 

{ int i; 

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

fprintf(pf,"No = %s Mark = %d\n", a[i].num,a[i].s); 

fprintf(pf,"\n\n"); 

main() 

{ STU a[N]={ {"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77}, 

{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71} }; 

STU *pOrder; 

int i, m; 

printf("***** The Original data *****\n"); 

outresult(a, stdout); 

printf("\nGive the number of the students who have better score: "); 

scanf("%d",&m); 

while( m>10 ) 

{ printf("\nGive the number of the students who have better score: "); 

scanf("%d",&m); 

pOrder=fun(a,m); 

printf("***** THE RESULT *****\n"); 

printf("The top :\n"); 

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

printf(" %s %d\n",pOrder[i].num , pOrder[i].s); 

free(pOrder); 

解题思路: 

第一处语句最后缺少分号。 

第二处应该使用方括号,而不是圆括号。 

像此类,使用编译,即可发现。 

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

请编写函数fun, 函数的功能是删去一维数组中所有相同的数使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。 

例如一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10。 

删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。 

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

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

给定源程序: 

#include <stdio.h> 

#define N 80 

int fun(int a[], int n) 

 

main() 

{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20; 

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

for(i=0; i<n; i++)printf("%3d",a[i]); 

n=fun(a,n); 

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

for(i=0;i<n;i++)printf("%3d",a[i]); printf("\n\n"); 

NONO(); 

解题思路: 

本题是删除已排序过数组中的相同数。 

1. 取出数组中的第1个数存放在临时变量k中,再利用for循环来依次判断所有的数。 

2. 如果取出的数和k相比,如果不相同,则仍存放在原数组中,其中存放的位置由j来控制,接着把这个数重新存入k。如果相同,则取下一数。 

参考答案: 

int fun(int a[], int n) 

int i, j = 1, k = a[0] ; 

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

if(k != a[i]) { 

a[j++]=a[i] ; 

k = a[i] ; 

a[j] = 0 ; 

return j ; 

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



06套: 

给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时程序输出: 

x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000 

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

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

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

给定源程序: 

#include <stdio.h> 

double f1(double x) 

{ return x*x; } 

double f2(double x, double y) 

{ return x*y; } 

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

__1__ fun(int i, double x, double y) 

{ if (i==1) 

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

return __2__(x); 

else 

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

return __3__(x, y); 

main() 

{ double x1=5, x2=3, r; 

r = fun(1, x1, x2); 

 

r += fun(2, x1, x2); 

printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r); 

解题思路: 

本题是根据给定的公式来计算函数的值。 

第一处:程序中使用双精度double类型进行计算,所以函数的返回值类型也为double,所以应填:double。 

第二处:当i等于1时,则返回f1函数的值,所以应填:f1。 

第三处:如果i不等于1,则返回f2函数的值,所以应填:f2。 

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

给定程序MODI1.C中函数fun的功能是比较两个字符串,将长的那个字符串的首地址作为函数值返回。 

请改正函数fun中指定部位的错误使它能得出正确的结果。 

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

给定源程序: 

#include <stdio.h> 

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

char fun(char *s, char *t) 

{ int sl=0,tl=0; char *ss, *tt; 

ss=s; tt=t; 

while(*ss) 

{ sl++; 

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

(*ss)++; 

while(*tt) 

{ tl++; 

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

(*tt)++; 

if(tl>sl) return t; 

else return s; 

main() 

{ char a[80],b[80],*p,*q; int i; 

printf("\nEnter a string : "); gets(a); 

printf("\nEnter a string again : "); gets(b); 

printf("\nThe longer is :\n\n\"%s\"\n",fun(a,b)); 

解题思路: 

第一处试题要求返回字符串的首地址,所以应改为:char *fun(char *s,char *t) 

第二处取字符串指针ss的下一个位置,所以应改为:ss++;。 

第三处:取字符串指针tt的下一个位置,所以应改为:tt++;。 

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

请编写函数fun,函数的功能是移动字符串中的内容,移动的规则如下把第1到第m个字符平移到字符串的最后把第m+1到最后的字符移到字符串的前部。 

例如字符串中原有的内容为: ABCDEFGHIJK, m的值为3, 则移动后字符串中的内容应该是: DEFGHIJKABC。 

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

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

给定源程序: 

#include <stdio.h> 

#include <string.h> 

#define N 80 

void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */ 

int i; char t; 

t=w[0]; 

for(i=0;i<strlen(w)-1;i++) 

w[i]=w[i+1]; 

w[strlen(w)-1]=t; 

void fun(char *w, int m) /* 可调用fun1函数左移字符 */ 

main() 

{ char a[N]= "ABCDEFGHIJK"; 

int m; 

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

printf("\n\nEnter m: ");scanf("%d",&m); 

fun(a,m); 

printf("\nThe string after moving:\n");puts(a); 

printf("\n\n"); 

NONO(); 

解题思路: 

本题是考察字符串的操作。 

1. 由于函数fun1是将字符串中字符循环左移一个位置,并通过实参w返回循环左移一个位置的字符串。 

2. 利用循环for语句来操作多少个字符(m)需要循环左移。 

参考答案: 

void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */ 

int i; char t; 

t=w[0]; 

for(i=0;i<strlen(w)-1;i++) 

w[i]=w[i+1]; 

w[strlen(w)-1]=t; 

void fun(char *w, int m) /* 可调用fun1函数左移字符 */ 

int i; 

for(i = 0 ; i < m ; i++) fun1(w); 

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



07套: 

程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函数fun的功能是输出这位学生的信息。 

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

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

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

给定源程序: 

#include <stdio.h> 

typedef struct 

{ int num; 

char name[9]; 

char sex; 

struct { int year,month,day ;} birthday; 

float score[3]; 

}STU; 

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

void show(STU ___1___) 

{ int i; 

printf("\n%d %s %c %d-%d-%d", tt.num, tt.name, tt.sex, 

tt.birthday.year, tt.birthday.month, tt.birthday.day); 

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

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

printf("%5.1f", ___2___); 

printf("\n"); 

main( ) 

{ STU std={ 1,"Zhanghua",'M',1961,10,8,76.5,78.0,82.0 }; 

printf("\nA student data:\n"); 

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

show(___3___); 

解题思路: 

本题是利用结构体变量存储了一名学生的信息。 

第一处:tt变量在函数体fun已经使用,所以应填:tt。 

第二处:利用循环分别输出学生的成绩数据,所以应填:tt.score[i]。 

第三处:函数的调用,所以应填:std。 

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

给定程序MODI1.C中函数 fun 的功能是:求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。 

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

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

给定源程序: 

#include <stdio.h> 

#define N 20 

int fun ( int * a, int n ) 

{ int i, m, t, k ; 

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

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

m=0; 

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

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

if(a[k]>a[m]) k=m; 

t=a[i];a[i]=a[m];a[m]=t; 

 

main( ) 

{ int x, b[N]={11,5,12,0,3,6,9,7,10,8}, n=10, i; 

for ( i=0; i<n; i++ ) printf("%d ", b[i]); 

printf("\n"); 

fun ( b, n ); 

for ( i=0; i<n; i++ ) printf("%d ", b[i]); 

printf("\n"); 

解题思路: 

第一处:外循环每循环一次,把当前位置i赋值给m,所以应改为:m=i;。 

第二处:通过内循环来找出最大的一个数的位置k,所以应改为:if(a[k]>a[m]) m=k;。 

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

请编写一个函数 unsigned fun ( unsigned w )是一个大于10的无符号整数,若 是 n (n ≥ 2)位的整数,函数求出w的低 n-1位的数作为函数值返回。 

例如:值为 5923,则函数返回 923; 值为 923 则函数返回 23。 

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

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

给定源程序: 

#include <stdio.h> 

unsigned fun ( unsigned w ) 

main( ) 

{ unsigned x; 

printf ( "Enter a unsigned integer number : " ); scanf ( "%u", &x ); 

printf ( "The original data is : %u\n", x ); 

if ( x < 10 ) printf ("Data error !"); 

else printf ( "The result : %u\n", fun ( x ) ); 

NONO( ); 

解题思路: 

本题是考察考生怎样获取一个符合要求的无符号整数。本题是应用if条件语句首先判断给出的数是几位数,再模相应的值,最后得出的余数就是结果。 

参考答案: 

unsigned fun ( unsigned w ) 

if(w>10000) w %= 10000 ; 

else if(w>1000) w %= 1000 ; 

else if(w>100) w %= 100 ; 

else if(w>10) w %=10 ; 

return w ; 

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



08套: 

给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a

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

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

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

给定源程序: 

#include <stdio.h> 

 

typedef struct 

{ int num; 

char name[9]; 

float score[3]; 

}STU; 

void show(STU tt) 

{ int i; 

printf("%d %s : ",tt.num,tt.name); 

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

printf("%5.1f",tt.score[i]); 

printf("\n"); 

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

void modify(___1___ *ss,float a) 

{ int i; 

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

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

ss->___2___ *=a; 

main( ) 

{ STU std={ 1,"Zhanghua",76.5,78.0,82.0 }; 

float a; 

printf("\nThe original number and name and scores :\n"); 

show(std); 

printf("\nInput a number : "); scanf("%f",&a); 

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

modify(___3___,a); 

printf("\nA result of modifying :\n"); 

show(std); 

解题思路: 

本题是利用结构体存储学生记录并由实参ss返回。 

第一处:实参ss是一个结构型指针变量,所以应填:STU。 

第二处:该学生的各科成绩都乘以一个系数a,所以应填:score[i]。 

第三处:函数的调用,由于函数定义时使用的指针结构型变量,所以应填:&std。 

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

给定程序MODI1.C中函数fun的功能是:求k!k<13),所求阶乘的值作为函数值返回。例如:若k = 10,则应输出:3628800。 

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

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

给定源程序: 

#include <stdio.h> 

long fun ( int k) 

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

if k > 0 

return (k*fun(k-1)); 

 

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

else if ( k=0 ) 

return 1L; 

main() 

{ int k = 10 ; 

printf("%d!=%ld\n", k, fun ( k )) ; 

解题思路: 

第一处:条件判断缺少圆括号。 

第二处:判断相等的符号是==。 

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

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N], int n),函数的功能是:使数组左下三角元素中的值乘以。 

例如:若n的值为3数组中的值为

| 1 9 7 | | 3 9 7 | | 2 3 8 |则返回主程序后a数组中的值应为 | 6 9 8 |  | 4 5 6 |  | 12 15 18| 

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

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

给定源程序: 

#include <stdio.h> 

#include <stdlib.h> 

#define N 5 

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

main ( ) 

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

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

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

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

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

printf("\n"); 

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

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

fun ( a, n ); 

printf ("***** THE RESULT *****\n"); 

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

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

printf("\n"); 

NONO( ); 

解题思路: 

本题是利用两重循环给二维数组左下三角元素中的值乘以n。 

参考答案: 

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

int i, j; 

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

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

a[i][j] *= n ; 

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



查看更多