四则运算2

一、设计思路:

1、题目避免重复:

(1)利用系统时间来产生随机数,重复率会降低。

(2)建立链表,逐个判断。可读取写入文件。

2、可定制(数量/打印方式):

(1)格式有默认值;

(2)可以选择重新设置分几列和每行的间隔。打印方式用%取余来实现分列输出。

3、可以控制参数:

(1)这些参数都有默认值;

(2)出题之前可以选择重新设置某一个或多个参数;

(3)是否有乘除法/括号/负数/余数/支持分数/支持小数:用户输入1/0表示是/否;

数值范围、真分数、假分数、精确到几位小数、每行的间隔:由用户输入决定;

(4)参数值得记录借鉴老师的方法,用数组来存储;用if-else来确定最终的格式。

是否有乘除法:判断数组中的参数是1还是0,若为0,则判断表示符号的随机数是不是乘除,是的话跳过;

数值范围:由rand()%(b-a+1)+a实现范围为a~b的随机数;

加减有无负数:判断数组中的参数是1还是0,若为0,则判断前一个数是否小于后一个数,是的话跳过;

每行的间隔:根据数组中的数,循环cout<<endl;

是否有余数:判断数组中的参数是1还是0,若为0,用%来判断

二、源代码

(1)

// 四则运算2.cpp : Defines the entry point for the console application.

// 袁佩佩 信1201-1班 20122785 2015/3/15

#include "stdafx.h"

#include "iostream.h"

#include "stdlib.h"

#include "time.h"

#include "Caculation.h"

#include "iomanip.h"

//******重新生成算术题******

void ReBuild(Caculation &Q)

{

if(para[4]==1)

Q.sign=rand()%4;

else

Q.sign=rand()%2;

Q.num1=rand()%(para[6]-para[5]+1)+para[5];

Q.num2=rand()%(para[6]-para[5]+1)+para[5];

}

//*****输出函数******

void Display(LinkC C,Caculation &Q)

{

int temp,count=0;                                                               //count记录重新生成题目的次数

for(int i=1;i<=para[1];i++)

{

cout<<"("<<i<<")";

if(para[4]==1)

Q.sign=rand()%4;                                                //有乘除法

else

Q.sign=rand()%2;                                                //没有乘除法

Q.num1=rand()%(para[6]-para[5]+1)+para[5];                                       //随机的(下限~上限)以内的整数

Q.num2=rand()%(para[6]-para[5]+1)+para[5];

RB:        ReBuild(Q);                                                                //检查是否有出过的题目

if(count>((para[6]-para[5]+1)*(para[6]-para[5]+1)*100))

{

cout<<endl<<"该难度的题目已出完,请更改出题设置!"<<endl;

break;

}

switch(Q.sign)

{

case 0:

if(ExistQues(C,Q))

{

count++;

goto RB;

}

cout<<Q.num1<<"+"<<Q.num2<<"="<<setw(5);

break;

case 1:

if((para[7]==0)&&(Q.num1<Q.num2))

{                                                                    //若为负数,则交换

temp=Q.num1;

Q.num1=Q.num2;

Q.num2=temp;

}

if(ExistQues(C,Q))

{

count++;

goto RB;

}

cout<<Q.num1<<"-"<<Q.num2<<"="<<setw(5);break;

case 2:

if(ExistQues(C,Q))

{

count++;

goto RB;

}

cout<<Q.num1<<"*"<<Q.num2<<"="<<setw(5);break;

case 3:

while(Q.num2==0)

Q.num2=rand()%(para[6]-para[5]+1)+para[5];

if(!para[8])

{

while((Q.num1%Q.num2)!=0||Q.num2==0)

{                                                                    //重新生成

Q.num1=rand()%(para[6]-para[5]+1)+para[5];

Q.num2=rand()%(para[6]-para[5]+1)+para[5];

}

}

if(ExistQues(C,Q))

{

count++;

goto RB;

}

cout<<Q.num1<<"/"<<Q.num2<<"="<<setw(5);break;

}

InsertQues(C,Q);

if(i%para[2]==0)                                                         //一行打印完规定列数,换行

for(int j=0;j<=para[3];j++)

cout<<endl;

}

cout<<endl<<endl;

}

//*****判断难度*****

void YesOrNo(int para)

{

if(para)

cout<<"是";

else

cout<<"否";

}

//*****查看设置*****

void ShowSetting()

