加减法练习

题目要求:

  • 在答题程序开始前,可以通过简单的输入输出交互,让用户确定题目的数量(n)、运算的大小范围(默认为0~100)及是否设计乘除法。

  • 程序每次运行时,会一次输出n道简单的 加减/加减乘除 法练习题。每输出1道题,等待用户输入其计算答案。

  • 在n道题目全部解答完毕后,程序会给出用户答对与答错的题目个数,并给出答错的题目与其正确答案。

  • 可以制定相应的赋分规则,向用户输出答题的最终得分。

  • 统计用户回答每一道题的用时,并向用户输出答题平均用时与最短用时。

代码实现:

#include<iostream>
#include<cstdlib>
#include<chrono>
#include<vector>
#include<string>
#include<cmath>int n, num = 0;  //n:题目总数 ;  num:答对题目数量
bool flag; // flag = 1 : 有乘除法; flag = 0 : 无乘除法
int n_min = 1, n_max = 100;  // 出题范围在 n_min ~ n_max 之间(默认范围为1~100)
std::vector<std::string> errlog; // 记录错题
std::vector<double> error_ans, ack; // 分别记录错误回答及对于正确答案
std::vector<double> times; //记录每题答题时间//输入判定,确保输入的是bool型
void Input_bool( bool& m)
{while (!(std::cin >> m)) //输入出错{std::cin.clear(); // 清除错误标志std::cin.ignore(1024, '\n');// 清除缓冲区,将回车(包括回车)之前的数据全部清除std::cout << "输入 0 或 1,请重新输入:";};std::cin.ignore(1024,'\n');
}//输入判定,确保输入的是整型
void Input_int( int& m)
{while (!(std::cin >> m)){std::cin.clear();std::cin.ignore(1024, '\n');std::cout << "此处输入必须为一个整数,请重新输入:";};std::cin.ignore(1024,'\n');
}//输入判定,确保输入的是整型或浮点型
void Input_value(double& m, int oper)
{if (oper == 4) {while (!(std::cin >> m)){std::cin.clear();std::cin.ignore(1024, '\n');std::cout << "此处输入必须为一个整数/浮点数,请重新输入(尽量四舍五入并保留两位小数):";};m = round(m * 100) / 100; //四舍五入保留两位小数}else {int temp;Input_int(temp);m = static_cast<double>(temp);}
}//答题前的简单交互
void Info()
{std::cout << "\t\t\t\t欢迎来到Wkingbai的加减法练习系统\n\n" << "请输入您所希望的答题数目:";Input_int(n);std::cout << "\n本系统默认运算范围为1~100是否需要重新设置(1:需要,0:不需要):";bool r;Input_bool(r);if (r) {std::cout << "请设置最小取值:";Input_int(n_min);std::cout << "请设置最大取值:";Input_int(n_max);}std::cout << "\n您希望您的题目中包含乘除法吗?(yes 请输入:1, no 请输入:0 )    答:";Input_bool(flag);if (flag)std::cout << "\n除法运算结果最少保留两位小数(四舍五入)";std::cout << "\n\n\t本次答题共100分,每题答对得" << 100.0 / n << "分,答错不得分\n\n";
}//出题及答题
void Questions_ans()
{// res: 正确答案  ,  ans : 学生回答  , oper : 运算类型(1:加,2:减,3:乘,4:除)double  res, ans;int oper;  //出题类型srand(time(NULL));for (int i = 0; i < n; ++i) {std::string log; // 记录出题题目std::cout << "第" << i + 1 << "道题:";oper = flag ? rand() % 4 + 1 : rand() % 2 + 1; //依据flag,随机选取出题类型int a = rand() % (n_max - n_min + 1) + n_min;int b = rand() % (n_max - n_min + 1) + n_min;switch (oper) {case 1: {res = a + b;log = std::to_string(a) + "+" + std::to_string(b) + "=";}break;case 2: {res = a - b;log = std::to_string(a) + "-" + std::to_string(b) + "=";}break;case 3: {res = a * b;log = std::to_string(a) + "*" + std::to_string(b) + "=";}break;case 4: {res = a / (b * 1.0);res = round(res * 100) / 100;log = std::to_string(a) + "/" + std::to_string(b) + "=";}break;}std::cout << log << std::endl;  //输出出题题目const auto start = std::chrono::steady_clock::now(); //开始计时Input_value(ans,oper);const auto end = std::chrono::steady_clock::now();//结束计时auto endtime = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() / 1000.0; // 计算答题时间times.push_back(endtime);if (ans == res)++num;else {errlog.push_back(log);error_ans.push_back(ans);ack.push_back(res);}std::cout << '\n';}
}//得分与错题结果
void result()
{double min_s = DBL_MAX, avg_s = 0;  //答题最短用时 和 平均用时for (int i = 0; i < times.size(); ++i){if (min_s > times[i])min_s = times[i];avg_s += times[i] / times.size();}std::cout << "本次答题共答对题目" << num << "道," << "答错" << n - num << "道。";std::cout << "答题平均用时为:" << avg_s << "秒," << "最短用时为:" << min_s << "秒。";std::cout << "您最终得分为" << (100.0 / n) * num << std::endl;if (num == n)std::cout << "\n\n\t\t恭喜你全部答对了,真是个天才呢!\n\n" << std::endl;else {std::cout << "\n答错题目及正确答案如下:\n\n";for (int i = 0; i < errlog.size(); ++i) {std::cout << errlog[i] << '\n';std::cout << "你的答案为:" << error_ans[i] << '\n';std::cout << "正确答案为:" << ack[i] << '\n';std::cout << std::endl;}}
}int main()
{Info();  //系统交互,进行一些常规设置std::cout << "\n\n\t\t\t\t答题开始\n\n";Questions_ans(); // 出题及解答std::cout << "\n\n\t\t\t\t答题结束\n\n";result(); // 得分与错题结果return 0;
}

C++基础与深度解析 || 加减法练习相关推荐

  1. [深蓝学院]c++基础与深度解析

    c++基础与深度解析 第二章 对象与基本类型 从初始值/赋值语句说起.类型讲起

  2. 部分仍在编辑文章 - Python基础专题 - 深度解析python中的赋值与拷贝

    深度解析python中的赋值与拷贝 jcLee95 的 CSDN 博客:https://blog.csdn.net/qq_28550263?spm=1011.2124.3001.5343 邮箱 :29 ...

  3. 【C++】深蓝学院课程:C++基础与深度解析 - 课程知识点目录

    第5章: 表达式基础与详述(类型转换) 第3节: 表达式基础:类型转换 28:[视频]类型转换 整型提升和浮点提升(无损转换) reinterpret_cast:主要用于指针相关的类型转换 为什么不建 ...

  4. 人工智能到底是什么?AI基础概念深度解析

    通常人们提到人工智能的基础概念是什么?其实人工智能涉及的内容非常广泛,从数学到计算机科学.想要学习人工智能的小伙伴要明白很多的基础知识,在这里小编会将人工智能的基础概念做一个总结梳理. 人工智能到底是 ...

  5. AI大语音(一)——语音识别基础(深度解析)

    本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 1 语音识别基础 1.1 声音特性 声音是由物体振动产生的声波.是通过介质传播并能被人或动 ...

  6. 利用函数wavread对语音信号进行采样_AI大语音(一)——语音识别基础(深度解析)...

    1 声音特性​ 声音(sound)是由物体振动产生的声波.是通过介质传播并能被人或动物听觉器官所感知的波动现象.最初发出振动的物体叫声源.声音以波的形式振动传播.声音是声波通过任何介质传播形成的运动. ...

  7. C++基础与深度解析第八章:动态内存管理

  8. C++基础与深度解析第七章:深入IO

  9. C++基础与深度解析第六章:函数

最新文章

  1. vs code php html,vscode如何调试html
  2. SVG 图像入门教程
  3. Sql Server之旅——第四站 你必须知道的非聚集索引扫描
  4. 【转】算法导论学习笔记 一 分治算法
  5. 一个文章表的 MySQL 索引怎么建立合理
  6. opencv3.4.1 + vs 2017 + cmake 3.11.3 + win10 配置. 终章
  7. Project Euler Problem 27 Quadratic primes
  8. 基于单片机的银行排队叫号系统的设计
  9. 瑞斯凯X9D Plus无法连接DCL模拟器的解决方法
  10. 微信支付一面(C++后台)
  11. fiddler打开之后google浏览器无法上网的解决办法
  12. linux软防火墙DDOS,Linux iptables防火墙详解 + 配置抗DDOS***策略实战
  13. QQ空间说说一键批量删除软件2.0使用教程
  14. crmeb v4.5.0版本 二次开发 新增加分机号功能 代码披露
  15. Android studio 入门笔记
  16. 微信内测新功能(深度清理),瞬间释放几个G内存!
  17. Oracle 计算日期规避节假日
  18. 人工智能如何用在智能家居行业?
  19. Python之23种设计模式
  20. shell 中字符串变量处理

热门文章

  1. java自动生成项目编号_java - Apache POI,在同一文档中创建项目符号点和编号列表 - 堆栈内存溢出...
  2. 数的概念扩展——复数
  3. 抓取七星彩历史开奖数java据,七星彩中五个号
  4. 联想小新pro14/yoga 14s 2021安装ubuntu/kali/manjaro问题排雷,解决自带键盘、触摸板和显卡驱动问题
  5. 根据抖音账号的分享链接下载无水印视频
  6. 整理:微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog
  7. 《谈判力》读书笔记:第一章 直接在立场上讨价还价的谈判方式的问题
  8. css实现多个loading动画效果
  9. html5泵站,HTML5 WebGL污水处理厂泵站自控系统
  10. 智慧城市渔友云智能水产养殖系统