阿超的四則運算(第二次做業)

GIT地址 https://github.com/StepEnter
GIT用戶名 StepEnter
學號後五位 62404
博客地址  https://www.cnblogs.com/step-enter/p/11543291.html
做業連接 http://www.javashuo.com/article/p-weggbcgg-bz.html

 

 

 

 

 

 

 

Part 0. 背景

阿超家裏的孩子上小學一年級了,這個暑假老師給家長們佈置了一個做業:家長天天要給孩子出一些合理的,但要有些難度的四則運算題目,而且家長要對孩子的做業打分記錄。html

做爲程序員的阿超心想,既然天天都須要出題,那何不作一個能夠自動生成小學四則運算題目與解決題目的命令行 「軟件」呢。他把老師的話翻譯一下,就造成了這個軟件的需求:git

  • 程序接收一個命令行參數 n,而後隨機產生 n 道加減乘除(分別使用符號+-*/來表示)練習題,每一個數字在 0 和 100 之間,運算符在 2 個 到 3 個之間。
  • 因爲阿超的孩子才上一年級,並不知道分數。因此軟件所出的練習題在運算過程當中不得出現非整數,好比不能出現 3÷5+2=2.6 這樣的算式。

建立程序,我在這裏使用Visual Studio 2019程序員

 

 

Part 1. 配置環境

因爲配置環境安裝Git和VS2019篇幅較多,因此分開寫了,詳見上一篇博客:https://www.cnblogs.com/step-enter/p/11542956.htmlgithub

安裝VS時沒有遇到什麼問題。如今就來講說安裝Git時吧。Git是一個超好用的分佈式版本控制系統,它能敏捷高效的處理任何或小或大的項目,但安裝Git時,老是安裝不上,過了好久才發現,本身安裝了一個與本身電腦不同的版本,致使一致安裝不上。後來在官網上從新下載了一個,最後安裝成功。編程

 

 

Part 2. 克隆項目

要求:咱們須要將咱們作的項目放在倉庫地址中:步驟以下所示:小程序

1.如圖所示: https://github.com/join 這個網址處成功申請註冊一個 Github 帳號登錄名爲:StepEnter數組

 

2.成功登陸後,輸入阿超倉庫的網址 https://github.com/Cherish599/AchaoCalculator 點擊Fork ,將阿超的四則運算庫拷貝到本身的同名倉庫中,以下圖所示:app

 

3.以下圖所示,帳號名爲StepEnter的用戶以從AchaoCalculator中獲取到了阿超的四則運算庫。dom

 

4.點擊Clone or download,複製下拉框連接,如圖所示:編輯器

 

 

 5.返回桌面,點擊右鍵,點擊Git Bash Here,如圖所示:

 

出現Git命令行界面:

 

Git命令行中寫入:

git clone https://github.com/StepEnter/AchaoCalculator.git(這個地址是咱們 Fork 後倉庫的地址,點擊回車

git config --global user.name "你的用戶名"

git config --global user.email 你的郵箱號

接連:git add .

git commit -m "分支名稱"(如:git commit -m "apple")

獲得如下界面:

 

 此刻即用Git記錄下全部的改動

如今到文件C:\Users\ASUS\Desktop中查找與倉庫同名的文件夾AchaoCalculator,這就是克隆到本地的項目截圖以下:

 

打開AchaoCalculator文件夾,截圖以下:

 

進入項目文件夾,新建一個文件夾,重命名爲你的Github帳號名個人帳號爲StepEnter截圖以下:

 

VS2019中新建項目,以Github帳號爲項目名稱,以上述AchaoCalculator中剛建立的StepEnter文件夾的存放位置爲路徑(如個人路徑爲C:\Users\ASUS\Desktop\AchaoCalculator\StepEnter)。截圖以下:

 

項目建立成功後就開始咱們的代碼部分,以下所示:

代碼部分

 建立一個Question的類,將全部有關問題的方法都放在Question裏面,

public class Question

針對阿超這個問題咱們須要設置下列幾個變量,從用戶端輸入的問題個數,隨機數,存放'+', '-', '*', '/'的字符數組,存放四則運算數字數組和存放四冊運算符號數組。以下所示

        public int question_num;//從用戶端輸入的問題個數
        public Random rand = new Random();//設置隨機數
        public char[] option = { '+', '-', '*', '/' };//將四則運算符號放在option裏
        public int[] arr = new int[4];//一個存放四則運算數字數組
        public char[] op = new char[3];//一個存放四冊運算符號數組

