四则运算<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 ...
随机推荐
- 重载Array类的contains方法
var allFilters = self.filtersContainer?.filters ?? [OpalFilter]() if let sorter = filtersContainer?. ...
- 使用 Fresco加载图片
概念: ImagePipeline ——负责从网络.本地图片.Content Provider(内容提供者)或者本地资源那里获取图片,压缩保存在本地存储中和在内存中保存为压缩的图片 Drawee——处 ...
- 使用cnblogs.com的用户体验和提出来的建议
1.是否提供良好的体验给用户(同时提供价值)? 我是很久以前就有CN的账号了的,因为这个网站有很多有用的信息,和比较活跃的论坛.很多不懂的问题可以求助上面的大神.但是,我第一次登陆主页面的时候我是懵逼 ...
- ZOJ 3822(求期望)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- BZOJ3206 [Apio2013]道路费用
首先我们强制要求几条待定价的边在MST中,建出MST 我们发现这个MST中原来的边是一定要被选上的,所以可以把点缩起来,搞成一棵只有$K$个点的树 然后$2^K$枚举每条边在不在最终的MST中,让在最 ...
- 使用openssl库实现RSA、AES数据加密
openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所 ...
- word 转 PDF时报错
利用微软自带的com组件,把word转化成Pdf,利用vs2012调试时没有问题,但是发布到IIS时出错,错误为: 检索 COM 类工厂中 CLSID 为 {} 的组件时失败,原因是出现以下错误: 8 ...
- [转]使用maven镜像
综述 用maven做项目,最郁闷的莫过于某些依赖库下载不了.被墙了,你懂的.使用maven镜像仓库及其重要,特别是国内的镜像,可以有效缓解被墙疼痛. 常用的镜像 国外镜像 ibiblio.org &l ...
- winform按钮和子按钮
实现目标: 一.两组按钮1和2,其中按钮2有两个子按钮, (1)当选按钮1时,按钮2和其子按钮不选中: (2)选中按钮2或其子按钮3和4时,1不选中 (3)选中按钮2时,默认选中其子按钮3 (4)选中 ...
- python 操作json
认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Dece ...