//李妍 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>的更多相关文章

  1. 介绍一款原创的四则运算算式生成器:CalculateIt2

    家里小朋友读一年级了,最近每天都有一些10以内的加减法口算练习,作为程序员爸爸,自然也是想办法能够偷懒,让电脑出题,给小朋友做些练习.于是,自己在业余时间开发了一个四则运算算式生成器,名为:Calcu ...

  2. 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序

    1. 编写一个能自动生成小学四则运算题目的程序.(10分)   基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图.   本题发一篇随笔,内容包括: 题 ...

  3. 四则运算appNABCD模型

    团队: 郭志豪:http://www.cnblogs.com/gzh13692021053/ 杨子健:http://www.cnblogs.com/yzj666/ 刘森松:http://www.cnb ...

  4. 第一章-第一题(小学生四则运算)--By郭青云

    1.项目需求 a) 除了整数以外,还要支持真分数的四则运算. (例如:  1/6 + 1/8 = 7/24) b) 让程序能接受用户输入答案,并判定对错. 最后给出总共 对/错 的数量. c) 逐步扩 ...

  5. 一个简易的四则运算单元...(15.12.15 BUG更新)

    网上找的, 没有作者信息, 只能在这里感谢一下了, 支持标准写法的四则运算 --2015-12-15 修改了一个内存泄漏的BUG - Pop方法没有释放申请的内存 unit Base.Calculat ...

  6. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  7. 【实践】js实现简易的四则运算计算器

    最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...

  8. HDU 5938 Four Operations(四则运算)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  9. C语言实现四则运算

    学生:宋丹丹 张潇裕 #include<iostream>#include<ctime>using namespace std;void main(){ int x1,x2,a ...

  10. 第五篇——C++实现四则运算

    写一个能自动生成小学四则运算题目的命令行 “软件”, 分别满足下面的各种需求.下面这些需求都可以用命令行参数的形式来指定: a) 除了整数以外,还要支持真分数的四则运算. (例如: 1/6 + 1/8 ...

随机推荐

  1. IntelliJ IDEA 中properties中文显示问题

  2. linux查看是否已安装GCC及安装GCC

    输入:gcc -v;如果提示未找到命令即表示没有安装 使用:yum install gcc即可

  3. URL链接中文参数乱码的若干处理方法

    JAVA 中URL链接中文参数乱码的若干处理方法,现在整理收录如下: 方法一: (1) JS中,在URL参数中确保用UTF-8编码,用js函数encodeURI()编码,例如 url:"xx ...

  4. boxplot

    x1 = rand(20,6); x2 = .5+rand(20,6); x3 = randn(20,6); x = [x1;x2;x3]; x = x(:); g1 = [ones(size(x1) ...

  5. javascript 数组操作 转

    javascript之数组操作 1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一 ...

  6. Oracle导入excel数据方法汇总[转]

    摘要:在程序编制过程和数据汇总交换过程中,经常会碰到需要将其他人员在office办公环境下编制的文件数据内容导入oracle中的情况.目前程序开发者经常使用的方法有如下几种:1,使用oracle提供的 ...

  7. 安装Adobe Dreamweaver CS6 免序列号 官方破解版

    Adobe Dreamweaver CS6 免序列号 官方破解版 Adobe Dreamweaver CS6是世界顶级软件厂商Adobe推出的一套可视化的网页开发工具,Dreamweaver CS6最 ...

  8. python 字典排序 关于sort()、reversed()、sorted()

    一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠倒的:相反的:(判决等)撤销的 print list(reversed(['dream','a ...

  9. JavaScript中Date的一些细节

    对于开发人员来说,Date有时候或许会很重要,我们可以通过new Date()来创建一个日期对象.例如: var start = new Date(), //获取当前时间 today = new Da ...

  10. web安全测试-AppScan

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的“民工兄弟” ...