• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            最近在網上看到一個求解數學表達式程序,感覺很不錯,故拿出來修改之后供大家一起分享.
            程序如下:
            #include <ctype.h> //打開庫文件
            #include <stdio.h>
            #include <iostream.h>
            #include <malloc.h>
            #include <process.h>
            #include <string.h>

            #define error 0
            #define ok 1
            typedef struct{
            ? int *base;
            ? int *top;
            ? int stacksize;
            }sqstack;

            class CExpression
            {
            public:
            ?CExpression();
            ?~CExpression();
            public:
            ?void initstack(sqstack &s);
            ?int gettop(sqstack &s);
            ?void push(sqstack &s,int e);
            ?int pop(sqstack &s,int &e);
            ?int setfind(char a,char b[]); //查找a在b中的位置
            ?char precede(char op1,char op2,int &flag); //比較op1和op2的優先級
            ??? int numlink(int opd,int ops,int &flag); //數字與字符串的連接
            ?int operate(int n1,char o,int n2,int &flag);//運算
            ??????????? /*
            ??????????? flag為一個標志變量,
            ??????????? 1為表達式有誤!除數為0!
            ??????????? 2為表達式的值過大或過小
            ??????????? 3為未知類型的錯誤,可能沒有這一點
            ??????????? 但為了容錯,還是要加上這一點
            ?-*/
            public:
            ?sqstack opnd;
            ?sqstack optr;
            private:
            ?sqstack s;
            };

            CExpression::CExpression()
            {
            ?s.top=s.base;
            }

            CExpression::~CExpression()
            {
            }

            void CExpression::initstack(sqstack &s)
            {
            ?s.base=(int *)malloc(10*sizeof(int));
            ?if(!s.base) exit(1);
            ?s.top=s.base;
            ?s.stacksize=100;
            }

            int CExpression::gettop(sqstack &s)
            {
            ?int e;
            ?e=*(s.top-1);
            ?return e;
            }

            void CExpression::push(sqstack &s,int e)
            {
            ??? if(s.top-s.base>=s.stacksize)
            ?{
            ??s.base=(int*)realloc(s.base,(s.stacksize+10*sizeof(int)));
            ??if(!s.base)
            ???exit(2);
            ??s.top=s.base+s.stacksize;
            ??s.stacksize+=10;
            ?}
            ?*s.top++=e;
            }

            int CExpression::pop(sqstack &s,int &e)
            {
            ?if(s.top==s.base)return error;
            ?e=*--s.top;
            ?return ok;
            }

            int CExpression::setfind(char a,char b[])
            {
            ?int i,j;
            ?i=-1,j=0;
            ?while(b[j]!='\0')
            ??if(a==b[j++]) {i=j-1;break;}
            ??return i;
            }

            char CExpression::precede(char op1,char op2,int &flag) //比較op1和op2的優先級
            {
            ?int i,j;
            ?char st1[8]={"+-*/()#"}; //運算符初始化
            ?char st2[7][8]={">><<<>>",">><<<>>",">>>><>>", //比較操作初始化
            ??">>>><>>","<<<<<= ",">>>> >>","<<<<< ="};
            ?i=setfind(op1,st1);j=setfind(op2,st1);
            ?if (i>-1 && j>-1) //如果你所輸入的運算符不在+-*/()#內,返回ERROR
            ?{return st2[i][j];flag=ok;}
            ?else flag=error;
            ?return error;
            }

            int CExpression::numlink(int opd,int ops,int &flag){ //數字與字符串的連接
            ?int aa=ops;
            ?ops=ops*10+opd-48;
            ?if (ops<0 && aa>0 || aa>214748364)
            ??flag=error; else flag=ok; //flag=0,說明ops已經過大,
            ?return ops;
            }

            int CExpression::operate(int n1,char o,int n2,int &flag){ //運算
            ??????????? /*
            ??????????? flag為一個標志變量,
            ??????????? 1為表達式有誤!除數為0!
            ??????????? 2為表達式的值過大或過小
            ??????????? 3為未知類型的錯誤,可能沒有這一點
            ??????????? 但為了容錯,還是要加上這一點
            ?-*/
            ?
            ?int result=0;
            ?switch (o){
            ?case '+': //加法運算
            ??flag=0;result=n1+n2;
            ??if (n1>=0 && n2>=0 && result<0 || n1<=0 && n2<=0 && result>0)
            ???//兩個大于0的數相加,和小于0,或兩個小于0的數相加,和大于0,返回錯誤
            ??{flag=2;return error;}
            ??else
            ??{flag=0;return result;}
            ??break;
            ?case '-': //減法運算
            ??flag=0;result=n1-n2;
            ??if (n1>=0 && n2<0 && result<0 || n1<=0 && n2>0 && result>0)
            ???//一個大于0的數減一個小于0 的數,和小于0或一個小于0 的數減去一個大于0的數,返回錯誤
            ???
            ??{flag=2;return error;}
            ??else
            ??{flag=0;return result;}
            ??break;
            ?case '*': //乘法運算
            ??flag=0;result=n1*n2;
            ??if (n1>=0 && n2>=0 && result<0 || n1<=0 && n2<=0 && result>0)
            ???//兩個大于0的數相乘,積小于0,或兩個小于0的數相乘,積大于0,返回錯誤
            ??{flag=2;return error;}
            ??else
            ??{flag=0;return result;}
            ??break;
            ?case '/': //除法運算
            ??if(n2!=0) //如果被除數為0要返加ERROR
            ??{flag=0;return n1/n2;break;}
            ??else
            ???//除數為0,返回錯誤
            ??{flag=1;return error;break;}
            ?}
            ?flag=3;return error;
            }

            void main()
            {
            ?CExpression expression;
            //?sqstack opnd; //用于存放運算數
            //?sqstack optr; //用于存放運算符
            ?int theta; //用于存放一個運算符
            ?int a,b; //用于存放用于操作的兩個數
            ?int temp; //一個臨時的變量
            ?int flag2=0; //一個標志變量,用于判斷是否要連接數字
            ?int flag1; //一個標志變量,用于判斷表達式是否是無效的
            ?int cn=0; //用于存放字符的位置
            ?int ops=0; //用于存放當前的操作數
            ?char st1[255]; //表達式中最多有255個字符
            ?char c; //用于表示當前的字符
            ?for (a=0;a<255;a++) st1[a]='#'; //對數組初始化
            ?expression.initstack(expression.opnd); //對棧OPND初始化
            ?expression.initstack(expression.optr); //對棧OPTR初始化
            ?expression.push(expression.optr,'#');
            ?cin>>st1;
            ?temp=strlen(st1);
            ?if (st1[temp-1]!='#') st1[temp]='#'; //對表達式的結尾加入一個#
            ?
            ?c=st1[0];
            ?while(c!='#' || expression.gettop(expression.optr)!='#'){ //cout<<st1;
            ??
            ??c=st1[cn];
            ??if(isdigit(c)) {
            ???ops=expression.numlink(c,ops,temp);
            ???if (temp==ok)
            ???{
            ????if (flag2) expression.pop(expression.opnd,temp);
            ????flag2=1;
            ????expression.push(expression.opnd,ops);
            ????cn++;
            ????continue;
            ???}
            ???else
            ???{cout<<"表達式的值過大,無法計算!"<<endl;return;}
            ??}
            ??else{
            ???ops=0;
            ???flag2=0;
            ???temp=expression.precede(expression.gettop(expression.optr),c,temp); //temp為precede中的一個代號,為ok為正確的運算符比較,為error為錯誤的運算符比較
            ???if (temp==error) {cout<<"表達式有誤!無法求解!"<<endl;return;} //錯誤的運算符比較時,返回.
            ???switch (temp){
            ???case '<':
            ????expression.push(expression.optr,c);cn++;break; //如果為<,操作符入棧
            ???case '=':
            ????expression.pop(expression.optr,temp);cn++;break; //如果為=,操作符出棧
            ???case '>': //如果為>,執行運算操作
            ????expression.pop(expression.optr,theta);
            ????expression.pop(expression.opnd,b);
            ????expression.pop(expression.opnd,a);
            ????expression.operate(a,theta,b,flag1);
            ????if (flag1==1) {cout<<"表達式有誤!除數不能為0!"<<endl;return;}
            ????else if(flag1==2) {cout<<"表達式的值過大或過小,無法計算!"<<endl;return;}
            ????else if(flag1==3) {cout<<"未知道類型的錯誤!"<<endl;return;}
            ????expression.push(expression.opnd,expression.operate(a,theta,b,flag1));
            ????break;
            ???case ' ':
            ????cout<<"表達式有誤!無法求解!"<<endl;return;
            ???} //end switch
            ??} //end if
            ?} //end while
            ?a=expression.gettop(expression.opnd);
            ?cn=0;
            ?while(st1[cn]!='#') cout<<st1[cn++]; //輸出你所輸入字符串
            ?cout<<"=";
            ?cout<<a<<endl; //輸出最終結果
            }

            該程序的缺點是不能處理存在小數的表達式.

            posts - 4, comments - 4, trackbacks - 0, articles - 0

            Copyright © 瘋蝶雨人

            久久青青草原国产精品免费| 久久精品国产精品亚洲下载| 亚洲欧美伊人久久综合一区二区| 丁香色欲久久久久久综合网| 人妻少妇久久中文字幕| 伊人久久免费视频| 亚洲中文字幕久久精品无码APP | 97久久精品人妻人人搡人人玩| 丁香久久婷婷国产午夜视频| 亚洲精品综合久久| 99久久成人国产精品免费| 亚洲国产成人久久笫一页| A狠狠久久蜜臀婷色中文网| 一本大道久久香蕉成人网| 久久99热国产这有精品| 伊人色综合久久天天人手人婷 | 久久婷婷国产综合精品 | 欧美久久久久久| aaa级精品久久久国产片| 一级做a爰片久久毛片毛片| 久久精品人人做人人妻人人玩| 亚洲精品国产自在久久| 精品久久久久久无码免费| 久久精品国产亚洲AV香蕉| 国内精品人妻无码久久久影院导航 | 97久久国产综合精品女不卡 | 热re99久久精品国99热| 久久99热这里只频精品6| 国产亚州精品女人久久久久久 | 久久国产精品免费| 色综合久久88色综合天天 | 99久久做夜夜爱天天做精品| 久久久久国产精品麻豆AR影院 | 精品国产99久久久久久麻豆| 久久综合久久鬼色| 久久精品亚洲精品国产欧美| 韩国三级中文字幕hd久久精品 | 国内精品久久久久久久涩爱| 久久精品国产一区二区三区日韩| 精品久久久久久久无码| 狠狠色婷婷综合天天久久丁香|