第2次做業:熟悉使用工具

GIT地址 Git地址
GIT用戶名 Misizu-star
學號後五位 61126
博客地址 個人博客
做業連接 我的第2次做業:熟悉使用工具

Part1.配置環境

1.VS2017

下載:目前VS更新到VS2019,(本人幾乎使用過vs各類版本,推薦vs2017)下載VS2017去須要官網的找舊版本。下載地址
安裝:運行引導安裝程序

等待下載安裝,安裝後設置一些我的配置,運行如圖
html

2.git

下載:下載地址 根據本身電腦配置選擇對應版本
安裝:安裝過程建議選擇默認,若在桌面點鼠標右鍵出現此標誌則安裝成功
git

part2.代碼實現

背景

阿超家裏的孩子上小學一年級了,這個暑假老師給家長們佈置了一個做業:家長天天要給孩子出一些合理的,但要有些難度的四則運算題目,而且家長要對孩子的做業打分記錄。做爲程序員的阿超造成了這個軟件的需求:
  • 程序接收一個命令行參數 n,而後隨機產生 n 道加減乘除(分別使用符號+-*/來表示)練習題,每一個數字在 0 和 100 之間,運算符在 2 個 到 3 個之間。
  • 軟件所出的練習題在運算過程當中不得出現非整數,好比不能出現 3÷5+2=2.6 這樣的算式。
  • 練習題生成好後,將生成的 n 道練習題及其對應的正確答案輸出到一個文件 subject.txt 中。

設計過程

這次做業代碼使用C++完成,建立一個名爲Calculator的類,類成員包含生成題目,計算題目兩個函數。

1.生成題目程序員

  • 思路:使用rand()函數產生隨機數、操做符個數、操做符下標,存儲在類型爲string的變量中。代碼以下:
string Calculator::MakeQuestion() {
    string question = "";
    int number1 = random(1, 100);
    int op_num = random(1, 3);    //隨機產生操做符個數
    question += to_string(number1);
    for (int i = 0; i < op_num; i++) {
        int op_index = random(0, 3);    //操做符下標()
        int number2 = random(1, 100);
        if (op_index == 3) {
            while (number1 < number2 || number1 % number2 != 0) {
                number2 = random(1, 50);    //不能整除則從新生成隨機數
            }
        }
        number1 = number2;
        question += op[op_index] + to_string(number1);  //Calculator成員中 string op[4] = { "+","-","*","/" };
    }
    question += "=";
    return question;
}

2.計算題目github

  • 探索:在百度上了解中綴表達式和後綴表達式,解決方法爲:先將表達式轉化爲後綴表達式,經過使用棧操做計算後綴表達式(後綴表達式真是個好東西)。但中綴表達式轉後綴表達式比較麻煩 不會用代碼實現。經過與同窗討論找到一個簡單方法。緩存

  • 思路:全部的四則運算都是先對兩個數據進行運算,再將運算結果通下一個數據進行運算,直到全部數據運算完爲止。難點就在於運算符的優先級。dom

  • 實現:使用兩個棧:數據棧和運算符棧;設置運算符優先級;遍歷字符串:
    1.遇到數據直接push數據棧
    2.遇到運算符分兩種狀況:
    ①運算符棧爲空 或 棧外運算符優先級 > 棧頂運算符優先級:運算符直接入棧
    ②棧外運算符優先級 <= 棧頂運算符優先級:將數據棧頭兩個數據和運算符棧棧頂pop,進行計算並將結果再push進數據棧,直到運算符棧爲空,運算符才入棧。
    3.最後的數據棧棧頂即是表達式結果。
    話很少說,上代碼:
