青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

最近在網上看到一個求解數學表達式程序,感覺很不錯,故拿出來修改之后供大家一起分享.
程序如下:
#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; //輸出最終結果
}

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


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

Copyright © 瘋蝶雨人

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久久激情视频| 亚洲精美视频| 欧美日韩亚洲高清| 欧美高清成人| 国产综合视频| 香港成人在线视频| 香蕉乱码成人久久天堂爱免费 | 亚洲精品久久久久久久久久久久久| 久久精品国产69国产精品亚洲| 激情成人在线视频| 亚洲欧美一区二区在线观看| 这里只有精品在线播放| 久久一区亚洲| 欧美成人第一页| 影院欧美亚洲| 久久综合久久综合久久| 久久欧美肥婆一二区| 国产亚洲a∨片在线观看| 亚洲一二三四久久| 亚洲专区一二三| 国产精品乱看| 性欧美超级视频| 久久精品一区二区国产| 国产日本欧洲亚洲| 香蕉久久夜色| 久久在线观看视频| 影音先锋日韩精品| 美日韩精品免费| 亚洲高清免费在线| 99精品国产一区二区青青牛奶| 久久三级福利| 欧美激情视频在线免费观看 欧美视频免费一 | 久久久女女女女999久久| 亚洲欧美日韩国产综合| 国产精品视频精品视频| 亚洲欧美欧美一区二区三区| 欧美在线免费一级片| 国产美女精品| 欧美韩日精品| 一本色道久久88亚洲综合88| 欧美日韩人人澡狠狠躁视频| 99精品欧美| 久久久久九九九| 91久久国产自产拍夜夜嗨| 欧美激情1区2区| 亚洲一区综合| 男人天堂欧美日韩| 一本大道久久a久久综合婷婷| 欧美性色aⅴ视频一区日韩精品| 亚洲一区免费在线观看| 另类激情亚洲| 在线亚洲精品| 国内精品国产成人| 欧美经典一区二区三区| 亚洲欧美视频在线观看| 欧美成人四级电影| 午夜精品影院| 亚洲丰满在线| 国产麻豆一精品一av一免费| 美女网站在线免费欧美精品| 一区二区激情视频| 免费在线欧美黄色| 亚洲制服欧美中文字幕中文字幕| 国模一区二区三区| 欧美日韩综合精品| 久久久久国产精品www| 一本久道久久综合中文字幕| 久久久青草婷婷精品综合日韩| 亚洲美女av电影| 国产一区二区三区四区老人| 欧美日韩国产一区二区三区地区 | 国产精品福利网站| 久久久久久久久久久成人| 日韩午夜视频在线观看| 久久尤物电影视频在线观看| 亚洲综合精品四区| 亚洲国产日本| 狠狠久久五月精品中文字幕| 欧美偷拍一区二区| 欧美成人免费va影院高清| 欧美在线一区二区| 亚洲淫片在线视频| 亚洲免费观看高清完整版在线观看| 久久婷婷人人澡人人喊人人爽| 亚洲免费视频一区二区| 99re66热这里只有精品3直播| 精品av久久707| 国产三级欧美三级日产三级99| 欧美日韩美女在线观看| 欧美激情a∨在线视频播放| 久久青草久久| 久久久久久久999精品视频| 午夜在线a亚洲v天堂网2018| 一本大道久久a久久精品综合| 亚洲国产高清一区| 亚洲高清资源| 亚洲第一色在线| 欧美高清视频在线观看| 免费不卡在线观看| 另类av导航| 欧美成人a视频| 久久国产视频网站| 91久久综合| 亚洲欧洲另类国产综合| 亚洲国产天堂久久综合网| 亚洲成人中文| 最新成人av网站| 亚洲日本电影| 一个色综合av| 亚洲夜间福利| 欧美亚洲视频| 久久裸体艺术| 欧美成人免费全部| 亚洲国产精品高清久久久| 亚洲黄色在线观看| 99视频一区| 亚洲综合国产| 久久久噜噜噜久久久| 久久综合伊人77777| 欧美高清不卡| 欧美视频在线视频| 国产日本欧美一区二区三区| 国产欧美日韩不卡免费| 伊人久久大香线蕉av超碰演员| 在线观看欧美日韩| 亚洲精品一区中文| 亚洲欧美日韩精品久久奇米色影视| 性欧美xxxx大乳国产app| 欧美在线综合视频| 女同性一区二区三区人了人一| 欧美顶级艳妇交换群宴| 亚洲精品1区2区| 国产精品99久久久久久久久| 亚洲午夜一二三区视频| 久久精品国产77777蜜臀 | 亚洲美女毛片| 亚洲一区免费在线观看| 久久久久久久尹人综合网亚洲 | 99热这里只有成人精品国产| 亚洲欧美日韩成人| 日韩视频三区| 亚洲男人的天堂在线| 久久影视精品| 欧美性色视频在线| 亚洲国产成人av| 亚洲一区二区三区精品在线| 久久嫩草精品久久久久| 99精品国产热久久91蜜凸| 欧美在线free| 欧美日韩在线视频首页| 经典三级久久| 亚洲欧美日本日韩| 欧美国产成人在线| 午夜精品久久久久久久白皮肤| 牛牛国产精品| 国产综合色一区二区三区 | 在线播放精品| 香蕉av福利精品导航| 亚洲国产综合视频在线观看| 亚洲视频久久| 欧美精品一区二区蜜臀亚洲| 国产综合网站| 香蕉久久久久久久av网站 | 欧美激情第六页| 欧美一级免费视频| 欧美日韩综合不卡| 亚洲精品在线看| 免费中文日韩| 久久久久.com| 国产一区二区日韩精品欧美精品| 在线一区二区三区四区五区| 欧美激情按摩| 久久在线免费观看| 狠狠色丁香久久婷婷综合_中| 欧美一二三视频| 亚洲天堂av在线免费观看| 欧美激情第10页| 亚洲日本无吗高清不卡| 免费观看久久久4p| 久久久精品网| 狠狠色伊人亚洲综合成人| 欧美一区2区三区4区公司二百 | 亚洲日本一区二区| 你懂的亚洲视频| 亚洲激情啪啪| 欧美国产日本在线| 美女视频一区免费观看| 在线观看成人小视频| 另类尿喷潮videofree| 久久激情视频| 在线成人av| 免费日韩av| 欧美成人精品不卡视频在线观看 | av成人动漫| 亚洲人成77777在线观看网| 欧美精品日韩| 亚洲一区在线观看视频| 在线中文字幕日韩| 国产精品一区视频网站| 亚洲欧美一区二区三区极速播放|