2016
计算机
二级
语言
题库
说明:本题库是针对2016年3月份考试的上机考试题库,本题库共有100套题目(每套题目包含3道题:一道程序填空题、一道程序修改题、一道程序设计题),真实考试的时候,考生输入准考证后计算机随机为你抽取一套考试,每个考生考试时只需考一套题目(包含三道题),但由于考试时是随机抽题,所以即使把原题库告诉大家,你也不能知道到时计算机会给你抽取哪一套题,所以大家只有把全部题库都理解才能万无一失)
二级C语言上机试题汇编
※※※※※※※※※※※※※※※※※※※※※※※※※
第1套:
给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定
所有数均为正数),将所指数组中小于平均值的数据移至数组的前部,大于等于平
均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均
值和移动后的数据。
例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:
30.500000
移动后的输出为:30 6 17 15 26 46 32 40 45 48
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double *x)
{ int i, j; double av, y[N];
av=0;
/**********found**********/
for(i=0; i<N; i++) av +=__1__;
for(i=j=0; i<N; i++)
if( x[i]<av ){
/**********found**********/
y[j]=x[i]; x[i]=-1; __2__;}
i=0;
while(i<N)
{ if( x[i]!= -1 ) y[j++]=x[i];
/**********found**********/
__3__;
}
for(i=0; i<N; i++)x[i] = y[i];
return av;
}
main()
{ int i; double x[N];
for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);}
printf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; i<N; i++) printf("%5.0f ",x[i]);
printf("\n");
}
解题思路:
第一处:求出N个数的平均值,所以应填:N。
第二处:利用for循环语句,把数组x中小于平均值的数,依次存放到数组y中,其中位置由
变量j来控制,所以应填:j++。
第三处:i是while循环体的控制变量,每做一次循环均要加1。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:统计字符串中各元音字母(即:A、
E、I、O、U)的个数。注意:字母不分大、小写。
例如:若输入:THIs is a boot,则输出应该是:1、0、2、2、0。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
fun ( char *s, int num[5] )
{ int k, i=5;
for ( k = 0; k<i; k++ )
/**********found**********/
num[i]=0;
for (; *s; s++)
{ i = -1;
/**********found**********/
switch ( s )
{ case 'a': case 'A': {i=0; break;}
case 'e': case 'E': {i=1; break;}
case 'i': case 'I': {i=2; break;}
case 'o': case 'O': {i=3; break;}
case 'u': case 'U': {i=4; break;}
}
if (i >= 0)
num[i]++;
}
}
main( )
{ char s1[81]; int num1[5], i;
printf( "\nPlease enter a string: " ); gets( s1 );
fun ( s1, num1 );
for ( i=0; i < 5; i++ ) printf ("%d ",num1[i]); printf ("\n");
}
解题思路:
第一处:num初始化错误,应为:num[k]=0;。
第二处:由于s是指针型变量,所以应改为:switch(*s)。
***************************************************
请编写函数 fun,函数的功能是求出二维数组周边元素之和,作为函数值返
回。二维数组中的值在主函数中赋予。
例如:二维数组中的值为
1 3 5 7 9
2 9 9 9 4
6 9 9 9 8
1 3 5 7 0
则函数值为 61。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include <stdio.h>
#define M 4
#define N 5
int fun ( int a[M][N] )
{
}
main( )
{ int aa[M][N]={{1,3,5,7,9},
{2,9,9,9,4},
{6,9,9,9,8},
{1,3,5,7,0}};
int i, j, y;
clrscr();
printf ( "The original data is : \n" );
for ( i=0; i<M; i++ )
{ for ( j =0; j<N; j++ ) printf( "%6d", aa[i][j] );
printf ("\n");
}
y = fun ( aa );
printf( "\nThe sum: %d\n" , y );
printf("\n");
NONO( );
}
解题思路:
本题是统计二维数组周边元素值之和,但要注意的是不要重复计算四个角上的元素值,结
果作为函数值返回。
参考答案:
int fun ( int a[M][N] )
{
int tot = 0, i, j ;
for(i = 0 ; i < N ; i++) {
tot += a[0][i] ;
tot += a[M-1][i] ;
}
for(i = 1 ; i < M - 1 ; i++) {
tot += a[i][0] ;
tot += a[i][N-1] ;
}
return tot ;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第21套:
给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定
所有数均为正数),将所指数组中大于平均值的数据移至数组的前部,小于等于平
均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均
值和移动后的数据。
例如,有10个正数:46 30 32 40 6 17 45 15 48 26,平均值为:
30.500000
移动后的输出为:46 32 40 45 48 30 6 17 15 26
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double *x)
{ int i, j; double s, av, y[N];
s=0;
for(i=0; i<N; i++) s=s+x[i];
/**********found**********/
av=__1__;
for(i=j=0; i<N; i++)
if( x[i]>av ){
/**********found**********/
y[__2__]=x[i]; x[i]=-1;}
for(i=0; i<N; i++)
/**********found**********/
if( x[i]!= __3__) y[j++]=x[i];
for(i=0; i<N; i++)x[i] = y[i];
return av;
}
main()
{ int i; double x[N];
for(i=0; i<N; i++){ x[i]=rand()%50; printf("%4.0f ",x[i]);}
printf("\n");
printf("\nThe average is: %f\n",fun(x));
printf("\nThe result :\n",fun(x));
for(i=0; i<N; i++) printf("%5.0f ",x[i]);
printf("\n");
}
解题思路:
第一处:计算N个数的平均值,所以应填:s/N。
第二处:利用for循环语句,把数组x中大于平均值的数,依次存放到数组y中,同时把数组
x上的该数置为-1,其中位置由变量j来控制,所以应填:j++。
第三处:再利用循环把不是-1的数,依次仍存放到数组y中,所以应填:-1。
***************************************************
给定程序MODI1.C的功能是:读入一个英文文本行,将其中每个单词的第一个
字母改成大写,然后输出此文本行(这里的“单词”是指由空格隔开的字符串)。
例如,若输入:I am a student to take the examination.,
则应输出:I Am A Student To Take The Examination.。
请改正程序中的错误,使程序能得出正确的结果。
注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <ctype.h>
#include <string.h>
/************found************/
include <stdio.h>
/************found************/
upfst ( char p )
{ int k=0;
for ( ; *p; p++ )
if ( k )
{ if ( *p == ' ' ) k = 0; }
else if ( *p != ' ' )
{ k = 1; *p = toupper( *p ); }
}
main( )
{ char chrstr[81];
printf( "\nPlease enter an English text line: " ); gets( chrstr );
printf( "\n\nBefore changing:\n %s", chrstr );
upfst( chrstr );
printf( "\nAfter changing:\n %s\n", chrstr );
}
解题思路:
第一处:包含头文件的标识错误,在include前漏写了#。
第二处:由于传入的参数是字符串,所以应为upfst(char *p)。
***************************************************
程序定义了N×N的二维数组,并在主函数中赋值。请编写函数fun,函数的功
能是:求出数组周边元素的平均值并作为函数值返给主函数中的s。
例如:a 数组中的值为
|0 1 2 7 9|
|1 9 7 4 5|
a = |2 3 8 3 1|
|4 5 6 8 2|
|5 9 1 4 1|
则返回主程序后s的值应为: 3.375。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include <stdio.h>
#include <stdlib.h>
#define N 5
double fun ( int w[][N] )
{
}
main ( )
{ int a[N][N]={0,1,2,7,9,1,9,7,4,5,2,3,8,3,1,4,5,6,8,2,5,9,1,4,1};
int i, j;
double s ;
printf("***** The array *****\n");
for ( i =0; i<N; i++ )
{ for ( j =0; j<N; j++ )
{ printf( "%4d", a[i][j] ); }
printf("\n");
}
s = fun ( a );
printf ("***** THE RESULT *****\n");
printf( "The sum is : %lf\n",s );
NONO( );
}
解题思路:
本题是统计二维数组周边元素值的平均值,但要注意的是不要重复计算四个角上的元素值。
参考答案:
double fun ( int w[][N] )
{
int i, j, n=0;
double sum=0;
for ( i =0; i<N; i++ ) {
sum+=w[0][i]+w[N-1][i]; n+=2;
}
for ( i =1; i<N - 1; i++ ) {
sum +=w[i][0]+w[i][N-1];
n+=2;
}
return sum/n;
}
※※※※※※※※※※※※※※※※※※※※※※※※※
第22套:
给定程序中,函数fun的功能是:将自然数1~10以及它们的平方根写到名为
myfile3.txt的文本文件中,然后再顺序读出显示在屏幕上。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <math.h>
#include <stdio.h>
int fun(char *fname )
{ FILE *fp; int i,n; float x;
if((fp=fopen(fname, "w"))==NULL) return 0;
for(i=1;i<=10;i++)
/**********found**********/
fprintf(___1___,"%d %f\n",i,sqrt((double)i));
printf("\nSucceed!!\n");
/**********found**********/
___2___;
printf("\nThe data in file :\n");
/**********found**********/
if((fp=fopen(___3___,"r"))==NULL)
return 0;
fscanf(fp,"%d%f",&n,&x);
while(!feof(fp))
{ printf("%d %f\n",n,x); fscanf(fp,"%d%f",&n,&x); }
fclose(fp);
return 1;
}
main()
{ char fname[]="myfile3.txt";
fun(fname);
}
解题思路:
本题要求所求出的数写入到指定的文件中保存。程序中共有三处要填上适当的内容,使程
序能运行出正确的结果。
第一处:int fprintf(FILE *stream, const char *format [,argument, …]); 因此本处
只能填写文件流的变量fp。
第二处:由于文件打开写操作,所以必须要关闭,因此,只能填写关闭文件的函数
fclose(fp)。
第三处:由于本题要把刚写入文件中的数据重新显示出来,读方式已经给出,但没有给出
文件名,所以本处只能写文件名变量fname或者直接给出文件名"myfile3.dat"。
***************************************************
给定程序MODI1.C中fun函数的功能是:将n个无序整数从小到大排序。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
#include <stdlib.h>
fun ( int n, int *a )
{ int i, j, p, t;
for ( j = 0; j<n-1 ; j++ )
{ p = j;
/************found************/
for ( i=j+1; i<n-1 ; i++ )
if ( a[p]>a[i] )
/************found************/
t=i;
if ( p!=j )
{ t = a[j]; a[j] = a[p]; a[p] = t; }
}
}
putarr( int n, int *z )
{ int i;
for ( i = 1; i <= n; i++, z++ )
{ printf( "%4d", *z );
if ( !( i%10 ) ) printf( "\n" );
} printf("\n");
}
main()
{ int aa[20]={9,3,0,4,1,2,5,6,8,10,7}, n=11;
printf( "\n\nBefore sorting %d numbers:\n", n ); putarr( n, aa );
fun( n, aa );
printf( "\nAfter sorting %d numbers:\n", n ); putarr( n, aa );
}
解题思路:
第一处:for循环的终止值应该<n或者是<=n-1。
第二处:使用临时变量p来保存最小值位置i,所以应改为:p=i;。
***************************************************
函数fun的功能是: 将两个两位数的正整数a、b合并形成一个整数放在c中。
合并的方式是: 将a数的十位和个位数依次放在c数的个位和百位上, b数的十位
和个位数依次放在c数的十位和千位上。
例如, 当a=45, b=12时, 调用该函数后, c=2514。
注意: 部分源程序存在文件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=(b%10)*1000+(a%10)*100+(b/10)*10+(a/10);
}
第02套:
给定程序中,函数fun的功能是:将形参n所指变量中,各位上为偶数的数去
除,剩余的数按原来从高位到低位的顺序组成一个新的数,并通过形参指针n传回
所指变量。
例如,输入一个数:27638496,新的数:为739。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
void fun(unsigned long *n)
{ unsigned long x=0, i; int t;
i=1;
while(*n)
/**********found**********/
{ t=*n % __1__;
/**********found**********/
if(t%2!= __2__)
{ x=x+t*i; i=i*10; }
*n =*n /10;
}
/**********found**********/
*n=__3__;
}
main()
{ unsigned long n=-1;
while(n>99999999||n<0)
{ printf("Please input(0<n<100000000): "); scanf("%ld",&n); }
fun(&n);
printf("\nThe result is: %ld\n",n);
}
解题思路:
第一处:t是通过取模的方式来得到*n的个位数字,所以应填:10。
第二处:判断是否是奇数,所以应填:0。
第三处:最后通形参n来返回新数x,所以应填:x。
***************************************************
给定程序MODI1.C中函数 fun 的功能是:计算n!。
例如,给n输入5,则输出120.000000。
请改正程序中的错误,使程序能输出正确的结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
double fun ( int n )
{ double result = 1.0 ;
/************found************/
if n = = 0
return 1.0 ;
while( n >1 && n < 170 )
/************found************/
result *= n--
return result ;
}
main ( )
{ int n ;
printf("Input N:") ;
scanf("%d", &n) ;
printf("\n\n%d! =%lf\n\n", n, fun(n)) ;
}
解题思路:
第一处:条件语句书写格式错误,应改为:if (n==0)。
第二处:语句后缺少分号。
***************************************************
请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数(不得
调用C语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-1234",则
函数把它转换为整数值 -1234。函数fun中给出的语句仅供参考。
注意: 部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填
入你编写的若干语句。
给定源程序:
#include <stdio.h>
#include <string.h>
long fun ( char *p)
{
/* 以下代码仅供参考 */
int i, len, t; /* len为串长,t为正负标识 */
long x=0;
len=strlen(p);
if(p[0]=='-')
{ t=-1; len--; p++; }
else t=1;
/* 以下完成数字字符串转换为一个数字 */
return x*t;
}
main() /* 主函数 */
{ char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n",n);
NONO ( );
}
NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i ;
char s[20] ;
long n ;
fp = fopen("c:\\test\\in.dat","r") ;
wf = fopen("c:\\test\\out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%s", s) ;
n = fun(s);
fprintf(wf, "%ld\n", n) ;
}
fclose(fp) ;
fclose(wf) ;
}
解题思路:
本题是将一个数字字符串转换为一个整数。
参考答案:
#include <stdio.h>
#include <string.h>
long fun ( char *p)
{
/* 以下代码仅供参考 */
int i, len, t; /* len为串长,t为正负标识 */
long x=0;
len=strlen(p);
if(p[0]=='-')
{ t=-1; len--; p++; }
else t=1;
/* 以下完成数字字符串转换为一个数字 */
while(*p) x = x*10-48+(*p++);
return x*t;
}
main() /* 主函数 */
{ char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n",n);
NONO ( );
}
NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i ;
char s[20] ;
long n ;
fp = fopen("c:\\test\\in.dat","r") ;
wf = fopen("c:\\test\\out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%s", s) ;
n = fun(s);
fprintf(wf, "%ld\n", n) ;
}
fclose(fp) ;
fclose(wf) ;
}
注意:由于NONO( )这个函数是改卷人用的,与考生没有什么关系,故下面从第2套试题开始均省略NONO( )
※※※※※※※※※※※※※※※※※※※※※※※※※
第03套:
给定程序中,函数fun的功能是将形参给定的字符串、整数、浮点数写到文本
文件中,再用字符方式从此文本文件中逐个读入并显示在终端屏幕上。
请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结
果。
注意:源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
给定源程序:
#include <stdio.h>
void fun(char *s, int a, double f)
{
/**********found**********/
__1__ fp;
char ch;
fp = fopen("file1.txt", "w");
fprintf(fp, "%s %d %f\n", s, a, f);
fclose(fp);
fp = fopen("file1.txt", "r");
printf("\nThe result :\n\n");
ch = fgetc(fp);
/**********found**********/
while (!feof(__2__)) {
/**********found**********/
putchar(__3__); ch = fgetc(fp); }
putchar('\n');
fclose(fp);
}
main()
{ char a[10]="Hello!"; int b=12345;
double c= 98.76;
fun(a,b,c);
}
解题思路:
本题是考察先把给定的数据写入到文本文件中,再从该文件读出并显示在屏幕上。
第一处:定义文本文件类型变量,所以应填:FILE *。
第二处:判断文件是否结束,所以应填:fp。
第三处:显示读出的字符,所以应填:ch。
***************************************************
给定程序MODI1.C中函数fun的功能是: 依次取出字符串中所有数字字符, 形
成新的字符串, 并取代原字符串。
请改正函数fun中指定部位的错误, 使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
给定源程序:
#include <stdio.h>
void fun(char *s)
{ int i,j;
for(i=0,j=0; s[i]!='\0'; i++)
if(s[i]>='0' && s[i]<='9')
/**********found**********/
s[j]=s[i];
/**********found**********/
s[j]="\0";
}
main()
{ char item[80];
printf("\nEnter a string : ");gets(item);
printf("\n\nThe string is : \"%s\"\n",item);
fun(item);
printf("\n\nThe string of changing is : \"%s\"\n",item );
}
解题思路:
第一处: 要求是取出原字符串中所有数字字符组成一个新的字符串,程序中是使用变量j
来控制新字符串的位置,所以应改为:s[j++]=s[i];。
第二处: 置新字符串的结束符,所以应改为:s[j]='\0';.
***************************************************
请编写函数fun, 函数的功能是: 将M行N列的二维数组中的字符数据, 按列的
顺序依次放到一个字符串中。
例如, 二维数组中的数据为:
W W W W
S S S S
H H H H
则字符串中的内容应是: WSHWSHWSH。
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入
你编写的若干语句。
给定源程序:
#include <stdio.h>
#define M 3
#define N 4
void fun(char s[][N], char *b)
{
int i,j,n=0;
for(i=0; i < N;i++) /* 请填写相应语句完成其功能 */
{
}
b[n]='\0';
}
main()
{ char a[100],w[M][N]={{'W','W','W','W'},{'S','S','S','S'},{'H','H','H','H'}};
int i,j;
printf("The matrix:\n");
for(i=0; i<M; i++)
{ for(j=0;j<N; j++)printf("%3c",w[i][j]);
printf("\n");
}
fun(w,a);
printf("The A string:\n");puts(a);
printf("\n\n");
NONO();
}
解题思路:
本题是把二维数组中的字符数据按列存放到一个字符串中。
1. 计算存放到一维数组中的位置。
2. 取出二维数组中的字符存放到一维数组(已计算出的位置)中。
参考答案:
void fun(char s[][N], char *b)
{
int i,j,n=0;
for(i=0; i < N;i++) /* 请填写相应语句完成其功能 */
{
for(j = 0 ; j < M ; j++) {
b[n] = s[j][i] ;
n = i * M + j + 1;
}
}
b[n]='\0';
}
※※※