主题:[活动]第77次编程比赛题目
yj1221 [专家分:20] 发布于 2008-11-21 14:25:00
编写一个程序可以计算表达式值的程序。
例如: 输入:3+6*8 输出:51
要求: 1. 程序能够进行小数运算
2. 表达式可以包含 ( ) [ ] { } 数字(0~9) 运算符(+ - * / ^) 小数点
3. 当用户输入有错时,给出出错位置,提示用户重新输入
比赛结束时间:11月28日(周五) 晚上10:00
网上有这题目的解法,不过,希望大家踊跃参加,提交自己写的程序。期待很好的代码出现!
比赛已经结束了,从提交的代码来看,最厉害的,相信大家都看得出来了。我会尽快给出比赛结果。希望这次比赛对大家有所收获。
最后更新于:2008-11-28 22:13:00
回复列表 (共29个回复)
11 楼
yingshuai16 [专家分:10] 发布于 2008-11-21 22:57:00
没有空详细写,时间要到了,呵呵。[code=c]
请填写代码
[/code]#define MAXSIZE 20
typedef struct _STACK
{
int elems[MAXSIZE];
int top;
}STACK;
int Push(STACK *stk,intx)
{
if((stk->top+1)>=MAXSIZE)
{
printf("Stack is overflow!");
}
stk->top=stk->top+1;
stk->elems[stk->top]=x;
}
int Pop(STACK *stk)
{
if (stk->tip<0)
{
printf("stack is empty!\n");
return;
}
stk->top-=1;
}
intTop(STACK *stk)
{
return stk->elens[stk->top];
}
main()
{
if(输入是数字)
push(数字);
if(不是)
push(符号)
比较下一个符号
优先级低就
pop(数字)
pop(数字)
记算结果
否则
push(符号)
}
12 楼
monishuzi [专家分:0] 发布于 2008-11-23 11:36:00
计算器
13 楼
liuwenhan [专家分:20] 发布于 2008-11-23 17:35:00
finish
#include<iostream>
#include<cctype>
#include<cmath>
#include<stdio.h>
#include<string.h>
using namespace std;
void badshow();
void highlevel(const char*);
double result(double a,double b,char c);
bool done(const char*,int);
void suanfa(const char*);
void init(const char *);
int top=-1;//for level
int top1=-1;//for sign
int top2=0;//for number
double* number;//store number
char* sign;//store sign
static int i=-1;//piont to the shizi array
int* level;//store the level
int mark;//the current level
int* aim;
int first;
int wrong;//
int main()
{
char *shizi;
wrong=0;
first=0;
mark=25;//>0
number=new double[100];
sign=new char[20];
level=new int[20];
aim=new int[10];
shizi=new char[100];
level[0]=-4;
//cin.unsetf(ios::skipws);
while(cin>>shizi && shizi!="quit")
{
suanfa(shizi);
if(wrong!=1) break;
init(shizi);
}
cout<<"the final result is "<<number[0];
return 0;
}
void highlevel(const char* shizi)
{
if(wrong==1) return;
if(mark==-1 && top1!=-1)
{
badshow();
return;
}
double a,b;
if(mark==0)
if(sign[top]!=shizi[i] && (top==0 || top==-1))
{
cout<<"The position of "<<i+1<<" is wrong."<<endl;
wrong=1;
return;
}
else if(level[top]==0)
{
top--;
top1--;
return;
}
if(top==-1)
{
level[++top]=mark;
sign[top]=shizi[i];
}
else if(mark<=level[top])
{
if(top>=0)
{
a=number[top2--];
number[top2+1]=0.0;
b=number[top2];
//cout<<"After the functions b is "<<b<<",a is "<<a<<".And there are "<<top2+1<<" numbers in array currently"<<endl;//check the problem
number[top2]=result(b,a,sign[top--]);
if(mark==-1 && top2==0) return;
}
highlevel(shizi);
}
else
{
level[++top]=mark;
sign[top]=shizi[i];
}
return;
}
14 楼
liuwenhan [专家分:20] 发布于 2008-11-23 17:36:00
void suanfa(const char* shizi)
{
if(wrong==1) return;
int flag=0;//mark :behind the number isn't '{','[','('
char sign1;
for(i=i+1;i<=strlen(shizi);i++)
{
if(i==strlen(shizi))
{
mark=-1;
cout<<top1;
if(top1!=-1)
{
cout<<"The position of "<<aim[top1]-1<<" is wrong."<<endl;
wrong=1;
}
if(top2==0) return;
//cout<<number[top2]<<endl<<top2<<endl;//check
//cout<<number[top2-1]<<endl<<top2-1;//check
highlevel(shizi);
return;
}
if(isalpha(shizi[i]))
{
cout<<"The position of "<<i+1<<" is character"<<endl;
wrong=1;
return;
}
else if(isdigit(shizi[i]))
{
if(first==0)
{
first=1;
flag=1;
}
if(flag==0)
top2++;
number[top2]=number[top2]*10+(double)shizi[i]-48.0;
flag=1;
}
else if(shizi[i]=='.')
{
done(shizi,flag);
continue;
}
else
{
if(shizi[i]=='{' || shizi[i]=='(' || shizi[i]=='[')
{
if(flag==1)
{
badshow();
return;
}
if(shizi[i]=='{')
sign1='}';
else if(shizi[i]=='[')
sign1=']';
else sign1=')';
sign[++top]=sign1;
aim[++top1]=i+1;
mark=0;
level[top]=mark;
suanfa(shizi);
}
else if(shizi[i]=='^')
{
mark=3;
highlevel(shizi);
}
else if(shizi[i]=='*' || shizi[i]=='/')
{
mark=2;
highlevel(shizi);
}
else if(shizi[i]=='+' || shizi[i]=='-')
{
mark=1;
highlevel(shizi);
}
else if(shizi[i]=='}' || shizi[i]==')' || shizi[i]==']')
{
mark=0;
highlevel(shizi);
return;
}
else
{
badshow();
return;
}
flag=0;
}
}
}
void badshow()
{
cout<<"The position of "<<i+1<<" is wrong"<<endl;
wrong=1;
}
15 楼
liuwenhan [专家分:20] 发布于 2008-11-23 17:36:00
bool done(const char* shizi,int b)
{
double j=0;
if(b!=1)
{
badshow();
return false;
}
else if(isalpha(shizi[++i]))
{
badshow();
return false;
}
else
{
for(i;i<strlen(shizi);i++)
{
if(isdigit(shizi[i]))
{
j++;
number[top2]=double(shizi[i]-48)/pow(10.0,j)+number[top2];
}
else
{
i--;
return false;
}
}
i--;
return true;
}
}
double result(double a,double b,char c)
{
switch(c)
{
case '^':
return pow(a,b);
case '*':
return a*b;
case '/':
return a/b;
case '+':
return a+b;
case '-':
return a-b;
}
}
void init(const char* shizi)
{
top=-1;
top1=-1;
top2=0;
first=0;
i=-1;
level[0]=-4;
wrong=0;
mark=25;//mark>0
delete []number;
delete []level;
delete []sign;
delete []aim;
delete []shizi;
number=new double[100];
sign=new char[20];
level=new int[20];
aim=new int[10];
shizi=new char[100];
cout<<"Please re-input:";
}
16 楼
xiaoji3431 [专家分:0] 发布于 2008-11-23 20:24:00
长期寻求网站入侵人员,拿欧美站,本人自己懂编程写木马,现在差一个网站入侵人员合作目前编写出来的网马大概种马率在40-50左右,而且是12合1体积在20K超高质量网马国内没几个人有能力编写有意者联系QQ25498276详谈
17 楼
yibing55555 [专家分:0] 发布于 2008-11-23 21:35:00
这是设么东西,怎么一堆隐藏
19 楼
zyq19851115 [专家分:0] 发布于 2008-11-24 01:47:00
33333333333
20 楼
dgcl09 [专家分:0] 发布于 2008-11-28 14:06:00
kankan
我来回复