c++計算器後續(1)

自娛自樂:

大概是一直在說的代碼規範,大概是玩一玩,以上。html

代碼規範:

  • 參考原文:連接ios

  • 相關節選:c++

    • 4 程序的版式git

      • 4.4規則:較長的語句(>80字符)要分紅多行書寫。github

      • 4.5規則:不容許把多個短語句寫在一行中,即一行只寫一條語句。緩存

      • 4.6 規則:if、for、do、while、case、switch、default等語句自佔一行,
        且if、for、do、while等語句的執行語句部分不管多少都要加括號{}。服務器

      • 4.7規則:代碼行以內應該留有適當的空格
        象if、for、while 等關鍵字以後應留一個空格再跟左括號‘( ’, 以突出關鍵字。
        2)函數名以後不要留空格, 緊跟左括號’(’ , 以與關鍵字區別。
        4)‘ ,’ 以後要留空格, 如Function(x, y, z)。若是‘ ;’ 不是一行的結束符號, 其後也要留空格
        二元操做符的先後應當加空格。yii

    • 5 註釋tcp

      • 5.1規則:源文件頭部應進行註釋,列出:生成日期、做者、模塊目的/功能等。分佈式

        /************************************************************
        FileName: test.cpp
        Author: Version : Date:
        Description: // 模塊描述
        Version: // 版本信息
        Function List: // 主要函數及其功能
        1. -------
        History: // 歷史修改記錄

      • 5.2規則:函數頭部應進行註釋,列出:函數的目的/功能、輸入參數、輸出參數、返回值等。

        /*************************************************
        Description: // 函數功能、性能等的描述
        Input: // 輸入參數說明,包括每一個參數的做
        // 用、取值說明及參數間關係。
        Output: // 對輸出參數的說明。
        Return: // 函數返回值的說明
        Others: // 其它說明
        *************************************************/

      • 5.6建議:註釋的主要目的應該是解釋爲何這麼作,而不是正在作什麼。
        若是從上下文不容易看出做者的目的,說明程序的可讀性自己存在比較大的問題,應考慮對其重構。

      • 5.7建議:避免非必要的註釋。

    • 6 標識符命名

      • 6.1規則:命名儘可能使用英文單詞,力求簡單清楚,避免使用引發誤解的詞彙和模糊的縮寫,令人產生誤解。
        說明:
        較短的單詞可經過去掉「元音」造成縮寫;
        較長的單詞可取單詞的頭幾個字母造成縮寫;
        一些單詞有你們公認的縮寫。
        示例:以下單詞的縮寫可以被你們基本承認。
        temp 可縮寫爲 tmp
        flag 可縮寫爲 flg
        statistic 可縮寫爲 stat
        increment 可縮寫爲 inc
        message 可縮寫爲 msg

      • 6.4規則:常量、宏和模板名採用全大寫的方式, 每一個單詞間用下劃線分隔。

      • 6.9建議:函數名以大寫字母開頭,採用謂-賓結構(動-名),且應反映函數執行什麼操做以及返回什麼內容。

      • 6.10建議:類、結構、聯合、枚舉的命名須分別以C、S、U、E開頭,其餘部分聽從通常變量命名規範。

    • 7 可讀性

      • 7.3規則:涉及物理狀態或者含有物理意義的常量,避免直接使用數字,必須用有意義的枚舉或常量來代替。
    • 8 變量、結構

      • 8.2規則:變量,特別是指針變量,被建立以後應當及時把它們初始化,以防止把未被初始化的變量當成右值使用。
    • 9 函數、過程

      • 9.7儘可能寫類的構造、拷貝構造、析構和賦值函數 ,而不使用系統缺省的。

      • 9.8建議:對於不須要拷貝構造函數時,應顯式地禁止它,避免編譯器生成默認的拷貝構造函數。

      • 9.10建議:禁止編寫依賴於其餘函數內部實現的函數。

      • 9.12建議:函數實現中不改變內容的參數要定義成const。

    • 10 c++專用規範

      • 10.3規則:主動使用const,避免使用宏。

      • 10.5規則:儘量局部地聲明變量。

