怎样写C代码——《狂人C》习题解答1(第一章习题7)
??? 自打小學開始,人們就被告知,做題之前應該先審題。這道理雖然很淺顯,但卻無比重要。
??? 然而正是由于這道理過于淺顯,所以總免不了被輕視——甚至被遺忘。人類歷史上發生過無數次因為輕視簡單淺顯的道理而招致失敗或走彎路的事情。輕視看起來簡單的真理,最后總是要受到懲罰的。在缺乏常識的時代更應該重視常識。
??? 編程也是如此。人們往往以為編寫程序代碼才是最有難度的工作,而編程要解決的問題本身是否成立或合理卻常常被忽視,認為那是顯而易見的事。在軟件工程中,需求分析在很長的歷史階段里都被錯誤地認為是最簡單的一個步驟。直到近些年來,有研究指出,軟件50%以上的缺陷是由于需求分析的錯誤造成的,編碼錯誤引起的軟件缺陷基本上只占全部缺陷的1/4左右。這時不少人才恍然大悟地發現:正確地提出問題比解決問題重要的多;因為如果沒能正確地提出問題,就根本談不上正確地解決問題。
??? 道理容易懂,但要真正做到認真地對待需求分析,卻是另一回事。因為這還需要訓練有素的職業修養和職業習慣。絕對不是僅僅在思想上認識到需求分析的重要性,就能養成好的職業習慣;良好習慣的培養需要大量的自覺的自我訓練。只有經過不斷反復的練習才能形成良好的習慣。
??? 這種訓練越早越好。一旦開始學習編程,就應該開始主動地進行良好編程習慣的培養和訓練,而不是等到學習軟件工程時才開始培養這種意識。
??? 在學習編程時,養成良好編程習慣方法之一就是通過抄題來主動地訓練自己。在抄題的過程中注意審查問題是否明確、合理。這樣做的另一個好處是,閱讀你代碼的人能夠清楚地了解這段程序要解決的是什么問題。
??? 下面通過一個例子,來初步地看一下應如何審題:
??? “輸入兩個數,求其最大公約數”
??? 在這里,問題要求輸入的兩個數是什么樣的數就不明確。是整數?分數?實數?復數?這樣的問題其實是無法解決的。因為問題本身就不周密、不嚴格。
??? 抄題時還可以思考對程序的具體要求,明確程序的功能。如果需要也可以自己進一步明確寫出。網上流傳的一套所謂的“C語言經典一百例”,其中的第一題就是一個很好的反例:
??? 【程序1】
??? 題目:有1、2、3、4個數字,能組成多少個互不相同且無重復數字的三位數?都是多少?
??? 1.程序分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。?
??? 2.程序源代碼:?
??? main()
??? {
???? int i,j,k;
???? printf("\n");
???? for(i=1;i<5;i++) /*以下為三重循環*/
?????? for(j=1;j<5;j++)
???????? for (k=1;k<5;k++)
????????? {
?????????? if (i!=k&&i!=j&&j!=k) /*確保i、j、k三位互不相同*/
?????????? printf("%d,%d,%d\n",i,j,k);
????????? }
???? }
??? 拋開這段代碼存在的許多其他問題不談,問題中的“能組成多少個互不相同且無重復數字的三位數”顯然被編程者所忽視了。這樣的代碼沒有什么價值。???
??? 因此強烈建議在寫代碼之前先抄一遍題目。
??? 可能有人覺得題目無法被編譯,沒關系,這可以成為極好的注釋。從某種意義上來說,寫注釋比寫代碼更重要。注釋雖然不能解決問題,卻極其有助于正確地解決問題或更容易地找出及改正錯誤。
??? 以下給出第一章習題7(21頁)的完整編程過程:
0.描述程序功能
/*
? Description: 輸出下面圖案
?
??????? /\?????
?????? /? \????
????? /??? \??
???? /????? \??
??? /________\??
*/
1.寫出main()
??? 很多初學者從頭到尾一個字一個字地寫代碼,這種寫代碼的方式非常糟糕。
??? 就如同蓋房子要先搭好腳手架一樣,寫代碼也應該先搭建好必要的框架。通常,這種框架就是main()。這個道理所有的建筑工人都懂得,但許多程序員卻不懂得。
??? 應當把寫代碼看成是按照不同的方式填充、完善、完成main()的過程——每一個程序都是如此,就如同裝修房屋一樣。房屋總是先建好再裝修的。還不至于有人愚蠢到邊建房子邊裝修的吧?
/*
? Description: 輸出下面圖案
?
??????? /\?????
?????? /? \????
????? /??? \??
???? /????? \??
??? /________\??
*/
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
?
? system("PAUSE");?
? return 0;
}
??? 至此,應該編譯一下。如果代碼有錯誤,越早發現越好。不少初學者急于事功,喜歡帶“病”前行,在全部代碼完成后再試圖排除BUG。這種做法很傻。因為增加了調試難度,工作量可能增加幾百倍甚至更多。?
???
??? 應該養成每寫一兩代碼就立刻編譯一下的好習慣,這種習慣越是初學者意義越大。就像攀巖一樣,要始終保持立足于堅實正確的基點之上,這樣才能從勝利走向更大的勝利。試圖通過匆忙的、一蹴而就的方式完成程序是不切實際的幻覺。
2.填充main()
??? 編譯通過后,開始考慮逐步添充main()。
??? 程序的的功能是在標準輸出設備上輸出5行字符,輸出字符序列的功能可通過調用printf()函數實現。
/*
? Description: 輸出下面圖案
?
??????? /\?????
?????? /? \????
????? /??? \??
???? /????? \??
??? /________\??
*/
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
? printf("\n");?????? //依然是先寫出必要的部分
? printf("\n");?????? //通過復制粘貼完成
? printf("\n");?????? //通過復制粘貼完成
? printf("\n");?????? //通過復制粘貼完成
? printf("\n");?????? //通過復制粘貼完成
? system("PAUSE");?
? return 0;
}
?
??? 編譯通過后再進入下一步驟。
3.逐步細化
??? 現在,最初抄寫的題目部分有了更多的用處。把相應的部分復制粘貼到printf()函數調用的""之內。
??? 不少初學者不注意使用“編輯”功能,這很不專業。應盡量使用編輯器中的“編輯”功能,來提高編程效率。
/*
?? Description: 輸出下面圖案
?
???????? /\?????
??????? /? \????
?????? /??? \??
????? /????? \??
???? /________\??
*/
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
? printf("???????? /\????? \n");?????? //依然是先寫出必要的部分
? printf("??????? /? \???? \n");?????? //通過復制粘貼完成
? printf("?????? /??? \??? \n");?????? //通過復制粘貼完成
? printf("????? /????? \?? \n");?????? //通過復制粘貼完成
? printf("???? /________\? \n");?????? //通過復制粘貼完成
? system("PAUSE");?
? return 0;
}
????
??? 編譯。這時編譯器可能會給出警告。
4.完善
??? 由于""內的“\”是轉義字符,無法直接寫出。應將""內的“\”改寫成“\\”。這應該通過“查找”“替換”來完成。替換過程中應注意有些“\”替換而有些“\”不替換。
??? 熟練應用IDE的編輯功能,可以提高寫代碼的效率和正確性。
???
/*
?? Description: 輸出下面圖案
?
???????? /\?????
??????? /? \????
?????? /??? \??
????? /????? \??
???? /________\??
*/
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
? printf("???????? /\\????? \n");?????? //依然是先寫出必要的部分
? printf("??????? /? \\???? \n");?????? //通過復制粘貼完成
? printf("?????? /??? \\??? \n");?????? //通過復制粘貼完成
? printf("????? /????? \\?? \n");?????? //通過復制粘貼完成
? printf("???? /________\\? \n");?????? //通過復制粘貼完成
? system("PAUSE");?
? return 0;
}
????
??? 至此,代碼完成。編譯,運行程序并檢查運行結果是否正確。
忠告:???
??? 程序員不但應當完成正確的代碼,而且更應當用正確地方式完成代碼。遵循良好的工序是代碼質量的重要保證,程序員的聰明才智則不是。
??????
轉載于:https://www.cnblogs.com/KBTiller/archive/2011/03/14/1983964.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的怎样写C代码——《狂人C》习题解答1(第一章习题7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转)__declspec(dllimp
- 下一篇: ALinq 入门学习(八)--ALinq