计算机二级C语言上机真题(64)【附详解】
【真题1】 给定程序的功能是对指定字符在字符串a 中出现的次数进行统计,统计
的数据存到b 数组中。其中:字符'Z'出现的次数存放到b[0]中,字符'Y'出现的次数
存放到b[1]中,字符'X'出现的次数存放到b[2]中,字符'W'出现的次数存放到b[3]
中,字符'V'出现的次数存放到b[4]中,其它字符出现的次数存放到b[5]中。
例如,当a 中的字符串为"AYYZXW1Y+ZWVP",调用该函数后,b 中存放数据应
是:2、3、1、2、1、4。
#include < stdio.h >#include < string.h >void fun(char *a, int b[])
{ int i;
for (i=0; i< 6; i++) b[i] = 0;
/**************found**************/
for (i=0; i< ___1___(a); i++)
if (a[i] >= 'V' && a[i] < = 'Z') b[4-(a[i]-'V')]++;
/**************found**************/
___2___ b[5]++;
}
main()
{ int i, b[6]; char a[100] = "AYYZXW1Y+ZWVP";
/**************found**************/
fun(___3___);
printf("The result is: ");
for (i=0; i< 6; i++) printf("%d ", b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是对指定字符在字符串中出现的次数进行统计。
提示思路:本题先对数组b初始化,通过for循环,将字符串在'V'~'Z'之间的
字符用b[4-(a[i]-'V')]++运算进行累加,其它字符出现的次数存放到b[5]
中。
答案:【1】strlen 【2】else 【3】a,b
【真题2】 给定程序modi.c 中函数fun的功能是:对N 名学生的学习成绩,按从
高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的
连续存储区中,此存储区的首地址作为函数值返回。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < alloc.h >#include < string.h >#include
< conio.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=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].num=b[j].num;
t[k].s=b[j].s;
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;
clrscr();
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);
}
(2011年2月)
解析: 本题的考核点是按学习成绩找出前m名学生。
提示思路:
1、首先开辟存储空间存放m名学生的信息;
2、通过循环,计算出前m 名学生的成绩,并将这些学生的数据放入动态分配
的存储区中。
程序中的第一个错误:malloc(size)在内存的动态存储区中分配一个长度为
size的连续空间。此函数的值是一个指针,它的值是该分配域的起始地址。
calloc(n,size)在内存的动态区存储中分配n 个长度为size的连续空间。函数
返回分配域的起始地址。
程序中的第二个错误:C 语言中不能整体给字符数组赋值。
【真题3】 请编写函数fun,函数的功能是:将M 行N 列的二维数组中的字符数据
按列的顺序依次放到一个字符串中。
例如,二维数组中的数据为:
W W W W
S S S S
H H H H
则字符串中的内容应是:WSHWSHWSH。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define M 3
#define N 4
void fun(char (*s)[N], char *b)
{……}
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");
}
(2011年2月)
解析: 本题的考核点是二维数组按行转换为一维数组的算法。
解题思路:本题提供的参考程序先通过一个for 语句开辟一个100 个字节的存
储空间,初值均为0,然后再利用内、外两层for循环,按列的顺序将第1到3
行的数据依次存放到一个字符串中,即实现了将M行N 列的二维数组中的字符
数据按列的顺序依次放到一个字符串中。
void fun(char (*s)[N], char *b)
{int x,y; /*定义两个整型变量*/
for(x=0;x< 100;x++) /*通过for循环开辟一个100 个字节的存储空间,并
将其中各元素的初值赋为0*/
*(b+x)=0;
for(x=0;x< N;x++) /*利用内、外两层for循环,按列的顺序将第1 到3行
的数据依次存放到一个字符串中*/
for(y=0;y< M;y++)
b[x*M+y]=*(s[y]+x);
}
的数据存到b 数组中。其中:字符'Z'出现的次数存放到b[0]中,字符'Y'出现的次数
存放到b[1]中,字符'X'出现的次数存放到b[2]中,字符'W'出现的次数存放到b[3]
中,字符'V'出现的次数存放到b[4]中,其它字符出现的次数存放到b[5]中。
例如,当a 中的字符串为"AYYZXW1Y+ZWVP",调用该函数后,b 中存放数据应
是:2、3、1、2、1、4。
#include < stdio.h >#include < string.h >void fun(char *a, int b[])
{ int i;
for (i=0; i< 6; i++) b[i] = 0;
/**************found**************/
for (i=0; i< ___1___(a); i++)
if (a[i] >= 'V' && a[i] < = 'Z') b[4-(a[i]-'V')]++;
/**************found**************/
___2___ b[5]++;
}
main()
{ int i, b[6]; char a[100] = "AYYZXW1Y+ZWVP";
/**************found**************/
fun(___3___);
printf("The result is: ");
for (i=0; i< 6; i++) printf("%d ", b[i]);
printf("\n");
}
(2011年2月)
解析: 本题的考核点是对指定字符在字符串中出现的次数进行统计。
提示思路:本题先对数组b初始化,通过for循环,将字符串在'V'~'Z'之间的
字符用b[4-(a[i]-'V')]++运算进行累加,其它字符出现的次数存放到b[5]
中。
答案:【1】strlen 【2】else 【3】a,b
【真题2】 给定程序modi.c 中函数fun的功能是:对N 名学生的学习成绩,按从
高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的
连续存储区中,此存储区的首地址作为函数值返回。
请改正函数fun 中指定部位的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < stdio.h >#include < alloc.h >#include < string.h >#include
< conio.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=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].num=b[j].num;
t[k].s=b[j].s;
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;
clrscr();
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);
}
(2011年2月)
解析: 本题的考核点是按学习成绩找出前m名学生。
提示思路:
1、首先开辟存储空间存放m名学生的信息;
2、通过循环,计算出前m 名学生的成绩,并将这些学生的数据放入动态分配
的存储区中。
程序中的第一个错误:malloc(size)在内存的动态存储区中分配一个长度为
size的连续空间。此函数的值是一个指针,它的值是该分配域的起始地址。
calloc(n,size)在内存的动态区存储中分配n 个长度为size的连续空间。函数
返回分配域的起始地址。
程序中的第二个错误:C 语言中不能整体给字符数组赋值。
【真题3】 请编写函数fun,函数的功能是:将M 行N 列的二维数组中的字符数据
按列的顺序依次放到一个字符串中。
例如,二维数组中的数据为:
W W W W
S S S S
H H H H
则字符串中的内容应是:WSHWSHWSH。
注意:部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >#define M 3
#define N 4
void fun(char (*s)[N], char *b)
{……}
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");
}
(2011年2月)
解析: 本题的考核点是二维数组按行转换为一维数组的算法。
解题思路:本题提供的参考程序先通过一个for 语句开辟一个100 个字节的存
储空间,初值均为0,然后再利用内、外两层for循环,按列的顺序将第1到3
行的数据依次存放到一个字符串中,即实现了将M行N 列的二维数组中的字符
数据按列的顺序依次放到一个字符串中。
void fun(char (*s)[N], char *b)
{int x,y; /*定义两个整型变量*/
for(x=0;x< 100;x++) /*通过for循环开辟一个100 个字节的存储空间,并
将其中各元素的初值赋为0*/
*(b+x)=0;
for(x=0;x< N;x++) /*利用内、外两层for循环,按列的顺序将第1 到3行
的数据依次存放到一个字符串中*/
for(y=0;y< M;y++)
b[x*M+y]=*(s[y]+x);
}