回 帖 发 新 帖 刷新版面

主题:[活动]第77次编程比赛题目

编写一个程序可以计算表达式值的程序。

例如: 输入:3+6*8      输出:51

要求: 1. 程序能够进行小数运算
       2. 表达式可以包含 ( ) [ ] { } 数字(0~9) 运算符(+ - * / ^)  小数点
       3. 当用户输入有错时,给出出错位置,提示用户重新输入

比赛结束时间:11月28日(周五) 晚上10:00

网上有这题目的解法,不过,希望大家踊跃参加,提交自己写的程序。期待很好的代码出现!


比赛已经结束了,从提交的代码来看,最厉害的,相信大家都看得出来了。我会尽快给出比赛结果。希望这次比赛对大家有所收获。

回复列表 (共29个回复)

11 楼


没有空详细写,时间要到了,呵呵。[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 楼

计算器

13 楼

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 楼

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 楼

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 楼

长期寻求网站入侵人员,拿欧美站,本人自己懂编程写木马,现在差一个网站入侵人员合作目前编写出来的网马大概种马率在40-50左右,而且是12合1体积在20K超高质量网马国内没几个人有能力编写有意者联系QQ25498276详谈

17 楼


这是设么东西,怎么一堆隐藏

18 楼


www

19 楼


33333333333

20 楼

kankan

我来回复

您尚未登录,请登录后再回复。点此登录或注册