1. 程式人生 > >簡易計算器

簡易計算器

轉化 用兩個 簡易 測試 小數 con esp 包含 using

1.讀入一個只包含 +, -, *, / 的非負整數計算表達式,計算該表達式的值。

2.Input測試輸入包含若幹測試用例,每個測試用例占一行,每行不超過200個字符,整數和運算符之間用一個空格分隔。沒有非法表達式。當一行中只有0時輸入結束,相應的結果不要輸出。

3.Output對每個測試用例輸出1行,即該表達式的值,精確到小數點後2位。

這道題的難處在於如何判斷運算的先後順序,仔細思考下我們就知道可以利用Stack來存儲我們需要的數字,而運算符僅作判斷使用。

我們又知道——我們輸入的時候先 數字 再 運算符;故可用兩個while()進行輸入;(因為一開始的輸入規則和後面的規則有所區別)

講一下這道提題的難點。

1.輸入格式的把握;

  兩個while(),先輸入數字 cin >> n; 在輸入運算符 c=getchar();

  利用string s; 這就需要多個if()來判斷哪些應該是整數並將其轉化為數值;(較為復雜,但在第二種方法中使用);

2.運算符的先後;

  建一個stack<double> array; 先壓數字 ,根據前一個的運算符判斷——如果是“ * ”或 “ / ”則把即將壓棧的數值和棧的頂值相乘,再壓棧;

  兩個棧,一個數值棧,一個運算符棧,寫一個函數Compare()比較運算符大小——然後可以直接寫運算的方法,不再考慮運算先後;再一個壓棧的方法(邊壓棧,邊計算結果);

#include <iostream>
#include <map>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
stack<double> num;

int main()
{
    int n;
    while(cin >> n)
    {
        char c;
        c = getchar();
        if(c==\n&&n==0)
            
break; num.push(n); c = getchar(); double m; while(cin >> n) { if(c==*) { m = num.top(); m *=n; num.pop(); num.push(m); } if(c==/) { m = num.top(); m/=n; num.pop(); num.push(m); } if(c==+) { num.push(n); } if(c==-) { num.push(-n); } if(getchar()==\n) break; c = getchar(); } double sum = 0; while(!num.empty()) { sum+=num.top(); num.pop(); } printf("%0.2lf\n",sum); } return 0; }

有所鑒借;

簡易計算器