題目:從鍵盤輸入乙個小於1000的正數,要求輸出它的平方根(如平方根不是整數,則輸出其整數部分)。要求在輸入資料後先對其檢查是否為小於1000的正數。若不是,則要求重新輸入。
#include
#include
#define m 1000
int main( void )
k=sqrt(i);
printf("%d的平方根的整數部分是%d\n",i,k);
return 0;
}——譚浩強 ,《c程式設計(第四版)學習輔導》,清華大學出版社,2023年7月,p25~26
首先說說題目。程式設計的題目一般有兩種形式:要麼描述程式的行為,僅僅要求程式設計者設計**;要麼純粹地只描述問題,程式的行為及**都由程式設計者設計。前者相當於給出了軟體規格說明(software specification)。後者則相當於提出了乙個軟體需求。這個題目無疑屬於前一種情況。
軟體規格說明應當對軟體應滿足的要求,以可驗證的方式作出完全、精確的描述。
但是題目中的「從鍵盤輸入乙個小於1000的正數」卻並不是乙個完全、精確的描述。程式設計師在看到這個要求之後不可能知道這個資料究竟應該具有什麼樣的性質,這個「正數」究竟是整數還是小數?如果不清楚這個,在**中就無法在確定這個資料的型別。當然也不可能完成程式。
那麼,自作聰明地假設乙個怎麼樣?對不起,這是一種職業惡習,完全背離程式設計師的職業的基本準則。如果學習程式設計的結果是養成了一種職業惡習,顯然與學習程式設計的初衷南轅北轍。因此這樣的題目簡直就是打著紅旗反紅旗。
描述程式的行為的題目中可能涉及到輸入。輸入是由程式使用者完成的,使用者的輸入可能正確也可能有錯誤。
如果考慮到程式的強健性,題目通常要求程式考慮使用者輸入有錯誤的情況。如果不考慮程式的強健性,那麼**可以只考慮使用者輸入沒有錯誤的情況。通常,題目要麼要求程式設計者考慮強健性,要麼不考慮強健性。
從題目中的「檢查是否為小於1000的正數」來看,題目顯然是要求程式具有一定的強健性。然而題目卻沒有說明在輸入不滿足的情況下程式應有的行為——即第二次輸入不小於1000的正數時程式的行為,所以這個題目本身就是不完整的。
既然要求考慮健壯性,就應該把這個意圖貫徹始終。不能虎頭蛇尾,前後自相矛盾。因而針對使用者輸入不滿足的「正數」的情況下程式的行為,題目也應該給出相應的說明。然而題目中對此卻隻字未提,毫無疑問,這個題目本身就是乙個不合格的題目。
求解爛題危害很大,因為爛題本身就是違背程式設計師根本職業要求——周密、嚴謹。解這樣的題目,一無所獲不說,反而有傷自身的素質,而得到的**也必然似是而非,經不起推敲。
測試一下前面引文中的**就不難發現,當輸入「-1」時,程式立刻崩潰——這個程式無比脆弱。然而自相矛盾的是題目卻暗示需要考慮程式的健壯性。
此外當第一次輸入大於等於1000的數,且第二次依然輸入大於等於1000的數的情況下,程式依然能給出結果。**中的那句if語句在這種情況下竟然毫無意義。這樣的**毫無價值。
結論就:路邊的野花不要採,書上的濫題不要做。初學者,亂做習題你傷不起啊!!!!!!!
此外需要指出的是,**中的
「k=sqrt(i);」
也是一種武斷的錯誤寫法,它是建立在sqrt(i)得到的值一定大於或等於i的平方根這個假設之上的,然而這個假設沒有任何依據。
「要求輸出它的平方根(如平方根不是整數,則輸出其整數部分)」,這句話也說的缺乏素質,至少不夠簡潔。無非就是輸出它平方根的整數部分麼,如此簡單的意思怎麼會說的那麼複雜且囉嗦不清呢?
胖紙傷不起啊
作 者 霍雨佳 完成日期 2014 年3月1日 版 本 號 v1.0 問題描述 使用結構體,利用公式看測量人的體重情況 樣例輸入 樣例輸出 問題分析 使用結構體,利用公式看測量人的體重情況 include include include getch標頭檔案 using namespace std v...
ACM,你傷不起
勞資六年前開始搞acm啊!從此踏上了尼瑪不歸路啊!誰特麼跟勞資講演算法是程式設計的核心啊!尼瑪除了面試題就沒見過用演算法的地方啊!誰再跟勞資講演算法之美演算法的力量,勞資一本演算法導論拍死你啊!那是搞acm的入門書啊!特麼的入門書就一千多頁啊!還沒有習題答案啊,學完了你特麼都不知道自己到底會不會啊有...
搞ACM的傷不起啊!!
勞資六年前開始搞acm啊!從此踏上了尼瑪不歸路啊!誰特麼跟勞資講演算法是程式設計的核心啊!尼瑪除了面試題就沒見過用演算法的地方啊!誰再跟勞資講演算法之美演算法的力量,勞資一本演算法導論拍死你啊!那是搞acm的入門書啊!特麼的入門書就一千多頁啊!還沒有習題答案啊,學完了你特麼都不知道自己到底會不會啊有...