int Calculator::Solve(string question) {
    stack<int> num_stack;    //保存運算數據的棧
    stack<char> op_stack;    //保存操做符的棧
    int i = 0;
    while (i < question.length()) {
        char temp = question[i];
        if (temp != '+'&&temp != '-'&&temp != '*'&&temp != '/'&&temp != '=') {
            int number = stoi(question.substr(i));    //取出完整運算數據
            num_stack.push(number);                   //運算數據直接入棧
            i += to_string(number).length();
        }
        else {
            if (op_stack.empty())
                op_stack.push(temp);
            else if (Prec(temp) > Prec(op_stack.top()))
                op_stack.push(temp);    //棧外操做符優先級大於棧頂
            else {                      //棧外操做符優先級小於或等於棧頂
                while (!op_stack.empty()) {
                    char op = op_stack.top();
                    int num2 = num_stack.top();
                    num_stack.pop();
                    int num1 = num_stack.top();
                    num_stack.pop();
                    if (op == '+')
                        num_stack.push(num1 + num2);
                    else if (op == '-')
                        num_stack.push(num1 - num2);
                    else if (op == '*')
                        num_stack.push(num1 * num2);
                    else if (op == '/')
                        num_stack.push(num1 / num2);
                    op_stack.pop();
                }
                op_stack.push(temp);
            }
            i++;
        }
    }
    return num_stack.top();
}

寫入文件
將數據寫入文件比較簡單,參考博客。效果以下:
函數

part3.單元測試與調試

  • 單元測試:啥?還要單元測試,單元測試啥玩意兒?em......在可愛的百度的幫助下找到 這篇博客 。裏面介紹了單元測試的基本步驟和注意事項。經過幾番倒騰終於掌握了單元測試的基礎方法。附圖以下:

    在單元測試運行完畢後,VS 會彈出一個測試結果窗口。綠色表明經過,紅色表明失敗。
    測試應考慮多種狀況,屢次測試,防止隱藏Bug。
  • 調試:調試較爲簡單,調試(F5)、斷點(F9)、逐過程調試(F10)、逐語句調試(F11)。
    一、經過二分法設置斷點調試(F5)找到bug的大體位置。
    二、逐語句調試,並在監視欄裏添加變量函數,與預想結果比較,找出邏輯錯誤。

part4.迴歸測試

迴歸測試是指修改了舊代碼後,從新進行測試以確認修改沒有引入新的錯誤或致使其餘代碼產生錯誤。也就是說修改代碼後再次進行單元測試。
個人程序規模較小,單元測試也較爲簡單,在迴歸測試中也沒有遇到什麼問題。工具

part5.Git提交

參考這篇博客的Git提交代碼步驟及常見錯誤和解決方法。
經過實際操做總結出簡單幾步:(前三步)visual-studio

  • 1.git配置
    git config --global user.name "YourName"
    git config --global user.email YourEmail
  • 2.克隆到本地:
    git clone url "url"爲代碼地址
  • 3.提交文件:
    git add 將文件提交到緩存區
    git status 檢查狀態,若提交到暫存區則會顯示提交的全部文件
    git commit -m "輸入描述" (描述本身寫)
    git push 將緩存區全部文件提交到github
  • 4.pull request
    在本身的GitHub上點擊 「New pull request」

    再點擊 發起請求,審覈經過則是如下效果:
    單元測試

    因爲提交後原倉庫已經改變,前三步操做沒能截到圖,emm......

part6.我的感想

  • 收穫:經過本次做業,如今我對Git和Github基本熟悉,基本掌握了VS2017的單元測試方法,瞭解到了斷言(Assert)的用處,對調試也更加熟練。
    在代碼實現過程當中使用到 stoi()(將字符串轉化爲int類型) 和substr()(取出字符串的子串)將兩個結合使用:
string str="abc123cd";
int num=stoi(str.substr(4));
cout << num << endl;
獲得的結果是23,str.substr(4)獲得的子串爲"23cd",再用stoi()轉化後就只剩23了,(不懂,對stoi()函數了解不深)但這樣卻能將字符串中未知長度的數字提取出來。
  • 總之,動手實踐。不懂的就多百度,看看別人遇到此類問題是怎麼解決的,多看多學。另外,英語和專業書籍真的很重要😢。
相關文章
相關標籤/搜索