源代码:

  1. //2016 3.6 Cheng Qiqin
  2. //四则运算改进
  3. #include <iostream>
  4. #include<ctime>
  5. #include<cstdlib>
  6. #include<iomanip>
  7. #include<fstream>
  8. using namespace std;
  9.  
  10. void proNum(int &ProNum)//确定题目数量
  11. {
  12. cout<<"请输入运算式的数量: ";
  13. cin>>ProNum;
  14. if(ProNum<)
  15. {
  16. cout<<"输入错误,";
  17. proNum(ProNum);
  18. }
  19. }
  20.  
  21. void typeway(int &type)//确定打印方式
  22. {
  23. cout<<"请输入打印方式(1、输出到屏幕 2、输出到文件): ";
  24. cin>>type;
  25. if(type>||type<)
  26. {
  27. cout<<"输入错误,";
  28. typeway(type);
  29. }
  30. }
  31.  
  32. void ismulAndDiv(int &isMulAndDiv)//确定是否有乘除法
  33. {
  34. cout<<"是否有乘除法(1、是 2、否):";
  35. cin>>isMulAndDiv;
  36. if(isMulAndDiv<||isMulAndDiv>)
  37. {
  38. cout<<"输入错误,";
  39. ismulAndDiv(isMulAndDiv);
  40. }
  41. }
  42.  
  43. int operationSymbol(int &isMulAndDiv)//确定是否有乘除法
  44. {
  45. if(isMulAndDiv==)
  46. {
  47. return ;
  48. }
  49. else
  50. {
  51. return ;
  52. }
  53. }
  54.  
  55. void isparenthese(int &isParenthese)//确定是否有括号
  56. {
  57. cout<<"是否有括号(1、是 2、否): ";
  58. cin>>isParenthese;
  59. if(isParenthese<||isParenthese>)
  60. {
  61. cout<<"输入错误,";
  62. isparenthese(isParenthese);
  63. }
  64. }
  65.  
  66. void isneg(int &isNeg)//确定加减有无负数
  67. {
  68. cout<<"加减有无负数(1、有 2、无): ";
  69. cin>>isNeg;
  70. if(isNeg<||isNeg>)
  71. {
  72. cout<<"输入错误,";
  73. isneg(isNeg);
  74. }
  75. }
  76.  
  77. void isremainder(int &isRemainder)//确定除法有无余数
  78. {
  79. cout<<"除法有无余数(1、有 2、无): ";
  80. cin>>isRemainder;
  81. if(isRemainder<||isRemainder>)
  82. {
  83. cout<<"输入错误,";
  84. isremainder(isRemainder);
  85. }
  86. }
  87.  
  88. void DivisorNotZore(int &Divisor,int RangeNum)//排除除数为0
  89. {
  90. while(Divisor==)
  91. {
  92. Divisor=rand()%RangeNum;
  93. }
  94. }
  95.  
  96. void Neg(int number1,int &number2,int RangeNum)//排除形如a-b结果为负的情况
  97. {
  98. while(number1<number2)
  99. {
  100. number2=rand()%RangeNum;
  101. }
  102. }
  103.  
  104. void Remainder(int number1,int &number2,int RangeNum)//排除有余数的情况
  105. {
  106. while((number1%number2)!=)
  107. {
  108. number2=rand()%RangeNum;
  109. DivisorNotZore(number2,RangeNum);
  110. }
  111. }
  112.  
  113. void main()
  114. {
  115. srand((int)time()); //设定时间种子
  116. int ProNum,type,isMulAndDiv,isParenthese,RangeNum,isNeg,isRemainder;
  117. int number[][],Prolength[],Rbr=,num,i,j,n; //number[100][10]用于存放每个表达式中数字,Prolength[100]用于记录表达式的长度
  118. char Problems[][];// Problems[100][100]用于存放表达式
  119. char fuhao[]={'+','-','*','/'};
  120. proNum(ProNum);
  121. typeway(type);
  122. ismulAndDiv(isMulAndDiv);
  123. isparenthese(isParenthese);
  124. isneg(isNeg);
  125. if(isMulAndDiv==)
  126. {
  127. isremainder(isRemainder);
  128. }
  129. cout<<"请输入数值范围:"<<endl;
  130. cout<<"请输入上限:";
  131. cin>>RangeNum;
  132. if(RangeNum<){
  133. cout<<"输入错误,请重新输入上限:";
  134. cin>>RangeNum;
  135. }
  136.  
  137. if(isParenthese==)//有括号
  138. {
  139. for(i=;i<ProNum;i++)
  140. {
  141. num=rand()%+;//随机得出每个表达式中数的个数
  142. j=;
  143. int leftParenthese[],loc=;
  144. if(num==)//运算式中只有两个数时,不需要括号
  145. {
  146. for(n=;n<num;n++)
  147. {
  148. Problems[i][j]='n';
  149. number[i][n]=rand()%RangeNum;
  150. if(Problems[i][j-]=='/')//排除除号后面的数为0的情况
  151. {
  152. DivisorNotZore(number[i][n],RangeNum);
  153. }
  154. j++;
  155. if(n<num-)//添加运算符
  156. {
  157. Problems[i][j]=fuhao[rand()%operationSymbol(isMulAndDiv)];
  158. j++;
  159. }
  160. }
  161. Prolength[i]=j;//记录运算式的长度
  162. }
  163. else//运算式中数超过两个,出现括号
  164. {
  165. for(n=;n<num;n++)
  166. {
  167. while(rand()%)//添加左括号
  168. {
  169. Rbr++;
  170. Problems[i][j]='(';
  171. leftParenthese[loc]=j;
  172. loc++;
  173. j++;
  174. }
  175. Problems[i][j]='n';
  176. number[i][n]=rand()%RangeNum;//排除除号后面的数为0的情况
  177. if(Problems[i][j-]=='/')
  178. {
  179. DivisorNotZore(number[i][n],RangeNum);
  180. }
  181. j++;
  182. while(rand()%==)//添加右括号
  183. {
  184. if(Rbr>)
  185. {
  186. Rbr--;
  187. loc--;
  188. if(Problems[i][j-]=='(')//排除形如(20)的情况
  189. {
  190. Problems[i][j-]=Problems[i][j-];
  191. j--;
  192. }
  193. else
  194. {
  195. if(Problems[i][leftParenthese[loc]]=='('&&Problems[i][leftParenthese[loc]+]=='('&&Problems[i][j-]==')')
  196. {
  197. for(int loction=leftParenthese[loc];loction<j-;loction++)
  198. {
  199. Problems[i][loction]=Problems[i][loction+];
  200. }
  201. j--;
  202. }
  203. else
  204. {
  205. Problems[i][j]=')';
  206. j++;
  207. }
  208. }
  209. }
  210. else{
  211. break;
  212. }
  213. }
  214. if(n<num-)//添加运算符
  215. {
  216. Problems[i][j]=fuhao[rand()%operationSymbol(isMulAndDiv)];
  217. j++;
  218. }
  219. }
  220. while(Rbr>)//保证左括号数量与右括号数量相等
  221. {
  222. Rbr--;
  223. loc--;
  224. if(Problems[i][j-]=='(')//排除形如(20)的情况
  225. {
  226. Problems[i][j-]=Problems[i][j-];
  227. j--;
  228. }
  229. else
  230. {
  231. if(Problems[i][leftParenthese[loc]]=='('&&Problems[i][leftParenthese[loc]+]=='('&&Problems[i][j-]==')')
  232. {
  233. for(int loction=leftParenthese[loc];loction<j-;loction++)
  234. {
  235. Problems[i][loction]=Problems[i][loction+];
  236. }
  237. j--;
  238. }
  239. else
  240. {
  241. Problems[i][j]=')';
  242. j++;
  243. }
  244. }
  245. }
  246. Prolength[i]=j;
  247. }
  248. for(int k=;k<i;k++)//排除运算式重复
  249. {
  250. if(Problems[k]==Problems[i])
  251. {
  252. i--;
  253. break;
  254. }
  255. }
  256. }
  257. }
  258. else
  259. {
  260. for(i=;i<ProNum;i++){
  261. num=rand()%+;
  262. j=;
  263. for(n=;n<num;n++){
  264. Problems[i][j]='n';
  265. number[i][n]=rand()%RangeNum;
  266. if(Problems[i][j-]=='/')//排除除号后面的数为0的情况
  267. {
  268. DivisorNotZore(number[i][n],RangeNum);
  269. }
  270. j++;
  271. if(n<num-)//添加运算符
  272. {
  273. Problems[i][j]=fuhao[rand()%operationSymbol(isMulAndDiv)];
  274. j++;
  275. }
  276. }
  277. Prolength[i]=j;//记录运算式的长度
  278. for(int k=;k<i;k++)//排除重复
  279. {
  280. if(Problems[k]==Problems[i])
  281. {
  282. i--;
  283. break;
  284. }
  285. }
  286. }
  287. }
  288. int s,t,q;
  289. ofstream of("problems.txt");
  290. if(!of)
  291. exit();
  292. for(i=;i<ProNum;i++)//表达式数量
  293. {
  294. s=;
  295. t=;
  296. q=Prolength[i];
  297. while(Problems[i][s]=='('&&Problems[i][q-]==')')//排除表达式首尾都有括号且无意义时的情况
  298. {
  299. int m,n=;
  300. bool kuohao=true;
  301. for(m=s;m<q-;m++)
  302. {
  303. if(Problems[i][m]=='(')
  304. {
  305. n++;
  306. }
  307. if(Problems[i][m]==')')
  308. {
  309. n--;
  310. }
  311. if(n==)
  312. {
  313. kuohao=false;
  314. break;
  315. }
  316. }
  317. if(kuohao)
  318. {
  319. s++;
  320. Prolength[i]=Prolength[i]-;
  321. q=q-;
  322. }
  323. else
  324. {
  325. break;
  326. }
  327. }
  328. while(Prolength[i]>)
  329. {
  330. if(Problems[i][s]=='n')
  331. {
  332. if(t>)
  333. {
  334. if(isNeg==)
  335. {
  336. if(Problems[i][s-]=='-'&&Problems[i][s-]=='n')
  337. {
  338. Neg(number[i][t-],number[i][t],RangeNum);
  339. }
  340. }
  341. if(isRemainder==)
  342. {
  343. if(Problems[i][s-]=='/'&&Problems[i][s-]=='n')
  344. {
  345. Remainder(number[i][t-],number[i][t],RangeNum);
  346. }
  347. }
  348. }
  349. if(type==)
  350. {
  351. cout<<number[i][t];
  352. }
  353. else
  354. {
  355. of<<number[i][t];
  356. }
  357. s++;
  358. t++;
  359. }
  360. else
  361. {
  362. if(type==)
  363. {
  364. cout<<Problems[i][s];
  365. }
  366. else
  367. {
  368. of<<Problems[i][s];
  369. }
  370. s++;
  371. }
  372. Prolength[i]--;
  373. }
  374. if(type==)
  375. {
  376. cout<<"="<<endl;
  377. }
  378. else
  379. {
  380. of<<"="<<endl;
  381. }
  382. }
  383. of.close();
  384. if(type==)
  385. {
  386. cout<<"出题完毕!"<<endl;
  387. }
  388. else
  389. {
  390. cout<<"出题完毕,题目已成功存入problems.txt!"<<endl;
  391. }
  392. }

