面向對象程序設計寒假作業2


這個作業屬於哪個課程 https://edu.cnblogs.com/campus/fzu/2020OOP/
這個作業要求在哪里 https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10231
這個作業的目標 1.新建一個github倉庫,並把作業推送到該倉庫 2.優化編程題 3.發布博客
作業正文 實踐題、編程題
其他參考文獻 https://www.w3h5.com/post/202.html
https://www.cnblogs.com/beyondzones/p/12262100.html
https://mbd.baidu.com/ma/landingpage?t=smartapp_share&appid=GeVyFwtN81ARbPF3GIbuaPlRPT3SfzYB&url=%2Fpages%2Farticle%2Farticle%3Feid%3Dd45ad14869574069552b80de
https://blog.csdn.net/ldl22847/article/details/7506468

實踐題

新建一個github倉庫,使用git,或者github desktop把接下去的編程題的代碼及測試腳本傳到這個倉庫。

在網頁中創建一個倉庫並命名

下載github desktop,在指定的目錄中添加文件,如圖:

請使用.gitignore文件忽略不要上傳的文件。用法自行百度。

創建.gitignore文件先下載Git,然后在本地倉庫所在的目錄中右鍵Git Bash Here

輸入touch .gitignore創建.gitignore文件

找到空白的.gitignore文件,對.gitignore文件進行編輯,並且設置過濾規則

過濾規則如下:

1、跳過單個文件:

比如我需要跳過 project.config.json 這個文件,可以這樣寫:

project.config.json

2、跳過某個格式的文件:

比如 .zip 、 .config 、 .sln 格式的文件,代碼如下:

*.zip*.config*.sln

3、跳過某個文件夾:

比如跳過 Debug 文件夾,代碼如下:

Debug/

4、過濾某個文件夾中的某個文件或者某個格式:

