一、设计思路

设计思路已给出,此处不再赘述。

二、源代码

(1)四则运算2.cpp(源文件)

 // 四则运算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[]==)
Q.sign=rand()%;
else
Q.sign=rand()%;
Q.num1=rand()%(para[]-para[]+)+para[];
Q.num2=rand()%(para[]-para[]+)+para[];
}
//*****输出函数******
void Display(LinkC C,Caculation &Q)
{
int temp,count=; //count记录重新生成题目的次数
for(int i=;i<=para[];i++)
{
cout<<"("<<i<<")";
if(para[]==)
Q.sign=rand()%; //有乘除法
else
Q.sign=rand()%; //没有乘除法
Q.num1=rand()%(para[]-para[]+)+para[]; //随机的(下限~上限)以内的整数
Q.num2=rand()%(para[]-para[]+)+para[];
RB: ReBuild(Q); //检查是否有出过的题目
if(count>((para[]-para[]+)*(para[]-para[]+)*))
{
cout<<endl<<"该难度的题目已出完,请更改出题设置!"<<endl;
break;
}
switch(Q.sign)
{
case :
if(ExistQues(C,Q))
{
count++;
goto RB;
}
cout<<Q.num1<<"+"<<Q.num2<<"="<<setw();
break;
case :
if((para[]==)&&(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();break;
case :
if(ExistQues(C,Q))
{
count++;
goto RB;
}
cout<<Q.num1<<"*"<<Q.num2<<"="<<setw();break;
case :
while(Q.num2==)
Q.num2=rand()%(para[]-para[]+)+para[];
if(!para[])
{
while((Q.num1%Q.num2)!=||Q.num2==)
{ //重新生成
Q.num1=rand()%(para[]-para[]+)+para[];
Q.num2=rand()%(para[]-para[]+)+para[];
}
}
if(ExistQues(C,Q))
{
count++;
goto RB;
}
cout<<Q.num1<<"/"<<Q.num2<<"="<<setw();break;
}
InsertQues(C,Q);
if(i%para[]==) //一行打印完规定列数,换行
for(int j=;j<=para[];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[]<<"个\t\t打印列数:"<<para[]<<"列"<<endl;
cout<<"\t每行间隔:"<<para[]<<"行\t\t是否有乘除法:";YesOrNo(para[]);cout<<endl;
cout<<"\t数值范围下限:"<<para[]<<"\t\t数值范围上限:"<<para[]<<endl;
cout<<"\t是否有负数:";YesOrNo(para[]);cout<<"\t\t是否有余数:";YesOrNo(para[]);cout<<endl;
cout<<"\t/******************************************/"<<endl;
}
//*****设置打印方式*****
void SetPrint()
{
system("cls");
char move1;
cout<<"\t/*************设置打印方式*************/"<<endl;
cout<<"\t 0.设置打印列数("<<para[]<<"列)"<<endl;
cout<<"\t 1.设置每行间隔("<<para[]<<"行)"<<endl;
cout<<"\t 2.返回主菜单"<<endl;
cout<<"\t/**************************************/"<<endl;
cout<<"请选择后续操作(0~2):";
cin>>move1;
while(move1<''||move1>'')
{
cout<<"错误!请正确输入操作序号(0~2):";
cin>>move1;
}
switch(move1)
{
case '':
reset2: cout<<"新的打印列数(建议7列以内):";
cin>>para[];
if(para[]<)
{
cout<<"出错!请重新输入!"<<endl;
goto reset2;
}
break;
case '':
reset3: cout<<"新的间隔行数:";
cin>>para[];
if(para[]<)
{
cout<<"出错!请重新输入!"<<endl;
goto reset3;
}
break;
case '':break;
}
}
//*****判断输入正确*****
void Reset(int i)
{
do
{
cout<<"请重新设置(是1/否0):";
cin>>para[i]; //此处输入字符出错,但没解决
}while(para[i]!=&&para[i]!=);
}
//*****设置题目难度*****
void SetLevel()
{
system("cls");
char move2;
cout<<"\t/*************设置题目难度*************/"<<endl;
cout<<"\t 0.是否有乘除法(";YesOrNo(para[]);cout<<")"<<endl;
cout<<"\t 1.数值范围("<<para[]<<"~"<<para[]<<")"<<endl;
cout<<"\t 2.是否有负数(";YesOrNo(para[]);cout<<")"<<endl;
cout<<"\t 3.是否有余数(";YesOrNo(para[]);cout<<")"<<endl;
cout<<"\t 4.返回主菜单"<<endl;
cout<<"\t/**************************************/"<<endl;
cout<<"请选择后续操作(0~4):";
cin>>move2;
while(move2<''||move2>'')
{
cout<<"错误!请正确输入操作序号(0~4):";
cin>>move2;
}
switch(move2)
{
case '':Reset();break;
case '': //此处若输入字符,则出错
reset1: cout<<"新的数值下限:"; //但没找到解决方法
cin>>para[];
cout<<"新的数值上限:";
cin>>para[];
if(para[]>=para[])
{
cout<<"出错!请重新输入数值范围!"<<endl;
goto reset1;
}
break;
case '':Reset();break;
case '':Reset();break;
case '':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<''||move>'')
{
cout<<"错误!请正确输入操作序号(0~5):";
cin>>move;
}
switch(move)
{
case '':Display(C,Q);break;
case '':
reset4: cout<<"请设置出题数量(建议100道以内):";
cin>>para[];
if(para[]<=)
{
cout<<"出错!请重新输入!"<<endl;
goto reset4;
}
break;
case '':SetPrint();break;
case '':SetLevel();break;
case '':ShowSetting();break;
case '':
cout<<"是否保存出题记录(是1/否0):";
cin>>save;
while(save!=''&&save!='')
{
cout<<"出错!请正确输入(是1/否0):";
cin>>save;
}
if(save=='')
WriteQues(C);
cout<<"感谢您的使用,再见!"<<endl;
para[]=;break;
}
} int main(int argc, char* argv[])
{
srand((unsigned)time(NULL)); //srand()函数产生一个以当前时间开始的随机种子
LinkC Cacu;
Caculation ques;
InitList(Cacu);
ReadQues(Cacu);
while(para[])
{
system("cls");
MainMenu(Cacu,ques);
system("pause");
}
return ;
}

(2)Caculation.h(数据结构头文件)

 #include "iostream.h"
#include "fstream.h" //0退出、1出题数量、2打印列数、3每行间隔、4乘除、5数值范围下限、6数值范围上限、7负数、8余数、9出过的题目数
int para[]={,,,,,,,,,}; //默认参数 //*****四则算术题的数据结构*****
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[]++;
}
//******判断题目存在******
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 ; //当两个数字和算符与文件中的一样,则存在
else
temp=temp->next;
}
return ;
}
//******读取出过的问题******
void ReadQues(LinkC &C)
{
LinkC temp;
ifstream infile("question.txt");
for(int i=;i<;i++) //读取参数表
infile>>para[i];
for(i=;i<para[];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();
}
for(int i=;i<;i++)
outfile<<para[i]<<" ";
for(temp=C->next;temp;temp=temp->next)
{
outfile<<temp->ques.num1<<" ";
outfile<<temp->ques.num2<<" ";
outfile<<temp->ques.sign<<" ";
}
}

该程序不是特别完美,若有bug和改进方案,欢迎交流。

三、截图

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

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

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

对题目的一些设置

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

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

首先当前设置如下。

连续出题多次发现

四、PSP0级 记录表

项目计划总结:

周活动总结表

姓名:袁佩佩                                       日期:15/3/14

日期       任务

听课

编写程序

阅读课本

准备考试

日总计

周日

周一

周二

300

20

320

周三

100

70

30

200

周四

200

115

5

320

周五

200

40

30

270

周六

43

10

53

周总结

800

268

95

1163

阶段时间和效率                                            周数(上一次周活动表的周数+1):1

不包括上一周在内的累计时间

总计

平均

最大

最小

以前各周的累计时间

总计

800

268

95

1163

平均

800

268

95

1163

最大

800

268

95

1163

最小

800

268

95

1163

时间记录表:

学生         袁佩佩                                            日期        15/3/14

教师        王建民                                             课程           PSP

日期

开始时间

结束时间

中断时间

净时间

活动

备注

15/3/11

8:00

9:50

10

100

计算机网络上课

课间10分钟休息

16:20

16:50

30

阅读《梦断代码》

17: 44

18:37

20

33

编写四则运算程序

填写PSP记录表

23:00

23:37

37

编写四则运算程序

3/12

10:10

12:00

10

100

计算机接口技术上课

课间休息

14:00

15:50

10

100

嵌入式开发技术上课

课间休息

16:50

17:50

60

四则运算

22:35

23:30

55

四则运算

3/13

8:00

12:00

40

200

上课 软件工程

操作系统

课间休息

21:00

23:00

20

100

编写四则运算

聊天、上厕所

3/14

12:12

12:55

43

优化代码


缺陷记录日志:

学生       袁佩佩

日期        3/14

教员       王建民

程序号        2

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

15/3/11

1

编码

编译

2min

描述:实参与形参类型不匹配

3/12

2

编码

执行

5min

逻辑错误

描述:检查重复的代码没写全,导致没能有效的避免重复。

3/13

3

编码

执行

5min

逻辑错误

描述:引入数据结构后,原来的参数和变量没有彻底转换完

3/14

4

编码

编译

1min

描述:忘加右括号了“)”

