《軟件工程基礎》第二次做業:GIT和Github工具的使用

GIT地址 https://github.com/JusticeXu
GIT用戶名 JusticeXu
學號後五位 61409
博客地址 https://www.cnblogs.com/codingbyjusticexu/
做業連接 https://edu.cnblogs.com/campus/xnsy/Autumn2019SoftwareEngineeringFoundation/homework/7590

Part0.背景

《現代軟件工程基礎》如今留下了這樣一份做業,熟悉GIT還有Gitpub的基本操做。c++

Part1.配置環境

由於電腦是MacBook,運行的是osX系統,所以對比於PC端上的Windows,使用Visual studio會有各類水土不服的狀況存在。所以用Xcode來代替,語言爲C++git

Part2.克隆項目

1)班級的項目被放到了Github上,須要註冊Gitpub帳號並將項目Fork到本身的同名倉庫裏程序員

2)下載並安裝GIT工具github

3)在Terminal中輸入如下代碼數組

git clone https://github.com/Cherish599/AchaoCalculator.git

出現如下界面,則說明項目已經被clone到電腦上數據結構

Part3.代碼實現

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

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

  • 程序接收一個命令行參數 n,而後隨機產生 n 道加減乘除(分別使用符號+-*/來表示)練習題,每一個數字在 0100 之間,運算符在 2 個 到 3 個之間。函數

  • 因爲阿超的孩子才上一年級,並不知道分數。因此軟件所出的練習題在運算過程當中不得出現非整數,好比不能出現 3÷5+2=2.6 這樣的算式。

  • 練習題生成好後,將生成的 n 道練習題及其對應的正確答案輸出到一個文件 subject.txt 中。

  • 當程序接收的參數爲4時,如下爲一個輸出文件示例。

    13+17-1=29
    11*15-5=160
    3+10+4-16=1
    15÷5+3-2=4

分析:從題目中能夠獲得,該程序中有兩步操做。

1)接受一個命令行參數n,而後隨機產生n道題目。

2)練習題生成後,將生成的練習題和正確答案輸出到一個文件subject.txt

注意事項:運算數應該在0100之間,運算符在23個之間,在運算過程當中不得出現非整數。

#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include <math.h>
#include <fstream>
#include <string>
#define random()(rand()%1000)
using namespace std;


