【苏大c++第一阶段考试】

考试说明

  1. 考试时间:合计2小时。选择题部分30分钟交卷,允许提前交卷。
  2. 考试过程中,不能连接未经指定网站或服务器。
  3. 闭卷考试部分,不能查阅任何类型的参考资料。
  4. 开卷考试部分,可以查阅纸质文档,不能查阅任何类型的电子文档。
  5. 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
  6. 违反上述2-5条者,视为考试作弊。

选择题答题方式(20分,闭卷,严禁使用vs编程环境进行尝试

  1. 打开浏览器,在地址栏中输入http://192.168.125.3,点击相应链接进入登录页面。
  2. 按要求输入两遍自己的学号。
  3. 点击“登录”按钮即可进入答题页面。如考试尚未开始,系统会进入等待页面并倒计时。考试开始时间到,系统会自动进入答题页面。
  4. 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
  5. 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失之前已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
  6. 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
  7. 考试结束时间到,系统会自动收卷。

编程题提交方式(80分,开卷)

  1. 提交前务必关闭vs2005vs2008或vs2010编程环境。
  2. 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
  3. 在浏览器的地址栏中输入http://192.168.125.3,点击相应链接进入提交页面。
  4. 按要求输入两遍自己的学号。
  5. 点击“选择文件”按钮,选择自己的源程序文件。点击“提交”按钮提交。
  6. 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤16-18。
  7. 提交成功后,可点击“查看内容”按钮检查提交的内容。


按以下要求编写程序

题目说明

请各位考生从网站下载数据文件score.txt,然后将该数据文件手动保存D盘根目录下。该文件中以文本形式存储若干个篮球队的比赛成绩每行包含4项信息,具体格式如下:

主队名

主队得分

客队得分

客队名称

4项信息之间用制表符(‘\t)分开。每行所有的字符一定是合法的ASCII字符不存在中文字符

请按要求依次完成如下操作:

  1. 编写一个函数readInfo。读取score.txt文件中的所有比赛信息,并将它们存放在matchs向量中。
  2. 编写一个函数showInfo显示第1步中得到的scores向量的前3个信息每行显示一个向量,每行的显示格式如下:

主队名

占12列,左对齐

主队得分

占3列,右对齐

客队得分

占3列,左对齐

客队名称

占12列,右对齐

  1. 编写findMaxGap函数找出分差最大的一场比赛,并显示在屏幕上。
  2. 编写一个函数GroupInfo,统计出每个队伍的总积分,每场的积分规则为:胜一场得3分,平一场得1分,负一场得0分。
  3. 编写一个函数delInfo,用于删除第4步得到向量中总积分低于平均积分的队伍
  4. 编写一个函数sortInfo,对第5得到的向量进行排序,排序规则如下:
  1. 首先按照积分从大到小排序;
  2. 积分相等按照队伍名称的长度从小到大排序
  3. 长度相等时,按照队伍名称字母ASCII从小到大排序。
  1. 编写一个重载函数showInfo显示第6步中得到的points向量的前n个信息(如果n不指定,则显示8个,不足n个则全部显示)每行显示一个向量,每行的显示格式如下:
  2. 编写一个函数writeInfo,将第6步排序后的结果写入到D盘的文本文件result.txt中,每个队伍占一行,积分在前,队伍名称在后,二者之间用空格分开。
  3. 编写一个函数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++;
		}
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值