| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 487 人关注过本帖
标题:新人求助!!各位高手帮忙看看!!
取消只看楼主 加入收藏
sag_aiolos
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-7-2
收藏
 问题点数:0 回复次数:0 
新人求助!!各位高手帮忙看看!!
帮忙看看这个程序的设计思路呗 !!!先谢谢诸位高手了!!!

#include<iostream.h>
#include<string.h>
#define stack_init_size 100
#define stackincrement 10

typedef struct
{
    char *cbase;
    char *ctop;
    int  istacksize;
}cstack;
//定义字符型结构体
typedef struct
{
    int *ibase;
    int *itop;
    int  istacksize;
}istack;
//定义整数型结构体
int initstack (cstack &c)
{
    c.cbase = new char[100];
    c.ctop = c.cbase;
    return 0;
}
//初始化
int initstack (istack &i)
{
    i.ibase = new int[100];
    i.itop = i.ibase;
    return 0;
}
//初始化
int cpush(cstack &c,char ce)
{
    *(c.ctop++) = ce;
    return 0;
}
//压栈
int ipush(istack &i,int ie)
{
    *(i.itop++) = ie;
    return 0;
}
//压栈

int cpop(cstack &c,char &ce)
{
    ce = *(--c.ctop);
    return 0;
}
//出栈
int ipop(istack &i,int &ie)
{
    ie = *(--i.itop);
    return 0;
}
//出栈
void getfun();//把输入的字符串附值给数组
int lenth=0;//输入的字符串的长度
int result=1;
static char array[100];//定义数组



int display()//打印开始屏信息
{
    for(int p=0;p<80;p++)
        cout<<"=";
    cout<<endl<<endl;
    for(int q=0;q<28;q++)
    cout<<" ";
    cout<<"简单LISP算术表达式计算器";
    cout<<endl<<endl;
    for(int r=0;r<22;r++)
        cout<<" ";
    cout<<"专业     姓名    学号   ";
        cout<<endl<<endl;
        cout<<"          本程序为简单的LISP算术表达式计算器,可以实现LISP加法表达式求值"<<endl;
    for(int s=0;s<80;s++)
        cout<<"=";
    cout<<endl;
        return 0;
}



void getfun()
{
    cout<<"请输入LISP表达式: ";
    cin.getline(array,100);
    lenth = strlen(array);
    if(lenth==0)
    cout<<"你没有输入任何数据!"<<endl;
}

/*重要的函数,计算LISP表达式的函数*/
void compute()
{
    char ce;
    int ie1;
    int ie;

    cstack c;
    istack i;
initstack (c);
initstack (i);
lenth = strlen(array);//求数组的长度的函数
for(int n=0;n<lenth;n++)
{
if(array[n]==')')
    {
        cpop(c,ce);
        if(i.ibase==i.itop)
        {
            cout<<"LISP表达式有误!"<<endl;
            break;
        }
        else
        {
            ipop(i,ie);
            ie1=ie;
            if(i.ibase==i.itop)
            {
                cout<<"LISP表达式有误!"<<endl;
                break;
            }
            else
            {
            ipop(i,ie);
            if(ce=='+')
            ie=ie+ie1;//对弹出的元素进行加操作
            ipush(i,ie);
            }
        }
    }
    else if((array[n]=='+')||(array[n]=='-')||(array[n]=='*')||(array[n]=='/'))
        {
            ce=array[n];
            cpush(c,ce);
        }
         if(array[n]>47&&array[n]<58)
            {
                ie=(int)((int)array[n]-48);//把字符型‘0’,‘1’转化为整数型0,1,2,
                ipush(i,ie);//弹出栈顶元素
            }

}

ipop(i,ie);//弹出栈顶元素,其实也就是最后结果了
if(i.ibase==i.itop)
{
cout<<"LISP式计算结果为:";
for(int m=0; m<lenth; m++)
cout<<array[m];
cout<<" = "<<ie<<endl;
}

}

/*判断LISP语法的函数*/
int jugde()
{
int lp=0;
int rp=0;
int oprator=0;
int number=0;
int lenth=0;

getfun();
lenth = strlen(array);
/*统计各操作符和数字的个数*/
for(int top=0;top<lenth;top++)
{
    if(array[top]=='(')
        lp++;
    if(array[top]==')')
        rp++;
    if(array[top]=='+'||array[top]=='-'||array[top]=='*'||array[top]=='/')
        oprator++;
    if(array[top]>47&&array[top]<58)
        number++;
}

if(lenth==1)
{
    if(array[0]>47&&array[0]<58)
    cout<<"LISP表达式结果为: "<<array[0]<<endl;
    else
    cout<<"请正确输入LISP,你没有输入数字!"<<endl;
}    
//判断是不是一个字符,如果是一个数字的话。就直接打出,如果不是的话,说明语法有问题
else
{
    if(array[0]!='(')
    cout<<"您是否忘记了开始的'(',请检查!"<<endl;
    //判断括号的匹配    
    else
    {
        if(array[lenth-1]!=')')
        cout<<"您是否忘记了最后的')'!"<<endl;
        else
        {
            if(lp!=rp||rp!=oprator||oprator!=number-1||lp!=oprator||lp!=number-1||rp!=number-1)
            {
                if(lp>rp)
                cout<<"您是否忘记了')'了!"<<endl;//判断括号的匹配
                if(lp<rp)
                cout<<"您是否忘记了'('了!"<<endl;//判断括号的匹配
                if(lp==rp&&oprator!=lp)
                cout<<"您的运算符有问题!"<<endl;
                if(lp==rp&&rp==oprator&&rp!=number-1)
                cout<<"您的运算数字有问题,请检查!"<<endl;
            }
        
           else
             {
               
                   for (int i=0;i<lenth;i++)
                {
                    if(array[i]=='(')
                    {
                     ++i;
                    if (array[i]!='+'&&array[i]!='-'&&array[i]!='*'&&array[i]!='/')
                    cout<<"你的LISP有问题,请检查!"<<endl;
                    else
                    result=0;
                    i--;                    
                    }
                
                }
             }
        }
    }
}

return 0;

}
        


 int main()
 {
     char loop[5];
     display();
    
     do
     {
     jugde();
     if(result==0)
     compute();
     cout<<"是否计算下一个LISP ?(y/n)"<<endl;
     cin.getline(loop,5);
     }
      while(loop[0]=='y'||loop[0]=='Y');
     return 0;
 }
搜索更多相关主题的帖子: 新人 
2008-07-02 14:03
快速回复:新人求助!!各位高手帮忙看看!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016879 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved