程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 327 Evaluating Simple C Expressions 簡易C表達式計算 stl模擬

uva 327 Evaluating Simple C Expressions 簡易C表達式計算 stl模擬

編輯:C++入門知識

 由於沒有括號,只有+,-,++,--,優先級簡單,所以處理起來很簡單。

題目要求計算表達式的值以及涉及到的變量的值。

我這題使用stl的string進行實現,隨便進行練手,用string的erase刪掉全部空格,然後對++、--進行處理然後刪去,最後就只剩簡單式子了,簡單循環下就出來了。

這裡有幾個坑點:

1.erase函數刪除字符後,後面字符的下標都會發生變化,剛開始使用i++去檢查空格,結果刪除後會跳掉字符。

2.++、--的後綴處理要注意,我開了兩個數組放後綴運算的。

3.輸出的變量值是當前後自增後的數。

 


唉,我發現我每次寫stl,代碼都很亂哪,果然缺欠練習呢。

代碼:


 
 

#include <iostream>  
#include <string>  
using namespace std; 
 
int v[27], used[27]; 
int p[27], m[27];           //record the i++ i--  
 
int main() { 
    string str; 
    while (getline(cin, str) != NULL) { 
        cout << "Expression: " << str << endl; 
        int value = 0; 
        for (int i = 0; i < 26; i++) 
            v[i] = i + 1, used[i] = p[i] = m[i] = 0; 
        for (int i = 0; i < str.size();) 
            if (str[i] == ' ') 
                str.erase(i, 1); 
            else 
                i++; 
        size_t f1, f2; 
        while (1) { 
            f1 = str.find("++"); 
            if (f1 != string::npos) { 
                if (str[f1 - 1] >= 'a' && str[f1 - 1] <= 'z') 
                    p[str[f1 -1] - 'a']++; 
                else 
                    v[str[f1 + 2] - 'a']++; 
                str.erase(f1, 2); 
            } 
//          cout << str << endl;  
            f2 = str.find("--"); 
            if (f2 != string::npos) { 
                if (str[f2 - 1] >= 'a' && str[f2 - 1] <= 'z') 
                    m[str[f2 -1] - 'a']--; 
                else 
                    v[str[f2 + 2] - 'a']--; 
                str.erase(f2, 2); 
            } 
            if (f1 == string::npos && f2 == string::npos) 
                break; 
//          cout << str << endl;  
        }//while  
//      cout << value << endl;  
        value += v[str[0] - 'a']; 
        used[str[0] - 'a'] = 1; 
        for (int i = 1; i < str.size(); i++) { 
            if (str[i++] == '+') 
                value += v[str[i] - 'a'], used[str[i] - 'a'] = 1; 
            else 
                value -= v[str[i] - 'a'], used[str[i] - 'a'] = 1;    
//      cout << str[i-1] << str[i]<<' ' << value << endl;  
        }//for  
        cout << "    value = " << value << endl; 
        for (int i = 0; i < 26; i++) 
            if (used[i]) 
                cout << "    " << char('a' + i) << " = "<< v[i] + p[i] + m[i] << endl; 
    }//while  
    return 0; 
} 

#include <iostream>
#include <string>
using namespace std;

int v[27], used[27];
int p[27], m[27];   //record the i++ i--

int main() {
 string str;
 while (getline(cin, str) != NULL) {
  cout << "Expression: " << str << endl;
  int value = 0;
  for (int i = 0; i < 26; i++)
   v[i] = i + 1, used[i] = p[i] = m[i] = 0;
  for (int i = 0; i < str.size();)
   if (str[i] == ' ')
    str.erase(i, 1);
   else
    i++;
  size_t f1, f2;
  while (1) {
   f1 = str.find("++");
   if (f1 != string::npos) {
    if (str[f1 - 1] >= 'a' && str[f1 - 1] <= 'z')
     p[str[f1 -1] - 'a']++;
    else
     v[str[f1 + 2] - 'a']++;
    str.erase(f1, 2);
   }
//   cout << str << endl;
   f2 = str.find("--");
   if (f2 != string::npos) {
    if (str[f2 - 1] >= 'a' && str[f2 - 1] <= 'z')
     m[str[f2 -1] - 'a']--;
    else
     v[str[f2 + 2] - 'a']--;
    str.erase(f2, 2);
   }
   if (f1 == string::npos && f2 == string::npos)
    break;
//   cout << str << endl;
  }//while
//  cout << value << endl;
  value += v[str[0] - 'a'];
  used[str[0] - 'a'] = 1;
  for (int i = 1; i < str.size(); i++) {
   if (str[i++] == '+')
    value += v[str[i] - 'a'], used[str[i] - 'a'] = 1;
   else
    value -= v[str[i] - 'a'], used[str[i] - 'a'] = 1; 
//  cout << str[i-1] << str[i]<<' ' << value << endl;
  }//for
  cout << "    value = " << value << endl;
  for (int i = 0; i < 26; i++)
   if (used[i])
    cout << "    " << char('a' + i) << " = "<< v[i] + p[i] + m[i] << endl;
 }//while
 return 0;
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved