计算机二级C语言上机真题(84)【附详解】
【真题1】 下列给定程序中,函数fun()的功能是:输出M 行M 列整数方阵,然后
求两条对角线上的各元素之和,返回此和数。
试题程序:
#include < conio.h >#include < stdio.h >#define M 5
___1___ fun(int n,int xx[][M])
{ int i, j,___ 2___;
printf("\nThe %d x %d matrix:\n",M,M);
for(i=0;i< M;i++)
{ for(j=0;j< M;j++)
printf("%4d",xx[i][j]);
printf("\n");
}
for(i=0;i< n;i++)
sum+=___3___;
return(sum);
}
main()
{ int
aa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}
};
printf("\nThe sum of all elements on 2 diagnals is %d",fun(M,aa));
}
(2011年2月)
解析: 填空1:由main 函数的调用语句可知fun函数的类型是int型的,也
可由返回值语句判断得知。
填空2:我们知道在C语言中每个变量在运算之前都必须被赋值,由循环中对
sum 的操作可知它是作为累加变量使用的,那么它的初值就得被赋为0。
填空3:由题意可知,程序的要求是在输出方阵的同时还要算出两个对角线元素
的值的和,关键是如何表达这两个元素在方阵中的位置。
答案:【1】int 【2】sum=0 【3】xx[i][i]+xx[i][n-i-1]
【真题2】 给定程序modi.c 中,函数fun 的功能是:用冒泡法对6 个字符串按由
大到小的顺序进行排序。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < conio.h >#define MAXLINE 20
fun(char *pstr[6])
{ int i,j;
char *p;
for (i=0;i< 5;i++) {
for(j=i+1;j< 6;j++) {
/************found************/
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];
clrscr();
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]);
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、建立了一个二维字符串数组,用于存放用户输入的6 个字符串;
2、建立了一个指针数组,目的是用6 个指针分别指向6 个字符串;
3、函数fun()的形参只有一个,即指针数组pstr[],这表明要想在函数fun()
中对6 个字符串进行操作,只能通过pstr[]中的6个指针。
题中第一个错误是在应用函数strcmp()的时候:观察源程序可以发现,在程序
中使用strcmp()函数的原意是为了判断字符串str[i]与str[i+1]两者的大小,
在fun()函数中只能通过指针来引用各个字符串,故应当使用*(pstr+x)的形式
来表示,而在使用strcmp()字符串比较函数的时候,第二个参数没有正确的表
示一个字符串,所以应当将"pstr+j"改为"*(pstr+j)";
题中第二个错误是在函数fun()中的语句" *(pstr + i) = pstr + j ;"处,此语
句的原意是进行字符串的赋值操作,错误和第一个错误大致是一样的,所以应
当将"pstr+j"改为"*(pstr+j)"。
在函数中通过指针引用字符串的方式是灵活的,譬如本题中也可以使用
pstr[i]、pstr[j]类似的方法进行表示。
【真题3】 请编制函数void Mtrx(int n),输出一个如下的n 阶方阵。变量n 从文
件c9670503.in 中读取。
例如,若读入 4 或 5 ,则分别输出
1 2 3 4 或 1 2 3 4 5
8 7 6 5 10 9 8 7 6
9 10 11 12 11 12 13 14 15
16 15 14 13 20 19 18 17 16
25 24 23 22 21
注意:此程序存贮在prog.c中。
请勿改动主程序main 中的任何内容,仅在函数Mtrx 的横线处填入适当的内容并删
除横线。
#include < conio.h >#include < stdio.h >#define M 10
/* 本程序中的fopen、fprintf 和fclose 与考生无关 */
void Mtrx( int n )
{ int a[M]={0},d=0, i, j, k;
FILE *fp ;
fp=fopen("dat52.dat","w");
for( i = 1 ; i < = n; i++ ) {
for( j=0; j< n; j++ )
{ ___(1)___; a[j]=d; }
if (i % 2)
for( k=0; k < n ; k++ )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ; }
else
for( ____(2)____ )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ;}
___(3)___
fprintf(fp, "\n");
}
fclose(fp);
}
main()
{ int n;
FILE *fp ;
clrscr();
fp=fopen("c9670503.in","r");
fscanf(fp, "%d", &n );
fclose(fp);
Mtrx( n );
}
(2011年2月)
解析: (1). d += 1
(2). k=n-1;k >=0;k--
(3). printf("\n");
本题的考核点是C 语言中的嵌套循环。
解题思路:对于一个二维矩阵进行计算,常常采用嵌套循环来实现。Mtrx 函数
中外循环是行循环,内循环是列循环。填空(1)部分为列循环输出准备数据,这
里应将d递增1。然后通过判断奇偶行而按不同的顺序输出数据,当为偶数行
执行填空(2)部分时,此时应从大到小输出数据,所以应从n-1到0 输出
a[k]。填空(3)使屏幕上的光标换行。
#include < conio.h >
#include < stdio.h >
#define M 10
/* 本程序中的fopen、fprintf和fclose与考生无关 */
void Mtrx( int n )
{ int a[M]={0},d=0, i, j, k;
FILE *fp ;
fp=fopen("dat52.dat","w");
for( i = 1 ; i < = n; i++ ) {
for( j=0; j< n; j++ )
{d += 1; a[j]=d; }
if (i % 2)
for( k=0; k < n ; k++ )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ; }
else
for( k=n-1;k >=0;k-- )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ;}
printf("\n");
fprintf(fp, "\n");
}
fclose(fp) ;
}
求两条对角线上的各元素之和,返回此和数。
试题程序:
#include < conio.h >#include < stdio.h >#define M 5
___1___ fun(int n,int xx[][M])
{ int i, j,___ 2___;
printf("\nThe %d x %d matrix:\n",M,M);
for(i=0;i< M;i++)
{ for(j=0;j< M;j++)
printf("%4d",xx[i][j]);
printf("\n");
}
for(i=0;i< n;i++)
sum+=___3___;
return(sum);
}
main()
{ int
aa[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}
};
printf("\nThe sum of all elements on 2 diagnals is %d",fun(M,aa));
}
(2011年2月)
解析: 填空1:由main 函数的调用语句可知fun函数的类型是int型的,也
可由返回值语句判断得知。
填空2:我们知道在C语言中每个变量在运算之前都必须被赋值,由循环中对
sum 的操作可知它是作为累加变量使用的,那么它的初值就得被赋为0。
填空3:由题意可知,程序的要求是在输出方阵的同时还要算出两个对角线元素
的值的和,关键是如何表达这两个元素在方阵中的位置。
答案:【1】int 【2】sum=0 【3】xx[i][i]+xx[i][n-i-1]
【真题2】 给定程序modi.c 中,函数fun 的功能是:用冒泡法对6 个字符串按由
大到小的顺序进行排序。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < conio.h >#define MAXLINE 20
fun(char *pstr[6])
{ int i,j;
char *p;
for (i=0;i< 5;i++) {
for(j=i+1;j< 6;j++) {
/************found************/
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];
clrscr();
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]);
}
(2011年2月)
解析: 首先,我们必须先读懂题中程序的大致意思,这是发现并改正程序中错
误的重要前提。
程序中的重要思想如下:
1、建立了一个二维字符串数组,用于存放用户输入的6 个字符串;
2、建立了一个指针数组,目的是用6 个指针分别指向6 个字符串;
3、函数fun()的形参只有一个,即指针数组pstr[],这表明要想在函数fun()
中对6 个字符串进行操作,只能通过pstr[]中的6个指针。
题中第一个错误是在应用函数strcmp()的时候:观察源程序可以发现,在程序
中使用strcmp()函数的原意是为了判断字符串str[i]与str[i+1]两者的大小,
在fun()函数中只能通过指针来引用各个字符串,故应当使用*(pstr+x)的形式
来表示,而在使用strcmp()字符串比较函数的时候,第二个参数没有正确的表
示一个字符串,所以应当将"pstr+j"改为"*(pstr+j)";
题中第二个错误是在函数fun()中的语句" *(pstr + i) = pstr + j ;"处,此语
句的原意是进行字符串的赋值操作,错误和第一个错误大致是一样的,所以应
当将"pstr+j"改为"*(pstr+j)"。
在函数中通过指针引用字符串的方式是灵活的,譬如本题中也可以使用
pstr[i]、pstr[j]类似的方法进行表示。
【真题3】 请编制函数void Mtrx(int n),输出一个如下的n 阶方阵。变量n 从文
件c9670503.in 中读取。
例如,若读入 4 或 5 ,则分别输出
1 2 3 4 或 1 2 3 4 5
8 7 6 5 10 9 8 7 6
9 10 11 12 11 12 13 14 15
16 15 14 13 20 19 18 17 16
25 24 23 22 21
注意:此程序存贮在prog.c中。
请勿改动主程序main 中的任何内容,仅在函数Mtrx 的横线处填入适当的内容并删
除横线。
#include < conio.h >#include < stdio.h >#define M 10
/* 本程序中的fopen、fprintf 和fclose 与考生无关 */
void Mtrx( int n )
{ int a[M]={0},d=0, i, j, k;
FILE *fp ;
fp=fopen("dat52.dat","w");
for( i = 1 ; i < = n; i++ ) {
for( j=0; j< n; j++ )
{ ___(1)___; a[j]=d; }
if (i % 2)
for( k=0; k < n ; k++ )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ; }
else
for( ____(2)____ )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ;}
___(3)___
fprintf(fp, "\n");
}
fclose(fp);
}
main()
{ int n;
FILE *fp ;
clrscr();
fp=fopen("c9670503.in","r");
fscanf(fp, "%d", &n );
fclose(fp);
Mtrx( n );
}
(2011年2月)
解析: (1). d += 1
(2). k=n-1;k >=0;k--
(3). printf("\n");
本题的考核点是C 语言中的嵌套循环。
解题思路:对于一个二维矩阵进行计算,常常采用嵌套循环来实现。Mtrx 函数
中外循环是行循环,内循环是列循环。填空(1)部分为列循环输出准备数据,这
里应将d递增1。然后通过判断奇偶行而按不同的顺序输出数据,当为偶数行
执行填空(2)部分时,此时应从大到小输出数据,所以应从n-1到0 输出
a[k]。填空(3)使屏幕上的光标换行。
#include < conio.h >
#include < stdio.h >
#define M 10
/* 本程序中的fopen、fprintf和fclose与考生无关 */
void Mtrx( int n )
{ int a[M]={0},d=0, i, j, k;
FILE *fp ;
fp=fopen("dat52.dat","w");
for( i = 1 ; i < = n; i++ ) {
for( j=0; j< n; j++ )
{d += 1; a[j]=d; }
if (i % 2)
for( k=0; k < n ; k++ )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ; }
else
for( k=n-1;k >=0;k-- )
{ printf( " %3d", a[k] ); fprintf(fp, " %3d", a[k]) ;}
printf("\n");
fprintf(fp, "\n");
}
fclose(fp) ;
}