{

system("cls");

cout<<"\t/*************四则运算出题系统*************/"<<endl;

cout<<"\t题目数量:"<<para[1]<<"个\t\t打印列数:"<<para[2]<<"列"<<endl;

cout<<"\t每行间隔:"<<para[3]<<"行\t\t是否有乘除法:";YesOrNo(para[4]);cout<<endl;

cout<<"\t数值范围下限:"<<para[5]<<"\t\t数值范围上限:"<<para[6]<<endl;

cout<<"\t是否有负数:";YesOrNo(para[7]);cout<<"\t\t是否有余数:";YesOrNo(para[8]);cout<<endl;

cout<<"\t/******************************************/"<<endl;

}

//*****设置打印方式*****

void SetPrint()

{

system("cls");

char move1;

cout<<"\t/*************设置打印方式*************/"<<endl;

cout<<"\t          0.设置打印列数("<<para[2]<<"列)"<<endl;

cout<<"\t          1.设置每行间隔("<<para[3]<<"行)"<<endl;

cout<<"\t              2.返回主菜单"<<endl;

cout<<"\t/**************************************/"<<endl;

cout<<"请选择后续操作(0~2):";

cin>>move1;

while(move1<'0'||move1>'2')

{

cout<<"错误!请正确输入操作序号(0~2):";

cin>>move1;

}

switch(move1)

{

case '0':

reset2:           cout<<"新的打印列数(建议7列以内):";

cin>>para[2];

if(para[2]<0)

{

cout<<"出错!请重新输入!"<<endl;

goto reset2;

}

break;

case '1':

reset3:           cout<<"新的间隔行数:";

cin>>para[3];

if(para[3]<0)

{

cout<<"出错!请重新输入!"<<endl;

goto reset3;

}

break;

case '2':break;

}

}

//*****判断输入正确*****

void Reset(int i)

{

do

{

cout<<"请重新设置(是1/否0):";

cin>>para[i];                      //此处输入字符出错,但没解决

}while(para[i]!=0&&para[i]!=1);

}

//*****设置题目难度*****

void SetLevel()

{

system("cls");

char move2;

cout<<"\t/*************设置题目难度*************/"<<endl;

cout<<"\t            0.是否有乘除法(";YesOrNo(para[4]);cout<<")"<<endl;

cout<<"\t            1.数值范围("<<para[5]<<"~"<<para[6]<<")"<<endl;

cout<<"\t            2.是否有负数(";YesOrNo(para[7]);cout<<")"<<endl;

cout<<"\t            3.是否有余数(";YesOrNo(para[8]);cout<<")"<<endl;

cout<<"\t              4.返回主菜单"<<endl;

cout<<"\t/**************************************/"<<endl;

cout<<"请选择后续操作(0~4):";

cin>>move2;

while(move2<'0'||move2>'4')

{

cout<<"错误!请正确输入操作序号(0~4):";

cin>>move2;

}

switch(move2)

{

case '0':Reset(4);break;

case '1':                                                   //此处若输入字符,则出错

reset1:           cout<<"新的数值下限:";                           //但没找到解决方法

cin>>para[5];

cout<<"新的数值上限:";

cin>>para[6];

if(para[5]>=para[6])

{

cout<<"出错!请重新输入数值范围!"<<endl;

goto reset1;

}

break;

case '2':Reset(7);break;

case '3':Reset(8);break;

case '4':break;

}

}

//****主页面*****

void MainMenu(LinkC &C,Caculation &Q)

{

char move,save;

cout<<"\t/*************四则运算出题系统*************/"<<endl;

cout<<"\t                 0.开始出题"<<endl;

cout<<"\t               1.设置出题数量"<<endl;

cout<<"\t               2.设置打印方式"<<endl;

cout<<"\t               3.设置题目难度"<<endl;

cout<<"\t               4.查看当前设置"<<endl;

cout<<"\t                 5.退出系统"<<endl;

cout<<"\t/******************************************/"<<endl;

cout<<"请选择后续操作(0~5):";

cin>>move;

while(move<'0'||move>'5')

{

cout<<"错误!请正确输入操作序号(0~5):";

cin>>move;

}

switch(move)

{

case '0':Display(C,Q);break;

case '1':

reset4:           cout<<"请设置出题数量(建议100道以内):";

cin>>para[1];

if(para[1]<=0)

{

cout<<"出错!请重新输入!"<<endl;

goto reset4;

}

break;

case '2':SetPrint();break;

case '3':SetLevel();break;

case '4':ShowSetting();break;

case '5':

cout<<"是否保存出题记录(是1/否0):";

cin>>save;

while(save!='1'&&save!='0')

{

cout<<"出错!请正确输入(是1/否0):";

cin>>save;

}

if(save=='1')

WriteQues(C);

cout<<"感谢您的使用,再见!"<<endl;

para[0]=0;break;

}

}