//數字轉換爲字符串
string int_string(int number)
{
    int value = abs(number);//取絕對值
    char str[100];
    itoa(value, str, 10); //運用itoa()函數將int型整數轉換爲字符串
    string str_= str;
    return str_;
}
//算式轉換爲字符串
string group(string str1, string str2, char m)  // group:算式組合
{
    string Equation;       // equation:算式
    Equation = str1 + m + str2;
    return Equation;
}
//生成運算符
char mark(int opt)
{
    int opt1, a;
    char symbol[1]; // 符號數組
    if (opt == 0)
    {
        opt1 = 2;
    }
    if (opt == 1)
    {
        opt1 = 4;
    }
    a = random() % opt1+1; //隨機生成1-2或1-4的數,隨opt的值而定,opt意爲是否含有乘除法
    if (a == 1) symbol[0] = '+';
    if (a == 2) symbol[0] = '-';
    if (a == 3) symbol[0] = '*';
    if (a == 4) symbol[0] = '/';
    return symbol[0];
}
//主函數
int main()
{
    std::__1::string str_num1,str_num2;
    srand((int)time(NULL));     //設置時間種子,每次執行種子不一樣,生成不一樣的隨機數
    int num1, num2,minus;
    int    opt, bracket, output, max, min, amount, control, b, c,d;
    cout << "請輸入你想要的出題數量:" << endl;
    cin >> amount;
    string equation[1000]; //定義數組
    char symbol;
    ofstream fout;
    if (opt == 1)
     {
     cout << "除法有無餘數,1(有),0(無)" << endl;
     cin >> output;
     }
    if ( output == 1 )
    {
        fout.open("output.txt");
        fout << amount << "道四則運算題以下:" << endl;
    }
    else
    {
        cout << amount << "道四則運算題以下:" << endl;
    }
    for (int i = 0; i<amount; i++)  //爲輸出規定題數
    {
        num1 = random() % (max - min + 1) + min;// 隨機生成min-max的整數
        num2 = random() % (max - min + 1) + min;// 隨機生成min-max的整數
        control = random() % 9 + 2;  //控制是幾個數的運算式,最多支持10個數的運算式
        symbol = mark(opt);
        if (minus == 0)      //原本要加負數的,思路有點不清晰,之後改進
         {
         str_num1 = int_string(num1);
         str_num2 = int_string(num2);
         }
         if (minus == 1)
         {
         d = random() % 2; //隨機生成0-1的數
         if (d == 0)
         {
         str_num1 = int_string(num1);
         str_num2 = '-' + str_num2;
         }
         }
        str_num1 = int_string(num1);
        str_num2 = int_string(num2);
        equation[i] = group(str_num1, str_num2, symbol);
        if (control >= 2)
        {
            for (; control >= 2; control--)
            {
                symbol = mark(opt);
                str_num1 = equation[i];
                if (bracket == 1)
                {
                    b = random() % 2; //隨機生成0-2的數
                    if (b == 0)  //若是b=0,就在字符串str_num1的左右加上括號
                    {
                        str_num1 = '(' + str_num1 + ')';
                    }
                }
                symbol = mark(opt);
                num2 = random() % (max - min + 1) + min;// 隨機生成min-max的整數
                str_num2 = int_string(num2);
                b = random() % 2;
                std::__1::string value;
                if (b == 0)
                {
                    value = str_num1;
                    str_num1 = str_num2;
                    str_num2 = value;
                }
                equation[i] = group(str_num1, str_num2, symbol);
            }
        }
        //判斷是否重複
        int repeat = 0; //repeat:重複
        for (c = 0; c<i; c++)
        {
            if (equation[c] == equation[i])
            {
                i = i - 1;
                repeat = 1;
                break;
            }
        }
        if (repeat != 1)//若不重複,則輸出
        {
            if (output == 1)
            {
                fout << equation[i] << "=" << endl;
            }
            else
            {
                cout << equation[i] << "=" << endl;
            }
        }
        
    }
    if (output == 1) //輸出到文件
    {
        fout.close();
    }
}

輸入結果:

最後將代碼上傳:

Part4.單元測試

OCUnit是蘋果Xcode中自帶的測試框架,它是一個可視化的測試框架,簡單的單元測試以下圖所示。

1.新建項目:

2.最簡單的測試
進入到這個類,setUp是每一個測試方法調用執行,tearDown是每一個測試方法調用執行。testExample是測試方法,和咱們新建的沒有差異。不過測試方法必須testXXX的格式,且不能有參數,否則不會識別爲測試方法。測試方法的執行順序是字典序排序。按快捷鍵Command + U進行單元測試,這個快捷鍵是所有測試。

3.出現以下結果(因爲咱們斷言a是等於0的,而a等於3,因此測試沒有經過。固然有其它的,用到再看,demo裏都有。)

Part5.我的感覺

此次做業消耗的精力真的是很大的,首先是GIT這個非可視化界面的使用,須要一次又一次不斷地百度,才懂得了一點點皮毛。而後是從GitHub上面fork下來的代碼……真的看不懂orz。沒辦法只好本身全盤推倒從新寫,在寫代碼的過程,我發現我對數據結構中棧的知識掌握得還不是很熟練,不斷地翻書翻書翻書…

總的來講這一次做業發現很多新的世界,包括簡單使用Github與GIT(甚至我以爲在GitHub上下載速度真的是太慢了,還了解到了一些hosts文件的知識,能夠算得上是意外收穫了)。所以雖然私下我罵了這個做業無數次,但完成後的喜悅是難以用語言歸納的,一個字:爽!

相關文章
相關標籤/搜索