中国地质大学(武汉)
C语言课程设计报告书
姓 名:杨瑞盾
班 级:122102
班级学号:20101003244
指导老师:武进霞
一、课设题目
高考招生录取成绩
已知文本文件f1.txt中存放了某个省当年参加高考的1000个考生的数据(考号、姓名、性别和考试成绩),存放格式是每行存放一个考生的数据,每个数据之间用空格隔开。
假定当年该省的招生计划是:一类本科招生计划为10%;二类本科招生计划为15%;三类本科招生计划为20%;四类高职高专招生计划为25%。
请编写程序,实现以下功能:
1.划定各批次录取分数线,结果可屏幕显示,也可存入文件;
2.能够统计各批次中男生,女生的录取比例。统计结果可屏幕显示,也可存入文件;
3.确定每名学生的录取情况及录取批次;
4.考生可以根据考号或姓名(支持重名)查询自己的成绩及录取情况;
5.系统程序要有界面;
6.存入文件的数据,每行存一种数据,每行之间的不同信息用空格分隔。)
二、题目分析
该程序题目已经很清楚的表达出要求编好的程序能够简单的实行高考招生功能,在导入含有一千个考生信息的txt文本后,能达到录取功能。根据该题目我们还可以知道完成程序后,不仅要有比较美观的界面,还要能界面显示出个批次中男女的比例以及录取线。在显示完这些后,我们最好设置一个大循环,使得考生能实现只要不关闭程序或者按指定输入而结束程序就能一直查询下去。并且能用txt文本将个批次中录取的人的一系列信息从程序中生成出来。
在这些基础上,我认为要程序达到尽善尽美就要拥有容错功能,还有,不能只是只能对一千个数据有效,我们要做到无论导入多少学生信息而只要通过改一下#define中定义的数值就行。
三、设计思路
刚看到此题时有点茫然不知所措,把题目和要求看了几遍。最后只有先打开vc++,将基本格式#include等先写好。
要编题目中要求的程序,就必须先用txt文本写好一千个学生的信息。想了一会,还是觉得编个程序将一千个学生信息表达出来比较好。
而后老师给出了一千个数据,于是就直接编高考程序了。
第一步为定义:
#include
#include
#define N 1000
用结构体的形式将学生的一切信息表达出来:
struct student
{
int number;
char name[10];
char sex[5];
int score;
};
struct student stu[N];
再应该从f1.txt中用fscanf将每一个人的学号、姓名、性别、分数提出来:
fscanf(fp,”%d%s%s%d”,&stu[i].number,stu[i].name,stu[i].sex,&stu[i].score);
然后比较大小:将原来一千个人按成绩高低排好顺序。引入t作为中间量有:
void sort()
{
struct student t;
int i,j;
for(i=0;i
{
for(j=0;j
if(stu[j].score
{
t=stu[j];
stu[j]=stu[j+1];
stu[j+1]=t;
}
}
}
之后再经过f2.txt用fprintf将排好的学号、姓名、性别、分数提出来。这样,就在该程序所在的文件夹形成一个f2文本。里面包含了按分数排好的学生信息。从这以后,我们都以f2为蓝本,将后面的工作都建立在f2上。
因为上面说到,要求不仅能对一千个学生起到作用,而且要针对任何学生人数起到作用,所以,将#define定义N,且赋值1000。从这里我们可以知道,只要改变N的赋值就可以得到一个可以为任何学生人数服务的程序。
要划出各批次的录取成绩,就要将压线的那个分数计算出来。在这里,特别考虑的是:压线分数上人数有多个,所以,我们不能单纯的将N乘以各个批次的百分点(注意:该处是一个容易忽略的地方)。编写程序如下:
首先将数据用fscanf从f2里面提出来,然后计算好人数,用N乘以各个百分点,就能得到各个批次上刚好上线人的分数,我们就以此份数作为该批次的录取线。
而且,将进入各个批次的人用一个单一的文本文件提出来(这儿应该用到fprintf),将它们分别用“一本”,“二本”,“三本”,“高专”命名,以便更好的查询。
先将数据从f2中提出来:
fp1=fopen("f2.txt","w");
for(i=0;i
fprintf(fp1,"%d%s%s%d\n",stu[i].num