麻烦帮忙改正,谢谢,可以的话讲解一下
时间:2011-12-11
来源:互联网
#include <iostream>
#include <cstdlib>
#include <cctype>
using namespace std;
void eatspaces(char* str);
double expr(char* str);
double term(char* str,int& index);
double number(char* str,int& index);
char* extract(char* str, int& index);
const int MAX = 80;
int main()
{
char buffer[MAX] = {0};
cout<< endl
<< "欢迎使用计算器"<<endl
<<"请输入表达式进行计算或者输入空白行退出"<<endl;
for(;;)
{
cin.getline(buffer,sizeof buffer);
eatspaces(buffer);
if(!buffer[0])
return 0;
cout<<"\t="<<expr(buffer)
<<endl<<endl;
}
}
void eatspaces(char* str)
{
int i = 0;
int j = 0;
while((*(str + i)= *(str + j++)) !='\0')
if(*(str + i) != ' ')
i++;
return;
}
double expr(char* str)
{
double value = 0.0;
int index = 0;
value = term(str,index);
for(;;)
{
switch(*(str + index++))
{
case '\0':
return value;
case '+':
value += term(str,index);
break;
case '-':
value -= term(str,index);
break;
default:
cout<<endl
<<"输入错误"
<<endl;
exit(1);
}
}
}
double term(char* str, int& index)
{
double value = 0.0;
value = number(str, index);
while((*(str + index) == '*')||(*(str + index) == '/'))
{
if(*(str + index) == '*')
value *= number(str, ++index);
if(*(str + index) == '/')
value /= number(str,++index);
}
return value;
}
double number(char* str,int& index)
{
double value = 0.0;
if(*(str + index) == '(')
{
char* psubstr = 0;
psubstr = extract(str,++index);
value = expr(psubstr);
delete[]psubstr;
return value;
}
while(isdigit(*(str + index)))
value = 10*value + (*(str + index++) - 48);
if(*(str + index)!= '.')
return value;
double factor = 1.0;
while(isdigit(*(str + (++index))))
{
factor = value + (*(str + index) - 48)*factor;
}
return value;
}
char* extract(char* str, int& index)
{
char buffer[MAX];
char* pstr = 0;
int numL = 0;
int bufindex = index;
do
{
buffer[index - bufindex] = *(str + index);
switch(buffer[index - bufindex])
{
case ')':
if(numL == 0)
{
buffer[index - bufindex] = '\0';
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
cout<<"输入错误"<<endl;
exit(1);
}
strcpy_s(pstr,index-bufindex,buffer);
return pstr;
}
else
numL--;
break;
case '(':
numL++;
break;
}
}while(*(str + index++) != '\0');
cout<<"输入错误"<<endl;
exit(1);
return pstr;
}
#include <cstdlib>
#include <cctype>
using namespace std;
void eatspaces(char* str);
double expr(char* str);
double term(char* str,int& index);
double number(char* str,int& index);
char* extract(char* str, int& index);
const int MAX = 80;
int main()
{
char buffer[MAX] = {0};
cout<< endl
<< "欢迎使用计算器"<<endl
<<"请输入表达式进行计算或者输入空白行退出"<<endl;
for(;;)
{
cin.getline(buffer,sizeof buffer);
eatspaces(buffer);
if(!buffer[0])
return 0;
cout<<"\t="<<expr(buffer)
<<endl<<endl;
}
}
void eatspaces(char* str)
{
int i = 0;
int j = 0;
while((*(str + i)= *(str + j++)) !='\0')
if(*(str + i) != ' ')
i++;
return;
}
double expr(char* str)
{
double value = 0.0;
int index = 0;
value = term(str,index);
for(;;)
{
switch(*(str + index++))
{
case '\0':
return value;
case '+':
value += term(str,index);
break;
case '-':
value -= term(str,index);
break;
default:
cout<<endl
<<"输入错误"
<<endl;
exit(1);
}
}
}
double term(char* str, int& index)
{
double value = 0.0;
value = number(str, index);
while((*(str + index) == '*')||(*(str + index) == '/'))
{
if(*(str + index) == '*')
value *= number(str, ++index);
if(*(str + index) == '/')
value /= number(str,++index);
}
return value;
}
double number(char* str,int& index)
{
double value = 0.0;
if(*(str + index) == '(')
{
char* psubstr = 0;
psubstr = extract(str,++index);
value = expr(psubstr);
delete[]psubstr;
return value;
}
while(isdigit(*(str + index)))
value = 10*value + (*(str + index++) - 48);
if(*(str + index)!= '.')
return value;
double factor = 1.0;
while(isdigit(*(str + (++index))))
{
factor = value + (*(str + index) - 48)*factor;
}
return value;
}
char* extract(char* str, int& index)
{
char buffer[MAX];
char* pstr = 0;
int numL = 0;
int bufindex = index;
do
{
buffer[index - bufindex] = *(str + index);
switch(buffer[index - bufindex])
{
case ')':
if(numL == 0)
{
buffer[index - bufindex] = '\0';
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
cout<<"输入错误"<<endl;
exit(1);
}
strcpy_s(pstr,index-bufindex,buffer);
return pstr;
}
else
numL--;
break;
case '(':
numL++;
break;
}
}while(*(str + index++) != '\0');
cout<<"输入错误"<<endl;
exit(1);
return pstr;
}
作者: gaoxiang2012 发布时间: 2011-12-11
单步调试和设断点调试是程序员必须掌握的技能之一。
作者: zhao4zhong1 发布时间: 2011-12-12
这代码也太长了吧
作者: zhongxianyao 发布时间: 2011-12-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28