五、心得体会

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

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

软件工程随堂小作业——随机四则运算Ⅱ(C++)的更多相关文章

  1. 软件工程随堂小作业——随机四则运算(C++)

    一.设计思路: 1.程序的主体部分是循环输出,次数即题目数目由用户输入: 2.三个整型变量+rand函数来实现随机数四则运算,一个变量代表加减乘除,另外两个用作运算数: 3.用户体验:题目分三列,排列 ...

  2. 软件工程随堂小作业——随机四则运算Ⅱ之算法思路(C++)

    1.题目避免重复: (1)利用系统时间来产生随机数,重复率会降低. (2)建立链表,逐个判断.可读取写入文件. 2.可定制(数量/打印方式): (1)格式有默认值; (2)可以选择重新设置分几列和每行 ...

  3. 软件工程随堂小作业——寻找“水桶”(C++)

    一.设计思想 思路与寻找一个水王相似,这次只是计数器和嫌疑人变量都设置为数组.每次选取一个ID与三个嫌疑人比较,若有相同则计数:若三个都不相同,则三个计数器都减一.若减为0,则从新赋值给嫌疑人. 二. ...

  4. 软件工程随堂小作业—— 寻找“水王”(C++)

    一.设计思路 (1)输入发帖ID记录表 (2)从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一.若计数器的数值被减为零,则重新选取当前ID开始记录比较. (3)输出结果 二.源 ...

  5. 软件工程随堂小作业——(C++)

    一.设计思路 本来我的思路是根据上楼的人数和上楼的层数来计算出平均值,但是我发现这个思路不对.于是我选择了最笨的方法,复杂度为O(n2). (1)输入坐电梯的人数和要去的楼层: (2)找到输入楼层里最 ...

  6. 软件工程随堂小作业——最优惠价钱(C++)

    一.设计思路 前提,没有买重复书的情况是最优惠的.总共买n本书,可以分解成5k+(n-5k),k=0,1,2,...1.如果k=0,n本不重复的价钱是最优惠的:2.如果k=1,算出每一种情况的折扣并比 ...

  7. 福州大学软件工程1816 | W班 第8次作业[团队作业,随堂小测——校友录]

    作业链接 团队作业,随堂小测--校友录 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客和程序得分表 评分统计图 千帆竞发图 总结 旅法师:实现了更新,导出,查询, ...

  8. 结对作业——随机生成四则运算(Core 第7组)

    结对作业 ——随机生成四则运算(core第7组) 吕佳玲 PB16060145 涂涵越 PB16060282 GITHUB地址 https://github.com/hytu99/homework_2 ...

  9. [福大软工] Z班 团队作业——随堂小测(同学录) 作业成绩

    团队作业--随堂小测(同学录) 作业链接 http://www.cnblogs.com/easteast/p/7763645.html 作业情况 本次作业从原先预计的3小时,有些组打了鸡血连续肝了4. ...