具體代碼:

  • Main.cpp

    /***************************************************************   
          FileName: Main.cpp
              
          Author:newmoon      
          Version :2.0        
          Date:16/07/25   
          
          Description:
              輸入一個字符串算式,拆分數字和運算符並輸出 
          
          Function List:
              int main()	輸入一個字符串算式,拆分數字和運算符並輸出
                                  
          History:               
              <author>  <time>   <version >   <desc>        
              newmoon   16/07/25    2.0     代碼規範相關   
      **************************************************************/ 
          
      #include"Scan.h"
      #include"Print.h"
      #include<iostream>
      #include<queue>
      using namespace std;
    
      int main()
      {
          Scan getStr;
          Print printQue;
          
          string s_input;		//輸入的字符串 
          queue<string> qs_output;		//輸出的隊列 
          
          cin >> s_input; 
          //調用Scan類的對象中的相應函數
          //以獲取拆分好的隊列 
          qs_output = getStr.ToStringQueue(s_input); 
          //調用Print類的對象中的相應函數
          //以輸出拆分好的隊列 
          printQue.PrintStringQueue(qs_output);
          
          return 0;
      }
  • Scan.h

    #ifndef SCAN_H
      #define SCAN_H
    
      #include<iostream>
      #include<queue>
      using namespace std;
    
      class Scan
      {
          public:
              //接收一個字符串算式,
              //將算式中的數字和運算符拆分並存入一個隊列,
              //最後返回這個隊列。
              queue<string> ToStringQueue(string s_input);
      };
    
      #endif
  • Scan.cpp

    /**************************************************************************  
          FileName: Scan.cpp
              
          Author:newmoon      
          Version :2.0        
          Date:16/07/25   
          
          Description:
              定義實現Scan類中的相關方法 
          
          Function List:
              queue<string> ToStringQueue(string s_input) 拆分算式中數字和運算符	
                                  
          History:               
              <author>  <time>   <version >   <desc>        
              newmoon   16/07/25    2.0     代碼規範相關   
      **************************************************************************/
      
      #include"Scan.h"
      #include<iostream>
      #include<queue>
      using namespace std;
    
      /********************************************************   
          Description:接收一個字符串算式,
                      將算式中的數字和運算符拆分並存入一個隊列, 
                      最後返回這個隊列。   
          Input:一個字符串類型的算式               
          Output:無   
          Return:一個元素爲string對象的隊列 
          Others:算式中的數字位數(包括小數位)超過十位則報錯 
      ********************************************************/
    
      queue<string> Scan::ToStringQueue(string s_input)
      {
          queue<string> qs_output;	//返回的隊列 
          string t_str;		//暫存鏈接起來的數字的中間變量 
          int cnt = 0;		//統計數字位數的變量 
    
          //遍歷整個算式字符串以拆分數字和運算符
          //碰到數字先接到中間變量上
          //碰到運算符則先前的數字入隊 
          for (int i = 0; i<s_input.size(); i++)
          {
              //遍歷到運算符 
              if (s_input[i] == '+' || s_input[i] == '-'
                      || s_input[i] == '*' || s_input[i] == '/'
                      || s_input[i] == '(' || s_input[i] == ')')
              {
                  //中間變量若不爲空(如以"-"開頭) 
                  //中間變量裏接起來的數字入隊 
                  if (!t_str.empty())
                  {
                      qs_output.push(t_str);
                      //清空中間變量以便下次鏈接 
                      t_str.clear();
                      //重置位數統計以便下次統計 
                      cnt = 0;
                  }
    
                  //遍歷到的運算符入隊 
                  switch (s_input[i])
                  {
                      case'+':
                          qs_output.push("+");
                          break;
                      case'-':
                          qs_output.push("-");
                          break;
                      case'*':
                          qs_output.push("*");
                          break;
                      case'/':
                          qs_output.push("/");
                          break;
                      case'(':
                          qs_output.push("(");
                          break;
                      case')':
                          qs_output.push(")");
                          break;
                  }
              }
    
              //遍歷到數字 
              else
              {
                  //接到中間變量上以組成數字 
                  t_str = t_str + s_input[i];
    
                  //統計數字位數 
                  if (s_input[i] != '.')
                  {
                      cnt++;
                  }
      
                  if (cnt > 10)
                  {
                      cout << "數字位數超過十位" << endl;
                      exit(1);
                  }
    
                  //以數字結尾的算式須要特判
                  //避免漏掉最後一個數字 
                  if (i == s_input.size()-1)
                  {
                      qs_output.push(t_str);
                  }
              }
          }
    
          return qs_output;
      }
  • Print.h

    #ifndef PRINT_H
      #define PRINT_H
    
      #include<iostream>
      #include<queue>
      using namespace std;
    
      class Print
      {
          public:
              //輸出接收的隊列 
              void PrintStringQueue(queue<string> qs_output);
      };
    
      #endif
  • Print.cpp

    (明明是同樣的星號。。。)

    /*************************************************************************  
          FileName: Print.cpp
              
          Author:newmoon      
          Version :2.0        
          Date:16/07/25   
          
          Description:
              定義實現Print類中的相關方法 
          
          Function List:
              void PrintStringQueue(queue<string> qs_output) 輸出一個接收的隊列	
                                  
          History:               
              <author>  <time>   <version >   <desc>        
              newmoon   16/07/25    2.0     代碼規範相關   
      **************************************************************************/ 
    
      #include"Print.h"
      #include<iostream>
      #include<queue>
      using namespace std;
    
      /************************************  
          Description:輸出一個接收的隊列    
          Input:元素類型爲string對象的隊列 
          Output:隊列中的元素,即string對象   
          Return:無   
          Others:無 
      *************************************/
          
      void Print::PrintStringQueue(queue<string> qs_output)
      {
          //循環輸出直到隊列爲空
          //以此來輸出整個隊列 
          while(!qs_output.empty())
          {
              cout << qs_output.front() << endl;
              //彈出已輸出的隊首元素以準備下一次輸出	 
              qs_output.pop();
          }
      }