测试用例:

1:验证结果正确性:

测试用例:测试输出30个式子,输出到屏幕上,有乘除法,有括号,有负数,有余数,范围为0-100

测试预期结果:

出现30个运算式,运算式有出现括号,每种括号出现形式均包括,但不出现无意义的括号

测试结果:

2、验证是否所有的边界条件都满足

测试用例:测试当输入表达式数量为0、数值上限小于1时

测试预测结果:要求重新输入表达式数量、数值上限

测试结果:

3、检查能否强制出现错误

测试用例:在选择是否出现乘除法,是否出现括号等问题时,不输入1,2 ,输入其他

测试预测结果:要求重新输入

测试结果:

4、测试有序性

测试用例:测试出现多个运算式,观察运算式中是否有无意义的括号出现

测试预期结果:运算式中每个括号都有意义

测试结果:

5、测试是否满足性能要求:

测试用例:有无乘除有无括号时运算式的状态

测试预期结果:符合题目要求

测试结果:

6、测试输入到文件是否会出现问题

测试用例:选择输出到文件

测试预期结果:problems.txt文件中存入了运算式

测试结果:

单元测试--四则运算2程序(c++)的更多相关文章

  1. 300道随机四则运算小程序(java编写)

    这是由Java编写的300道随机四则运算小程序, 运算数范围为0~100(不包括100),运算结果保留两位小数. 程序代码: import java.util.*; class Yunsuan{ pu ...

  2. 任务02——安装 Intellj IDEA,编写一个简易四则运算小程序,并将代码提交到 GitHub

    github地址:https://github.com/ErhuoHome/First.git 安装jdk与intellij idea没有太大问题,以前安装过eclipse 在程序方面,由于对真分数的 ...

  3. 结对项目-四则运算出题程序(GUI版)

    目录: 一.致搭档(含项目地址) 二.PSP(planning) 三.结对编程中对接口的设计 四.计算模块接口的设计与实现过程 五.计算模块接口部分的性能改进 六.计算模块部分单元测试展示 七.计算模 ...

  4. 任务04——对四则运算小程序的进一步改进,并学习 Git 中 Branch 的用法

    https://github.com/jinxiaohang/Operation/tree/test01 对于任务2的代码进行优化修改感觉很麻烦,所以直接选择重写代码完成任务四, 任务四很早就发布了, ...

  5. Right-BICEP 测试四则运算二程序

    测试方法: Right-BICEP 测试计划: 1.Right-结果是否正确? 2.B-是否所有的边界条件都是正确的? 3.是否有乘除法? 4.是否有括号? 5.是否有输出方式? 6.是否可以选择出题 ...

  6. 结对编程作业——四则运算GUI程序

    毛忠庆 201421122088 赵嘉楠 201421122065 源代码存放位置:https://gitee.com/ouwen0819/SiZeYunSuan.git 题目描述 使用 -n 参数控 ...

  7. 按照Right-BICEP要求设计四则运算2程序的单元测试用例

    Right——结果是否正确? B——是否所有的边界条件都是正确的? I——能查一下反响关联吗? C——能用其它手段交叉检查一下吗? E——你是否可以强制错误条件发生? P——是否满足性能要求? 测试计 ...

  8. 按照Right-BICEP要求设计四则运算3程序的单元测试用例

    按照Right-BICEP要求: Right——结果是否正确? B——是否所有的边界条件都是正确的? I——能查一下反响关联吗? C——能用其它手段交叉检查一下吗? E——你是否可以强制错误条件发生? ...

  9. 小学生四则运算出题程序 无操作界面java版 简单的运用java中一些基本操作

    这是本学期java课中实验大纲里的第一个实验,这里简单做了一个无用户界面版本. import java.util.Random; import java.util.Scanner; public cl ...

随机推荐

  1. sqlite多表关联update

    sqlite数据库的update多表关联更新语句,和其他数据库有点小不一样 比如:在sql server中: 用table1的 id 和 table2的 pid,关联table1 和 table2 , ...

  2. 使用ASP.Net WebAPI构建REST服务(五)——客户端

    WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问.但是,有的时候我们如果想在自己的程序中使用WebAPI时,此时就要实现自己的客户端了.我之前介绍过在.Net 4.5中 ...

  3. python操作二进制文件

    有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...

  4. Spring框架及IOC容器

    Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多层JavaEE系统的框架,它的主要目地是简化企业开发.Spring以一种非侵入式的方式来管理你的代码, Spring提倡”最少 ...

  5. 根据窗体自动调整控件及文本框记住上次填写内容Demo

    第一次写文章,组词难免没有不通之处... 最近常用到Winform根据窗体大小自动调整空间大小及字体.文本框记住上次填写内容待下次输入某一段时候自动跳出上次输入内容.于是就随便把两个问题放到同一个de ...

  6. xlistview的java(脚)

    package com.bwie.xlistviews; import com.bwie.test.R; import android.content.Context;import android.u ...

  7. LINQ基础(一)

    一.学习LINQ需要先了解以下知识点: 1.1 委托 1.2 匿名方法 1.3 Lambda表达式 1.4 扩展方法 二.LINQ原理:      from s in names where s.le ...

  8. 修改Oracle数据库的字符集为UTF-8

    1.改客户端字符集:通过WINDOWS的运行菜单运行Regedit,修改注册表 Start -> Run -> Rededit <-| Under registry Editor - ...

  9. iOS7中计算UILabel中字符串的高度

    iOS7中计算UILabel中字符串的高度 iOS7中出现了新的方法计算UILabel中根据给定的Font以及str计算UILabel的frameSize的方法.本人提供category如下: UIL ...

  10. linux基础命令(二)用户管理和权限管理