目录
一. 题目
考试说明
- 考试时间:合计2小时。选择题部分30分钟交卷,允许提前交卷。
- 考试过程中,不能连接未经指定网站或服务器。
- 闭卷考试部分,不能查阅任何类型的参考资料。
- 开卷考试部分,可以查阅纸质文档,不能查阅任何类型的电子文档。
- 考试过程中,不得使用任何形式的电子存储设备,不可使用手机。
- 违反上述2-5条者,视为考试作弊。
选择题答题方式(20分,闭卷,严禁使用vs编程环境进行尝试)
- 打开浏览器,在地址栏中输入http://192.168.125.3,点击相应链接进入登录页面。
- 按要求输入两遍自己的学号。
- 点击“登录”按钮即可进入答题页面。如考试尚未开始,系统会进入等待页面并倒计时。考试开始时间到,系统会自动进入答题页面。
- 在页面左侧选择题号,页面右侧即会显示相应的题目。考生只需点击选择相应的选项。
- 答题过程中如关闭浏览器或出现系统故障导致计算机重新启动,系统不会丢失之前已经完成的题目的答案。考生可以打开浏览器重新登录并继续考试。
- 答题完成后,点击“交卷”按钮即可完成交卷。交卷后不能再次登录系统继续考试。
- 考试结束时间到,系统会自动收卷。
编程题提交方式(80分,开卷)
- 提交前务必关闭vs2005、vs2008或vs2010编程环境。
- 所有源程序内容必须仅包含在一个源程序文件(CPP文件)中。
- 在浏览器的地址栏中输入http://192.168.125.3,点击相应链接进入提交页面。
- 按要求输入两遍自己的学号。
- 点击“选择文件”按钮,选择自己的源程序文件。点击“提交”按钮提交。
- 如提交成功,系统会显示相关信息。如果提交不成功,请重复步骤16-18。
- 提交成功后,可点击“查看内容”按钮检查提交的内容。
按以下要求编写程序
题目说明
请各位考生从课程信息发布网站下载数据文件input.txt,然后将该数据文件手动保存在D盘根目录下。该文件中的数据以文本形式存储,包含若干个以空格间隔的单词,且不包含任何标点符号。
请按要求依次完成如下操作:
- 编写一个函数ReadFile。读取input.txt文件中的所有单词,并将它们存放在string类型的A向量中。
- 编写一个函数ShowData。显示第1步中生成的string类型的A向量。要求每行显示X个单词,每个单词占Y列,左对齐,右补空格。该函数要求将每行显示单词个数X、每个单词显示列数Y都作为函数参数来进行处理。如不设定,则每行显示5个单词,每个整数占8列。
- 编写一个函数GetNumbers,提取出A向量中所有形式为整数数值的单词,并将其转换为整数,将计算结果保存在另一个int类型的向量B中。
- 编写一个函数ShowData。显示第3步中生成的int类型的B向量。要求每行显示X个整数,每个整数占Y列,左对齐,右补空格。该函数要求将每行显示单词个数X、每个单词显示列数Y都作为函数参数来进行处理。如不设定,则每行显示5个整数,每个整数占5列。
- 编写一个函数SortData。对第3步中生成的向量B按照各元素的“权重”进行增序排序。所谓“权重”是指某整数的各位数字的总和除以该整数位数所得到的计算结果,该结果为double类型。例如:356的权重计算过程为:(3+5+6)/3=4.66667;4457的权重计算过程为:(4+4+5+7)/4=5.0。
- 编写一个函数WriteFile。将经过第5步处理的向量B中所有整数写入到指定文本文件中,要求每行显示4个整数,每个整数占5列,右对齐,左补空格字符。
- main函数如下:
void main()
{
string ifname="d:\\input.txt",ofname="d:\\result.txt";
vector<string> A;
vector<int> B;
ReadFile(ifname,A);
cout<<"文件读取操作完成后的A向量为:"<<endl;
ShowData(A);
cout<<endl;
B=GetNumbers(A);
cout<<"整数提取操作完成后的B向量为:"<<endl;
ShowData(B);
cout<<endl;
SortData(B);
cout<<"排序操作完成后的B向量为:"<<endl;
ShowData(B,6);
cout<<endl;
WriteFile(ofname, B);
}
注意: 不允许修改main函数,每修改一处,扣3分;
评分标准
(编程题满分为80分)
大项 | 子项 | 评分项 | 应得分 | 实得分 |
正 确 性 70分 | 结果(70分) 含编译子项5分 | ReadFile函数 | 15 | |
ShowData函数(string向量版本) | 10 | |||
ShowData函数(int向量版本) | 10 | |||
GetNumbers函数 | 13 | |||
SortData函数 | 12 | |||
WriteFile函数 | 10 | |||
上述各项都不得分 | 见编译子项 | 本项不得分 | ||
程序运行出现异常 | -10 | |||
程序死循环 | -10 | |||
修改main函数 | -3(每处修改) | |||
编译(5分) | 编译连接均通过(无warning) | 5 | ||
编译连接均通过(有warning) | 4 | |||
编译通过、连接不通过 | 3 | |||
编译、连接均不通过 | 0 | |||
可 读 性 10分 | 缩进对齐(4分) | 正确运用缩进对齐规则 | 4 | |
有缩进对齐但不完全符合要求 | 2 | |||
没有使用缩进对齐规则 | 0 | |||
注释(3分) | 有详细且正确的注释 | 3 | ||
有注释,但不够详细 | 2 | |||
完全没有注释 | 0 | |||
变量命名(3分) | 变量命名有规则 | 3 | ||
变量命名有规则、但规则使用不一致 | 2 | |||
变量命名无规则 | 0 | |||
总分(满分80分) |
二. 代码
#include<iostream>
#include<vector>
#include<fstream>
#include<string>
#include<iomanip>
#include<sstream>
#include<algorithm>
#include<cmath>
using namespace std;
void ReadFile(string ifname,vector<string>&a){
ifstream ifile(ifname);
while(!ifile.eof()){
string s;
if(ifile>>s){
a.push_back(s);
}
}
ifile.close();
}
void ShowData(const vector<string>&a,int X=5,int Y=8){
/*要求每行显示X个单词,
每个单词占Y列,左对齐,右补空格。
该函数要求将每行显示单词个数X、每个单词显示列数Y都作为函数参数来进行处理。
如不设定,则每行显示5个单词,每个整数占8列。*/
int cont=0;
for(int i=0;i<a.size();i++){
cout<<left<<setw(Y)<<setfill(' ')<<a[i];
cont++;
if(cont==X){
cont=0;
cout<<endl;
}
}
}
vector<int>GetNumbers(const vector<string>&a){
/*
提取出A向量中所有形式为整数数值的单词,
并将其转换为整数,
将计算结果保存在另一个int类型的向量B中
*/
vector<int>tempB;
for(int i=0;i<a.size();i++){
/*
int n;
istringstream s(a[i]);
if(s>>n){
tempB.push_back(n);
}
*/
int j=0;
if(a[i][j]=='-' or (a[i][j]<='9' and a[i][j]>='0')){
for(j=1;j<a[i].size();j++){
if(a[i][j]<'0' or a[i][j]>'9'){
break;
}
}
}
if(j==a[i].size()){
int n;
istringstream s(a[i]);
if(s>>n){
tempB.push_back(n);
}
}
}
return tempB;
}
void ShowData(const vector<int>&b,int X=5,int Y=8){
/*要求每行显示X个单词,
每个单词占Y列,左对齐,右补空格。
该函数要求将每行显示单词个数X、每个单词显示列数Y都作为函数参数来进行处理。
如不设定,则每行显示5个单词,每个整数占8列。*/
int cont=0;
for(int i=0;i<b.size();i++){
cout<<left<<setw(Y)<<setfill(' ')<<b[i];
cont++;
if(cont==X){
cont=0;
cout<<endl;
}
}
}
int getNum(int a){
a=abs(a);
double cont=0;
double s=0;
while(a){
s+=a%10;
cont++;
a=a/10;
}
return s/cont;
}
bool cmp(int a,int b){
int aNum=getNum(a);
int bNum=getNum(b);
return aNum<bNum;
}
void SortData(vector<int>&b){
/*
5、对第3步中生成的向量B按照各元素的“权重”进行增序排序。
所谓“权重”是指某整数的各位数字的总和除以该整数位数所得到的计算结果,
该结果为double类型。
例如:356的权重计算过程为:(3+5+6)/3=4.66667;4457的权重计算过程为:(4+4+5+7)/4=5.0。
*/
sort(b.begin(),b.end(),cmp);
}
void WriteFile(string s,const vector<int>&b){
/*
将经过第5步处理的向量B中所有整数写入到指定文本文件中
要求每行显示4个整数,
每个整数占5列,右对齐,左补空格字符
*/
ofstream ofile(s);
int cont=0;
for(int i=0;i<b.size();i++){
ofile<<setw(5)<<right<<setfill(' ')<<b[i];
cont++;
if(cont==4){
ofile<<endl;
cont=0;
}
}
ofile.close();
}
int main()
{
//string ifname="d:\\input.txt",ofname="d:\\result.txt";
string ifname="/Users/apple/Downloads/1-2/阅卷用数据文件/input.txt",ofname="/Users/apple/Downloads/1-2/阅卷用数据文件/result.txt";
vector<string> A;
vector<int> B;
ReadFile(ifname,A);
cout<<"文件读取操作完成后的A向量为:"<<endl;
ShowData(A);
cout<<endl;
B=GetNumbers(A);
cout<<"整数提取操作完成后的B向量为:"<<endl;
ShowData(B);
cout<<endl;
SortData(B);
cout<<"排序操作完成后的B向量为:"<<endl;
ShowData(B,6);
cout<<endl;
WriteFile(ofname, B);
}
三. 总结
期中考试三件套:
1. 读写文件
2. vector操作
3. sstream(即stringstream)
这次差点被坑,在GetNumbers里本来是直接用istringstream ss(a[i])把数放进int中去的,毕竟如果ss>>n成功的话就说明是int,结果我忘记了,只要是包含int的部分都会被塞进去
结果就是,12a这样一个字符串在我的程序里面将12提出来当成int塞进B里了。
判断的时候又忘记要把负号单独拿出来判断了。
好吧,我说怎么真的会十分钟了事嘞。