计算机二级C语言上机真题(7)【附详解】
【真题1】 给定程序中,函数fun 的功能是:将自然数1~10 以及它们的平方根写
到名为myfile3.txt 的文本文件中,然后再顺序读出显示在屏幕上。
#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);
}
(2011年2月)
解析: 本题考核点为:文件的打开,关闭和读写操作。
题中第一个空填"fp":是向文件指针fp所指向的文件中写数据。
题中第二个空填"fclose(fp);":此语句是文件的关闭操作。
题中第三个空填"fname":fopen 函数用于文件的打开操作,其调用形式一般
为:fopen(文件名,使用文件方式)。"fname"为所要打开的文件名。
答案:【1】fp 【2】fclose(fp) 【3】fname
【真题2】 给定程序modi.c 中函数fun 的功能是:把 m(1≤m≤10)个字符串连接
起来,组成一个新串,放入pt中。 例如:把3 个串:"abc","CD","EF"串连起来,
结果是"abcCDEF"。 请改正函数 fun 中的语法错误,使它能统计出正确结果。 注
意:不要改动 main 函数。
#include < conio.h >
#include < stdio.h >
#include < string.h >
int fun(char str[][10], int m, char *pt)
{ /************found************/
Int k,q,i;
for(k=0;k< m;k++)
{ q=strlen(str[k]);
for(i=0;i< q;i++)
/************found************/
pt[i]=str[k,i];
pt+=q;
pt[0]=0;
}
}
main()
{ int m,h;
char s[10][10], p[120];
clrscr() ;
printf("\nPlease enter m:");
scanf("%d", &m); gets(s[0]);
printf("\nPlease enter %d string:\n",m);
for (h=0; h<m; h++) gets(s[h]);
fun(s,m,p);
printf("\nThe result is:%s\n",p);
}
(2011年2月)
解析: 本题的考核点是C语言的一些基本用法和数组的使用。
C 语言是区分大小写的,所以,"Int k, q, i; "应改为"int k, q, i; "。
二维数组定义的一般形式为:类型说明符 数组名[常量表达式][常量表达式] 例
如char str[k][i]定义str为k 行i 列的字符数组。所以"pt[i]=str[k,i];"应改
为"pt[i]=str[k][i];"。
【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
除了前面连续的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C 语
言提供的字符串函数。 例如,字符串中的内容为:****A*BC*DEF*G******,
删除后,字符串中的内容应当是:****ABCDEFG。 注意:部分源程序存在文件
prog.c中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括
号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
void fun(char *a)
{……}
main()
{ char s[81];
printf("Enter a string:\n"); gets(s);
fun(s);
printf("The string after deleted:\n"); puts(s);
}
(2011年2月)
解析: 本题的考核点是删除字符串中字符的算法。 提示思路:先将原串中的串
首连续的*号字符赋给一字符串数组,再从原串中的第一个非*字符开始,将非*
号的字符追加其后,最后将新串覆盖原串。
void fun(char *a)
{ char b[81];
int i=0,j=0;
/*将原字符串中的字符串首连续的*号字符赋给一字符串数组b*/
while (a[i] && (a[i]=='*')) {b[j]=a[i]; j++; i++;}
else k++;
while (a[i])
/*从原串中的第一个非*字符开始,将非*号的字符追加在数组b 后*/
if (a[i]!='*') {b[j]=a[i];j++;i++;}
else i++;
b[j]='\0';j=0;i=0;
while(b[j]) /*将字符串b 中的所有字符复制到a 字符串中覆盖原串
*/
{a[i]=b[j];i++;j++;}
a[i]='\0';
}
到名为myfile3.txt 的文本文件中,然后再顺序读出显示在屏幕上。
#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);
}
(2011年2月)
解析: 本题考核点为:文件的打开,关闭和读写操作。
题中第一个空填"fp":是向文件指针fp所指向的文件中写数据。
题中第二个空填"fclose(fp);":此语句是文件的关闭操作。
题中第三个空填"fname":fopen 函数用于文件的打开操作,其调用形式一般
为:fopen(文件名,使用文件方式)。"fname"为所要打开的文件名。
答案:【1】fp 【2】fclose(fp) 【3】fname
【真题2】 给定程序modi.c 中函数fun 的功能是:把 m(1≤m≤10)个字符串连接
起来,组成一个新串,放入pt中。 例如:把3 个串:"abc","CD","EF"串连起来,
结果是"abcCDEF"。 请改正函数 fun 中的语法错误,使它能统计出正确结果。 注
意:不要改动 main 函数。
#include < conio.h >
#include < stdio.h >
#include < string.h >
int fun(char str[][10], int m, char *pt)
{ /************found************/
Int k,q,i;
for(k=0;k< m;k++)
{ q=strlen(str[k]);
for(i=0;i< q;i++)
/************found************/
pt[i]=str[k,i];
pt+=q;
pt[0]=0;
}
}
main()
{ int m,h;
char s[10][10], p[120];
clrscr() ;
printf("\nPlease enter m:");
scanf("%d", &m); gets(s[0]);
printf("\nPlease enter %d string:\n",m);
for (h=0; h<m; h++) gets(s[h]);
fun(s,m,p);
printf("\nThe result is:%s\n",p);
}
(2011年2月)
解析: 本题的考核点是C语言的一些基本用法和数组的使用。
C 语言是区分大小写的,所以,"Int k, q, i; "应改为"int k, q, i; "。
二维数组定义的一般形式为:类型说明符 数组名[常量表达式][常量表达式] 例
如char str[k][i]定义str为k 行i 列的字符数组。所以"pt[i]=str[k,i];"应改
为"pt[i]=str[k][i];"。
【真题3】 规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:
除了前面连续的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C 语
言提供的字符串函数。 例如,字符串中的内容为:****A*BC*DEF*G******,
删除后,字符串中的内容应当是:****ABCDEFG。 注意:部分源程序存在文件
prog.c中。 请勿改动主函数main 和其他函数中的任何内容,仅在函数fun 的花括
号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
void fun(char *a)
{……}
main()
{ char s[81];
printf("Enter a string:\n"); gets(s);
fun(s);
printf("The string after deleted:\n"); puts(s);
}
(2011年2月)
解析: 本题的考核点是删除字符串中字符的算法。 提示思路:先将原串中的串
首连续的*号字符赋给一字符串数组,再从原串中的第一个非*字符开始,将非*
号的字符追加其后,最后将新串覆盖原串。
void fun(char *a)
{ char b[81];
int i=0,j=0;
/*将原字符串中的字符串首连续的*号字符赋给一字符串数组b*/
while (a[i] && (a[i]=='*')) {b[j]=a[i]; j++; i++;}
else k++;
while (a[i])
/*从原串中的第一个非*字符开始,将非*号的字符追加在数组b 后*/
if (a[i]!='*') {b[j]=a[i];j++;i++;}
else i++;
b[j]='\0';j=0;i=0;
while(b[j]) /*将字符串b 中的所有字符复制到a 字符串中覆盖原串
*/
{a[i]=b[j];i++;j++;}
a[i]='\0';
}