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北理复试机试题相关推荐

  1. 2011年华科计算机考研复试机试题真题

    很好的资料哦,更多资料请访问王道论坛:www.cskaoyan.com 2011年华科计算机考研复试机试题真题:

  2. 华科计算机考研复试真题,华科计算机考研复试机试题(2000-2013)

    华科计算机考研复试机试题(2000-2013),c++实现,注本人参加过2014年华科上机考试,老师说机试时可以使用c语言,c++语言. 2000年 阶乘 #include #include #inc ...

  3. 华科计算机考研复试真题,华科计算机考研复试机试题【含参考代码】

    华科计算机考研复试机试题[含参考代码] (32页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.9 积分 华科历年复试机试题汇总上机考试.一般网站上公 ...

  4. 上交复试机试题Old BIll

    上交复试机试题Old BIll 问题描述: Among grandfather's papers a bill was found. 72 turkeys $_679_ The first and t ...

  5. 中南大学2019研究生复试机试题

    中南大学2019研究生复试机试题 机试题共六题 1.选球问题 题目描述 输入 输出 样例输入 样例输出 解决代码 2.模拟出入栈游戏 题目描述 输入 输出 样例输入 样例输出 解决代码 3.爬楼梯游戏 ...

  6. 2022年华东师范大学计科考研复试机试题-详细题解

    2023大厂真题提交网址(含题解): www.CodeFun2000.com(http://101.43.147.120/) 最近我们一直在将收集到的机试真题制作数据并搬运到自己的OJ上,供大家免费练 ...

  7. 1019: 堆石子 2016年中南大学研究生复试机试题

    题目描述 在一片沙滩上摆放着 n堆石子. 现要将石子有次序地合并成一堆. 规定每次选2 堆相邻石子合并成新的一堆,合并的费用为新的一堆石子数.试设计一个算法,计算出将 n堆石子合并成一堆的最小总费用. ...

  8. 2016年中南大学研究生复试机试题(1015~1019)

    目录: **A:第几天 B:加油站 C:序列求平均 D:士兵排阵 ** A:第几天 http://39.106.164.46/problem.php?id=1015 思路: 分闰年和非闰年讨论即可. ...

  9. 北理python复试_北理复试及其初试超强总结(转)

    1 . 重视笔试:笔试的科目包括数字电子电路和模拟电子电路,其中题型包括填空. 判断和计算.总的笔试时间是 120 分钟,如果掌握得好一个小时左右就可以做完,题量不 小,覆盖的面比较广,但题目不难. ...

  10. 13-19年复旦大学计算机学院研究生复试机试题

    (不保证代码完全正确,自己敲的可能存在不完善的地方,请各位大佬发现后指出,谢谢!) 暂时结束. 试题列表 2019上机题 2018上机题 2017上机题 2016上机题 2015上机题 2014上机题 ...

最新文章

  1. 企业架构研究总结(2)——问题的由来和基本概念
  2. 无软件linux,无需安装即可运行或演示Linux的方法 (1)
  3. Linux移植随笔 tslib
  4. 错误代码#1045 Access denied for user 'root'@'localhost' (using password:YES)
  5. python ide是什么意思_初学Python使用什么IDE会更好?
  6. python中控制代码块逻辑关系_一、Python基础知识
  7. 自反而缩,虽千万人,吾往矣。
  8. 推进 DevSecOps 走向未来
  9. C++ 类的设计与实现规范
  10. usb驱动---linux ACM驱动详解ACA【转】
  11. h5与微信小程序直播开发
  12. Win7动态主题制作
  13. Java 获取Excel中的表单控件
  14. 压力换算公斤单位换算_压力单位换算方法
  15. 前端开发css样式基础篇
  16. 父子游标不可共享的情况分析
  17. 三国杀网页版普通服务器怎么进,就想知道老服怎么进_三国杀Online_玩家社区_三国杀官方社区 - Powered by Discuz!...
  18. python hypothesis testing
  19. 李宏毅老师《机器学习》课程笔记-2.2 为什么是“深度”学习?
  20. arduinopn532模块_Arduino 开源 NFC近场通讯模块 PN532

热门文章

  1. ASP.NET 实践:锁定 ASP.NET 配置设定
  2. 十四、K8s calico网络的通信及网络策略
  3. MPLS virtual private network OptionA实验(华为设备)
  4. 像A + B一样容易
  5. Linux下学习进程控制
  6. shiro实战系列(十一)之Caching
  7. 语音分析应用场景——来电原因分析与运营效率提升
  8. regsvr32.exe是什么东西
  9. 最新 Bitnami redmine安装与配置
  10. iOS 3D Touch功能