> 文章列表 > 【C++】苏大期中考试前第二次模拟

【C++】苏大期中考试前第二次模拟

【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. 提交成功后,可点击“查看内容”按钮检查提交的内容。

按以下要求编写程序

题目说明

请各位考生课程信息发布网站下载数据文件input.txt,然后将该数据文件手动保存D盘根目录下。该文件中的数据以文本形式存储,包含若干个以空格间隔的单词,且不包含任何标点符号。

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

  1. 编写一个函数ReadFile。读取input.txt文件中的所有单词,并将它们存放在string类型的A向量中。
  2. 编写一个函数ShowData。显示第1步中生成的string类型的A向量。要求每行显示X个单词,每个单词占Y列,左对齐,右补空格。该函数要求将每行显示单词个数X、每个单词显示列数Y都作为函数参数来进行处理。如不设定,则每行显示5个单词,每个整数8列。
  3. 编写一个函数GetNumbers,提取出A向量中所有形式为整数数值的单词,并将其转换为整数,将计算结果保存在另一个int类型的向量B中。
  4. 编写一个函数ShowData。显示第3步中生成的int类型的B向量。要求每行显示X个整数,每个整数占Y列,左对齐,右补空格。该函数要求将每行显示单词个数X、每个单词显示列数Y都作为函数参数来进行处理。如不设定,则每行显示5个整数,每个整数占5列。
  5. 编写一个函数SortData。对第3步中生成的向量B按照各元素的“权重”进行增序排序。所谓“权重”是指某整数的各位数字的总和除以该整数位数所得到的计算结果,该结果为double类型。例如:356的权重计算过程为:(3+5+6)/3=4.66667;4457的权重计算过程为:(4+4+5+7)/4=5.0
  6. 编写一个函数WriteFile。将经过第5步处理的向量B中所有整数写入到指定文本文件中,要求每行显示4个整数,每个整数占5列,右对齐,左补空格字符。
  7. 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里了。

判断的时候又忘记要把负号单独拿出来判断了。

好吧,我说怎么真的会十分钟了事嘞。

情感知识