随机推荐

  1. HttpClient入门

    HttpClient入门 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 H ...

  2. Android自定义样式

    1.AndroidManifest.xml android:theme="@style/Theme.CustomDialog 样式要用:@style <?xml version=&qu ...

  3. MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份]

    MariaDB之基于Percona Xtrabackup备份大数据库[完整备份与增量备份] 1.Xtrabackup的安装 percona-xtrabackup-2.2.3-4982.el6.x86_ ...

  4. Objective-C中的self和super

    1.有过面向对象的人知道,self相当于this,super相当于调用父类的方法 2.self是类的隐藏的参数,指向当前调用方法的类,另一个隐藏参数是_cmd,代表当前类方法的selector. su ...

  5. Copying Rowsets

    I find that you often need to create and manipulate standalone rowsets. Sometimes you can get the da ...

  6. asp.net跨页面传值

    a.aspx.cs //获取a中的id HttpCookie objCookie = new HttpCookie("myCookie", id); Response.Cookie ...

  7. PHP 表单 - 验证邮件和URL

    PHP - 验证名称 以下代码将通过简单的方式来检测 name 字段是否包含字母和空格,如果 name 字段值不合法,将输出错误信息: $name = test_input($_POST[" ...

  8. input中如何输入逆写的中文句子

    <input style="text-align:right" /><input type="text" dir="rtl" ...

  9. ContactsContract中涉及数据库中的一些列属性值【Written By KillerLegend】

    ContactsContract.Data   http://developer.android.com/reference/android/provider/ContactsContract.Dat ...

  10. scrapy爬虫框架入门教程

    scrapy安装请参考:安装指南. 我们将使用开放目录项目(dmoz)作为抓取的例子. 这篇入门教程将引导你完成如下任务: 创建一个新的Scrapy项目 定义提取的Item 写一个Spider用来爬行 ...