一个简单的Qt Console Application计算练习程序
初步体验Qt Creator
用途:练习20以内2位数乘法速算的程序
功能1:支持用户设定题目数量
std::cout << "请输入本次练习题目数量:";int numProblems = 0;std::string num;std::cin >> num;try {numProblems = std::stoi(num);MathQuiz quiz(numProblems);quiz.runQuiz();} catch (const std::invalid_argument& e) {std::cerr << "请输入合法的整数结果!\n";continue;}
功能2:支持随机生成期望数量的题目
void MathQuiz::generateProblems() {for (int i = 0; i < numProblems; i++) {int randomValue1 = generateRandomValue();int randomValue2 = generateRandomValue();problems.emplace_back(randomValue1, randomValue2);}
}int MathQuiz::generateRandomValue() { return randomGenerator.bounded(10, 21); }
功能3:支持判断用户输入结果的准确性
bool MathQuiz::promptAndCheckAnswer(int value1, int value2, int index) {std::cout << std::format("{}-{} 请计算:{}×{}=", index, numProblems, value2,value1);std::string str;int result = 0;std::cin >> str;try {result = std::stoi(str);} catch (const std::invalid_argument& e) {std::cerr << "请输入合法的整数结果!\n";}return result == value2 * value1;
}
功能4:循环出题,并支持记录计算错误的题目
std::map<int, std::string> incorrectProblems;for (int i = 0; i < numProblems; i++) {const auto& problem = problems[i];bool correct = false;while (!correct) {correct = promptAndCheckAnswer(problem.first, problem.second, i + 1);if (!correct) {std::cout << "回答错误,请再试一次。\n";incorrectProblems.insert(std::pair<int, std::string>(i + 1, std::format("{}×{}", problem.first, problem.second)));} else {if (incorrectProblems.find(i + 1) == incorrectProblems.end()) {numCorrect++;}break;}}}
功能5:支持统计正确题目数、平均计算耗时和总计耗时
void MathQuiz::printResults(double elapsedTime) {double correctPercent = numCorrect * 100 / numProblems;QTextStream out(stdout);QString outstr =QString("共%2题,答对%1题,正确率:%3%,平均用时:%4秒,累计用时:%5秒。\n").arg(numCorrect).arg(numProblems).arg(correctPercent).arg(elapsedTime / numProblems).arg(elapsedTime);out << outstr;
}
程序结构:
main.cpp主程序
#include <windows.h>#include <QCoreApplication>
#include <iostream>#include "mathquiz.h"int main() {SetConsoleOutputCP(CP_UTF8);while (true) {std::cout << "请输入本次练习题目数量:";int numProblems = 0;std::string num;std::cin >> num;try {numProblems = std::stoi(num);MathQuiz quiz(numProblems);quiz.runQuiz();} catch (const std::invalid_argument& e) {std::cerr << "请输入合法的整数结果!\n";continue;}std::cout << "是否继续练习? (y/n):";std::string yn;std::cin >> yn;if (yn != "y" && yn != "Y") break;}return 0;
}
mathquiz.cpp,一个计算功能类
#include "mathquiz.h"#include <iostream>MathQuiz::MathQuiz(int numProblems) : numCorrect(0), numProblems(numProblems) {randomGenerator.seed(QTime::currentTime().msec());generateProblems();
}void MathQuiz::runQuiz() {QTime startTime = QTime::currentTime();std::map<int, std::string> incorrectProblems;for (int i = 0; i < numProblems; i++) {const auto& problem = problems[i];bool correct = false;while (!correct) {correct = promptAndCheckAnswer(problem.first, problem.second, i + 1);if (!correct) {std::cout << "回答错误,请再试一次。\n";incorrectProblems.insert(std::pair<int, std::string>(i + 1, std::format("{}×{}", problem.first, problem.second)));} else {if (incorrectProblems.find(i + 1) == incorrectProblems.end()) {numCorrect++;}break;}}}QTime endTime = QTime::currentTime();double elapsedTime = startTime.msecsTo(endTime) / 1000.0;printResults(elapsedTime);printIncorrectProblems(incorrectProblems);
}void MathQuiz::generateProblems() {for (int i = 0; i < numProblems; i++) {int randomValue1 = generateRandomValue();int randomValue2 = generateRandomValue();problems.emplace_back(randomValue1, randomValue2);}
}int MathQuiz::generateRandomValue() { return randomGenerator.bounded(10, 21); }bool MathQuiz::promptAndCheckAnswer(int value1, int value2, int index) {std::cout << std::format("{}-{} 请计算:{}×{}=", index, numProblems, value2,value1);std::string str;int result = 0;std::cin >> str;try {result = std::stoi(str);} catch (const std::invalid_argument& e) {std::cerr << "请输入合法的整数结果!\n";}return result == value2 * value1;
}void MathQuiz::printResults(double elapsedTime) {double correctPercent = numCorrect * 100 / numProblems;QTextStream out(stdout);QString outstr =QString("共%2题,答对%1题,正确率:%3%,平均用时:%4秒,累计用时:%5秒。\n").arg(numCorrect).arg(numProblems).arg(correctPercent).arg(elapsedTime / numProblems).arg(elapsedTime);out << outstr;
}void MathQuiz::printIncorrectProblems(const std::map<int, std::string>& incorrectProblems) {if (incorrectProblems.empty()) {return;}std::cout << "回答错误的题目:\n";int i = 1;for (const auto& it : incorrectProblems) {const auto& problem = problems[it.first - 1];std::cout << "题目 " << i << ": " << it.second << "="<< (problem.first * problem.second) << "\n";i++;}
}
mathquiz.h头文件
#ifndef MATHQUIZ_H
#define MATHQUIZ_H#include <QRandomGenerator>
#include <QTime>
#include <vector>class MathQuiz {public:MathQuiz(int numProblems);void runQuiz();private:void generateProblems();int generateRandomValue();bool promptAndCheckAnswer(int value1, int value2, int index);void printResults(double elapsedTime);void printIncorrectProblems(const std::map<int, std::string>& incorrectProblems);QRandomGenerator randomGenerator;int numCorrect;int numProblems;std::vector<std::pair<int, int>> problems;
};#endif // MATHQUIZ_H
运行效果
遇到问题总结:
Qt Creator编写Console程序,运行时没反应,应勾选下面选项
Qt Creator编写Console程序,汉字输出乱码
原因1:默认字符输出位置设置的值与Windows控制台默认字符集(GBK)不符
默认字符输出查看与修改
确定控制台窗口使用的编码格式:
原因2:文件编码格式与系统不兼容
原因3:部分库默认使用UTF-8,输出应转码,比如QTextStream
QTextStream out(stdout);
out.setEncoding (QStringConverter::System);
还有个方法,添加windows.h的引用,并在main开始时,添加:
SetConsoleOutputCP(CP_UTF8);
注意:将所有源代码以及系统文件编辑器默认编码均修改为UTF-8即可
相关文章:

