- github連結
- 作業連結
編寫一個程式,要求根據給定的圓的半徑求圓的面積,并将求得的結果列印出來。……建立一個工程,将程式寫成兩個.cpp和一個.h的形式。
這個問題倒是沒什麼難的,但對于同學們來說是一個上手子產品化的好開端。從現在開始,不是隻為了AC而寫代碼,而是要寫“有品質的代碼”、“讓别人看得懂的代碼”。在我看來,每行每業都有前人總結的“經驗”。那“高内聚低耦合”、“子產品化”,這兩條就是程式設計中很重要的兩條道理。第一個是問題的粒度,如果問題的規模很大,就應該将其分子產品,然後逐個攻破。這樣子做代碼結構、脈絡清晰,使得思路容易分析,然後友善debug、合作程式設計和疊代。電腦還是挺死闆的,你怎麼打代碼它就按照你的代碼做。但如果你隻是為了AC寫代碼,寫出來的代碼雜亂、命名不規範、格式亂套、沒有分子產品……讓别人想看的欲望都沒有,那你就不适應合作程式設計的要求。巨大的工程很難由一個人單獨完成,刷boss也得組幾個隊友對不對?

我之前的電腦作業中是有分多個檔案的。但我在一個 .h 頭檔案中同時包括了函數聲明和定義。這次的作業讓我學到了一個隻将聲明放在 .h 中,而定義全放到新的 .cpp 檔案中去。這樣子做,如果别人想看你的代碼能做到什麼功能,隻需看 .h 中的所有函數聲明即可。
cin輸入檢測
基于棟哥上課提出的問題:
int a, b;
cin >> a >> b;
cout<< a + b;
/* 輸入 3a5
輸出 3 (a = 3,b = 0) */
下面節選自 人民郵電出版社《C++ Primer Plus》 第六版 第755頁内容:
不同版本抽取運算符檢視輸入流的方式是相同的。跳過空白(空格、換行、制表符),直到遇到非空白字元。…… >> 運算符将讀取一個指定類型的資料。
在上面這個例子中,輸入
3a5
那麼 3 指派給了變量
a
,輸入中的字元a會留在輸入流中等待下一條
cin
語句。輸入時沒有滿足程式期望的情況,例如上面的變量
b
,這種情況下,将不會改變變量
b
的值(是以,如果b有初始化的話,那麼b會保持初始化的值)。cin中有一些狀态,會設定為false。這個false的傳回值可以讓
if
、
while
語句來判定輸入是否滿足要求。
C++ 的一個與 C 最大的差別就在于類。C語言中用
%d
scanf
的傳回值這樣的東西來檢測輸入。而 C++ 将其封裝成各種成員函數。詳細可以看看這兩篇部落格:
- cin.fail() 示例代碼簡潔易懂。
- cin.get,cin.clear以及cin.sync 這篇比較詳細。
Something else
這個例子(輸入
3a5
)讓我想到了我之前的程式。我之前是寫了挺多的輸入檢測方面的函數,比方說輸入題目數量時可以檢測出輸入字元串并報錯然後提示使用者重新輸入一遍。然後我猛地一想到好像類似于
3a5
的我沒辦法檢測出來。
如圖所示,在輸入題目數量時,輸入
3a5
。程式會認為使用者輸入的題目數量為3,然後
a5
留在緩沖區中等待下一條輸入,并被檢測答案輸入的有效性的函數給擋住,并輸出錯誤提示。
這是我之前的檢測代碼:
while (scanf_s("%d", &input) != 1)//輸入的不是%d
{
while ((ch = getchar()) != '\n')
putchar(ch);//如果使用者輸入了字元串,就顯示這個字元串,并且在顯示“不符合要求”
}
在這段之後再加上這一條
while((ch = getchar()) != '\n' && ch != EOF);//清空緩存區