創造一個製造表達式的函數,CreateQuestion。

        public void CreateQuestion(int question_num)//創造question_num個四則運算
        {
            this.question_num = question_num;
            for (int i = 0; i < this.question_num; )
            {
                int op_cnt = rand.Next(2, 4);//從rand中選出2-3個符號,op_cnt即符號個數
                for (int j = 0; j < op_cnt; j++)
                {
                    arr[j] = rand.Next(0, 100);//從0-99中隨機選出一個數放在arr[j]裏
                    int temp = rand.Next(0, 4);//從0-3中取出一個數做爲option的下標
                    op[j] = option[temp];//option[temp]裏的符號存放在op[j]裏
                }
                arr[op_cnt] = rand.Next(1, 100);//最後一個數(由於數字數始終比字符數大一個)
                if (Judge(op_cnt) == true)//判斷這個表達式是否知足阿超的要求
                {
                    Write(op_cnt);//若知足要求,則打印表達式
                    i++;//若知足要求,繼續下一個表達式
                } 
            }
        }

其中Judge是一個判斷函數,若知足條件返回一個bool形式的值。

        public bool Judge(int op_cnt)//判斷這個表達式是否知足阿超的要求
        {
            for (int i = 0; i < op_cnt; ++i)
            {
                bool judge = calculate(arr[i], op[i], arr[i + 1]);
                if (judge == false)
                    return false;
            }
            return true;
        }

其中calculate是一個判斷函數,它的返回值也是一個bool形的值,如知足條件,返回值爲真。

        public bool calculate(int num1, char op_1, int num2)//判斷單個表達式是否知足要求
        {
            int ans;
            switch (op_1)
            {
                case '+':
                    ans = num1 + num2;
                    break;
                case '-':
                    ans = num1 - num2;
                    if (ans < 0 )//判斷表達式是否會出現負數
                        return false;
                    break;
                case '*':
                    ans = num1 * num2;
                    break;
                case '/':
                    if (num2 == 0 || num1 % num2 != 0)//判斷分母不爲零並計算是不是分數
                        return false;
                    break;
                default:
                    Console.WriteLine("發生錯誤!");
                    break;
            }
            return true;
        }

其中的打印函數爲Write。

        public void Write(int op_cnt)//打印表達式
        {
            Console.WriteLine("-------------------------------------");
            for (int i = 0; i < op_cnt; i++)
            {
                Console.Write(arr[i]);
                Console.Write(op[i]);
            }
            Console.WriteLine(arr[op_cnt]);
        }    

程序運行結果爲:

 說說感悟吧!這個題被老師提出來以後,我就在腦海中構思了一下這個題的過程,想着用C語言運用幾個函數在20分鐘內就能被搞定。但當我動手敲的時候,發現這個題並無我以前想的那麼簡單。C#,這門語言雖然在暑期的時候學過,但當時沒有大量的練習,致使不少基礎的東西都忘記了,所以寫這個代碼花了很長的時間。最後我想說的是,由於太馬虎了,把CreateQuestion的循環中,下標j寫成了i,致使整個程序跑出來一直都是錯誤的,就這個問題花了我一下午的時間。這裏但願你們可以認真對待本身的程序,不要馬虎,必定要認真檢查代碼。

 

 

Part 3. 單元測試

在 VS2019裏進行單元測試:

右鍵點擊Question大類,點擊建立單元測試,如圖所示:

 

 建立第一個測試:首先建立名爲CreateQuestionTest類,目的是爲了對隨機出現的option下標進行測試,如圖所示:

 

 按照以上方法分別對Judge,calculate進行測試,截圖以下:

 

 感悟:之前一直覺得測試是須要不少大型機器和一羣優秀的人經過複雜的編碼作的一項偉大的事。當我接觸到VS中測試時,我以前也一直覺得測試對於咱們這些小程序來講,跟設置斷點Debug是同樣的,但如今我才發現,測試不只能夠找Bug,還能進行不少更爲複雜的測試。測試是指對一個完成了所有或部分功能、模塊的計算機程序在正式使用前的檢測,以確保該程序能按預約的方式正確地運行。爲了發現程序中的錯誤,我經過對一個方法不斷地測試,最後改正錯誤後所有經過測試。

 

 

 

Part 4. 基本操做

1.斷點

設置斷點和單步運行。將要設置斷點的行號前左鍵單擊,以下圖所示,我在第 272930 行設了個斷點:

 

 設置斷點後運行截圖以下:能夠看出咱們進入的程序裏面當前值的大小,好比這opop_cnt的值爲3,也就是與咱們控制檯上輸入的n值一致。

 

 查找快捷鍵:點擊調試,則可看到如下界面:逐語句快捷鍵爲F11,逐過程的快捷鍵爲F10,跳出快捷鍵爲shift+F11

 

 咱們逐語句查看當前值的大小,截圖以下:

 

 

 

