设计思路:
定义两个数组number[1000],oper[1000]分存储数字和运算符,利用随机数函数随机的为number,oper数组分配整数和运算符
Int Puanduan()用来判断计算结果是否正确,正确返回1,错误返回0
利用for循环找到除号首先进行运算把结果保存到与字符序号相同的number【i】数组中并把poer【i】变为加号,把number[i+1]变为0;最后从左到右算一遍加减运算
Main。Cpp
//四则运算
//李营;20142930;2016/3/21
#include "Arithmetic.h"
int main()
{
P:
Arithmetic A;//声明对象
int N;//存储打印的题目数量
int M;//存储参与混合运算的数字个数
int n,m,f,o,p;
cout<<"><><><><><><><><><><><><><><><"<<endl;
cout<<">< 请选择模式: ><"<<endl;
cout<<">< 1为整数; ><"<<endl;
cout<<">< 2为假分数; ><"<<endl;
cout<<">< 3有括号运算 ><"<<endl;
cout<<">< 4混合运算答题模式 ><"<<endl;
cout<<"><><><><><><><><><><><><><><><"<<endl;
cin>>n;
cout<<"生成f值以内的运算题目(输入f值):"<<endl;
cin>>f;
if(n==1||n==2)
{
cout<<"请输入要打印的题目数量:"<<endl;
cin>>N;
cout<<"有无乘除运算?(1没有,2有):"<<endl;
cin>>m;
cout<<"加减运算有无负数?(1没有,2有):"<<endl;
cin>>o;
cout<<"除法有无余数?(1没有,2有)"<<endl;
cin>>p;
}
if(n==4)
{
cout<<"请输入参与混合运算的数字个数:"<<endl;
cin>>M;
}
switch(n)
{
case 1:
{A.Intnumber(N,m,f,o,p);break;}
case 2:
{A.Mixnumber(N,m,f,o);break;}
case 3:
{A.Havespace(f,N);}
case 4:
{A.CeShi(M,f);}
default:
{
cout<<"请按要求输入啦,亲!"<<endl;
goto P;
}
}
goto P;
return 0;
}
.h文件
#pragma once
#include<iostream>
using namespace std;
class Arithmetic
{
protected:
int a,b,c,d,y,m;
public:
Arithmetic(void);
~Arithmetic(void);
int Intnumber(int N,int m,int F,int O,int P);//整数函数
int Mixnumber(int N,int m,int F,int O);//分数算式函数
int show1(int y,int a,int b,int o,int P);//显示函数1
int show2(int y,int a,int b,int c,int d);//显示函数2
int Havespace(int F,int N);//有括号运算函数
int CeShi(int N,int f);//产生测试题目函数
char Operator();//产生运算符
int PanDuan(float dd,int N,int number[1000],char oper[1000]);//d:传递用户输入的答案;N:传递用户所选混合运算的整数个数
};
Arithmetic.cpp文件
#include "Arithmetic.h"
Arithmetic::Arithmetic(void)
{
}
Arithmetic::~Arithmetic(void)
{
}
int Arithmetic::Intnumber(int N,int m,int F,int O,int P)
{
for(int i=0;i<N;i++)
{
a=rand()%F;
b=rand()%F;
if(m==1)
{ y=rand()%2;}
else if(m==2)
{ y=rand()%4;} //判断是否有乘除
if(b==0||(a==b&&b==c)) //避免重复且除数不为0
{
i--;
}
else
{
show1(y,a,b,O,P);
}
if((i+5)%4==0)
{
cout<<endl;
}
}
return 0;
}
int Arithmetic::Mixnumber(int N,int m,int F,int O)
{
for(int i=0;i<N;i++)
{
a=rand()%F;
b=rand()%F;
if(m==1)
{ y=rand()%2;}
else if(m==2)
{ y=rand()%4;} //判断是否有乘除
c=rand()%100;
d=rand()%100;
if(b==0||b>=a||d>=c||(a==b&&b==c)) //确保假分数避免重复且除数不为0
{
i--;
}
else
{
show2(y,a,b,c,d);
}
}
return 0;
}
int Arithmetic::show1(int y,int a,int b,int o,int p)
{
if(y==0)
{
if(o==1)//判断有无负数
{cout<<a<<"+"<<b<<"= ";}
else
{
if(rand()%3==0)//随机确定负号位置
{cout<<"(-"<<a<<")+"<<b<<"= ";}
if(rand()%3==1)
{cout<<a<<"+(-"<<b<<")= ";}
else
{cout<<"(-"<<a<<")+(-"<<b<<")= ";}
}
}
else if(y==1)//判断有无负数
{
if(o==1)//随机确定负号位置
{cout<<a<<"-"<<b<<"= ";}
else
{
if(rand()%3==0)
{cout<<"(-"<<a<<")-"<<b<<"= ";}
if(rand()%3==1)
{cout<<a<<"-(-"<<b<<")= ";}
else
{cout<<"(-"<<a<<")-(-"<<b<<")= ";}
}
}
else if(y==2)
{ cout<<a<<"*"<<b<<"= ";}
else
if(p==1)//判断是否要求有余数
{
if(a%b!=0)
{a=(a-a%b);}//确保没有余数
cout<<a<<"/"<<b<<"= ";
}
else
{
if(b==1)
{b=b+1;}
if(a%b==0)
{a=(a+rand()%b);}//确保有余数
cout<<a<<"/"<<b<<"= ";
}
return 0;
}
int Arithmetic::show2(int y,int a,int b,int c,int d)
{
if(y==0)
{cout<<"("<<a<<"/"<<b<<")+("<<c<<"/"<<d<<")="<<endl;}
else if(y==1)
{ cout<<"("<<a<<"/"<<b<<")-("<<c<<"/"<<d<<")="<<endl;}
else if(y==2)
{ cout<<"("<<a<<"/"<<b<<")*("<<c<<"/"<<d<<")="<<endl; }
else
{cout<<"("<<a<<"/"<<b<<")/("<<c<<"/"<<d<<")="<<endl; }
return 0;
}
int Arithmetic::Havespace(int F,int N)
{
for(int i=0;i<N;i++)
{
char s;
int n=rand()%4;
if(n==0)
{s='+';}
else if(n==1)
{s='-';}
else if(n==2)
{s='*';}
else
{s='/';}
cout<<"("<<rand()%F<<s<<rand()%F<<")"<<s<<"("<<rand()%F<<s<<rand()%F<<")="<<endl;
}
return 0;
}
char Arithmetic::Operator()//随机产生运算符
{
char c;//存储运算符
int r;
r=rand()%4;
if(r==0)
{
c='+';
}
else if(r==1)
{
c='-';
}
else if(r==2)
{
c='*';
}
else
{
c='/';
}
return c;
}
int Arithmetic::CeShi(int N,int f)//实现混合运算式的输出
{
int n=0;//用来计算作对数目
for(int i=0;i<30;i++)//循环生成30道题目
{
int N1=N-1;//运算符个数
char oper[1000];//用来存储运算符
int number[1000];//用来存储参与运算的随机数
for(int i=0;i<N;i++)//对参与运算的数依次赋值
{
number[i]=(rand()%f);
if(number[i]==0)
{
i--;
}
}
for(int i=0;i<N-1;i++)//对参与运算的运算符依次赋值
{
oper[i]=Operator();
}
oper[N-1]='=';
for(int i=0;i<N;i++)//输出每一个混合运算式
{
int m;
if(((oper[i]=='/')&&(oper[i-1]!='/'))||((oper[i]=='/')&&(oper[i-1]=='/')&&(oper[i-2]=='/')))
//解决连续除号的如何加括号
{
cout<<"(";
m=i;
}
cout<<number[i];
if(i==(m+1)&&oper[m]=='/')//后括号的输出
{
cout<<")";
}
cout<<oper[i];
}
cout<<"?";
float D;//用来存储用户输入的答案
cin>>D;
n=n+PanDuan(D,N,number,oper);
}
cout<<"您答对了"<<n<<"道题目"<<endl;
return 0;
}
int Arithmetic::PanDuan(float dd,int N,int number[1000],char oper[1000])//判断混合运算用户单是否正确
{
int n=0;//用来返回用户答案是否正确如正确返回1,错误返回0
for(int i=0;i<N;i++)
{
if(oper[i]=='/')
{
number[i+1]=(number[i])/(number[i+1]);
oper[i]='+';
number[i]=0;
}
}
for(int i=0;i<N;i++)
{
if(oper[i]=='*')
{
number[i+1]=(number[i])*(number[i+1]);
oper[i]='+';
number[i]=0;
}
}
float sum=number[0];
for(int i=0;i<(N-1);i++)
{
if(oper[i]=='+')
{
sum=sum+number[i+1];
}
else
{
sum=sum-number[i+1];
}
}
if(dd==sum)
{
n=1;
cout<<"正确!";
}
else
{
cout<<"错误!";
}
cout<<endl;
return n;
}
程序截图:
编程总结分析:
不要上来就写代码,一定要分析好,但也不要分析的太过细致入微,首先是功能的实现,然后在做优化。不要想着一簇而就,比如不会混合运算的,自己便首先完成了简单的两个数的四则运算的输出及计算,要从自己会的出发循序渐进。另外在程序编译运行过程中发现方法体功能写的尽量单纯一点,能够避免大量的代码重写。在程序调试过程中出现了死循环,在一顿查找后才发现,原来是自己变量的定义出现了问题,把存储用户输入答案的变量设成了整形,进而在用户输入小数是出现了bug,从中认识到严谨的重要性。另外在这个较大(对于本人而言)程序编写过程中,我似乎明白了写单元测试的重要性。
周活动总结表
姓名:李营 日期:2016/3/26
日期 任务 |
听课(min) |
编写程序(min) |
阅读课本 |
准备考试 |
整理并发布作业 |
日总计(min) |
|
周日 |
|||||||
周一 |
100 |
120 |
220 |
||||
周二 |
|||||||
周三 |
150 |
150 |
|||||
周四 |
|||||||
周五 |
60 |
60 |
|||||
周六 |
120 |
120 |
|||||
周总计 |
100 |
270 |
450 |
阶段时间和效率:
不包括本周的累计时间:
总计 |
100 |
270 |
120 |
390 |
|||
平均 |
100 |
270 |
120 |
390 |
|||
最大 |
100 |
270 |
120 |
390 |
|||
最小 |
100 |
270 |
120 |
390 |
全部周的累积时间:
总计 |
200 |
540 |
180 |
120 |
840 |
||
平均 |
100 |
270 |
90 |
120 |
420 |
||
最大 |
100 |
270 |
120 |
120 |
450 |
||
最小 |
100 |
270 |
60 |
120 |
390 |
时间记录日志
学生:李营 日程:20016/3/19
教师:王建民 课程;软件工程概论
日期 |
开始时间 |
结束时间 |
中断时间 |
净时间 |
活动 |
备注 |
3/21 |
8:00 |
9:50 |
10 |
100 |
听课 |
王老师讲课 |
14:30 |
16:50 |
20 |
120 |
编写程序(二柱子) ,打水,聊天 |
作业 |
|
3/23 |
14:00 |
16:40 |
10 |
150 |
编写程序(利用数组解决了就安吉算出答案的问题,打水 |
作业 |
3/25 |
14:00 |
15:00 |
120 |
阅读大道至简 |
作业 |
|
3/26 |
9:30 |
11:30 |
120 |
编写程序(对程序稍加完善),整理提交作业 |
作业 |
缺陷记录日志
学生:李营
日期:2016/3/26
教员:王建民
程序号:2
日期 |
编号 |
类型 |
引入阶段 |
排除阶段 |
修复时间 |
修复缺陷 |
3/21 |
1 |
a |
编码 |
编码 |
1min |
|
注释时多注释了一个“}” |
||||||
2 |
b |
编译运行 |
编译运行 |
1min |
||
不能正确的输出答案 |
||||||
3/23 |
3 |
c |
编码 |
编码 |
1min |
|
忘记了关闭上一次的运行窗口造成程序报错为找不到保存路径 |