四则运算<3>
//李妍 2015.3.12
//四则运算新
#include<iostream>
#include<fstream>
#include<iomanip>
#include<cmath>
#include<vector>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define random() (rand()%1000)
const int MAX=; /*输入模块*/
class Input
{
public:
Input()
{
for( int i = ;i < MAX;i++ )
Str_input[i] = '\0';
}
char Str_input[MAX];
void inStr()
{
cin>>Str_input;
}
}; /*输出模块*/
class Output
{
public:
Output()
{
result = ;
}
double getRes( double res )
{
result = res;
return result;
} private:
double result;
}; /*计算用的存储结构*/
template <class Type>
class STACK{
private:
Type base[MAX];
int Size;
public:
STACK()
{
Size=;
};
void push(Type a)
{
base[Size]=a;
Size++;
}
Type pop()
{
return base[--Size];
}
int size()
{return Size;}
}; /*计算的模块*/
class jisuan
{
public:
bool shuhanshu(char);
bool fuhanshu(char);
int jckh(char);
bool jcxsd(char *);
int pdyxj(char);
double ToData(char*);
double Call(double,double,char);
int ppkh(char* buffer,int pos);
void Opr( STACK<char>&, STACK<double>&, int& );
double Calculate(char*, double& ); };
bool jisuan::shuhanshu(char ch)
{
return ((ch>=''&&ch<='')||ch=='.')?true:false;
}
bool jisuan::fuhanshu(char ch)
{
return (ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='#')?true:false;
}
int jisuan::jckh(char ch)
{
if(ch=='(')
return ;
if(ch==')')
return -;
return ;
}
bool jisuan::jcxsd(char *ch)
{
int a=;
for(int i=;i<strlen(ch);i++)
if(ch[i]=='.')
a++;
if(a>)
return false;
return true;
}
int jisuan::pdyxj(char ch) //符号的优先极别
{
switch(ch)
{
case '+':
return ;
case '-':
return ;
case '*':
return ;
case '/':
return ;
case '#':
return ;
default:
return -;
}
}
double jisuan::ToData(char* ch) //将数字转化为数值
{
int i,j,sumn=;
double sum=0.0;
if(!jcxsd(ch)) return 0.0;
for(i=;i<strlen(ch);i++)
{
if(ch[i]!='.')
sumn=sumn*+(ch[i]-'');
else break;
}
if(i<strlen(ch))
for(j=i+;j<strlen(ch);j++)
sum=sum*+(ch[j]-'');
sum /= pow(10.0,(double)(strlen(ch)--i));
return (sum+sumn);
}
double jisuan::Call(double sum,double data,char ch)
{
double ans=0.0;
switch(ch)
{
case '+':
ans=sum+data;
break;
case '-':
ans=sum-data;
break;
case '*':
ans=sum*data;
break;
case '/':
if( data != 0.0 )
ans=sum/data;
else
{
cout<<"程序出现除0错误,终止!\n";
system("pause");
exit();
}
break;
case '#':
return ;
default:ans=0.0;
break;
}
return ans;
}
int jisuan::ppkh(char* buffer,int pos) //利用栈找到匹配的括号
{
STACK<char> Temp;
int i;
for(i=pos;i<strlen(buffer);i++)
{
if(jckh(buffer[i])==)
Temp.push('');
if(jckh(buffer[i])==-)
{
Temp.pop();
if(Temp.size()==) return i;
}
}
return -;
}
void jisuan::Opr(STACK<char>& symbol,STACK<double>& data,int& mark)
{
double sum;
while(symbol.size()!=)
{
char tem=symbol.pop();
int temp=pdyxj(tem);
symbol.push(tem);
if(temp<mark)
break;
else{
sum=Call(data.pop(),data.pop(),symbol.pop());
data.push(sum);
}
}
}
double jisuan::Calculate(char* buffer,double& sum) //字符串读入和各个函数调配
{
STACK<double> data;
STACK<char> symbol;
double ans;
char temp[MAX];
int ct=,mark=,tp=;
data.push(sum);
while(ct<=strlen(buffer))
{
if(shuhanshu(buffer[ct])) //如果是数字或小数点
{
while( ct < strlen(buffer) && shuhanshu(buffer[ct]) )
temp[tp++]=buffer[ct++];
temp[tp]='\0';
tp=; //读到非数字也非小数为止
ans=ToData(temp); //把读到的字符串转化为数
data.push(ans); if(ct==strlen(buffer)) //已经独到字符串末尾
{
mark=;
Opr(symbol,data,mark);
sum=data.pop();
return sum;
}
else{
int mark=pdyxj(buffer[ct]);
Opr(symbol,data,mark); //计算
}
}
else if(fuhanshu(buffer[ct])) //如果是运算符
symbol.push(buffer[ct++]); //运算符入symbol栈
else
{
char BF[];int k=; //如果都不是,则只能是括号
while( jckh( buffer[ct] ) != && ct <= strlen(buffer) )
BF[k++] = buffer[ct++];
BF[k]='\0';
if(jckh(buffer[ct])==) //一旦读到左括号,寻找它匹配的右括号
{
int i,j;
char Temp[];
for(i=ct+,j=;i<ppkh(buffer,ct);i++,j++)
Temp[j]=buffer[i]; //把这对括号中的字符串存入Temp
Temp[j]='\0';
data.push(Calculate(Temp,sum)); ct+=(strlen(Temp)+);
if(ct+==strlen(buffer))
{
mark=;
Opr(symbol,data,mark);
sum=data.pop();
return sum;
}
else
{
mark=pdyxj(buffer[ct+]); //不是的话继续计算
Opr(symbol,data,mark);
}
ct++; //读入下一个字符
}
}
}
return .;
} string i_s(int shuzi)
{
int temp=abs(shuzi);
char str[];
itoa(temp,str,);
string str1=str;
return str1;
} string zuhe (string str1,string str2,char x)
{
string expression;
expression=str1+x+str2;
return expression;
} //是否有乘除法
char operator_random(int c1)
{
char o;
int c,c2;
if(c1==)
{
c2=;
}
if(c1==)
{
c2=;
}
c= (rand() % )%c2;
if (c == ) o = '+';
else if (c == ) o = '-';
else if (c == ) o = '*';
else o = '/';
return o;
} void main()
{
srand((unsigned)time(NULL));//设置时间种子 ,以使程序每次得到的结果都不同
int mul_div,number,output_mode,value_range,num_1,num_2,plus_or_minus,jump,yushu,kuohao,score=;
double answer=0.0,solution;
string str_1,str_2,temp;
char operator_r;
char storage[];
cout<<" 是否有乘除法?<0>没有 <1>有:";
cin>>mul_div;
cout<<" 有无括号? <0>没有 <1>有:";
cin>>kuohao;
cout<<" 加减有无负数?<0>没有 <1>有:";
cin>>plus_or_minus;
cout<<" 除法有无余数?<0>没有 <1>有:";
cin>>yushu;
cout<<" 题目如何输出?<0>在文件中输出 ,<1>在此直接输出:";
cin>>output_mode;
cout<<" 请输入数值范围:";
cin>>value_range; cout<<" 请输入题目的数量:";
cin>>number;
cout<<endl; string *expression=new string[number];//string expression[number];
ofstream fout;
if(output_mode==)
{
fout.open("yunsuan.txt");
fout<<number<<"道随机四则运算:"<<endl;
}
else
{
cout<<number<<"道随机四则运算:"<<endl;
} for (int i = ; i < number; i++)
{
num_1=random()%value_range+;
num_2=random()%value_range+;
int length;//运算式的长度
int j=num_1-num_2;
int x=num_1%num_2;
operator_r=operator_random(mul_div);
length=random()%+;
str_1=i_s(num_1);
str_2=i_s(num_2);
expression[i]=zuhe(str_1,str_2,operator_r);
if(length>)
{
for(length;length>;length --)
{
operator_r=operator_random(mul_div);
str_1=expression[i];
if(kuohao==)
{
jump=random()%;
if(jump==)
{
str_1='('+str_1+')';
}
}
operator_r=operator_random(mul_div);
num_2=random()%value_range+;
str_2=i_s(num_2);
jump=random()%;
if (jump==)
{
temp=str_1;
str_1=str_2;
str_2=temp;
}
expression[i]=zuhe(str_1,str_2,operator_r); }
}
if(output_mode==)
{ strcpy(storage,expression[i].c_str()); cout.precision(); //设置精度为12 Input in;
jisuan cl;
Output out; answer=out.getRes( cl.Calculate(storage,answer) ); //计算模块 if(plus_or_minus== )
{
if(answer>)
{
cout<<" ("<<i+<<")"<<expression[i]<<"="<<endl;
cout<<" 输入结果:";
cin>>solution;
cout<<" 正确结果:"<<answer<<endl;
if(answer==solution)
{
score++;
cout<<" 正确!!!"<<endl;
cout<<endl;
}
else
{
cout<<" 很遗憾,错误!"<<endl;
cout<<endl;
}
} //如果结果小于0
else
{
i=i-;
}
}
else //如果不要求加减无负数
{
cout<<" ("<<i+<<")"<<expression[i]<<"="<<endl;
cout<<" 输入结果:";
cin>>solution;
cout<<" 正确结果:"<<answer<<endl;
if(answer==solution)
{
score++;
cout<<" 正确!!!"<<endl;
cout<<endl;
}
else
{
cout<<" 很遗憾,错误!"<<endl;
cout<<endl;
}
}
}
else
{
fout<<expression[i]<<"="<<endl;
}
}
if(output_mode==)
{
cout<<" 得分:"<<score<<endl;
cout<<endl;
} if(output_mode==)
{
fout.close();
}
}
结对编程伙伴:李妍 20133099 博客地址:http://www.cnblogs.com/liyan-luckygirl/
四则运算<3>要求新加的功能是可以输入答题,并判断对错,最后得出最终得分。
我们利用栈来实现对算式的运算,从符号优先级入手,利用栈匹配,字符串读入等完成运算,最终得到结果。
四则运算<3>的更多相关文章
- 介绍一款原创的四则运算算式生成器:CalculateIt2
家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- 四则运算appNABCD模型
团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...
- 第一章-第一题(小学生四则运算)--By郭青云
1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如: 1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...
- 一个简易的四则运算单元...(15.12.15 BUG更新)
网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...
- 利用ANTLR4实现一个简单的四则运算计算器
利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...
- 【实践】js实现简易的四则运算计算器
最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...
- HDU 5938 Four Operations(四则运算)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- C语言实现四则运算
学生:宋丹丹 张潇裕 #include<iostream>#include<ctime>using namespace std;void main(){ int x1,x2,a ...
- 第五篇——C++实现四则运算
写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求.下面这些需求都可以用命令行参数的形式来指定: a) 除了整数以外,还要支持真分数的四则运算. (例如: 1/6 + 1/8 ...
随机推荐
- 解决qt5在ubuntu下无法调用fcitx输入中文的问题
如题,在以前安装qt5.2.1的时候就遇到了这个问题.当时上网搜了很多资料,结果都解决不了,发现都是复制来复制去. 这次因为要用qt5.3.0在ubuntu下写个程序,所以不解决这个问题不行了.就继续 ...
- eclipse 安装git的插件和上传项目
这里有个链接,已经很详细的写了过程 博客1以及博客2.其实遇到安装的问题,就是因为我用的eclipse版本比较老,但是eclipse里面又装了好多插件,不想在重新安装eclipse.还有一个很好的博 ...
- 分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集
在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...
- CCF 2016-12 送货
问题描述 试题编号: 201512-4 试题名称: 送货 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 为了增加公司收入,F公司新开设了物流业务.由于F公司在业界的良好口碑, ...
- java面向对象编程——第八章 类的高级概念
8.1访问修饰符: public:该类或非该类均可访问: private: 只有该类可以访问: protected:该类及其子类的成员可以访问,同一个包中的类也可以访问: 默认:相同数据包中的类可以访 ...
- redis sort
redis sort命令用法 1.命令描述返回或保存给定列表.集合.有序集合key中经过排序的元素.排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较. 2.一般sort用法最简单的sort ...
- UVa 11361 - Investigating Div-Sum Property
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 二模 (8) day2
第一题: 题目描述: 有 n 个炸弹,有些炸弹牵了一根单向引线(也就是说引线只有在这一端能被炸弹点燃),只要引爆了这个炸弹,用引线连接的下一个炸弹也会爆炸.每个炸弹还有个得分,当这个炸弹被引爆后就能得 ...
- Redis系列-存储篇string主要操作函数小结
通过上两篇的介绍,我们的redis服务器基本跑起来.db都具有最基本的CRUD功能,我们沿着这个脉络,开始学习redis丰富的数据结构之旅,当然先从最简单且常用的string开始. 1.新增 a)se ...
- Zone.js
https://github.com/angular/zone.js/ Zone.js