一个简单的Qt Console Application计算练习程序
初步体验Qt Creator 用途:练习20以内2位数乘法速算的程序 功能1:支持用户设定题目数量 std::cout << "请输入本次练习题目数量:";int numProblems 0;std::string num;std::cin >> num;try {numProblems std::stoi(…...

windows文件拷贝给wsl2的Ubuntu
参考: windows文件如何直接拖拽到wsl中_win 移到文件到wsl-CSDN博客 cp -r /mnt/盘名/目标文件 要复制到wsl中的位置e.g.cp -r /mnt/d/byt5 /home Linux文件复制、移动、删除等操作命令_linux移动命令-CSDN博客 Linux 文件、文件夹的复制、移动、删除 - Be-myse…...
vivado 采用 SSI 器件进行设计
SSI 管脚的考虑因素 在为特定 SLR 中的组件规划管脚时,请将引脚放置在同一个 SLR 中。例如,将器件的 DNA 信息作为外部接口的一部分 时,请将该接口的引脚放置在 DNA_PORT 所在的主 SLR 中。其它考虑因素包括如下: • 把…...

Lua环境安装
软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua是一种轻量级、小巧且易于嵌入应用程序的脚本语言,广泛用于游戏开发、Web开发、自动化脚本等领域。本文将详细介绍如何在不同操作系统上安装L…...

浏览器控制的无线开关
esp32-c3 作为HTTP server 控制led 灯。服务器注册两个uri 。一个"/open" 控制开,一个"/close"控制关。下一步再用一片c3作为客户端,运行http client 发送/open. /Close 模拟浏览器,控制led. 其实只要用手机或pc或平…...

Docker部署SSM项目及避坑指南
#又踩坑了,这里记录一下,以免日后忘记 前言:本来以为用docker部署个项目很轻松,嗯结果,又踩坑了,这里记录一个完整版。话不多说,开整。 第一步: 用docker拉取MySQL和Tomcat&#…...
多线程代码案例:单例模式/阻塞队列/线程池/定时器
案例一.单例模式 单例模式是一种设计模式;类似于棋谱,有固定套路,针对一些特定场景可以给出一些比较好的解决方案; 只要按照设计模式来写代码,就可以保证代码不会太差,保证了代码的下限; --------------------------------------------------------------------------------…...
Ruby CGI Cookie
Ruby CGI Cookie 在Web开发中,Cookie是一种常用的技术,用于在用户浏览器和服务器之间存储和传递信息。Ruby作为一种流行的编程语言,提供了CGI(Common Gateway Interface)库来处理Cookie。本文将详细介绍如何在Ruby中使用CGI库来创建、读取、修改和删除Cookie。 Cookie的…...

linux中取消anaconda默认使用base环境
在linux新安装anaconda之后,每次打开终端,总是显示正在使用默认anaconda中的base环境,如下如所示: 取消该默认设置,打开home目录下的.condarc文件,在末尾添加如下命令: auto_activate_base: fa…...

江门中微子到底是做什么的?
江门中微子实验是一项重要的大科学装置实验。以下是关于它的一些详细信息: 实验位置与建设深度:位于广东江门地下 700 米处。这样的深度可以有效屏蔽宇宙射线等外界干扰,为探测中微子提供较为纯净的实验环境。探测器特点: 拥有世界…...

React源码03 - React 中的更新
03 - React 中的更新 React 中创建更新的方式: 初次渲染:ReactDOM.render、ReactDOM.hydrate 后续更新:setState、forceUpdate 1. ReactDOM.render() 先创建 ReactRoot 顶点对象然后创建 FiberRoot 和 RootFiber创建更新,使应用进…...
【Hive实战】Hive MetaStore升级调研(Mysql)
Hive MetaStore升级调研(Mysql库) 文章目录 Hive MetaStore升级调研(Mysql库)升级步骤脚本说明原文 MetaStore升级的主要部分是对存储媒介mysql进行schema进行升级。 升级步骤 关闭MetaStore实例并限制对MetaStore MySQL数据库的访…...
优化漏洞扫描流程以保障企业数字化业务安全
漏洞扫描技术历经二十余年发展,已从人工搜索演进至开源及商业扫描平台,其应用紧随IT环境与数字业务变迁而不断革新。为有效提升漏洞检测效果,确保企业数字化业务安全运行,安全专家建议遵循以下关键步骤实施漏洞扫描: …...

【大数据算法】一文掌握大数据算法之:大数据算法分析技术。
大数据算法分析技术 1、引言2、 大数据分析技术2.1 时间/空间复杂度2.2 I/O 复杂度2.3 结果质量2.4 通信复杂度 3、总结 1、引言 小屌丝:鱼哥,最近更文有些不频繁了哈。 小鱼:这一个月不见,你这说话方式也变了。 小屌丝ÿ…...

使用AITemplate和AMD GPU的高效图像生成:结合Stable Diffusion模型
Efficient image generation with Stable Diffusion models and AITemplate using AMD GPUs 2024年1月24日,作者是[Douglas Jia] Stable Diffusion 已成为图像生成领域的突破性进展,帮助用户将文本描述转化为引人入胜的视觉输出。 Stable Diffusion 的…...

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性,实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型,其通过深度学习技术,如卷…...

虚拟机网络设置为桥接模式
1、打开VMware Workstation Pro,点击“虚拟机—设置”,进入虚拟机设置页面 2、点击“网络适配器”,网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”,进入虚拟网络编辑器页面 4、选择桥接模式,并选择要桥接到的…...

Numpy基础02
目录 1.数组操作 1.1改变维度 1.2遍历数组 1.2.1nditer(array,order) 1.2.1.1flags 参数 1.2.1.2op_flags 参数 1.3平展数组 1.3.1flatten(orderC) 1.3.2ravel() 1.4数组转置 1.4.1transpose() 1.4.2T 1.5分割数组 1.5.1hsplit(arr,indices_or_section) 1.5.2vsp…...

Elasticsearch是做什么的?
初识elasticsearch 官方网站:Elasticsearch:官方分布式搜索和分析引擎 | Elastic Elasticsearch是做什么的? Elasticsearch 是一个分布式搜索和分析引擎,专门用于处理大规模数据的实时搜索、分析和存储。它基于 Apache Lucene …...
Java中消息队列
MQ是Message Queue的缩写,也就是消息队列的意思,它是一种应用程序对应用程序的通信方法,使得应用程序能够通过读写出入列队的消息来进行通信,而无需要使用专用的连接来链接它们。消息队列中间件是分布式系统中重要的组件ÿ…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...