算术题(按所需数量)生成

2023-10-08 02:50
文章标签 数量 生成 算术题

本文主要是介绍算术题(按所需数量)生成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

##作业正文


###***part.1----配置环境及工具准备
***
想用C++来着,一点点不知不觉写完了也调试好了,发现还主要都是用的C/尴尬
####① 编程环境准备

电脑中之前已经下载有VS 2017,便不需要额外下载了
###Image

####② github账号准备

之前的一个学期就一直有在使用github来存储平时的一些代码
###Image

“fork”拷贝入自己的同名仓库中
####③ 安装git

成功安装后选择一个文件打开“bash here”,输入以下指令,实现项目克隆到本地
###Image

###***part.2----代码实现
**###
####① 题目要求

 程序接收一个命令行参数 n,然后随机产生 n 道加减乘除(分别使用符号±
/来表示)练习题,每个数字在 0 和 100 之间,运算符在 2 个 到 3 个之间。
 由于阿超的孩子才上一年级,并不知道分数。所以软件所出的练习题在运算过程中不得出现非整数,比如不能出现 3÷5+2=2.6 这样的算式
 练习题生成好后,将生成的n道题及其对应的正确答案输出到一个文件subject.txt中。
####② 思路分析及代码实现

看到题目要求我的想法是每个式子整体由两个部分组成,其中第一部分是参与运算的三个数值、两个运算符,第二部分是”=”和运算结果。
第二部分比较简单,就单纯输出显示或者运算输出
而第一部分需要随机生成
随机生成三个运算数值

还要随机生成两个运算符(均是在“±×/”中随机的一个)
后者可以依旧采用随机生成两个数值
然后替代成符号
(这里可以采用一个替代规则,还需要一个字符数组
作为“运算符库”)
两个运算符为了后面容易调用也采用一个字符数组
存储起来
按照以上说的,要用到多个数组,且要多次存储和调用其中数值,因此我想到采用一个结构体
,如下:


//定义记录每道算术题字符串形式及参与运算的数值的结构体
typedef struct question
{	int a[5];char b[2];//用于记录运算符char c[4];//运算符库int d;//d为结果	
}sums;

其中a用于存储随机生成的5个数值
随机生成函数如下

//随机生成5个数值,3个用于参与运算,2个用于生成运算符,均存于数组a中
int product(sums &L)
{int i;for (i = 0; i < 3; i++){L.a[i] = rand() % 100 + 1;}for (; i < 5; i++){L.a[i] = rand() % 3 + 0;}	return 0;
}

借用数组最后两个元素a[3]和a[4]生成运算符并存储于字符数组中


//利用L.a数组最后两个数值生成运算符
int Operator(sums &L)
{	L.b[0] = L.c[L.a[3]];//随机生成运算符并存储于L.bL.b[1] = L.c[L.a[4]];return 0;
}

这下数值和运算符都已经大体具备了
仔细看题目要求,有一点要求,结果不许为小数,因此需要有一个判断函数,确保生成的式子运算后必须为整数,若为整数同时生成运算结果存储于L.d,以下代码

