全国计算机等级考试C语言上机考试题库120套Word下载.docx
《全国计算机等级考试C语言上机考试题库120套Word下载.docx》由会员分享,可在线阅读,更多相关《全国计算机等级考试C语言上机考试题库120套Word下载.docx(115页珍藏版)》请在冰点文库上搜索。
![全国计算机等级考试C语言上机考试题库120套Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/6/95505f76-c21d-4844-a341-84e6d701e13a/95505f76-c21d-4844-a341-84e6d701e13a1.gif)
,85,70,78},{10004,"
FangFang"
90,82,87},
{10005,"
ZhangSan"
95,80,88}};
STUn={10006,"
ZhaoSi"
55,70,68},ss[N];
inti,j;
FILE*fp;
fp=fopen("
student.dat"
"
wb"
fwrite(t,sizeof(STU),N,fp);
rb"
fread(ss,sizeof(STU),N,fp);
printf("
\nTheoriginaldata:
\n\n"
for(j=0;
j<
N;
j++)
{printf("
\nNo:
%ldName:
%-8sScores:
"
ss[j].sno,ss[j].name);
for(i=0;
i<
3;
i++)printf("
%6.2f"
ss[j].score[i]);
\n"
}
fun("
n);
\nThedataaftermodifing:
【参考答案】
(1)filename
(2)fp
(3)fp
【解题思路】
填空1:
本空是对文本文件的打开,filename所指的文件中的最后数据要进行重写,因此首先是要打开,因而本空填写filename。
填空2:
fseek
功能是重定位流上的文件指针。
用法:
int
fseek(FILE
*stream,
long
offset,
fromwhere);
本空应该填写fp。
填空3:
因为题目中要对所有学生数据均以二进制方式输出到文件中,因此本空填写fp。
知识点讲解:
函数名:
fseek
功
能:
重定位流上的文件指针。
用
法:
fromwhere)。
描
述:
函数设置文件指针stream的位置。
如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。
如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值:
成功,返回0;
否则返回非0值。
2、程序改错
下列给定程序中函数Creatlink的功能是:
创建带头结点的单向链表,并为各结点数据域赋0到m-1的值。
请改正函数Creatlink中指定部位的错误,使它能得出正确的结果。
部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!
stdlib.h>
typedefstructaa
{intdata;
structaa*next;
}NODE;
NODE*Creatlink(intn,intm)
{NODE*h=NULL,*p,*s;
inti;
/**********found***********/
p=(NODE)malloc(sizeof(NODE));
h=p;
p->
next=NULL;
for(i=1;
=n;
i++)
{s=(NODE*)malloc(sizeof(NODE));
s->
data=rand()%m;
next=p->
next;
next=s;
p=p->
returnp;
outlink(NODE*h)
{NODE*p;
p=h->
\n\nTHELIST:
\n\nHEAD"
while(p)
->
%d"
p->
data);
{NODE*head;
head=Creatlink(8,22);
outlink(head);
(1)p=(NODE
*)malloc(sizeof(NODE));
(2)return
h;
【考点分析】
本题考查:
变量赋初值;
for循环语句;
函数返回值。
(1)由变量定义可知p为指向结点的指针。
指向刚分配的结构指针,所以应改为p=(NODE
*)malloc(sizeof(NODE))。
(2)在动态分配内存的下一行语句是,使用临时结构指针变量h保存p指针的初始位置,最后返回不能使用p,是因为p的位置已经发生了变化,所以应改为return
h。
3、程序设计
请编写函数fun,该函数的功能是:
统计一行字符串中单词的个数,作为函数值返回。
字符串在主函数中输入,规定所有单词由小写字母组成,单词之间有若干个空格隔开,一行的开始没有空格。
部分源程序在文件PROG1.C中。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include<
string.h>
#defineN80
intfun(char*s)
{
voidmain()
{
FILE*wf;
charline[N];
intnum=0;
Enterastring:
\n"
gets(line);
num=fun(line);
Thenumberofwordis:
%d\n\n"
num);
/******************************/
wf=fopen("
out.dat"
"
w"
fprintf(wf,"
%d"
fun("
abigcar"
));
fclose(wf);
/*****************************/
fun(char
*s)
i,j=0;
for(i=0;
s[i]!
='
\0'
;
i++)
if(s[i]!
'
&
(s[i+1]=='
||s[i+1]=='
))
/*如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束*/
j++;
return
j;
/*返回单词个数*/
要判断单词的个数,首先想到的是程序怎样识别出一个单词,如果一个字母的下一个字符为空格或者结束标记,则表示一个单词结束,因此程序使用for循环语句遍历整个字符串,用if条件语句判断当前字符是否表示一个单词的结束,如果当前字符表示一个单词结束,则存放单词个数的变量加1,最后返回单词的个数。
第二套
给定程序中,函数fun的功能是:
计算形参x所指数组中N个数的平均值(规定所有数均为正数),作为函数值返回,并将大于平均值的数放在形参y所指数组中,在主函数中输出。
例如,有10个正数:
46、30、32、40、6、17、45、15、48、26,其平均值为30.500000。
主函数中输出:
46
32
40
45
48。
#defineN10
doublefun(doublex[],double*y)
{inti,j;
doubleav;
av=__1__;
for(i=0;
i++)
av=av+__2__;
for(i=j=0;
if(x[i]>
av)y[__3__]=x[i];
y[j]=-1;
returnav;
{inti;
doublex[N],y[N];
i++){x[i]=rand()%50;
%4.0f"
x[i]);
\nTheaverageis:
%f\n"
fun(x,y));
y[i]>
=0;
%5.1f"
y[i]);
(1)0.0
(2)x[i]/N
(3)j++
通过读上面的程序可以看出此空考的是给变量赋初值,av代表的是平均值,因此av的初值应该是0.0。
通过for循环可知,此空代表求平均值,因此应该填写x[i]/N。
先把大于平均值的数放在形参y所指数组中,然后使下标值加1,因此此空应该填j++。
下列给定程序中,函数fun的功能是:
根据整型参数m,计算如下公式的值。
例如,若m=2000,则应输出0.000160。
请改正程序中的错误,使它能得出正确的结果。
conio.h>
/*************found**************/
fun(intm)
{doubley=0,d;
for(i=100,i<
=m,i+=100)
{d=(double)i*(double)i;
y+=1.0/d;
return(y);
{intn=2000;
system("
CLS"
\nTheresultis%1f\n"
fun(n));
(1)double
fun(int
m)
(2)for(i=100;
i<
=m;
i+=100)
(1)题目要求在函数fun中求级数前m项和,可用循环语句,每次计算级数中的一项,然后累加。
第一处错误在于定义fun(int
m),由函数的返回值可知应该定义为double
m)。
(2)for(i=100,i<
=m,i+=100)中是一个简单的语法错误。
for循环语句的形式为for(表达式1;
表达式2;
表达式3)
,其表达式之间应以"
;
"
相隔。
已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。
找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。
已给出函数的首部,请完成该函数。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
typedefstructss
{charnum[10];
ints;
fun(STUa[],STU*s)
STUa[N]={{"
A01"
81},{"
A02"
89},{"
A03"
66},{"
A04"
87},{"
A05"
77},
{"
A06"
90},{"
A07"
79},{"
A08"
61},{"
A09"
80},{"
A10"
71}},m;
*****Theoriginaldata*****\n"
i++)
No=%sMark=%d\n"
a[i].num,a[i].s);
fun(a,&
m);
*****THERESULT*****\n"
Thelowest:
%s,%d\n"
m.num,m.s);
%s,%d"
fun(STU
a[],STU
i;
*s=a[0];
/*先认为第1个值最小*/
i++)
/*如果在循环的过程中再发现比第1个值更小的则赋给*s*/
if(s->
s>
a[i].s)
*s=a[i];
找出结构体数组元素中的最小值。
先认为第1个值最小,即*s=a[0];
,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。
另外,本题还涉及结构体中的指向运算符,请考生注意。
第三套
计算x所指数组中N个数的平均值(规定所有数均为正数),平均值通过形参返回给主函数,将小于平均值且最接近平均值的数作为函数值返回,并在主函数中输出。
46、30、32、40、6、17、45、15、48、26,平均值为30.500000。
主函数中输出m=30。
doublefun(doublex[],double*av)
doubled,s;
s=0;
i++)s=s+x[i];
__1__=s/N;
d=32767;
if(x[i]<
*av&
*av-x[i]<
=d){
d=*av-x[i];
j=__2__;
}
return__3__;
doublex[N],av,m;
m=fun(x,&
av);
av);
m=%5.1f"
m);
(1)*av
(2)i
(3)x[j]
从原程序中可以看出*av代表的是平均值,而s/N表示的就是平均值,因此本空应该填*av。
if语句来判断找最接近平均值的数,因而此空应该填i。
题目要求将小于平均值且最接近平均值的数作为函数返回,而j表达的是最接近平均值的数在数组中的下标,因而本空应该填写x[j]。
2、程序修改
根据整型形参n,计算如下公式的值。
例如,若n=10,则应输出0.617977。
intfun(int