Part 5. 迴歸測試

單元測試不只僅用來保證當前代碼的正確性,更重要的是用來保證代碼修復、改進或重構以後的正確性。也就是說,在每次修改完 Bug 以後,咱們其實都須要運行一遍來看看是否是知足以前全部的單元測試樣例。因此,在每次由於現有的 failed test 而修復原有代碼後,最好都所有運行一遍單元測試,保證之前 passed test 仍然是能夠經過的。

所以修復原有代碼後,運行所有的單元測試的截圖以下:

 

 

Part 6.效能分析


點擊工具欄裏的分析,再點擊性能探察器,截圖以下:

 

選擇GPU使用狀況和CPU佔用率,截圖以下:

 

選擇GPU使用狀況,截圖以下:

 CPU使用率截圖以下:

 

查看該解決方案在運行中佔用CPU的狀況,能夠細化到每一個調用的函數。能夠以此分析所編寫的程序在哪裏能夠進行優化。

 效能分析能夠查看當前具體函數的CPU使用率,這裏好比查看StepEnter.Program::Main的函數CPU使用率,截圖以下:

 

 

Part 7.提交代碼

 利用 Github中git add和git commit命令對本地的倉庫進行修改,而這些操做都是離線的,所以,使用git push命令將Github跟蹤到最新改變。

 在使用該命令前,請確保全部本地的改動都已經 add 並 commit 了。能夠用 git status來檢查:

 

 出現如圖所示的 nothing to commit 即說明已經能夠 push 了。使用 push 命令後,會彈出一個窗口要求登陸 Github,此時輸入 Github 的 用戶名或郵箱 與 密碼 便可成功 push。

 

 登錄成功後,出現下列截圖:

在完成 push 後,咱們就能夠開始向源倉庫(即阿超的倉庫)發起 Pull Request(簡稱 PR ,指發起請求給倉庫貢獻代碼)。打開你 Fork 後的項目主頁,如圖所示,點擊按鈕 New pull request

 

 此時點擊 Create pull request 便可發起請求。

 

 

 

 Part 8. 感想與分享

 1. 這些天來,一直都在與馬虎作「鬥爭」。不只僅是安裝Git安裝錯版本,代碼下標i、j問題,還有單元測試問題。單元測試是真的弄得我都要絕望了,我在VS類裏點擊右鍵,發現右鍵屬性裏沒有「建立單元測試」這一項,我就在百度上尋找解決方案,發現能夠用工具-->自定義-->上下文菜單->-編輯器上下文菜單|代碼窗口-->將「建立單元測試」這個菜單移到運行測試菜單下面,我覺得這樣能夠解決我右鍵屬性沒有建立單元測試的問題,結果發現仍是沒有這一選項,而後我又重啓VS,右鍵出現了建立單元測試這一項,但這一項是暗的,不能點開。就這一個建立單元測試的小問題我就弄了很久很久。最後在同窗的幫助下才發現,一開始建立項目的時候就建立錯了,致使後面建立不了單元測試,不能完成單元測試和迴歸測試。折騰了一天,終於建立單元測試成功。雖然這些都是小問題,但仍是須要細心謹慎,小問題能夠牽扯出大問題,一個一個小問題堆積起來變得愈來愈大,所以在小問題出現時就要解決,不要等到最後纔回過頭來找。

2.這些天我又使用VS建立一些小程序,不是我最熟悉的C語言,而是我最不熟悉的C#。經過這幾天的學習,我看到了我在C#學習上的不足,由於之前貪玩,致使C#的學習都落下了。到如今選喲使用C#時,才發現本身之前的問題。在學習每一門語言時,咱們都要一步一個腳印,不要貪玩,更不要用意念編程,全部程序都須要本身手動敲一下,熟悉一下語言特有的規則,在學習的時候找到本身的錯誤和不足,不要等到後面作項目的時候才追悔莫及。

3.經過Git的安裝和使用,我瞭解到不少關於Git命令行的知識,經過簡易的命令,就可將咱們所寫的代碼放到Github平臺上。GitHub記錄了咱們全部改動後的代碼,版本控制工具能夠用於記錄程序開發過程當中的每一個版本。因爲 Git 自己就是至關好用的工具,以及 GitHub 上彙集了許多牛人牛項目,因此除了單純的代碼託管之外,GitHub 也被視做程序員的 知識庫。學習Github的使用,讓咱們提早進入了項目管理版本控制部分,感謝此次做業!!Y(^0^)Y

相關文章
相關標籤/搜索