int main(int argc, char* argv[])

{

srand((unsigned)time(NULL));      //srand()函数产生一个以当前时间开始的随机种子

LinkC Cacu;

Caculation ques;

InitList(Cacu);

ReadQues(Cacu);

while(para[0])

{

system("cls");

MainMenu(Cacu,ques);

system("pause");

}

return 0;

}

(2)

#include "iostream.h"

#include "fstream.h"

//0退出、1出题数量、2打印列数、3每行间隔、4乘除、5数值范围下限、6数值范围上限、7负数、8余数、9出过的题目数

int para[10]={1,30,3,0,0,0,5,0,0,0};      //默认参数

//*****四则算术题的数据结构*****

typedef struct

{

int num1;

int num2;

int sign;

}Caculation;

typedef struct CNode                                   //结点

{

Caculation ques;

struct CNode * next;

}CNode,*LinkC;

//******题目初始化******

void InitList(LinkC &C)

{

C=new CNode;

C->next=NULL;

}

//******添加题目信息******

void InsertQues(LinkC &C,Caculation Q)

{                                                                    //尾插入

LinkC tail,temp;

tail=C;

while(tail&&tail->next!=NULL)

tail=tail->next;

temp=new CNode;

temp->ques=Q;

temp->next=NULL;

tail->next=temp;

tail=temp;

para[9]++;

}

//******判断题目存在******

int ExistQues(LinkC C,Caculation Q)

{

LinkC temp;

temp=C->next;

while(temp)

{

if((temp->ques.num1==Q.num1)&&(temp->ques.num2==Q.num2)&&(temp->ques.sign==Q.sign))

return 1;                             //当两个数字和算符与链表中的一样,则存在

else

temp=temp->next;

}

return 0;

}

//******读取出过的问题******

void ReadQues(LinkC &C)

{

LinkC temp;

ifstream infile("question.txt");

for(int i=0;i<10;i++)                        //读取参数表

infile>>para[i];

for(i=0;i<para[9];i++)                      //读取出过的题目

{

temp=new CNode;

infile>>temp->ques.num1;

infile>>temp->ques.num2;

infile>>temp->ques.sign;

temp->next=NULL;

}

}

//******写入文件******

void WriteQues(LinkC C)

{

LinkC temp;

ofstream outfile("question.txt");

if(!outfile)

{

cout<<"文件存储失败!"<<endl;

exit(0);

}

for(int i=0;i<10;i++)

outfile<<para[i]<<" ";

for(temp=C->next;temp;temp=temp->next)

{

outfile<<temp->ques.num1<<" ";

outfile<<temp->ques.num2<<" ";

outfile<<temp->ques.sign<<" ";

}

}

三、运行结果

第一次使用时,程序默认10以内四则运算10道题,有负数余数,分三列打印,每行间隔一行。见下图。

对参数进行一些修改。见下图。

对打印方式进行修改。见下图。

对题目的一些设置

退出系统,可选择保存出过的题目和参数设置。

后来经过我的代码优化,当某种类型的题目全部都出过以后,会提示。

首先当前设置如下。

连续出题多次发现

四、遇到的困难

设计思想里已经写了,编写程序的时候,我是渐进式的自顶向下的开发的。但是我不太清楚编写代码时,该不该用自顶向下。因为我比较注重细节,先写框架 再写核心往往会导致编出来的程序虎头蛇尾。而且这次我是最后才加上的数据结构,以至于之前写的变量名、参数等等都要变更,有些麻烦。以后我会训练自己自底 向上写代码的能力。我有个坏毛病就是,边写边思考,有时候这个问题还差一点就解决了,结果就又扯到另一个问题上了。我在与其他同学交流的过程中,也了解到“下手”之前,必须要先把整个程序在心里构建的差不多了,再敲代码。多和编程能力强或编程习惯好的同学交流,多向他们学习,也是受益匪浅啊。

最后就是,数据结构部分我是借鉴之前数据结构小学期自己做的员工管理系统来编写的,回忆起了链表以及相关操作的知识。

转载于:https://www.cnblogs.com/lrhan/p/5609554.html

