招聘的问题

64288 2003-04-16 09:50:54
请解决一下,计算器的编程,错在哪?
#include<stdio.h>
typedef struct{
int *top;
int *base;
}sqtack1;
typedef struct{
char *top;
char *base;
}sqtack2;
initstack1(sqtack1 wet )
{wet.top=wet.base=(int*)malloc(100*sizeof(int));
}
initstack2(sqtack2 wet)
{wet.top=wet.base=(char*)malloc(100*sizeof(char));
}
push1(sqtack1 wet ,int n )
{*++wet.top=n;
}
push2(sqtack2 wet,char n )
{*++wet.top=n;
}
int gettop1(sqtack1 wet)
{int n;
n=*wet.top;
return(n);
}
char gettop2(sqtack2 wet)
{ char n ;
n=*wet.top;
return(n);
}
int pop1(sqtack1 wet)
{int n;
n=*wet.top--;
return(n);
}
char pop2(sqtack2 wet)
{char n;
n=*wet.top--;
return(n);
}
int in(char *c,int *b )
{int a,s,i;
sqtack1 wet;
initstack1(wet);
if(*c>47&&*c<58)
{
for(i=0;*c>47&&*c<58;i++)
{a=*c-48;
push1(wet,a);
*c=getchar();
}
for(;i>0;i--,s=s*10)
{s=1;
*b=0;
*b=pop1(wet)*s+*b;
}
return(0);
}
else return (1);
}
char precede(char a,char b)
{if(a=='=')
return('<');
else if(b=='=')
return('>');
else if(a=='(')
{if(b==')')
return('=');
return('<');
}
else if((b=='*'||b=='/')&&(a=='+'||a=='-'))
return('<');
else return('>');
}
int operate(int a,char theta,int b)
{int c;
switch(theta)
{case'+':
c=a+b;break;
case'-':
c=a-b;break;
case'*':
c=a*b;break;
case'/':
c=a/b;break;
}
return(c);
}
evaluateexpression()
{char theta,c;int one,other;
char *p=&c;
int result,b;
int *q=&b;
sqtack1 opnd;
sqtack2 optr;
initstack2(optr);push2(optr,'=');
initstack1(opnd); c=getchar();
while(c!='='||gettop2(optr)!='=')判断是否结束
{if(!in(p,q))判断是否是数字,还是字母
push1(opnd,b);
else switch (precede(gettop2(optr),c))
{case'<':
push2(optr,c);c=getchar();break;
case'=':
pop2(optr);c=getchar();break;
case'>':
theta=pop2(optr);
other=pop1(opnd);one=pop1(opnd);
push1(opnd,operate(one,theta,other));
break;
}
}
result=gettop1(opnd);
printf("%d\n",result);
}

main()
{ evaluateexpression();
}

...全文
142 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaohangcom 2003-04-22
  • 打赏
  • 举报
