這個作業屬於哪個課程 | 2020春福大面向對象程序設計 |
---|---|
這個作業要求在哪里 | 寒假作業1 |
這個作業的目標 | 安裝開發環境,回顧知識,了解編譯過程,實現白話文編程,記錄學習過程,發布博客 |
作業正文 | 問答題 實踐題 編程題 |
其他參考文獻 | 在各題鏈接中體現 |
問答題
你認為C語言有什么缺陷(你覺得哪里用的不順手)
- 我在使用C語言的過程中經常出現一些數組下標越界的問題,但是編譯的時候不會提示錯誤,由於越界的內容是未知的,運行的時候就可能產生一些我想象不到的混亂的答案。如果不夠熟練C語言中的語法要求,會產生邏輯問題。C語言的運算符數量多,優先級比較復雜,不易記住,所以使用的時候容易出現錯誤。
- 關於平行的問題“你覺得C++和C語言比有什么優點”,因為我之前完全不了解c++,所以搜索了一些資料。下面是一些個人收獲和想法:
C語言是面向過程的語言,C++是基於面向對象的語言。面向過程是指先通過分析得到解決問題所需的步驟,然后把這些步驟用函數一步步實現,使用的時候依次調用。面向對象是把構成問題的成分分解成幾個對象,用功能來划分問題,建立對象的目的是描述某個事物在解決問題步驟中的行為。
封裝是將抽象得到的數據和行為(或功能)相結合,是將數據與操作數據的源代碼進行有機的結合,形成“類”。
首先,類是一種用戶定義的引用數據類型,類的本質是數據類型,不是可以操作的數據,所以也沒有開辟空間。其次,類的成員當中可以有成員變量(數據成員)和成員函數,類的屬性與數據成員(也是一種數據類型)相對應,成員函數則用於操作類的各項屬性,是一個類具有的特有的操作。
C語言的編譯過程
C語言的編譯過程包括預處理,編譯,匯編,鏈接四個步驟。
- 預處理的工作包括將#include頭文件和宏定義替換成真正的內容。預處理結束后,得到的是一個體積比原來文件大的文本文件。
- 預處理得到的程序中有數字、字符串、變量的定義,以及C語言的關鍵字。編譯過程可以檢查語法,在確認所有指令符合語法規則后,就可以將經過預處理的程序轉換成匯編代碼。
- 匯編過程將匯編代碼轉成機器碼,生成目標文件,是二進制格式。目標文件由段組成。代碼段包含的主要是程序的指令。數據段主要存放程序中要用到的各種全局變量或靜態的數據。
- 鏈接過程將多個目標文件和庫文件連接成最終的可執行文件。鏈接處理分成靜態鏈接和動態鏈接。
實踐題
查看自己的C++編譯器版本
在visual studio 2019界面中,選擇工具欄->命令行->開發者命令提示,然后輸入cl.exe即可查看編輯器版本
用命令行編譯一份C代碼
在visual studio 2019界面中,按住鍵盤win鍵+r鍵,在出現的頁面中輸入cmd,點擊確定即可打開命令行。
輸入要編譯的代碼所在的盤符,例如D:並按回車鍵,隨后輸入代碼的地址和文件名,例如CC\case。這是個Hello world的代碼,按下回車即可顯示結果。
編程題
閱讀題目
中國文化博大精深,從倉頡造字開始,漢字一直流傳到了今天。我們在感嘆漢字的源遠流長時,也不禁感慨,為什么沒有一門使用漢字編程的語言?
漢字真的不能編程嗎?最近文言文編程火了一把,吾有一數。曰三。名之曰「甲」。這朴實無華的變量定義無疑不是幾千年來中華文化的發展中一朵奇葩。
今天小王同學想,文言文能編程那白話文呢?他找到了你,讓你幫幫他。
編程要求
編寫一個程序,輸入滿足以下語法要求的一段文字,輸出運行后的結果。
變量定義:整數 錢包 等於 零
運算(加法):錢包 增加 四
運算(減法):錢包 減少 四
輸出:看看 錢包
樣例
輸入:
整數 錢包 等於 零
錢包 增加 四
錢包 減少 三
看看 錢包
輸出:
一
思考及划分模塊過程
從題目中我們可以看到
整數 錢包 是用來定義初始值的
等於 用來賦值
增加 減少 分別表示加和減
看看 是用來輸出結果的
程序按功能划分需要分為以下幾個部分
- 把輸入的漢字轉化成數字
- 把計算結果以漢字的形式進行輸出
- 排除錯誤的輸入
- 根據“增加”和“減少”分別進行計算
編寫模塊及測試樣例
百度得知在中文windows操作系統下,中文默認是采用BGK字符集,每個字符占兩個字節。因此char數組就可以存漢字了,且strcmp(a,b)在a,b完全相同時返回一個值0,所以可以用strcmp函數進行判斷。現在我們可以寫出一個判斷初始值的函數。
int change(char shu[])
{
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"二")==0)
return 2;
if(strcmp(shu,"三")==0)
return 3;
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"四")==0)
return 4;
if(strcmp(shu,"五")==0)
return 5;
if(strcmp(shu,"六")==0)
return 6;
if(strcmp(shu,"七")==0)
return 7;
if(strcmp(shu,"八")==0)
return 8;
if(strcmp(shu,"九")==0)
return 9;
if(strcmp(shu,"零")==0)
return 0;
}
接下來我們需要寫一個函數用來輸出算好的結果(函數中只寫單個數字的輸出,數據保證只從0-99所以兩位數的情況可以放到主函數中判斷)
void change1(int num)
{
if(num==0) printf("零");
if(num==1) printf("一");
if(num==2) printf("二");
if(num==3) printf("三");
if(num==4) printf("四");
if(num==5) printf("五");
if(num==6) printf("六");
if(num==7) printf("七");
if(num==8) printf("八");
if(num==9) printf("九");
}
先來考慮怎么輸入第一行。可以用四個短的字符數組分別存四個詞語,並設置錯誤輸入的特判。由於變量的名字不一定是“錢包”,所以輸入第一行的時候如果變量名不是“錢包”不算錯誤輸入,同時我們可以進行數據的初始化。下面是main函數中用於輸入並檢查第一行的語句。
scanf("%s %s %s %s",a,b,c,d);
if(strcmp(a,"整數")!=0||strcmp(c,"等於")!=0)
{printf("輸入錯誤\n");
return 0;
}
num=change(d);
由於“看看”說明需要輸出結果了,所以當輸入“看看”時不再進入計算過程。
如果計算行輸入的變量名與第一行的變量名不同,也屬於輸入錯誤。
排除這種情況后,再輸入接下來的計算種類和數值。
如果計算種類與“增加”或“減少”相同,則分別進入不同的運算,如果出現“加上”“減去”這樣的輸入則不進入運算。
while(1)
{scanf("%s",y);
if(strcmp(y,"看看")==0) break;
if(strcmp(y,b)!=0)
{printf("輸入錯誤\n");
return 0;
}
scanf("%s",z);
scanf("%s",x);
if(strcmp(z,"增加")==0)
num=num+change(x);
else if(strcmp(z,"減少")==0)
num=num-change(x);
else
{printf("輸入錯誤\n");
return 0;
}
}
原來的輸出部分只寫了一句
change1(num);
這樣可以滿足樣例的輸入輸出。
但是后來想到雖然數字只有零到九,但是多次運算可以得到大於十的數,所以要對得到的計算結果進行分類。
可以分成三類,第一類是個位數,第二類是整十的數,第三類是兩位數但不是整十的數。
if(num/10==0)
change1(num);
else if(num%10==0)
{change1(num/10);
printf("十");
}
else
{change1(num/10);
printf("十");
change1(num%10);
}
這樣就可以滿足大於十的計算結果輸出。
下面是一個檢測變量名可以不用是“錢包”的樣例
需要改進的地方
如果輸入的數字不是個位數,那么我的程序無法判斷並計算
完整代碼
#include<stdio.h>
#include<string.h>
int change(char shu[])
{
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"二")==0)
return 2;
if(strcmp(shu,"三")==0)
return 3;
if(strcmp(shu,"一")==0)
return 1;
if(strcmp(shu,"四")==0)
return 4;
if(strcmp(shu,"五")==0)
return 5;
if(strcmp(shu,"六")==0)
return 6;
if(strcmp(shu,"七")==0)
return 7;
if(strcmp(shu,"八")==0)
return 8;
if(strcmp(shu,"九")==0)
return 9;
if(strcmp(shu,"零")==0)
return 0;
}
void change1(int num)
{
if(num==0) printf("零");
if(num==1) printf("一");
if(num==2) printf("二");
if(num==3) printf("三");
if(num==4) printf("四");
if(num==5) printf("五");
if(num==6) printf("六");
if(num==7) printf("七");
if(num==8) printf("八");
if(num==9) printf("九");
}
int main()
{char a[10],b[10],c[10],d[10],y[10],z[10],x[10],m[10];
int num;
scanf("%s %s %s %s",a,b,c,d);
if(strcmp(a,"整數")!=0||strcmp(c,"等於")!=0)
{printf("輸入錯誤\n");
return 0;
}
num=change(d);
while(1)
{scanf("%s",y);
if(strcmp(y,"看看")==0) break;
if(strcmp(y,b)!=0)
{printf("輸入錯誤\n");
return 0;
}
scanf("%s",z);
scanf("%s",x);
if(strcmp(z,"增加")==0)
num=num+change(x);
else if(strcmp(z,"減少")==0)
num=num-change(x);
else
{printf("輸入錯誤\n");
return 0;
}
}
scanf("%s",m);
if(num/10==0)
change1(num);
else if(num%10==0)
{change1(num/10);
printf("十");
}
else
{change1(num/10);
printf("十");
change1(num%10);
}
return 0;
}