研究生初试录取
问题描述
研究生考试课程为4门,其中数学、外语、政治为统一命题,而专业基础课则根据不同的专业由招生学校自行命题。国家对初试录取分数有总分要求(如某一年要求4门课总分应达到310分),另外还有对每门课的最低分数要求(如总分为100的试卷最低应达到40分,总分为150的试卷最低应达到65分)。编程统计初试合格的人数,并按总分由高到低的顺序输出合格考生的信息。
基本要求
程序运行时首先要求输入:考生姓名,准考证号,报考专业,是否应届生,4门课程(政治、数学、外语、专业基础课)成绩。这些原始数据应保存到一个文件中。
然后输入:录取的总分要求,各课程的最低分数要求。
输出要求:过线考生的姓名,准考证号,报考专业,是否应届生,4门课程(政治、数学、外语、专业基础课)成绩及总分,这些信息应存放到另一个文件中。
测试数据
程序应输入不少于10名考生的信息,其中应届生和历届生分别有若干名,并且都有合格和不合格的情况。
实现提示
可定义一个考生类存放有关信息和实现相应的操作。分数线数据(总分要求和各门课程的要求)可定义另外的类来存放,但应能被考生类及其派生类直接访问。
话不多说,上代码:
#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<cstring>
#include<algorithm>
using namespace std;
class candidate //考生类
{
friend class scoreline; //将scoreline声明为友元类
private:
string name; //考生姓名
string number; //准考证号
string professional; //报考专业
string isgraduate; //是否是应届生
int policital; //政治分数
int math; //数学分数
int english; //英语分数
int majorclass; //专业课
int all; //总分
public:
int getall()
{
return all; //获取总分
}
void print(); //打印数据
void input1(string name,string number,string professional,string isgraduate,int policital,int math,int english,int majorclass);
void zero(); //将类元素置零
void format(); //格式输出
};
void candidate::print() //打印
{
cout<<"考生姓名"<<name<<"准考证号"<<number<<"报考专业"<<professional<<"是否为应届生"<<isgraduate<<"政治"<<policital<<"数学"<<math<<"英语"<<english<<"专业课"<<majorclass<<"总分"<<all<<endl;
}
void candidate::input1(string name,string number,string professional,string isgraduate,int policital,int math,int english,int majorclass)
{
this->name=name;
this->number=number;
this->professional=professional;
this->isgraduate=isgraduate;
this->policital=policital;
this->math=math;
this->english=english;
this->majorclass=majorclass;
this->all=policital+math+english+majorclass;
}
class scoreline //定义分数线类
{
private:
int policeline; //政治分数线
int mathline; //数学分数线
int englishline; //英语分数线
int majorline; //专业课分数线
int allline; //总分数线
public:
int judge(candidate a); //判断是否符合要求
void input2(int policeline,int mathline,int englishline,int majorline,int alline); //将输入的值赋值到类成员
};
int scoreline::judge(candidate a) //判断是否符合要求(考生类的引用)
{
if(a.all>=allline&&a.policital>=policeline&&a.math>=mathline&&a.english>=englishline&&a.majorclass>=majorline)
{
return 1; //符合要求返回1
}
return 0; //否则返回0
}
void scoreline::input2(int policeline,int mathline,int englishline,int majorline,int allline) //输入分数线类数据
{
this->policeline=policeline;
this->mathline=mathline;
this->englishline=englishline;
this->majorline=majorline;
this->allline=allline;
}
void candidate::zero() //将该考生成绩置零
{
this->policital=0;
this->math=0;
this->english=0;
this->majorclass=0;
this->all=0;
}
void candidate::format()
{
cout<<name<<setw(14)<<number<<setw(12)<<professional<<setw(12)<<isgraduate;
cout<<setw(6)<<policital<<setw(5)<<math<<setw(5)<<english<<setw(5)<<majorclass<<setw(6)<<all<<setw(3)<<endl;
}
bool cmp(candidate a,candidate b) //重写sort()的cmp参数
{
return a.getall()>b.getall(); //按总成绩降序排列
}
int main()
{
string name; //学生姓名
string number; //准考证号
string professional; //报考专业
string isgraduate; //是否为应届生
int policital; //政治
int math; //数学
int english; //英语
int majorclass; //专业课
int all; //总分
freopen("D://in.txt","r",stdin); //打开in.txt文件
freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
cout<<"请输入考生姓名、准考证号、报考专业、是否为应届生、政治、数学、英语、专业课成绩"<<endl;
candidate cand[20]; //创建对象数组并分配空间
for(int i=1;i<=10;i++) //遍历十个数据
{
cin>>name>>number>>professional>>isgraduate>>policital>>math>>english>>majorclass;
cand[i].input1(name,number,professional,isgraduate,policital,math,english,majorclass);
cand[i].print();
}
int policeline;
int mathline;
int englishline;
int majorline;
int allline;
cout<<"请输入政治分数线、数学分数线、英语分数线、专业课分数线、以及总分数线"<<endl;
freopen("D://input.txt","r",stdin);
cin>>policeline>>mathline>>englishline>>majorline>>allline; //输入各科分数线
scoreline line; //定义分数线类变量line
line.input2(policeline,mathline,englishline,majorline,allline);
int fitness=0; //定义合格人数
for(int i=1;i<=10;i++)
{
if(line.judge(cand[i]))
{
fitness++;
}
else
{
cand[i].zero(); //将不合格的人所有成绩置零,方便排序
}
}
line.input2(policeline,mathline,english,majorline,allline); //输入line数据
sort(cand+1,cand+11,cmp); //对数据按总分排序(降序)
cout<<"一共有10人报考,有"<<fitness<<"人达到最低分数要求"<<endl;
cout<<"考生姓名"<<" 准考证号 "<<"报考专业"<<" 是否为应届生"<<" 政治"<<" 数学"<<" 英语"<<" 专业课"<<" 总分"<<endl;
for(int i=1;i<=fitness;i++)
{
cand[i].format(); //格式输出
}
}
以下in.txt放在D盘根目录下:
"刘一" "20162398" "信息工程" "是" 23 45 67 88
"邓二" "20153849" "信息计算" "否" 60 99 60 98
"张三" "20163834" "计算机" "是" 43 45 12 15
"李四" "20163487" "大数据" "是" 45 100 65 87
"王五" "20163874" "云计算" "是" 40 65 40 65
"赵六" "20153288" "计算机" "否" 34 65 23 32
"田七" "20152389" "软件" "否" 56 90 45 100
"段八" "20153844" "动物科学" "否" 23 64 23 90
"于九" "20163984" "信息管理" "是" 78 78 60 120
"付十" "20162387" "会计" "是" 66 107 45 121
以下input.txt放在D盘根目录下:
40 65 40 65 310
以下为D盘根目录下out.txt文件输出结果:
请输入考生姓名、准考证号、报考专业、是否为应届生、政治、数学、英语、专业课成绩
考生姓名"刘一"准考证号"20162398"报考专业"信息工程"是否为应届生"是"政治23数学45英语67专业课88总分223
考生姓名"邓二"准考证号"20153849"报考专业"信息计算"是否为应届生"否"政治60数学99英语60专业课98总分317
考生姓名"张三"准考证号"20163834"报考专业"计算机"是否为应届生"是"政治43数学45英语12专业课15总分115
考生姓名"李四"准考证号"20163487"报考专业"大数据"是否为应届生"是"政治45数学100英语65专业课87总分297
考生姓名"王五"准考证号"20163874"报考专业"云计算"是否为应届生"是"政治40数学65英语40专业课65总分210
考生姓名"赵六"准考证号"20153288"报考专业"计算机"是否为应届生"否"政治34数学65英语23专业课32总分154
考生姓名"田七"准考证号"20152389"报考专业"软件"是否为应届生"否"政治56数学90英语45专业课100总分291
考生姓名"段八"准考证号"20153844"报考专业"动物科学"是否为应届生"否"政治23数学64英语23专业课90总分200
考生姓名"于九"准考证号"20163984"报考专业"信息管理"是否为应届生"是"政治78数学78英语60专业课120总分336
考生姓名"付十"准考证号"20162387"报考专业"会计"是否为应届生"是"政治66数学107英语45专业课121总分339
请输入政治分数线、数学分数线、英语分数线、专业课分数线、以及总分数线
一共有10人报考,有3人达到最低分数要求
考生姓名 准考证号 报考专业 是否为应届生 政治 数学 英语 专业课 总分
"付十" "20162387" "会计" "是" 66 107 45 121 339
"于九" "20163984" "信息管理" "是" 78 78 60 120 336
"邓二" "20153849" "信息计算" "否" 60 99 60 98 317
欢迎指教!!!