//判别运算式子是否符合要求,并运算
int Tell(sums &rl,int sum)
{int e;float g, h, f;	if (rl.b[0] == '/' || rl.b[1] == '/'){if (rl.b[0] == '/'){e = rl.a[0] / rl.a[1];g = rl.a[0];h = rl.a[1];f = g / h;if (e != f){return 0;}}else{e = rl.a[1] / rl.a[2];g = rl.a[1];h = rl.a[2];f = g / h;if (e != f){return 0;}}}else{if (rl.a[3] == 0 && rl.a[4] == 0)rl.d = rl.a[0] + rl.a[1] + rl.a[2];elseif (rl.a[3] == 0 && rl.a[4] == 1)rl.d = rl.a[0] + rl.a[1] - rl.a[2];elseif (rl.a[3] == 0 && rl.a[4] == 2)rl.d = rl.a[0] + rl.a[1] * rl.a[2];elseif (rl.a[3] == 0 && rl.a[4] == 3)rl.d = rl.a[0] + rl.a[1] / rl.a[2];elseif (rl.a[3] == 1 && rl.a[4] == 0)rl.d = rl.a[0] - rl.a[1] + rl.a[2];elseif (rl.a[3] == 1 && rl.a[4] == 1)rl.d = rl.a[0] - rl.a[1] - rl.a[2];elseif (rl.a[3] == 1 && rl.a[4] == 2)rl.d = rl.a[0] - rl.a[1] * rl.a[2];elseif (rl.a[3] == 1 && rl.a[4] == 3)rl.d = rl.a[0] - rl.a[1] / rl.a[2];elseif (rl.a[3] == 2 && rl.a[4] == 0)rl.d = rl.a[0] * rl.a[1] + rl.a[2];elseif (rl.a[3] == 2 && rl.a[4] == 1)rl.d = rl.a[0] * rl.a[1] - rl.a[2];elseif (rl.a[3] == 2 && rl.a[4] == 2)rl.d = rl.a[0] * rl.a[1] * rl.a[2];elseif (rl.a[3] == 2 && rl.a[4] == 3)rl.d = rl.a[0] * rl.a[1] / rl.a[2];elseif (rl.a[3] == 3 && rl.a[4] == 0)rl.d = rl.a[0] / rl.a[1] + rl.a[2];elseif (rl.a[3] == 3 && rl.a[4] == 1)rl.d = rl.a[0] / rl.a[1] - rl.a[2];elseif (rl.a[3] == 3 && rl.a[4] == 2)rl.d = rl.a[0] / rl.a[1] * rl.a[2];elseif (rl.a[3] == 3 && rl.a[4] == 3)rl.d = rl.a[0] / rl.a[1] / rl.a[2];return 1;}return 0;}

具体代码解释:由于小数只会产生于有“/”运算符参与的式子,所以只有在此情况判断是否返回0
然后即将编写主函数时,自然会想到结构体的初始化,初始化函数如下


//初始化结构体SUMSint initList(sums &L)
{int i;for (i = 0; i < 6; i++){L.a[i] = 0;}for (i = 0; i < 2; i++){L.b[i] = 0;}L.d = 0;L.c[0]= '+';L.c[1]= '-';L.c[2]='*';L.c[3]= '/';return 1;
}

然后是主函数部分,其中程序包括,输入算术题数目进行循环调用函数,以及存入文件subject.txt


int main()
{sums rl;FILE *wf;errno_t w;int i;int sum;w = fopen_s(&wf, "subject.txt", "w");if (initList(rl) == 1)cout << "请稍等" << endl;cout << "请输入需要的算术题总数:" << endl;cin >> sum;cout << "*此程序用于算术题的自动生成*" << endl;for (i = 0; i < sum; i++){product(rl);cout << "正在生成第" << i << "个运算式" << endl;Operator(rl);//生成运算符并存储于rl.bif (Tell(rl, sum) == 0)//调用函数Tell对整体式子进行判断是否符合要求,符合则进一步运算出结果{i--;}else{fprintf(wf, "%d ", rl.a[0]);fprintf(wf, "%c ", rl.b[0]);fprintf(wf, "%d ", rl.a[1]);fprintf(wf, "%c ", rl.b[1]);fprintf(wf, "%d", rl.a[2]);fprintf(wf, "=");fprintf(wf, "%d", rl.d);fprintf(wf, "\n");cout << "写入完毕" << endl;initList(rl);}}fclose(wf);}

####③ 运行展示

###Image

###Image

###***part.3----测试

####①单元测试
右键解决方案先创建单元测试项目
####Image

为了对原来项目各个函数进行测试,需要引入原来项目
####Image

对各个函数按顺序逐一测试,全部通过
####Image

####②回归测试
再次对原项目测试,仍无差错。

###***part4----感想
***
本次作业的完成坎坷很多,但正如一句西方名言所说,“收获与磨难永成正比”,通过完成这个作业,也同时受益颇多。

一方面虽然之前一直在使用github,但都是在线建立仓库与文件,用来存储日常代码,这次之后才了解到了git的具体使用,但是各种git指令还不熟悉,需要在后续的使用中渐渐掌握。

代码方面这次的题目整体是比较简单的,没有花费过多时间,只是期间整形赋值给字符数组时遇到过问题,于是不得不改变原有显示、存储字符串的方案,采用字符输出。但后续代码编写能力还有待提高,尤其后面要努力提高对C++和正在学的python的掌握。

最大的收获还是了解了单元测试这方面吧,之前很少接触这个,非常感谢我们的课程能给我们一个机会去接触这些。

这篇关于算术题(按所需数量)生成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162192

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];