這個作業屬於哪個課程 | 2020面向對象程序設計張棟班 | |||||||||||
這個作業的要求在哪里 | 面向對象程序設計寒假作業2 | |||||||||||
這個作業的目標 | 1、學習git的創建倉庫和上傳代碼;2、優化代碼並且可以優雅地命名;3、學習window批處理 | |||||||||||
作業正文 | 2020面向對象程序設計寒假作業2 | |||||||||||
其他參考文獻 | freopen函數;C++語言程序設計基礎;windows批處理教程;創建倉庫;commit和push |
首先讀題吧!
編程題(請使用C語言或者C++完成以下題目):
• 繼續完成作業一的編程題。
• 優化架構,一般要求每個函數長度不超過15行。
• 優化規范,尤其是命名規范。
• 制作一個編譯腳本,運行該腳本可以編譯你的代碼,可選的腳本語言,python(2.7),windows批處理,powershell,shell。
• 進行單元測試,即測試每一個函數,並制作一個測試腳本,運行該腳本可以進行測試,並顯示測試結果。
• 在作業一編程題的基礎上添加以下功能:
o 通過命令行讀取一個文件,然后運行這個文件。如我的程序叫lang,lang 1.txt代表我要運行1.txt這個文本中的代碼。
o 假設我的1.txt內容如下:
• 整數 錢包 等於 零
• 錢包 增加 四
• 錢包 減少 三
看看 錢包
o 輸入lang 1.txt后,命令行輸出一。
一、關於代碼!要求:把作業一的編程題優化,首先要把每個函數的長度控制在15行以內,其次是命名要規范。
我要解決的就是函數長度問題和命名的問題(main(主函數),transform(轉化),process(步驟),output(輸出),這是第二個要求,命名,我也不曉得我這樣命名專不專業!),自己代碼太長了,要思考更好的寫法。這一次我想嘗試用C++來寫,原因是我覺得String類這個應該會有很大的用處,就可不用strcmp函數了,直接用==,output的時候直接用+,這樣可太方便了。還有一個就是getline函數!!
首先我初始化了一些東西,主要是用在漢字轉化上,
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "減少";
之后我把整個問題分為了,四個函數來實現,分別是main(主函數),transform(轉化),process(步驟),output(輸出)。
第一個transform(轉化)是漢字轉化為阿拉伯數字,這里的想法是運用數組下標對於數字,這在結束的轉化里也用到了。
int transform(string number)
{
int i;
for (i = 0;; i++)
{
if (number == chinese[i])
{
break;
}
}
return i;
}
第二個是錢包的加加減減,函數process(步驟)同樣是運用到數組下標的對應。
void process(string first)
{
string number;
getline(cin, number);
if (first == add)
{
sum = sum + transform(number);
}
else
{
sum = sum - transform(number);
}
}
第三個是output函數,代碼比較長,原本想要分兩個來函數來寫,但是最終還是沒分出來,它們之間的變量關系比較緊密,所以超出了幾行。
void putout()
{
int a[10], n, i, t,l;
string outcome;
if (sum < 0) cout << "error!";
else {
n = sum;
if (sum <= 10) cout << chinese[sum];
else {
for (i = 1; n != 0; i++)
{
a[i] = n % 10;
n = n / 10;
}
if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
if (a[i - 2] == 0) outcome = outcome + "十";
else {
for (t = i - 2; t > 0; t--)
{
l = a[t];
outcome = outcome + "十" + chinese[a[t]];
}
}
cout << sum << endl << outcome;
}
}
}
最后是main函數。大量應用了getline函數,比如最開始“整數 錢吧 等於 零”,三個循環,每次讀取字符串到空格,最后分出漢字數字“零”來,這解決了我在第一次作業里的困惑。
int main()
{
string begin, origin, later, first;int flag = 1;
for (int i = 1; i <= 3; i++)
getline(cin, begin, ' ');
getline(cin, origin);
sum = transform(origin);
do {
getline(cin, later, ' ');
if (later == "錢包")
{
getline(cin, first, ' ');process(first);
}
else
{
putout();flag = 0;
}
} while (flag);
return 0;
}
完整代碼如下:
#include<iostream>
#include<string>
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "減少";
int sum;
int transform(string number)
{
int i;
for (i = 0;; i++)
{
if (number == chinese[i])
{
break;
}
}
return i;
}
void process(string first)
{
string number;
getline(cin, number);
if (first == add)
{
sum = sum + transform(number);
}
else
{
sum = sum - transform(number);
}
}
void putout()
{
int a[10], n, i, t,l;
string outcome;
if (sum < 0) cout << "error!";
else {
n = sum;
if (sum <= 10) cout << chinese[sum];
else {
for (i = 1; n != 0; i++)
{
a[i] = n % 10;
n = n / 10;
}
if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
if (a[i - 2] == 0) outcome = outcome + "十";
else {
for (t = i - 2; t > 0; t--)
{
l = a[t];
outcome = outcome + "十" + chinese[a[t]];
}
}
cout << sum << endl << outcome;
}
}
}
int main()
{
string begin, origin, later, first;int flag = 1;
for (int i = 1; i <= 3; i++)
getline(cin, begin, ' ');
getline(cin, origin);
sum = transform(origin);
do {
getline(cin, later, ' ');
if (later == "錢包")
{
getline(cin, first, ' ');process(first);
}
else
{
putout();flag = 0;
}
} while (flag);
return 0;
}
二、有關腳本的那些事!
第一個:編譯腳本
我好難啊!
學習過程就不提了!
講講我遇到的問題
首先,我的思路的這樣的,依次打開(type)文件,直至打開作業二.cpp,然后編譯!
可想而知,我遇到了什么!
那就是滿屏的代碼!!
之后,我就仔細想想,這不太行,會不會是只要打開路徑就好,在作業二.cpp所在的文件夾就行。
於是我就是試了試!
沒想到,滿屏代碼消失了,卻出現了令我聞風喪膽,看了就吐的這一段話!
<
'gcc' 不是內部或外部命令,也不是可運行的程序
或批處理文件。
又又又找不到gcc了!!
我該怎么辦,也只能百度了,於是可愛的網友告訴我要以下這樣寫!
但是,就在我開心的轉圈圈的時候!!gcc它竟然找不到作業二.cpp了
所以!
我試了一遍又一遍都搞不定它,所以我只好靈機一動,把作業二.cpp復制在了腳本的文件夾了,然后成功了!!
哈哈哈!!
第二個:測試腳本
我開始因為是寫一個批處理文件然后就相當於一個程序來測試,然后參考了其他同學的作業,才發現是,重新寫一個.cpp來測試,測試腳本只是來運行它的??希望我的理解沒有錯。
首先根據我自己的代碼吧,我覺得只有output函數最需要測試,這也是自己在寫代碼的時候修改最多的。
根據這個函數的性質,我的測試程序的功能是,輸入一個數字(當然這個數字在0~99之間),得到正常的對應漢字可判斷。
這很像在學習寫作業的提交反饋哦。
我的測試代碼:
#include<iostream>
using namespace std;
int sum;
string b[10] = { "九","十","二十","十五","九十九","三十五","六十六","十一","零","一" };
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" }, add = "增加", depress = "減少";
string output()
{
int a[10], n, i, t, l;
string outcome;
if (sum < 0) cout << "error!";
else {
n = sum;
if (sum <= 10) outcome=chinese[sum];
else {
for (i = 1; n != 0; i++)
{
a[i] = n % 10;
n = n / 10;
}
if (a[i - 1] != 1) outcome = chinese[a[i - 1]];
if (a[i - 2] == 0) outcome = outcome + "十";
else {
for (t = i - 2; t > 0; t--)
{
l = a[t];
outcome = outcome + "十" + chinese[a[t]];
}
}
}
}
return outcome;
}
int main()
{
string output();
int a[10] = {9,10,20,15,99,35,66,11,0,1},i;
for (i = 0; i < 10; i++)
{
sum = a[i];
if (output() == b[i])
cout << "pass" << endl;
else
cout << "error" << endl;
}
}
我的測試腳本和截圖:
三、添一些功能?!
添加功能!
我看到題目的時候是驚呆的狀態!這樣可以??可以用代碼寫出來的??竟然要打開一個txt。
然后通過大佬的提示用freopen函數來寫就好。於是粗粗看過百度對這個函數用法的介紹,我就上場寫了,沒想到,竟然成了!
我的代碼:
int main()
{
string begin, origin, later, first;int flag = 1;
freopen("D:\\window批處理學習\\cin.txt","r" , stdin);
for (int i = 1; i <= 3; i++)
getline(cin, begin, ' ');
getline(cin, origin);
sum = transform(origin);
do {
getline(cin, later, ' ');
if (later == "錢包")
{
getline(cin, first, ' ');process(first);
}
else
{
putout();flag = 0;
}
} while (flag);
return 0;
}
結果:
創建倉庫和上傳代碼!
首先,我先從群里下載了,GitHubdesktop,然后創建了自己的倉庫
步驟如下
第一步在D盤新建一個文件夾,取名git
第二步點擊軟件頁面菜單欄file后選擇第一個new repository
第三步選擇創建位置為文件夾git,取一個你喜歡的名字
第四步創建完成!
之后把你整理好的代碼文件夾放在你新創建的倉庫里!
之后就是commit(填寫summary之后點擊左下角)
再push它
ok了!