回复
kao ~~贴出来这么乱!!!!
zhaohangcom 2003-04-22
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;
/*
原理: 当遇到+ - 时 向后看一个符号 ,如果是+- 前面计算 , 如果是× / 先计算后面 ,如果 遇到 ( 进入 递归 (递归内原理不变 )
*/
double cpu(istream& cin)
{
char in;
long double storage[5];
for(int i=0;i<5;++i)
storage[i]=0;

cin>>in;
if(in=='(')
{
storage[0]=cpu(cin);
cin>>in;
}
else
{
if((in<'0')||(in>'9'))
{
cout<<endl;
cout<<" in computer + or - error in the 1 num(1)"<<endl;
return 0;
}
while((in>='0')&&(in<='9'))
{
double carry=in-48;
storage[0]=storage[0]*10+carry;
cin>>in;
}
if(in=='.')
{
cin>>in;
double multi=0.1;
while((in>='0')&&(in<='9'))
{

double carry=in-48;
storage[1]=storage[1]+carry*multi;
multi=multi*0.1;
cin>>in;
}
storage[0]=storage[0]+storage[1]; //num1 --> storage[0]
storage[1]=0;
}
}

while(in!='=')
{
char stat;
switch(in)
{
case '+':
case '-':
stat=in;
cin>>in;
if(in=='(')
{
storage[1]=cpu(cin);
cin>>in;
}
else
{
if((in<'0')||(in>'9'))
{
cout<<endl;
cout<<" in computer + or - error in the 2 num(2)"<<endl;
return 0;
}
while((in>='0')&&(in<='9'))
{
double carry=in-48;
storage[1]=storage[1]*10+carry;
cin>>in;
}
if(in=='.')
{
cin>>in;
double multi=0.1;
while((in>='0')&&(in<='9'))
{

double carry=in-48;
storage[2]=storage[2]+carry*multi;
multi=multi*0.1;
cin>>in;
}
storage[1]=storage[1]+storage[2]; //num2 --> storage[1]
storage[2]=0;
}
}
while((in=='*')||(in=='/'))
{
char stat1=in;
cin>>in;
if(in=='(')
{
storage[2]=cpu(cin);
cin>>in;
}
else
{
if((in<'0')||(in>'9'))
{
cout<<endl;
cout<<"in compute * or / ,the 2 num error(3)"<<endl;
return 0;
}
while((in>='0')&&(in<='9'))
{
double carry=in-48;
storage[2]=storage[2]*10+carry;
cin>>in;
}
if(in=='.')
{
cin>>in;
double multi=0.1;
while((in>='0')&&(in<='9'))
{

double carry=in-48;
storage[3]=storage[3]+carry*multi;
multi=multi*0.1;
cin>>in;
}
storage[2]=storage[2]+storage[3]; //num3--> storage[2]
storage[3]=0;
}
}
if(stat1=='*')
{
storage[1]=storage[1]*storage[2];
storage[2]=0;
}
if(stat1=='/')
{
if(storage[2]==0)
{
cout<<endl;
cout<<"div by 0"<<endl;
return 0;
}
storage[1]=storage[1]/storage[2];
storage[2]=0;
}
}
if((in=='+')||(in=='-')||(in=='=')||(in==')'))
{
if(stat=='+')
{
storage[0]=storage[0]+storage[1];
storage[1]=0;
}
if(stat=='-')
{
storage[0]=storage[0]-storage[1];
storage[1]=0;
}
}

break;

case '*':
case '/':
stat=in;
cin>>in;
if(in=='(')
{
storage[1]=cpu(cin);
cin>>in;
}
else
{
if((in<'0')||(in>'9'))
{
cout<<endl;
cout<<"in compute * or / ,the 2 num error(4)"<<endl;
return 0;
}
while((in>='0')&&(in<='9'))
{
double carry=in-48;
storage[1]=storage[1]*10+carry;
cin>>in;
}
if(in=='.')
{
cin>>in;
double multi=0.1;
while((in>='0')&&(in<='9'))
{

double carry=in-48;
storage[2]=storage[2]+carry*multi;
multi=multi*0.1;
cin>>in;
}
storage[1]=storage[1]+storage[2];
storage[2]=0;
}
}
if(stat=='*')
{
storage[0]=storage[0]*storage[1];
storage[1]=0;
}
if(stat=='/')
{
if(storage[1]==0)
{
cout<<endl;
cout<<"div by 0"<<endl;
return 0;
}
storage[0]=storage[0]/storage[1];
storage[1]=0;
}
break;
case '(':

storage[1]=cpu(cin);
cin>>in;
break;
case ')':
return storage[0];
}
}
return storage[0];
}

int main()
{

cout<<cpu(cin)<<endl;
return 0;

}
//早上起来 凑巧玩手机的计算器 。没什么事 编一个玩玩~~错误检查 不够完善!
~~想法 应该没问题~~但是写code 时 ,有些不够简洁(读入数据应该封装)。
~~不过不想做了~~~如果你能看懂~~欢迎批评!!
~~lokioo@163.com
zhaohangcom 2003-04-21
  • 打赏
  • 举报
回复
这么写程序很容易出错~~~指针应用太多~~数据结构不清晰~~

~~你上面那一大堆 也就是vector
~~优先级判断用数组表示不久行了~~干吗自己找麻烦
~~我好久不用C了~~没怎么看
telpow 2003-04-21
  • 打赏
  • 举报
回复
mark
Oliver2002 2003-04-21
  • 打赏
  • 举报
回复
程序有几处错误,
首先声明两个堆栈是你初试化,建议初始化函数改为宏定义:
比如:
#define initstack1(sqtack1wet) sqtack1wet.top=sqtack1wet.base=new int[100]
#define initstack2(sqtack2wet) sqtack2wet.base=sqtack2wet.base=new char[100]
或者自己初试化后再作为参数传递给函数,注意用传地址方式传递,你的函数是错误的,
压栈和出栈函数的参数传递方式也同样用传地址方式,
还有算法上也有一定的问题,
'('的优先级应最高,
在你的
char precede(char a,char b)函数中必须加上一句:

if(b=='(')
return('<');

还应注意分配内存的释放,必须养成良好的习惯~~~~~
初步看了一下就这么几处错误,你自己在去调试一下,应该没问题了,我刚调试过。
ghtsao 2003-04-19
  • 打赏
  • 举报
回复
UP
qiuafa 2003-04-18
  • 打赏
  • 举报
回复
up
petertangh 2003-04-16
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1665/1665086.xml?temp=.3995325
ambition2005 2003-04-16
  • 打赏
  • 举报
回复
用VC调试DEBUG

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