順便附帶:

大概是又去看了看git相關的東西,原來只是爲了完成上傳代碼的任務,不知道是什麼東西,反正就照着教程一步一步作就是了,如今再回過頭去看,感受比一臉懵逼好點。下面只是一些本身的理解,助教學長後來卻是給了一些很不錯的教程,適合小白,還有學長本身寫的,連接以下:學長廖雪峯其餘一其餘二其餘三(不必全看,只是有些有時莫名不能訪問,因此多列幾個)

git大概是個分佈式的版本控制系統,感受寫論文或代碼的話可能會用到。所謂版本控制,就是一個東西改來改去有不少個版本,而後它會幫你記錄各個版本,能夠看版本間的不一樣,還能夠回退到各個版本。分佈式大概是這些版本就存在本身的電腦上,而不是存在一箇中心服務器,固然也能夠上傳到遠程的倉庫,好比傳到github上(免費的,還開源 ,感受很厲害)。

使用的話,目前只用到了一些命令(也是命令行吧,長得和cmd挺像),如今是大概知道這些命令到底作了什麼。git init 會在當前的目錄下初始化一個倉庫,大概就是用來存各個版本的地方,是會被隱藏起來的.git文件。git add 會把文件添加到倉庫的緩存區,文件也會被追蹤起來(不是很懂)。git commit 會把倉庫緩存區的文件正式變成倉庫裏的一個版本,還要跟上版本信息。git push 就是把文件傳到遠程的倉庫上,固然你要先添加一個遠程的倉庫。還有git status 能夠看當前目錄下狀態,有哪些文件沒被追蹤,有哪些文件追蹤還沒存到倉庫裏,所有存到倉庫裏的話那工做目錄就是乾淨的(clear)。目前基本這幾個就夠用了。

相關文章
相關標籤/搜索