git連接:
Operation3.1.1
此次修改內容:改變了語言的讀取方式,把代碼從dev移植到vs中。git
表達式的話我也沒用到棧的知識,由於只是用到隨機數隨機符號,而後排列好了,也就沒有檢驗的必要了。
核心是在計算的時候。中綴表達式轉後綴表達式,而後進行計算的道理都懂的,我就講講具體實現。假設自述表達式中的符號以字符形式由鍵盤輸入,並存放在字符型數組str中,其後綴表達式存放在字符型數組exp中,在將自述表達式轉換成後綴表達式的過程當中用一個字符型數組stack做爲棧。設字符「#」爲表達式的終止符。下面給出將自述表達式轉換成後綴表達式的方法。
依次從鍵盤輸入表達式中的字符ch,對於每個ch作以下操做:github
對於表達式「(56-20)/(4+2)#」,其轉換成後綴表達式的過程,就以下:算法
Stack | exp | 說明 |
---|---|---|
( | Ch爲「(」,將此括號插入棧stack | |
( | 56# | Ch爲數字,將56存入數組exp中,並插入一個字符「#」 |
(- | 56# | Ch爲「-」,因爲stack中「(」之前沒有字符,故直接將ch插入棧stack中 |
(- | 56#20# | Ch爲數字,將20#存入數組exp中 |
56#20#- | Ch爲「)」,將棧stack中「(」之前的字符依次刪除並存入數組exp中,而後將「(」刪除 | |
/ | 56#20#- | Ch爲「/」,將ch插入棧stack中 |
/( | 56#20#- | Ch爲「(」,將此括號插入棧stack中 |
/( | 56#20#-4# | Ch爲數字,將4#存入數組exp中 |
/(+ | 56#20#-4# | Ch爲「+」,因爲stack中「(」之前沒有字符,故直接將ch插入棧stack中 |
/(+ | 56#20#-4#2# | Ch爲數字,將2#存入數組exp中 |
/ | 56#20#-4#2#+ | Ch爲「)」,故將棧stack中「(」之前的字符依次刪除並存入數組exp中,而後將「(」刪除 |
56#20#-4#2#+/ | Ch爲「#」,故將棧stack中的全部有符依次彈出並存入數組exp中,而後再將ch存入數組exp中,獲得後綴表達式 |
int Question::check(string str)//用於計算生成的運算式的結果 { stringstream s; s << str << '#'; str = s.str(); s.str(""); int i, t, top = 0,len=str.length(); double d; char str1[11]; //表達式 char exp[15]; //存後綴表達式 char stack[15]; //做爲棧來使用 char ch; for (i = 1; i <= len; i++) str1[i] = str[i - 1]; t = 1; i = 1; ch = str1[i]; i++; while (ch != '#') { switch (ch) { case '(': //斷定爲左括號 top++; stack[top] = ch; break; case ')': /*斷定爲右括號*/ while (stack[top] != '(') { exp[t] = stack[top]; top--; t++; } top--; break; case '+': /*斷定爲加減號*/ case '-': while (top != 0 && stack[top] != '(') { exp[t] = stack[top]; top--; t++; } top++; stack[top] = ch; break; case '*': /*斷定爲'*'或'/'號*/ case '/': while (stack[top] == '*' || stack[top] == '/') { exp[t] = stack[top]; top--; t++; } top++; stack[top] = ch; break; case ' ':break; default: while (ch >= '0' && ch <= '9') /*斷定爲數字*/ { exp[t] = ch; t++; ch = str1[i]; i++; } i--; exp[t] = '#'; t++; } ch = str1[i]; i++; } while (top != 0) { exp[t] = stack[top]; t++; top--; } exp[t] = '#'; t = 1; top = 0; ch = exp[t]; t++; while (ch != '#') { switch (ch) { case '+':stack[top - 1] = stack[top - 1] + stack[top]; top--; break; case '-':stack[top - 1] = stack[top - 1] - stack[top]; top--; break; case '*':stack[top - 1] = stack[top - 1] * stack[top]; top--; break; case '/':if (stack[top] != 0) stack[top - 1] = stack[top - 1] / stack[top]; else { printf("\n\t除零錯誤!\n"); exit(0);/*異常退出*/ } top--; break; default:d = 0; while (ch >= '0' && ch <= '9') /*斷定爲數字字符*/ { d = 10 * d + ch - '0'; /*將數字字符轉換成對應的數值*/ ch = exp[t]; t++; } top++; stack[top] = char(d); } ch = exp[t]; t++; } return stack[top]; }
原本是想看看Qt的,qt的方法學起來也很簡單容易看懂跟swing有點類似,可是qt for vs2017
的版本還沒發佈,只好用一下vs自帶的MFC,MFC呢看起來比較繁瑣
可是,若是不想本身敲代碼,能夠在建立MFC工程的時候選基於對話框,這樣用起來就比較方便,跟vb同樣的把控件拖入,設置控件的屬性以及動做。不過MFC還要設置類、
變量等。
編程