2016北理复试机试题
1.
输入学生信息,姓名 成绩(成绩的数目不一定)
输出每个学生的学号和平均成绩,以及不及格课程数超过2的学生,按不及格课程数从大到小排好序输出。
自己编的测试用例:
输入:
xiaoming 99 88 5 44 98 52
zhangsan 55 85 74
huahua 6 5 2 8 88
lixiang 14 52 69 74 33
输出:
不及格数超过2的学生:
huahua的不及格数目为:4
xiaoming的不及格数目为:3
lixiang的不及格数目为:3
zhangsan的平均成绩为:71.3333
xiaoming的平均成绩为:64.3333
lixiang的平均成绩为:48.4
huahua的平均成绩为:21.8
使用了简单的class
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;class stu {public:string name, info;vector<int> score; //这个记录成绩的数组其实没用上int not_pass = 0;double aver_score;stu(string info){ //使用输入的一整行信息构造学生对象this->info = info;for (int i = 0; i < info.length(); i++) {if (info[i] >= 'a' && info[i] <= 'z') i = getName(i); //返回的i指向name后面的空格else if (info[i] >= '0' && info[i] <= '9') i = getScore(i); }}private:int total_score = 0, num = 0;int getName(int i) {int start = i;while (info[i] >= 'a' && info[i] <= 'z')i++;name = info.substr(start, i);return i;}int getScore(int i) {int sco = 0;while (info[i] >= '0' && info[i] <= '9') {sco = sco * 10 + (info[i] - '0');i++;}score.push_back(sco);total_score += sco;num++;aver_score = total_score * 1.0 / num;if (sco < 60)not_pass++;return i;}
};bool cmp1(stu a, stu b) { return a.not_pass > b.not_pass; }
bool cmp2(stu a, stu b) { return a.aver_score > b.aver_score; }int main()
{string info;vector<stu> s;while (getline(cin, info)) {s.push_back(stu(info));}sort(s.begin(), s.end(), cmp1);cout << "不及格数超过2的学生:" << endl;for (auto it = s.begin(); it != s.end(); it++) {if (it->not_pass >= 2) cout << it->name << "的不及格数目为:" << it->not_pass << endl;elsebreak;}cout << endl;sort(s.begin(), s.end(), cmp2);for (auto it = s.begin(); it != s.end(); it++) cout << it->name << "的平均成绩为:" << it->aver_score << endl;return 0;
}
2.
输入字符串,输出字符串中包含的数字,比如 2.3ABC0-2.3 输出 2.3 0 -2.3。
注意一些特殊的情况如+004.500值为+4.5。
方法1
(老实本分版)
是通过两个判断数字开始和结束的函数判断数字范围。再在这个范围内生成该数字。输入字符串中仅支持包含字母
,数字
和+
、-
、.
三个字符。
运行截图:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;string t;bool start_sign(char c) //遇到的可以认为是一个数开始的字符
{if (c >= '0' && c <= '9')return true;else if (c == '+' || c == '-')return true;return false;
}bool end_sign(char c) //遇到的可以认为是一个数结束的字符
{if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')return true;else if (c == ' ' || c == '+' || c == '-')return true;return false;
}int printNum(int i)
{double num = 0;double _point = 1;bool exist_plus = false;int flag = 1; //符号位do{ //不使用while的原因是+和-既是开始符也是结束符,所以为避免冲突,第一次执行时不应该判断。if (t[i] <= '9' && t[i] >= '0') {if (_point >= 1) { //_point未遇到小数点前恒为1num = num * 10 + t[i] - '0';}else {num = num + _point * (t[i] - '0');_point = _point * 0.1;}}else if (t[i] == '-')flag *= -1;else if (t[i] == '+')exist_plus = true;else if (t[i] == '.')_point *= 0.1;} while (!end_sign(t[++i])&&i<t.length());if (exist_plus)cout << '+';cout << num * flag << ' ';return i-1;
}int main()
{while (getline(cin, t)){for (int i = 0; i < t.length(); i++) {if (start_sign(t[i])) {i = printNum(i); //返回的i是最后一个数字内的符号}}cout << endl << endl;}
}
(2020.4.17)
方法2 巧用字符流
感觉方法1还是有点麻烦,可以巧用我前面哪篇博客提到的字符串流,发挥C++的优势嘛
诸如去后缀0、处理小数点等等杂事都不用管,交给流就完了,不过要对流操作有一个熟练的掌握
需要注意的是流输入如果错误,会自动在流中添加一个错误标记,使流无法再次被读入(防止一连串的错误),这就要求在else中必须clear()掉错误标记后才能继续读入。
如果没想起来清除错误标记,为了处理这个错误,也可以重新创建一个流istringstream ii(s);
然后再从新流读 ii >> ret;
。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;string getNum(string s)
{string ret;istringstream i(s); //从s中创建输入流 double t;if(i >> t){ //从流中读一个double if(s[0]=='+') cout << '+'; //有加号则先输出一个加号 cout << t << " ";i >> ret; //把剩下的字符串返回 return ret;}else{ //流前面并不是数字,无法读入 i.clear(); //由于上一次流读入错误,流中存在错误标记,无法再次读入,需要先清除错误标记i >> ret;return ret.substr(1); //去掉一个字符,返回 }
}int main()
{string s;getline(cin,s);while(s != ""){ //循环到删光为止 s = getNum(s);}
}
2016北理复试机试题相关推荐
- 2011年华科计算机考研复试机试题真题
很好的资料哦,更多资料请访问王道论坛:www.cskaoyan.com 2011年华科计算机考研复试机试题真题:
- 华科计算机考研复试真题,华科计算机考研复试机试题(2000-2013)
华科计算机考研复试机试题(2000-2013),c++实现,注本人参加过2014年华科上机考试,老师说机试时可以使用c语言,c++语言. 2000年 阶乘 #include #include #inc ...
- 华科计算机考研复试真题,华科计算机考研复试机试题【含参考代码】
华科计算机考研复试机试题[含参考代码] (32页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.9 积分 华科历年复试机试题汇总上机考试.一般网站上公 ...
- 上交复试机试题Old BIll
上交复试机试题Old BIll 问题描述: Among grandfather's papers a bill was found. 72 turkeys $_679_ The first and t ...
- 中南大学2019研究生复试机试题
中南大学2019研究生复试机试题 机试题共六题 1.选球问题 题目描述 输入 输出 样例输入 样例输出 解决代码 2.模拟出入栈游戏 题目描述 输入 输出 样例输入 样例输出 解决代码 3.爬楼梯游戏 ...
- 2022年华东师范大学计科考研复试机试题-详细题解
2023大厂真题提交网址(含题解): www.CodeFun2000.com(http://101.43.147.120/) 最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练 ...
- 1019: 堆石子 2016年中南大学研究生复试机试题
题目描述 在一片沙滩上摆放着 n堆石子. 现要将石子有次序地合并成一堆. 规定每次选2 堆相邻石子合并成新的一堆,合并的费用为新的一堆石子数.试设计一个算法,计算出将 n堆石子合并成一堆的最小总费用. ...
- 2016年中南大学研究生复试机试题(1015~1019)
目录: **A:第几天 B:加油站 C:序列求平均 D:士兵排阵 ** A:第几天 http://39.106.164.46/problem.php?id=1015 思路: 分闰年和非闰年讨论即可. ...
- 北理python复试_北理复试及其初试超强总结(转)
1 . 重视笔试:笔试的科目包括数字电子电路和模拟电子电路,其中题型包括填空. 判断和计算.总的笔试时间是 120 分钟,如果掌握得好一个小时左右就可以做完,题量不 小,覆盖的面比较广,但题目不难. ...
- 13-19年复旦大学计算机学院研究生复试机试题
(不保证代码完全正确,自己敲的可能存在不完善的地方,请各位大佬发现后指出,谢谢!) 暂时结束. 试题列表 2019上机题 2018上机题 2017上机题 2016上机题 2015上机题 2014上机题 ...
最新文章
- 企业架构研究总结(2)——问题的由来和基本概念
- 无软件linux,无需安装即可运行或演示Linux的方法 (1)
- Linux移植随笔 tslib
- 错误代码#1045 Access denied for user 'root'@'localhost' (using password:YES)
- python ide是什么意思_初学Python使用什么IDE会更好?
- python中控制代码块逻辑关系_一、Python基础知识
- 自反而缩,虽千万人,吾往矣。
- 推进 DevSecOps 走向未来
- C++ 类的设计与实现规范
- usb驱动---linux ACM驱动详解ACA【转】
- h5与微信小程序直播开发
- Win7动态主题制作
- Java 获取Excel中的表单控件
- 压力换算公斤单位换算_压力单位换算方法
- 前端开发css样式基础篇
- 父子游标不可共享的情况分析
- 三国杀网页版普通服务器怎么进,就想知道老服怎么进_三国杀Online_玩家社区_三国杀官方社区 - Powered by Discuz!...
- python hypothesis testing
- 李宏毅老师《机器学习》课程笔记-2.2 为什么是“深度”学习?
- arduinopn532模块_Arduino 开源 NFC近场通讯模块 PN532