Debug/test.exeDebug/*.zip

5、指定添加某個文件、文件夾或者格式:(前面加感嘆號"!")

!/mtk/one.txt!/mtk/!*.zip

開頭多了一個感嘆號,Git會將滿足這類規則的文件添加到版本管理中。

6、[] 過濾多個文件或者類型

# cat .gitignore *.[oa] *~

第一行告訴 Git 忽略所有以 .o 或 .a 結尾的文件。
一般這類對象文件和存檔文件都是編譯過程中出現的,我們用不着跟蹤它們的版本。
第二行告訴 Git 忽略所有以波浪符(~)結尾的文件
一起上傳.gitignore文件即完成操作

編程題優化

(1)繼續完成作業一的編程題。
(2)優化架構,一般要求每個函數長度不超過15行。
(3)優化規范,尤其是命名規范。
(4)制作一個編譯腳本,運行該腳本可以編譯你的代碼,可選的腳本語言,python(2.7),windows批處理,powershell,shell。

示例腳本:

gcc 1.cpp -o lang.exe
進行單元測試,即測試每一個函數,並制作一個測試腳本,運行該腳本可以進行測試,並顯示測試結果。

示例腳本:

gcc 1.cpp test.cpp -o test.exetest
在作業一編程題的基礎上添加以下功能:
o通過命令行讀取一個文件,然后運行這個文件。如我的程序叫lang,lang 1.txt代表我要運行1.txt這個文本中的代碼。
o假設我的1.txt內容如下:
整數 錢包 等於 零
錢包 增加 四
錢包 減少 三
看看 錢包
o輸入lang 1.txt后,命令行輸出一。
編程題要求:
1.讀題,提取出題目的要求。
2.分解需求,把需求分解為幾個你覺得不太相關的模塊。
3.思考每個模塊怎么寫,可以從簡單的模塊開始寫。
4.對於不會的問題進行查閱資料。
5.對於每一個模塊設計測試用例。
6.詳細記錄下以上每一步,並寫在博客中。
7.不要求完全做出來,但要求記錄詳細。
8.建議博客長度不少於1000字(不包含代碼)。

1.題目要求:

白話文編程要滿足變量的定義,能夠根據輸入的白話文進行加減運算,且能輸出正確結果

2.分解需求:

(1)編寫transform函數,將白話文形式的零到十轉換為數字
(2)以transform函數為輔編寫函數change,使計算范圍擴大為100以內
(3)加減運算合並為一個calculate函數
(4)編寫主函數(遇到“看看 xxx”時就輸出結果的判斷在主函數中體現)

3.思考過程:

針對前一次的作業,我提出了第一個函數——轉換函數除了通過個個枚舉的方式能否用其他方式的疑問,雖然原代碼長度就不超過15行,我通過參考同學的博客發現可以改變先前用個個枚舉的方法,先將漢字的數按順序排列為二維的字符數組,輸入白話####文的數字后遍歷比較字符串,找到后返回對應的數字形式。這樣的方式可以有效地使轉換函數的代碼量減少。

原轉換函數如下:

int transform(char str[]){
    if(strcmp("零",str)==0)return 0;
    if(strcmp("一",str)==0)return 1;
    if(strcmp("二",str)==0)return 2;
    if(strcmp("三",str)==0)return 3;
    if(strcmp("四",str)==0)return 4;
    if(strcmp("五",str)==0)return 5;
    if(strcmp("六",str)==0)return 6;
    if(strcmp("七",str)==0)return 7;
    if(strcmp("八",str)==0)return 8;
    if(strcmp("九",str)==0)return 9;
if(strcmp("十",str)==0)return 10;
//個個枚舉
}

通過參考優化后的轉換函數如下:

char num[15][5]={"零","一","二","三","四","五","六","七","八","九","十"};
//改變作業一中通過個個比較字符串的做法,先將漢字按順序排成列表

int transform(char z[]){
    int i;
    for(i=0;i<11;i++){
        if(strcmp(z,num[i])==0) return i;//比較字符串,返回漢字的數字形式 
    }
} 

由以上使用二維字符數組列表來轉換白話文和數字的方式可以聯想到原代碼中數字轉白話文的result函數可以刪除,直接在主函數中體現

原代碼的加減函數的運算僅限制於十以內的加減運算,若要將運算量擴大為100以內編寫一下change函數.

char str1[20],str2[20];
int change(char d[]){//d數組為讀入用於計算的量,一個漢字的字符串長度為2
    if(strlen(d)==2) return transform(d);//不超過十的數直接用transform函數進行轉換  
    if(strlen(d)==4){//長度為4,對應兩個漢字 
	        str1[0]=d[2];str1[1]=d[3];str1[2]='\0';      //一種情況對應十開頭的數 ,將第二個漢字賦給str1數組 
            if(transform(str1)!=10) return transform(str1)+10;  
            else{
			    str1[0]=d[0];str1[1]=d[1];str1[2]='\0';//另一種情況為十結尾的數字,將第一個漢字賦給str1數組 
                return 10*transform(str1);
            }}
    if(strlen(d)==6){
	    str1[0]=d[0];str1[1]=d[1];str1[2]='\0';str2[0]=d[4];str2[1]=d[5];str2[2]='\0';//幾十幾的類型,分別將第一個漢字和末尾漢字賦個str1和str2 
        return transform(str1)*10+transform(str2);
    }}

優化加減運算函數:原來的加減運算函數只能計算十以內的數,編寫以上change函數后可以進行更大的運算,比較字符串判斷是加運算還是減運算后再進行計算,可將原來的兩個進行加減運算的函數合並為一個calculate函數:

int calculate(int sum,char c[],char d[]){//將原來的加減運算合並為一個calculate函數 
    if(strcmp(c,"增加")==0) return sum+change(d);
    if(strcmp(c,"減少")==0) return sum-change(d);
}

明顯相對於原來的個個枚舉的情況代碼量減少了且運算范圍增大了

對主函數進行修改,將局限於原來十以內的運算擴大為100以內

int main(){
    char a[100],b[100],c[100],d[100];
    scanf("%s %s %s %s",a,b,c,d);
    char m[100],n[100],s[100],t[100];
    sum=change(d);getchar();
    for(;;){
        scanf("%s",m);
        if(strcmp("看看",m)==0) break;
        scanf("%s",n);
        scanf("%s",s);
        if(strcmp("增加",n)==0) sum+=change(s);
        if(strcmp("減少",n)==0) sum-=change(s);
    } 
    scanf("%s",t);
    if(sum<=10) printf("%s",num[sum]);
    if(sum>10){
        int a;
		a=sum/10;
        if(a==1) printf("十");
        else{
            printf("%s",num[a]);
            printf("十");
        }
        int b; 
        b=sum%10;   
        if(b!=0) printf("%s",num[b]); 
    }
    return 0;
}

完整代碼:

#include<bits/stdc++.h>
using namespace std;
int sum;
char num[15][5]={"零","一","二","三","四","五","六","七","八","九","十"};
//改變作業一中通過個個比較字符串的做法,先將漢字按順序排成列表 
int transform(char z[]){
    int i;
    for(i=0;i<11;i++){
        if(strcmp(z,num[i])==0) return i;//比較字符串,返回漢字的數字形式,transform函數用於輔助下面的change函數 
    }
} 
char str1[20],str2[20];
int change(char d[]){//d數組為讀入用於計算的量,一個漢字的字符串長度為2
    if(strlen(d)==2) return transform(d);//不超過十的數直接用transform函數進行轉換  
    if(strlen(d)==4){//長度為4,對應兩個漢字 
	        str1[0]=d[2];str1[1]=d[3];str1[2]='\0';      //一種情況對應十開頭的數 ,將第二個漢字賦給str1數組 
            if(transform(str1)!=10) return transform(str1)+10;  
            else{
			    str1[0]=d[0];str1[1]=d[1];str1[2]='\0';//另一種情況為十結尾的數字,將第一個漢字賦給str1數組 
                return 10*transform(str1);
            }}
    if(strlen(d)==6){
	    str1[0]=d[0];str1[1]=d[1];str1[2]='\0';str2[0]=d[4];str2[1]=d[5];str2[2]='\0';//幾十幾的類型,分別將第一個漢字和末尾漢字賦個str1和str2 
        return transform(str1)*10+transform(str2);
    }} 
int calculate(int sum,char c[],char d[]){//將原來的加減運算合並為一個calculate函數 
    if(strcmp(c,"增加")==0) return sum+change(d);
    if(strcmp(c,"減少")==0) return sum-change(d);
}
int main(){
    char a[100],b[100],c[100],d[100];
    scanf("%s %s %s %s",a,b,c,d);
    char m[100],n[100],s[100],t[100];
    sum=change(d);getchar();
    for(;;){
        scanf("%s",m);
        if(strcmp("看看",m)==0) break;
        scanf("%s",n);
        scanf("%s",s);
        if(strcmp("增加",n)==0) sum+=change(s);
        if(strcmp("減少",n)==0) sum-=change(s);
    } 
    scanf("%s",t);
    if(sum<=10) printf("%s",num[sum]);
    if(sum>10){
        int a;
		a=sum/10;
        if(a==1) printf("十");
        else{
            printf("%s",num[a]);
            printf("十");
        }
        int b; 
        b=sum%10;   
        if(b!=0) printf("%s",num[b]); 
    }
    return 0;
}

4.編譯腳本

編輯完后重命名

但文件類型仍然顯示文本文檔,通過查閱資料可知,文件的擴展名被自動隱藏了

打開我的電腦在查看中勾選文件擴展名

勾選后再次重命名


編譯后如圖

再次編輯如圖:

疑問:要生成如下的.exe文件,路徑問題到底應該怎么解決?

5.單元測試:

參考同學的博客,模仿寫得以下內容:

重命名后得:

疑問:出現以上這種情況到底應該如何解決?

6.添加功能

做的時候完全沒有頭緒,參考同學們的博客了解到了freopen()函數,freopen()包含在頭文件stdio.h里,將這個函數加在優化后的代碼中,即可實現功能的添加。

格式為:freopen("in.txt","r",stdin);,in.txt處填文件路徑

輸入文本內容:

運行所用的腳本:

嘗試以上方法沒有得到其他同學那樣的結果

7.疑問及總結

(1)本次作業的知識盲區特別多,做作業時感到特別迷茫

(2)通過參考同學的做法得到啟發,利用二維字符數組列表來轉換十以內的數字,並且能夠省略result函數的編寫

(3)以transform函數為輔,編寫change函數可以使加減運算的范圍從十以內擴大到一百以內

(4)關於腳本的編寫語法我還不了解,在做作業過程中通過查找網上資料將隱藏的文件擴展名顯示出來得以進一步完成作業

(5)此外,路徑問題還未得到解決,詢問他人仍然未解決,g++環境也不懂得配置

(6)雖然作業完成的並不好,但我相信貴在盡力能將努力的過程體現在文章中,也算不無收獲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM