if(min==a[i].s)
b[j++]=a[i];/*找出成绩与min相等的学生的记录,存入结构体b中*/
returnj;/*返回最低成绩的学生人数*/
}
【解析】该程序使用循环嵌套,第1个for循环的作用是找出最小值;第2个for循环的作用是找出与min相等的成绩,即最低成绩的学生记录,并将其存入结构体数组b中。
二、程序编写题
程序编写题占40分,需要将系统提供的程序补充完整,一般是编写一个叫fun的自定义函数,下面以一个真题讲解程序编写题的做法。
编写一个函数fun(),它的功能是:
使实型数保留2位小数,并对第三位进行四舍五入(规定实数为正数)
例如:
例如:
实型数为1234.567,则fun函数返回1234.57输出;实型数为1234.562,则fun函数返回1234.56输出。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
floatfun(float)
{
}
main()
{floata;
printf("Entera:
");
scanf("%f",&a);
printf("Theoriginaldatais:
%f\n",a);
printf("Theresultis:
%f\n",fun(a));
NONO();
}
NONO()
{
inti;
floata;
FILE*rf,*wf;
rf=fopen("C:
\\Exam\\24010001\\in.dat","r");/*rf指向考生文件夹下in.dat文件*/
wf=fopen("C:
\\Exam\\24010001\\out.dat","w");/*wf指向考生文件夹下out.dat文件*/
for(i=0;i<20;i++)/*循环20次*/
{fscanf(rf,"%f",&a);/*每次循环,从rf所指文件中读一个数据给a赋值*/
fprintf(wf,"%f\n",fun(a));/*调用fun函数,并且以上面读取的a的值作为实参
进行fun函数处理,把返回值写入到wf所指文件*/
}
fclose(rf);
fclose(wf);
}
参考答案:
floatfun(floath)
{
longa;
a=h*1000;
a=(a+5)/10;
returna/100.0;
}
当在fun函数中写入如上答案后,进行编译、链接、运行后,输入数据1234.567后,会输出1234.570000;输入数据1234.562后,输出1234.560000,满足题目要求;如果发现输出的数据不能满足要求,说明编写的fun函数有错误,需要修改,再运行,直到满足题目要求。
程序运行完毕后,点击模拟系统的评分(注意:
正式考试没有评分),编程题共20个得分测试点,每个得分测试点2.00分,考生共有20个得分测试点正确,合计得分40分。
得分:
1.340000
得分:
212.130000
得分:
341.210000
得分:
21.910000
得分:
87.900000
得分:
32.550000
得分:
455.310000
得分:
6656.210000
得分:
3232.210000
得分:
345.210000
得分:
21.320000
得分:
22.330000
得分:
2121.9100
得分:
2121.990000
得分:
22.000000
得分:
79.000000
得分:
90.000000
得分:
1020.000000
得分:
2121.990000
得分:
12.980000
标准答案测试数据:
1.340000
212.130000
341.210000
21.910000
87.900000
32.550000
455.310000
6656.210000
3232.210000
345.210000
21.320000
22.330000
2121.910000
2121.990000
22.000000
79.000000
90.000000
1020.000000
2121.990000
12.980000
这类题目我们可以手动算出计算结果,更为有趣的是,像这类可以手动算出结果的题目,如果我们不编写fun函数代码,而是做一个结果文件,只要这个结果文件的数据和系统的评分数据是相同的,系统也会给我们满分,哪怕我们没有写一行程序!
用这种方法的时候,首先要确定这个结果文件的文件名,如上例中的文件名是out.dat(绝大部分情况下也是out.dat)。
然后我们在考生文件夹下手动建立这个结果文件out.dat。
1.手动建立out.dat
打开考生文件夹C:
\Exam\24010001,用鼠标右键单击in.dat,弹出如图7-1所示的菜单。
用鼠标左键单击菜单中的“复制”子菜单。
然后用鼠标右键单击考生文件夹的空白处,出现如图7-2所示的菜单。
用鼠标左键单击“粘帖”子菜单。
此时将在考生文件夹下生成一个名为“复件in.dat”的文件,用鼠标右键单击这个文件名,单击“重命名”子菜单,然后将文件名重命名为out.dat。
如果看不到文件的扩展名(即考生文件夹下为in,而不是in.dat),在考生文件夹的上方有一个“工具”菜单,选择“工具”菜单的子菜单“文件夹选项”,出现如图7-3所示的界面。
在出现的选项板中选择“查看”选项板,用鼠标拉动中间的滚动条,在其中找到选项“隐藏已知文件类型的扩展名”,将前面小框中的小钩去掉(用鼠标单击它就去掉了),然后单击确定,这时候再看考生文件夹下的文件,就可以看到文件的扩展名了。
建立out.dat文件,我们也可以在考生文件夹下点击鼠标右键,新建文本文档,然后对文本文件改名为out.dat即可,用这种方法建立out.dat,同样要注意扩展名的问题。
2.向out.dat中写入数据
建好结果文件后,就是怎样得到正确的数据了。
有的题目没有办法得到,因此没有办法使用这种方法,我们可以通过综合分析得出正确的数据,例如上面例子。
如果存在in.dat文件(有的程序中不存在in.dat),则都是使用in.dat的数据作输入,然后对这些数据作处理,最后将处理的数据放入out.dat文件中。
假如存在in.dat文件,用记事本方式打开in.dat和out.dat(鼠标右击文件in.dat,单击“打开方式”子菜单,出现如图7-4所示的界面,选择记事本方式打开文件)。
7-1复制菜单图7-2粘贴菜单
图7-3文件夹选项图7-4选择记事本
这样,in.dat文件就用记事本打开了,用同样的方法使用记事本打开out.dat。
比如本例中,打开in.dat文件的内容为:
1.34214232121.134555314.212121.9078987.8999
32.545646455.312326656.21213232.2121345.2121
21.3232422.3349992121.9092121.989921.9999
78.999989.99991019.9992121.9899912.9879
那么我们一个一个数据进行分析。
第一个数据1.3421423,根据题目要求是对它保留两位小数,对第三位作四舍五入处理,因此得出数据1.34。
注意输入到out.dat文件的格式,在本例中调用
fprintf(wf,"%f\n",fun(a));来输出数据,采用"%f\n"输出格式,也就是用%f的方式输出到文件中,输出结果是1.340000。
注意小数总共有6位,如果你不记得了,可以运行VC,看看是输出几位。
输出数据后还要输出一个回车符,也就是要换行。
我们将out.dat文件的第一行写为1.340000,然后保存文件。
运行评分程序,看看评分情况。
我们发现,在考试得分情况的第一行有如下信息:
得分:
1.340000
再看看分数,得分2分。
成功了!
没有写任何程序!
将所有数据按相同的方法分析完,把正确的数据输入到out.dat文件中,最后保存这个文件。
这样,我们就可以在不编写程序的情况下做对这道题了。
注意:
不是每一道题都能使用这种方法,而且这种方法存在风险,如果数据的输出格式判断错误,将会使程序结果完全错误,如上面例子中少写一个0就不得分。
但是,这确实是一个万不得已的办法。
使用这种方法做题,需要特别注意的问题:
(1)out.dat文件中的数据格式一定要正确。
例如本例中在NONO函数中的语句fprintf(wf,
"%f\n",fun(a));我们已经学过fprintf为一个文件函数,这条语句表示将调用函数返回的结果写入wf所指的文件中,本例中wf指向out.dat文件(由语句wf=fopen("C:
\\Exam\\24010001\\out.dat","w");可知;同时,这条语句可以知道考生文件夹为C:
\Exam\24010001);fprintf函数双引号部分的内容决定了out.dat中的数据格式,本例为输出一个数据后换行。
假如修改fprintf函数为:
fprintf(wf,"%f",fun(a));去掉换行,则所有数据在同一行内写。
假如修改fprintf函数为:
fprintf(wf,"num=%f\n",fun(a));则out.dat中的数据应为如下格式:
num=1.340000
num=212.130000
num=341.210000
num=21.910000
num=87.900000
num=32.550000
num=455.310000
num=6656.210000
num=3232.210000
num=345.210000
num=21.320000
num=22.330000
num=2121.910000
num=2121.990000
num=22.000000
num=79.000000
num=90.000000
num=1020.000000
num=2121.990000
num=12.980000
(2)并非每套编程题目都有NONO函数,fprintf函数可以直接出现在main函数内,使用方法都相同。
例如:
实验七部分:
模拟一套上机考试真题的编程题没有NONO函数。
如果读者会自己编写程序,完全可以忽略NONO函数,通过我们前面给出的NONO函数的注释(考试不会给出注释),可以知道NONO函数是一个评分函数,与我们的程序编写没有关系。
只有在使用本节介绍的方法时,需要注意NONO函数中的部分语句。
(3)本例中是把in.dat中的数据按照题目要完成的功能写到了out.dat中;部分题目没有in.dat,此时必定是以程序中的数据作为参照数据,读者可以自己分析。
三、程序编写题有以下几个特点
(1)程序编写题必须要能正确运行才能得分。
无论程序写了多少,如果不能运行或
者运行的结果是错误的均不能得分。
(2)程序的运行结果以最后一次运行结果为准。
在修改了程序之后,必须要重新运行程序才能有效。
(3)编写程序时,不要对NONO函数和main函数做任何修改,以免引起不必要的错误。
(4)在编写程序时,可以使用任何可以调用的函数,完全不必要理会题目中禁止使用函数的那些条件。
四、考试注意事项
在考试的一个星期之前将教材第四分册中的50套题目完全熟练练习,这些题目与上机考试模拟系统中的题目是一一对应的,然后自我随机抽查。
如果能够完全做对,并且每道程序填空题都能在2分钟之内做完,每道程序修改题都能在2分钟之内做完,每道程序编写题都能在10分钟内做完,就算练习合格了。
考试时间为90分钟。
一般情况下,考生最好提前半个小时到场,以便熟悉环境。
在考试过程中,如果出现死机等情况,不用慌张。
这时应举手向监考老师反应,由监考老师解决,排除故障的时间不会计入考试时间。
如果中途想重新做原来的题目,可以进入考试文件夹下目录,下在VC中重新打开,就可以重做题目了。
考试时题目由系统随机抽取,题库中由50套题。
相邻两个人的题目一般是不相同的,所以上机不可能出现抄袭现象。
抽出的题目难易程度并不相同,但是题目抽出之后就不能重新抽取了。
二级C语言上机考试改错题总结
根据多年研究全国计算机等级考试二级C语言,发现很多考生对上机考试存在很大的问题。
现将在教学过程中对二级C语言上机考试题库总结的经验和大家分享,希望能对我们考生的考试有所帮助,顺利通过考试!
以下是对上机考试改错题的做题方法和总结,改错题的错误主要分为以下几类:
1.if或while语句
若错误行是if或者while语句,则要注意以下点:
1)首先判断是否正确书写if或while关键字;
2)然后看有没有用小括号把整个表达式括起来,若没有则加上小括号;
3)若条件表达式中有指针变量而且没有指针运算符时,则加上指针运算符*;
4)若if条件表达式中只有一个等于号即数学等号(=),看是否需要改写成两个等于号即逻辑等号(==);
5)若if条件表达式为其他的比较运算符,则一般是进行逆转或加一个等于号;
6)do-while循环结构,while表达式最后有一个分号;
2.for语句
若错误行是for语句,则要注意以下几点:
1)首先判断for有没有书写正确;
2)然后看for中的表达式是不是用分号(;)隔开,若不是则改为分号。
记住是分号(;),不是逗号(,)!
3)再者,分析for中的三个表达式,是否符合题意;
第一个表达式表示起始条件,
第二个表达式表示终止条件,
第三个表达式表示循环变量的变化。
3.return语句
若错误行为return语句,则要注意以下几点:
1)首先看是不是正确书写return关键字;
2)然后看是不是缺少分号,若是则加上分号即可;
3)再者判断return后的变量或表达式是否正确;
这种错误需要根据题意来分析,分析返回变量或表达式的值和类型。
4.赋值语句
若错误行是赋值语句,则要看赋值是否正确,然后看赋值运算符是否写正确。
5.定义语句
若错误行是定义语句,则要注意:
1)首先分析变量类型名是否写对;
2)然后分析给变量赋初值是否正确;
3)若以上均不是,则看是不是少定义了某个变量或少了花括号;
6.表达式错误问题
若错误行中有整数1除以某个表达式或变量时,必须把整数1改为1.0;若变量或表达式是整型时,则只能进行强制类型转换。
7.字符串类问题
若错误行中有字符串结束符,则特别要注意结束符有没有写错。
但是要区分清楚字符'o'和数字'0'。
8.指针类问题
若错误行中有指针变量,并且该变量名之前没有指针运算符,则一般都是加上指针运算符;
9.函数首部类问题
若错误行是函数首部,则要注意:
1)首先看该行最后有没有分号,若有则删掉分号;若括号参数间是分号则要改为逗号;
2)形参和实参类型不一致问题
若实参是个地址或数组名或指针变量名,则对应的形参肯定是指针或数组;
若实参是二维数组名,则对应的形参应该是行指针或是二维数组;
若后面用到某形参时有指针运算符,则该形参必为指针类型;
若形参是二维数组或指向M个元素的指针变量,则该二维数组的长度必须与main函数中对应数组的第二维的长度相同。
3)函数类型不一致问题
若函数中没有return语句,则函数类型为void;
若函数中有return语句,则函数的类型必须与rerun后的变量类型一致;
10.语法错误问题
1)语句缺少分号。
若错误号中语句没有以分号结束则加上分号;
2)变量名不一致。
C语言是区分大小写的,若错误行中有大写字母一般都改为小写字母;
11.逻辑错误问题
这种题型主要是表达式错误,占的题量比较多而且我们没有统一的做题方法,需要我们具体问题具体分析。
12.书写错误问题
特别注意我们的注释部分,注释是以/*开始,以*/结尾,不能有多余的,比如“/***注释部分*****/*/”是错误的!