新手C++ 練習項目--計算器

本篇博客用於記錄我本身用C++實現的一個計算器,目標是完成加減乘除帶括號的四則運算,並在後期用工廠設計模式加以優化。git

 

 

Part 1:calculate 1+1=2設計模式

實現這樣的一個式子的計算,只須要用到字符串分割便可,一開始嘗試了stringstream去先讀入一整個字符串"1+2",而後建立了兩個臨時變量int和一個char,用>>去讀入,可是發現讀入的char放在中間被忽略掉了函數

string s ="12+34"; // stringstream ss(s); // int n1,n2,c; // ss>>n1>>c>>n2;//c is 34 ,the '+' is ignored

而後我就換用了substr去進行分割,substr有兩個參數,一個是開始分出字串的位置,另外一個是字串的長度,第二個參數默認值是npos,也就是字符串末尾。post

int i =0; while(isdigit(s[i])) { ++i;//pos
 } 
    cout<<cal( atof(s.substr(0,i).c_str()) , atof(s.substr(i+1).c_str()) ,s[i])<<endl;

這樣就跑出來了一個簡單的1+1=2了!但這個程序改起來很麻煩,沒有辦法適應1+1+1=3,也沒有優先級操做,等下一part咱們再來作新功能。優化

 

part2:後綴表達式的使用spa

今天想了好久,發現本身想不出一個既能很好的處理各類符號優先級又能處理好括號的問題,這個時候各位羣友的博客幫了我很大忙,我知道了一個叫後綴表達式的東西,行如  "6  5  2  3  + 8 * + 3  +  *"的這種式子,運算符在操做數以後,且是能夠直接用堆棧簡單處理的一個不錯的表達式,簡單總結就是,遇到數字就壓入堆棧,遇到一個符號就彈出兩個操做數,計算以後又壓回去,加號和減號有點不一樣,由於加號和減號能夠寫在一開頭做爲負號處理(switch的case裏不要申請局部變量,過不去編譯的,固然加個大括號表示生命週期也能夠過的~).net

這裏有一篇不錯的博客,我在這裏給你們安利一下:https://blog.csdn.net/sgbfblog/article/details/8001651設計

附上我寫的代碼:code

double calc(char post[]) { stack<double> sd; //stack<char> sc;
    char tempNum[MAX_BUFFER]; int j = 0; for(size_t i =0;post[i] != '\0';++i)//一直讀到結尾
 { while(isdigit(post[i])){ tempNum[j] = post[i]; ++i; ++j; tempNum[j] = '\0';//能夠配合後面的直接設置i = 0 來重置tempNum
            if(post[i] == ' ') { sd.push(atof(tempNum)) ; j=0; } } switch(post[i]){ case '+': {//局部變量的申請,加個大括號,否則編譯不過,也能夠把n1 n2放到上面去聲明
                    double n1 = sd.top(); sd.pop(); if(sd.empty()){ sd.push(n1); n1 = 0; } double n2 = sd.top(); sd.pop(); sd.push(n1+n2); break; } case '-': { double n1 = sd.top(); sd.pop(); if(sd.empty()){ sd.push(-n1); n1 = 0; } double n2 = sd.top(); sd.pop(); sd.push(n1+n2); break; } case '*': { double n1 = sd.top(); sd.pop(); double n2 = sd.top(); sd.pop(); sd.push(n1*n2); break; } case '/': { double n1 = sd.top(); sd.pop(); double n2 = sd.top(); sd.pop(); sd.push(n2/n1); break; } break; default:break; } //++i;
 } double total = sd.top(); sd.pop(); return total; }

這個處理後綴的表達式的函數實現了基本功能,可是若是後面的數是負數就會bug   QAQ,寫好一個計算器真的不容易,明天繼續更新part3,中綴表達式轉後綴表達式!blog

相關文章
相關標籤/搜索