考试说明
- 考试时间:合计2小时。选择题部分30分钟交卷,允许提前交卷。
- 考试过程中,不能连接未经指定网站或服务器。
- 闭卷考试部分,不能查阅任何类型的参考资料。
- 开卷考试部分,可以查阅纸质文档,不能查阅任何类型的电子文档。
- 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
- 违反上述2-5条者,视为考试作弊。
选择题答题方式(20分,闭卷,严禁使用vs编程环境进行尝试)
- 打开浏览器,在地址栏中输入http://192.168.125.3,点击相应链接进入登录页面。
- 按要求输入两遍自己的学号。
- 点击“登录”按钮即可进入答题页面。如考试尚未开始,系统会进入等待页面并倒计时。考试开始时间到,系统会自动进入答题页面。
- 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
- 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失之前已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
- 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
- 考试结束时间到,系统会自动收卷。
编程题提交方式(80分,开卷)
- 提交前务必关闭vs2005、vs2008或vs2010编程环境。
- 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
- 在浏览器的地址栏中输入http://192.168.125.3,点击相应链接进入提交页面。
- 按要求输入两遍自己的学号。
- 点击“选择文件”按钮,选择自己的源程序文件。点击“提交”按钮提交。
- 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤16-18。
- 提交成功后,可点击“查看内容”按钮检查提交的内容。
按以下要求编写程序
题目说明
请各位考生从网站下载数据文件score.txt,然后将该数据文件手动保存在D盘根目录下。该文件中以文本形式存储若干个篮球队的比赛成绩,每行包含4项信息,具体格式如下:
主队名 | 主队得分 | 客队得分 | 客队名称 |
4项信息之间用制表符(‘\t’)分开。每行所有的字符一定是合法的ASCII字符,不存在中文字符。
请按要求依次完成如下操作:
- 编写一个函数readInfo。读取score.txt文件中的所有比赛信息,并将它们存放在matchs向量中。
- 编写一个函数showInfo显示第1步中得到的scores向量的前3个信息,每行显示一个向量,每行的显示格式如下:
主队名 占12列,左对齐 | 主队得分 占3列,右对齐 | : | 客队得分 占3列,左对齐 | 客队名称 占12列,右对齐 |
- 编写findMaxGap函数找出分差最大的一场比赛,并显示在屏幕上。
- 编写一个函数GroupInfo,统计出每个队伍的总积分,每场的积分规则为:胜一场得3分,平一场得1分,负一场得0分。
- 编写一个函数delInfo,用于删除第4步得到向量中总积分低于平均积分的队伍。
- 编写一个函数sortInfo,对第5步得到的向量进行排序,排序规则如下:
- 首先按照积分从大到小排序;
- 积分相等时按照队伍名称的长度从小到大排序
- 长度相等时,按照队伍名称字母的ASCII从小到大排序。
- 编写一个重载函数showInfo显示第6步中得到的points向量的前n个信息(如果n不指定,则显示8个,不足n个则全部显示),每行显示一个向量,每行的显示格式如下:
- 编写一个函数writeInfo,将第6步排序后的结果写入到D盘的文本文件result.txt中,每个队伍占一行,积分在前,队伍名称在后,二者之间用空格分开。
- 编写一个函数getWeakestAwayHome,找出第1步得到向量中客场得分最少的队伍名称。
序号 占3列,左对齐 | 队名 占12列,左对齐 | 积分 占3列,右对齐 |
程序中所用到的结构体定义如下:
struct match
{
string teamA;//主队名称
string teamB;//客队名称
int scoreA;//主队得分
int scoreB;//客队名称
};
struct goal
{
string team;//队伍名称
int point;//积分
};
main函数如下:
int main()
{
vector<struct match> matchs;
if (readInfo("d:\\input.txt", matchs) == false)
{
cout << "打开文件失败";
return -1;
}
cout << "共有" << matchs.size() << "条比赛成绩" << endl;
cout << "前三条为:" << endl;
showInfo(matchs);
cout << "最大分差为:" << findMaxGap(matchs) << endl;
vector<struct goal> points= GroupInfo(matchs);
cout << "合计有" << points.size() << "支队伍";
double aver = 0;
cout << "删除了" << delInfo(points, aver) << "个队伍"<<endl;
cout << "队伍的平均积分为" << aver << endl;
sortInfo(points);
cout << "前8名队伍信息如下\n";
showInfo(points);
if (writeInfo("d:\\result.txt",points) == true)
{
cout << "文件保存成功\n";
}
cout << "客场得分最少的球队是:" << getWeakestAwayHome(matchs);
return 0;
}
注意: 不允许修改main函数,每修改一处,扣3分;
评分标准
(编程题满分为100分)
大项 | 子项 | 评分项 | 应得分 | 实得分 |
正 确 性 90分 | 结果(90分) 含编译子项5分 | readInfo函数 | 10 | |
showInfo函数 | 10 | |||
findMaxGap函数 | 10 | |||
GroupInfo函数 | 10 | |||
delInfo函数 | 10 | |||
sortInfo函数 | 10 | |||
showInfo重载函数 | 10 | |||
writeInfo函数 | 10 | |||
getWeakestAwayHome函数 | 10 | |||
上述各项都不得分 | 见编译子项 | 本项不得分 | ||
程序运行出现异常 | -10 | |||
程序死循环 | -10 | |||
修改main函数 | -3(每处修改) | |||
编译(5分) | 编译连接均通过(无warning) | 5 | ||
编译连接均通过(有warning) | 3 | |||
编译通过、连接不通过 | 2 | |||
编译、连接均不通过 | 0 | |||
可 读 性 10分 | 缩进对齐(4分) | 正确运用缩进对齐规则 | 4 | |
有缩进对齐但不完全符合要求 | 3 | |||
没有使用缩进对齐规则 | 2 | |||
注释(3分) | 有详细且正确的注释 | 3 | ||
有注释,但不够详细 | 2 | |||
完全没有注释 | 0 | |||
变量命名(3分) | 变量命名有规则 | 3 | ||
变量命名有规则、但规则使用不一致 | 2 | |||
变量命名无规则 | 0 |
#include "StdAfx.h"
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <iomanip>
#include<algorithm>
#include<cmath>
using namespace std;
struct match
{
string teamA;//主队名称
string teamB;//客队名称
int scoreA;//主队得分
int scoreB;//客队名称
};
struct goal
{
string team;//队伍名称
int point;//积分
};
bool readInfo(string s, vector<struct match>&m){
ifstream ifile (s);
if(!ifile){
return false;
}
while(!ifile.eof()){
struct match g;
if(ifile>>g.teamA>>g.scoreA>>g.scoreB>>g.teamB){
m.push_back(g);
}
}
ifile.close();
return true;
}
void showInfo(const vector<struct match>&m){
/*主队名
占12列,左对齐 主队得分
占3列,右对齐 : 客队得分
占3列,左对齐 客队名称
占12列,右对齐
*/
int i;
for(i=0;i<3;i++){
cout<<left<<setw(12)<<m[i].teamA;
cout<<right<<setw(3)<<m[i].scoreA;
cout<<":";
cout<<left<<setw(3)<<m[i].scoreB;
cout<<right<<setw(12)<<m[i].teamB;
cout<<endl;
}
}
int cmp(struct match a,struct match b){
return abs(a.scoreA-a.scoreB)>abs(b.scoreA-b.scoreB);
}
int findMaxGap(vector<struct match>&m){
/*找出分差最大的一场比赛,并显示在屏幕上*/
sort(m.begin(),m.end(),cmp);
return abs(m[0].scoreA-m[0].scoreB);
}
vector<struct goal> GroupInfo(const vector<struct match>&m){
vector<struct goal>g;
/*出每个队伍的总积分,每场的积分规则为:胜一场得3分,平一场得1分,负一场得0分。*/
int i;
for(i=0;i<m.size();i++){
int j;
int flag=0;//flag=1 a,flag=2 b,flag=3 ab
for( j=0;j<g.size();j++){
if(m[i].teamA==g[j].team){
if(flag==2){flag=3;}
else{flag=1;}
if(m[i].scoreA-m[i].scoreB>0){
g[j].point+=3;
}
else if (m[i].scoreA-m[i].scoreB==0){
g[j].point++;
}
else{}
if(flag==3){break;}
}
else if (m[i].teamB==g[j].team){
if(flag==1){flag=3;}
else{flag=2;}
if(m[i].scoreB-m[i].scoreA>0){
g[j].point+=3;
}
else if (m[i].scoreA-m[i].scoreB==0){
g[j].point++;
}
else{}
if(flag==3){break;}
}
}
if(flag==1){//only a
struct goal t;
t.point=0;
t.team=m[i].teamB;
if(m[i].scoreB-m[i].scoreA>0){
t.point+=3;
}
else if (m[i].scoreA-m[i].scoreB==0){
t.point++;
}
else{}
g.push_back(t);
}
else if (flag==2){//only b
struct goal t;
t.point=0;
t.team=m[i].teamA;
if(m[i].scoreB-m[i].scoreA<0){
t.point+=3;
}
else if (m[i].scoreA-m[i].scoreB==0){
t.point++;
}
else{}
g.push_back(t);
}
else if(flag==0){
struct goal t;//b
struct goal t1;//a
t.point=0;
t1.point=0;
t.team=m[i].teamB;
t1.team=m[i].teamA;
if(m[i].scoreB-m[i].scoreA>0){
t.point+=3;
}
else if (m[i].scoreA-m[i].scoreB==0){
t.point++;
t1.point++;
}
else{
t1.point+=3;
}
g.push_back(t);
g.push_back(t1);
}
}
return g;
}
int delInfo(vector<struct goal> &p,double &aver){
int j;
for(j=0;j<p.size();j++){
aver+=p[j].point;
}
aver=aver/(double)p.size();
int cont=0;
int k;
vector<struct goal>temp;
for(k=0;k<p.size();k++){
if(p[k].point<aver){
cont++;
}
else{
temp.push_back(p[k]);
}
}
p.clear();
for(k=0;k<temp.size();k++){
p.push_back(temp[k]);
}
return cont;
}
int cmp2(struct goal a, struct goal b){
if(a.point==b.point){
if(a.team.length()==b.team.length()){
return a.team[0]<b.team[0];
}
return a.team.length()<b.team.length();
}
return a.point>b.point;
}
void sortInfo(vector<struct goal>&p){
/* 首先按照积分从大到小排序;
积分相等时按照队伍名称的长度从小到大排序
长度相等时,按照队伍名称字母的ASCII从小到大排序。
*/
sort(p.begin(),p.end(),cmp2);
}
void showInfo(const vector<struct goal>&p, int n=8){
/*(如果n不指定,则显示8个,不足n个则全部显示),每行显示一个向量,每行的显示格式如下:
序号
占3列,左对齐 队名
占12列,左对齐 积分
占3列,右对齐
*/
int i;
for(i=0;i<n;i++){
cout<<left<<setw(3)<<i+1;
cout<<left<<setw(12)<<p[i].team;
cout<<right<<setw(3)<<p[i].point<<endl;
if(i+1==p.size()){
break;
}
}
}
bool writeInfo(string s,const vector<struct goal>&p){
/*每个队伍占一行,积分在前,队伍名称在后,二者之间用空格分开。*/
ofstream ofile(s);
if(!ofile){return false;}
int i=0;
for(i=0;i<p.size();i++){
ofile<<p[i].point<<" "<<p[i].team<<endl;
}
ofile.close();
return true;
}
int cmp3(struct match a,struct match b){
return a.scoreB<b.scoreB;
}
string getWeakestAwayHome(vector<struct match>&m){
sort(m.begin(),m.end(),cmp3);
return m[0].teamB;
}
int main()
{
vector<struct match> matchs;
if (readInfo("d:\\input.txt", matchs) == false)
{
cout << "打开文件失败";
return -1;
}
cout << "共有" << matchs.size() << "条比赛成绩" << endl;
cout << "前三条为:" << endl;
showInfo(matchs);
cout << "最大分差为:" << findMaxGap(matchs) << endl;
vector<struct goal> points= GroupInfo(matchs);
cout << "合计有" << points.size() << "支队伍";
double aver = 0;
cout << "删除了" << delInfo(points, aver) << "个队伍"<<endl;
cout << "队伍的平均积分为" << aver << endl;
sortInfo(points);
cout << "前8名队伍信息如下\n";
showInfo(points);
if (writeInfo("d:\\result.txt",points) == true)
{
cout << "文件保存成功\n";
}
cout << "客场得分最少的球队是:" << getWeakestAwayHome(matchs);
return 0;
}
vector删改那块,用erase怎么都得不到正确答案,删除数量是对的,但是总和统计又不对,真是怪了。当时考试的时候就是erase得不出答案,立刻换方法用了clear(),然后一个个放进目标vector中,也算是灵机一动吧。
补一下vector处的代码,hh当时应该是漏了it=p.erase(it)前面的it=,考试时可把人吓死了。
vector<struct goal>temp;
for(vector<struct goal>::iterator it=p.begin();it!=p.end();){
if(it->point<aver){
cont++;
it=p.erase(it);
}
else{
it++;
}
}