计算机二级C语言上机真题(8)【附详解】
【真题1】 给定程序的功能是调用fun 函数建立班级通讯录。通讯录中记录每位学
生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作
为一个数据块写到名为myfile5.dat 的二进制文件中。
#include < stdio.h >
#include < stdlib.h >
#define N 5
typedef struct
{ int num;
char name[10];
char tel[10];
}STYPE;
void check();
/**********found**********/
int fun(___【1】___ *std)
{
/**********found**********/
___【2】___ *fp; int i;
if((fp=fopen("myfile5.dat","wb"))==NULL)
return(0);
printf("\nOutput data to file !\n");
for(i=0; i<N; i++)
/**********found**********/
fwrite(&std[i], sizeof(STYPE), 1, ___【3】___);
fclose(fp);
return (1);
}
main()
{STYPE s[10]={{1,"aaaaa","111111"},
{2,"bbbbb","222222"},
{3,"ccccc","333333"},
{4,"ddddd","444444"},
{5,"eeeee","555555"}};
int k;
k=fun(s);
if (k==1)
{printf("Succeed!"); check();}
else
printf("Fail!");
}
void check()
{ FILE *fp; int i;
STYPE s[10];
if((fp=fopen("myfile5.dat","rb"))==NULL)
{printf("Fail !!\n"); exit(0);}
printf("\nRead file and output to screen :\n");
printf("\n num name tel\n");
for(i=0; i<N; i++)
{ fread(&s[i],sizeof(STYPE), 1, fp);
printf("%6d %s %s\n", s[i].num, s[i].name,
s[i].tel);
}
fclose(fp);
}
(2011年2月)
解析: 本题考核点为结构体和文件的操作等。
题中第一空填"STYPE":typedef可以用来声明新的类型名来代替已有的类型
名,此题用"STYPE"来代替未命名的结构体。
题中第二空填"FILE":"FILE"关键字用于声明文件指针。
题中第三空填"fp":fwrite函数的一般调用形式为:
fwrite(buffer,size,count,fp);
其中buffer:是一个指针,是要输出数据的地址;size:是要写的字节数;
count:要进行读写多少个size字节的数据项;fp:文件型指针。
答案:【1】STYPE 【2】FILE 【3】fp
【真题2】 给定程序modi.c 中,函数fun 的功能是:在字符串str中找出ASCII
码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。
例如,调用fun 函数之前给字符串输入:ABCDeFGH,调用后字符中的内容为:
eABCDFGH。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main
函数。
#include < stdio.h >
fun(char *p)
{ char max,*q; int i=0;
max=p[i];
while (p[i]!=0)
{ if (max< p[i])
{ max=p[i];
/************found************/
p=q+i;
}
i++;
}
/************found************/
while (q< p)
{ *q=*(q-1);
q--;
}
p[0]=max;
}
main()
{char str[80];
printf("Enter a string:");gets(str);
printf("\nThe original string:"); puts(str);
fun(str);
printf("\nThe string after moving:"); puts(str);
printf("\n\n");
}
(2011年2月)
解析: 本题着重考察考生对C 语言中指针以及一些简单算法的掌握情况。
本题中的第一个错误:由程序可知,指针p指向字符串的首地址,指针q指向
字符串中最大的字符,所以程序中的语句"p=q+i;"应改为"q=p+i;";
本题中的第二个错误:由题意可知,在找出最大字符后,应将其放在第一个位
置上,并将该字符前的原字符向后移动,当q大于或等于p时,移动字符,反
之,退出循环,所以程序中语句"while (q< p)"应改为"while (q >p)"。
【真题3】 请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数
(不得调用C 语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-
1234",则函数把它转换为整数值 -1234。 注意:部分源程序存在文件prog.c
中。 请勿改动主函数main 和其它函数中的任何内容, 仅在函数fun 的花括号中填
入你编写的若干语句。
#include < stdio.h >
#include < string.h >
long fun(char *p)
{……}
main() /* 主函数 */
{ char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n", n);
}
(2011年2月)
解析: 本题的考核点是指针、ASCII码、循环语句及条件语句的使用。 解题思
路:通过循环语句移动指针,取出指针所在位置上的字符,先判断其为正负号
还是为数字字符,如果为数字字符则将其转化为相应的数值,否则作正负标
记。
long fun(char *p)
{ long n=0;
int flag=0;
/*通过循环语句移动指针,取出指针所在位置上的字符*/
while(*p!='\0') {
if(*p=='-') /*判断其是否为负号*/
flag=1;
else if (*p=='+') /*判断其是否为正号*/
flag=0;
else /*判断其是否为数字字符*/
n=n*10+(*p-'0'); /*将数字字符转化为相应的数值*/
p++;
}
if (flag==1) n=-n;
return n;
}
生的编号、姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作
为一个数据块写到名为myfile5.dat 的二进制文件中。
#include < stdio.h >
#include < stdlib.h >
#define N 5
typedef struct
{ int num;
char name[10];
char tel[10];
}STYPE;
void check();
/**********found**********/
int fun(___【1】___ *std)
{
/**********found**********/
___【2】___ *fp; int i;
if((fp=fopen("myfile5.dat","wb"))==NULL)
return(0);
printf("\nOutput data to file !\n");
for(i=0; i<N; i++)
/**********found**********/
fwrite(&std[i], sizeof(STYPE), 1, ___【3】___);
fclose(fp);
return (1);
}
main()
{STYPE s[10]={{1,"aaaaa","111111"},
{2,"bbbbb","222222"},
{3,"ccccc","333333"},
{4,"ddddd","444444"},
{5,"eeeee","555555"}};
int k;
k=fun(s);
if (k==1)
{printf("Succeed!"); check();}
else
printf("Fail!");
}
void check()
{ FILE *fp; int i;
STYPE s[10];
if((fp=fopen("myfile5.dat","rb"))==NULL)
{printf("Fail !!\n"); exit(0);}
printf("\nRead file and output to screen :\n");
printf("\n num name tel\n");
for(i=0; i<N; i++)
{ fread(&s[i],sizeof(STYPE), 1, fp);
printf("%6d %s %s\n", s[i].num, s[i].name,
s[i].tel);
}
fclose(fp);
}
(2011年2月)
解析: 本题考核点为结构体和文件的操作等。
题中第一空填"STYPE":typedef可以用来声明新的类型名来代替已有的类型
名,此题用"STYPE"来代替未命名的结构体。
题中第二空填"FILE":"FILE"关键字用于声明文件指针。
题中第三空填"fp":fwrite函数的一般调用形式为:
fwrite(buffer,size,count,fp);
其中buffer:是一个指针,是要输出数据的地址;size:是要写的字节数;
count:要进行读写多少个size字节的数据项;fp:文件型指针。
答案:【1】STYPE 【2】FILE 【3】fp
【真题2】 给定程序modi.c 中,函数fun 的功能是:在字符串str中找出ASCII
码值最大的字符,将其放在第一个位置上;并将该字符前的原字符向后顺序移动。
例如,调用fun 函数之前给字符串输入:ABCDeFGH,调用后字符中的内容为:
eABCDFGH。 请改正程序中的错误,使它能得出正确结果。 注意:不要改动main
函数。
#include < stdio.h >
fun(char *p)
{ char max,*q; int i=0;
max=p[i];
while (p[i]!=0)
{ if (max< p[i])
{ max=p[i];
/************found************/
p=q+i;
}
i++;
}
/************found************/
while (q< p)
{ *q=*(q-1);
q--;
}
p[0]=max;
}
main()
{char str[80];
printf("Enter a string:");gets(str);
printf("\nThe original string:"); puts(str);
fun(str);
printf("\nThe string after moving:"); puts(str);
printf("\n\n");
}
(2011年2月)
解析: 本题着重考察考生对C 语言中指针以及一些简单算法的掌握情况。
本题中的第一个错误:由程序可知,指针p指向字符串的首地址,指针q指向
字符串中最大的字符,所以程序中的语句"p=q+i;"应改为"q=p+i;";
本题中的第二个错误:由题意可知,在找出最大字符后,应将其放在第一个位
置上,并将该字符前的原字符向后移动,当q大于或等于p时,移动字符,反
之,退出循环,所以程序中语句"while (q< p)"应改为"while (q >p)"。
【真题3】 请编写一个函数fun,它的功能是:将一个数字字符串转换为一个整数
(不得调用C 语言提供的将字符串转换为整数的函数)。例如,若输入字符串"-
1234",则函数把它转换为整数值 -1234。 注意:部分源程序存在文件prog.c
中。 请勿改动主函数main 和其它函数中的任何内容, 仅在函数fun 的花括号中填
入你编写的若干语句。
#include < stdio.h >
#include < string.h >
long fun(char *p)
{……}
main() /* 主函数 */
{ char s[6];
long n;
printf("Enter a string:\n") ;
gets(s);
n = fun(s);
printf("%ld\n", n);
}
(2011年2月)
解析: 本题的考核点是指针、ASCII码、循环语句及条件语句的使用。 解题思
路:通过循环语句移动指针,取出指针所在位置上的字符,先判断其为正负号
还是为数字字符,如果为数字字符则将其转化为相应的数值,否则作正负标
记。
long fun(char *p)
{ long n=0;
int flag=0;
/*通过循环语句移动指针,取出指针所在位置上的字符*/
while(*p!='\0') {
if(*p=='-') /*判断其是否为负号*/
flag=1;
else if (*p=='+') /*判断其是否为正号*/
flag=0;
else /*判断其是否为数字字符*/
n=n*10+(*p-'0'); /*将数字字符转化为相应的数值*/
p++;
}
if (flag==1) n=-n;
return n;
}