c++中計算有理式
第一步,將有理式以字串的形式輸入
第二步,使用string.at()函式逐個讀取有理式字串中的字元,將數字拼在一起構成運算元,然後將運算元和操作符依次存放在乙個鍊錶中
第三步,進入有理式計算演算法
(只是一般的計算演算法,至於開頭出現括號,出現浮點數,運算元字串轉int或double型別等等,不做進一步解釋)
1、 定義兩個棧,分別儲存運算元和操作符
2、 定義乙個判定操作符優先順序的函式value(string c1,string c2),這裡由於程式需要,將操作符型別定義為string型別。
符號共有+ - * / ( ) =等7種,操作符之間的優先順序為:
valuec2+
-*/(
)=c1+
11-1-101
1-11
-1-101
1*11
1101
1/11
1101
1(00
0000
—— 數字1代表c1可以進行優先運算,-1代表c2優先順序更高,0代表什麼都不做,繼續輸入運算元即可。
3、 依次pop有理式鍊錶中的運算元(符)進來,當檢測到鍊錶中僅剩乙個 = 時,推出程式顯示計算結果。
4、 遵循左算優先的原則,當某個運算元push進運算元棧後進行判斷,如果value(c1,c2)<1,那麼直接回到3;如果value(c1,c2)==1,那麼進入5。
5、 判斷此時c1是否為(,若是,就pop掉操作符棧;否則,pop出運算元棧的兩個數,進行運算,然後pop掉操作符,然後回到3;
附程式:
//stack_eqution.cpp :
定義控制台應用程式的入口點。 //
#include
"stdafx.h"
#include
#include
#include
using
namespace std;
//單節點定義
typedef
struct
nnode *ptonnode;
typedef
struct
nnode
stack1,*s1;
typedef
struct
onode *ptoonode;
typedef
struct
onode
stack2,*s2;
//進棧函式
void push(int
x, s1
y)void push(string
x, s2
y)//
出棧函式
int pop(s1
y)string pop(s2
y)//string
轉數字型別(int,float,double)
template
type>
type stringtonum(const
string& str)
//操作符比較
int value(string
cl,string
cr)else
if (cl == "*" | cl == "/")
else
if (cl == "(")//
當cl出現(或者)時,
else
level = 0;
return level;}//
進佇列函式
void pushh(string
x, s2
y)s2 z = new
stack2;
z->a = x;
z->next = p->next;
p->next = z;}//
多項式字串入棧
int into_stack(s2
equation, strings)}
if (s.at(i) =='+' | s.at(i) =='-' | s.at(i) =='*' | s.at(i) =='/' | s.at(i) =='(' | s.at(i) ==')' | s.at(i) =='=')
else }
if (str1 == "=")
}// if (s.length() == 0)
//
return 1;}//
內部運算函式
int compute(s2
equ)
if (equ->next->a =="=")
string str1 = pop(equ);//
用於過程中儲存equ中的字串
int nl, nr;//
用於過程中運算元的儲存
控制台程式裡呼叫控制台程式
現在遇到這麼個問題,我想用控制台裡呼叫控制台程式來實現多文字。但是在控制台裡呼叫控制台程式時,它不是出現新的控制台視窗顯示,而是已有的控制台裡顯示呼叫的程式,system d code 練習 jjplace editor debug editor.exe winexec d code 練習 jjpl...
沒有控制台視窗的控制台程式
include include pragma comment linker,subsystem windows entry maincrtstartup int main int argc,char argv 編譯後執行程式會彈出乙個訊息框,而沒有背後的控制台視窗。再看看下面的 include in...
建立控制台程式
var username,userpwd string login boolean begin try while not login do 登入 begin write login readln username setconsolemode getstdhandle std input hand...