个人作业五:四则运算二相关推荐

  1. 作业五—个人项目-小学四则运算 “软件”之升级版1

    作业五-个人项目-小学四则运算 "软件"之升级版 作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/21 ...

  2. 兰州大学C语言程序设计课程作业,【兰州大学|兰州大学C语言程序设计课程作业( 五 )】语言程序设计|课程|作业-傻大方...

    『易坊知识库摘要_兰州大学|兰州大学C语言程序设计课程作业( 五 )』34.用户未作答标准答案exp04. 以下叙述中正确的是 在程序的一行上可以出现多个有效的预处理命令行使用带参的宏时,参数的类型应 ...

  3. 5.1 实验五 四则运算单元测试

    5.1 实验五 四则运算单元测试 一.过程简介: 工作人员:邵家文       学号:201306114322 李泳江       学号:201306114314          博客:http:/ ...

  4. 研究生语音识别课程作业记录(二) 非特定人孤立词识别

    研究生语音识别课程作业记录(二) 非特定人孤立词识别 前言 一. 任务要求 二. 识别方法 三. 语音数据库 四. 特征参数提取 五. 识别过程及分析 六. 小结 前言 研究生期间的语音识别课程作业记 ...

  5. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件 一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两 ...

  6. Python编程基础:第十五节 二维列表2D Lists

    第十五节 二维列表2D Lists 前言 实践 前言 列表中的元素可以是任何形式,整型.浮点型.字符串型,甚至是一个列表.当列表的元素也是列表时,我们将其称为二维列表. 实践 我们先来创建多个一维列表 ...

  7. OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

    OpenCV学习笔记(五十一)--imge stitching图像拼接stitching stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitch ...

  8. 深蓝学院《从零开始手写VIO》作业五

    深蓝学院<从零开始手写VIO>作业五 1. 完成Bundle Adjustment求解器 2. 完成测试函数 3. 论文总结 1. 完成Bundle Adjustment求解器 完成单目 ...

  9. 《当程序员的那些狗日日子》(五十二)同学情与差距

    (五十二)同学情与差距 临近春节放假前,我收到了高中一同学志的结婚请柬.想想也快到春节放假了,于是我干脆请了几天假,跟春节假期连在一起,这样就可以提先回家过一个春节长假了. 说起来很巧,志是我到广州后 ...

  10. JavaScript学习(五十二)—继承、call方法和apply方法

    JavaScript学习(五十二)-继承.call方法和apply方法 学习内容 一.继承 二.call方法 三.apply方法 一.继承 所谓继承就是两个构造方法建立起来的某种联系,通过某种联系,可 ...

最新文章

  1. 沙市一中2021年高考成绩查询,2021年荆州高考状元名单公布,荆州文理科状元是谁多少分...
  2. Linux的完全免费特性
  3. 3D-VID:基于LiDar Video信息的3D目标检测框架|CVPR20
  4. JS选中OPTION
  5. windebug的妙用
  6. 2017年最值得关注的5大产品设计趋势
  7. 机箱前面的耳机插孔没声音
  8. c语言的实验报告实验原理,c语言实验报告
  9. 数据结构课程设计 重言式判别
  10. 前端-项目引入苹方字体
  11. 【科学文献计量】中英文文献标题及摘要可读性指标分析与可视化
  12. GHOST WIN8 32位软件自选安装专业优化版 201307 V4.0
  13. 阜阳有儿童计算机编程吗,终于明白儿童有必要学编程吗
  14. Python中的StringIO与cStringIO简析
  15. OpenCV—python 显着性检测二
  16. 移动开发——音乐小程序服务器搭建
  17. Java、五边形的面积
  18. 使用Project客户端和Project Server进行项目管理
  19. 【报告分享】2020年中国工业机器视觉产业发展白皮-赛迪(附下载)
  20. 中国著名电子商务网站网址名单大全

热门文章

  1. 统计哈姆雷特文本中高频词的个数
  2. C++ 类模板语法初步01
  3. 排序上---(排序概念,常见排序算法,直接插入,希尔排序,直接选择排序,堆排序)
  4. c++多态--2(计算器,纯虚函数和抽象类)
  5. Linux时间函数札记
  6. 【ubuntu】ubuntu下用make编译程序报错找不到openssl/conf.h
  7. 详解C++中的函数调用和下标以及成员访问运算符的重载
  8. Linux下IO多路复用之select函数的使用
  9. ubuntu下无法在根目录创建文件夹;permission denied 权限不足问题解决方法
  10. 进程间通信————有名管道