本文目錄一覽:
剛開始學C語言,要看些什麼書(介紹幾本)
《程序員》推薦C++ 圖書三人談
主持人:熊節(透明),《程序員》雜誌編輯,C-View成員
嘉 賓:孟岩(夢魘),聯想公司掌上設備事業部應用開發處任職,C-View成員。與侯捷先生合譯《C++ Standard Library》一書
金尹(惡魔),上海天宇公司CTO,在《程序員》連載有“自由與繁榮的國度”系列文章
透明:“學C++用哪本書入門”,這是被問得最多的一個問題。但是哪一本書是最好的入門書?似乎很難找到答案。《C++ Primer》太厚,《Effective C++》對讀者要求比較高,《Essential C++》又常常被批評為“太淺”。
其實說穿了:no silver bullet。想從一本書學會C++,那是不可能的。有朋友問我如何學C++,我會建議他先去找本數據結構書,把裡面的習題全部用C++做一遍,然後再去看《Effective C++》。myan經常說“要在學習初期養成好習慣”,我對此頗不以為然。
個人認為,《Essential C++》適合作教材,《C++ Primer》適合作參考書,《Effective C++》適合作課外讀物。
惡魔:很後悔當初買了《C++ Primer》。因為從我個人角度來看,它的功能效用基本是和《The C++ Programming Language》重合。當然對於入門來說,它還是很不錯的。但是《C++ Primer》太厚,一來導致看書極其不方便,二來系統學習需要花比較長的時間。對於目前這個越來越快餐化的時代來說,的確有很多不適合的地方,不過可以作為初學者的參考書。現在我以一塊K3 CPU的代價把它借給了別人,希望我那位同事能夠從中得到一些益處。
如果已經具備了C基礎,我建議看國內的書,例如錢能的《 C++大學教程(第二版) 》。(如果沒有C的基礎還是看譚浩強的C語言)。這本書對C講得還算比較清晰,有很多習題值得一做,特別是最後的struct和union兩個部分。其中的一些算法比較拖沓和繁瑣(比如樹和鏈表的遍歷算法),讀者可以嘗試修改這些例子,作為最後對C語言的一些總結測試。
夢魘:這個問題讓我想起四五年前的情形。今天對於C++有一點認識的人,多半是從那幾年就開始學C++了。那時根本沒有品牌觀念。從書店裡找一本C++書,如果看着還算明白,就買下來。我記得那時候宛延闓、張國鋒、麥中凡教授的書都受到很高的讚譽。我個人最早的一本C++書是Greg Perry的一本書,今天想起來,其實是一本打着C++旗號的C語言教程。對我作用最大的一本書是國防科技出版社出版的一本書,書名記不得了,作者叫斯蒂芬·布萊哈。
透明:還記得以前曾批評過一本C++書,是北航出的,整本書就沒有出現過class關鍵字。那本書,說穿了其實只是介紹了C語言和iostream庫的用法,根本不能算C++。而當時我常常推薦的一本書是電子科技大學張松梅老師的C++教程。那本書,直到今天來看也沒有太大的問題,唯一的缺憾就是由於年代久遠,許多東西已經過時了。而對於一本技術書籍來說,“過時”是最不可接受的。
總體來說,那時使用C++的人真是在“盲人摸象”。不過這也有好處,就是對C++的很多細節能搞清楚,以後看到經典好書時比較容易理解;當然壞處就是概念不清,甚至都不知道C++和Visual C++、Borland C++到底有什麼不一樣。
夢魘:整個90年代,其實大部分人對於C++的認識都似是而非。一開始是等同於Borland C++,後來是等同於Visual C++和MFC。所以一般來說,打着BC和VC旗號的書賣得很好,人們覺得這就是C++。而我比較幸運,布萊哈的那本書雖然從現在的眼光來看談不上高超,但基本路子是對的。可能是因為原書是給UNIX程序員的培訓教材,所以沒有讓我一開始就形成“C++ == VC++”的認識。
其實一直到1996年,我們那裡搞計算機的都是唯Borland C++馬首是瞻的,到了VC 4.0出來,一下子格局全變了。1997年VC5推出之後,書店裡MFC書鋪天蓋地,學MFC的人,頭抬得都比別人高一些。不過現在看來,那時候大部分的MFC書都是三流貨色。我曾經有一段時間認為,那一批程序員中間有不少被誤導了。根本原因就是相對的封閉。
透明:我覺得一本書的價值有兩方面:第一,教給你實用的技術;第二,促使你去思考。對於一本介紹VC(或者說MFC)使用方法的書,我根本不希望它能促使我有什麼思考,所以我就一定要求它在技術上精益求精完美無瑕。我剛開始用VC的時候,買的第一本書就是潘愛民老師翻譯的《VC技術內幕》(第四版),沒有受到那些“三流貨色”的誤導,應該說是很幸運的。
夢魘:1999年機械工業出版社開始出版“計算機科學叢書”,其中的《Thinking in C++》第一版受到了廣泛的歡迎。其實我一直不認為這本書很出色,雖然拿過一次大獎。然而我們都得承認,這本書在C++書籍領域裡第一次建立了品牌觀念,很多初學者開始知道,不是隨便買哪一本都一樣的。再往後就是2000年的《 深入淺出MFC(第二版) 》第二版,以及侯先生在《程序員》上發表的那一篇《C++/OOP大系》,加上整個大環境的變化,品牌觀念深入人心,C++書籍市場終於開始逐漸與世界同步。
回想往事,我的感覺是,那個需要戰戰兢兢選擇入門書的時代已經過去,今天的C++初學者,大可以放心地買口碑好、自己讀起來思路順暢的書,入門不再是太大的問題。還有一些程序員已經學了幾年C++,但看到今天出版的一些新書,感覺比較陌生,這也不是什麼問題。侯先生經常說“凡走過必留下足跡”,所謂“走彎路”,未必不是一件好事。
至於具體的推薦表,就不好一概而論了。總之在我的印象里,《Essential C++》、《C++ Primer》、錢能教授的C++教程,都不錯。甚至有人一上來就看Bjarne Stroustrup的《The C++ Programming Language》,只要他喜歡,也沒什麼不可以。
透明:我同意你的觀點。不管怎麼說,編程是門實踐性非常強的學問。要想對C++對象模型有深入的了解,最好的辦法就是寫一串程序去看結果;要想學會OOP,也只能從項目中學。對於初學者,最好的學習方法就是不停地寫程序,寫真正有用的程序,寫到有問題的時候就去查書,於是自然就會知道哪本書好哪本書不好。不過我們的教育制度能不能讓大學裡的學生們有這樣的學習機會,我表示懷疑。
以我的經驗,學C++有兩個門檻:入門和使用。完全看不懂C++,這是一個門檻,但是只要有一本合適的入門書,很快就能跨過。要想真正用上C++,卻不是件很容易的事情。尤其對於學生來說,接觸到的東西多是“玩具”,很難有實戰的機會。所以經常看見有人問“C++到底能做什麼”,這是C++學習中一個比較麻煩的問題。我們都是做了相當長時間的C++程序之後才看到一些真正經典的書,也正是因為走了相當長的彎路之後才知道這些書的經典之所在。所謂彎路,我想也是一種必須的積累。就算一開始就看《Essential C++》和《C++ Primer》,沒有兩三年的時間恐怕還是難有所得。
惡魔:有兩句十分有道理的話,一是我大學的C語言老師說的“寫程序不如說是抄程序”,另一句是一網友說的“好的設計來自借鑒,天才的設計來自剽竊”。對於我這個理性批判主義者來說,這兩句話的確不太適合。但是無論從哪個角度來講,對於初學者來說,剽竊大師的作品是通向成功的最快捷徑。
我個人認為,對於C++的初學者來說,首先要確定自己專業領域內主要使用的特性的方向。因為C++的特性如此眾多,初學者想貪多基本是不可能成功的。C++的編程範式基本可以分為ADT+PP、GP和OO三個方向。對於ADT+PP範式來說,初學者的主要問題不是學習C++,而是學習C的使用。對於這樣的初學者,國內的幾本書還是寫得比較清楚,符合中國人的習慣,比如譚浩強的《C語言教程》、錢能的《C++語言大學教程》。這兩本書我首推第一本,因為這一本我潛心研究了一年,這本書當中很多程序是可以剽竊的,而且可以對這些程序進行加工和提升。比如結構這一章中,它所給出的用struct來實現鏈表、二叉樹的算法是相當蹩腳的。學習ADT+PP的初學者將這本書揣摩透以後可以嘗試修改這兩個程序。另外這本書的第二版稍微涉及了一些關於“類”的內容。學習ADT+PP的初學者,可以不被OO中的一些專有特性擾亂自己的思路,對於類層次扁平、無繼承、無多態的程序編寫是有很大好處的。
透明:你好象比較推崇國內教授寫的書。現在社會上有種不好的風氣:一捧就捧上天,一貶就貶下地。就好象對待譚教授的書,前幾年是奉為經典,這幾年又有很多人使勁批評。學C++更是有點“崇洋媚外”,總是覺得初學就應該看《Essential C++》。我看這種觀點也是片面的。
惡魔:當然《Essential C++》也值得看看。但是我個人覺得這本書沒有譚浩強的《C語言教程》來得好。主要原因是:第一,C++的所有特性都點到了,但是不深,看了以後會三心二意沒有方向;第二,可以抄襲借鑒的例子太少。《C語言教程》中有很多有趣的問題,比如猴子吃桃、漢諾塔等等,這些例子對於剛剛涉及C/C++語言編程的人來說是學習編程很好的例子。《Essential C++》只能是前兩本書看透以後,作為學習C++特性的一個過渡性的書籍。讓讀者真正領略到什麼是C++的編程、和C編程的不同點在哪裡。
透明:我發現一個很有趣的現象:初學者往往喜歡問“哪本書比較好”,這讓我很是不解。這有點像一個剛學打籃球的人問“王治郅和科比誰比較厲害”。當然科比更厲害一些。但如果你是想學打籃球,這兩個人都非常非常有資格教你,你跟誰學都能學得很強——關鍵不是在於你選哪個老師,而是在於你自己用多少功夫去學。
透明:回到原來話題。學會了C++的語法,能看懂C++代碼之後,必須有些書來指導進階(或者叫指點迷津)。我覺得《設計模式》很好,能夠讓讀者看到一些精妙的用法。不過正如我經常說的,模式帶來的麻煩和好處一樣多,甚至麻煩還要更多。而且,C++本身的問題使得在C++中使用GoF模式愈加麻煩。
夢魘:《Design Patterns》這本書絕對是不可以沒有的,而且中英文版都不可少。最初我看中文版,說實話看不懂,但是也不覺得人家翻譯得不好,所以就想,大概是原文就很難懂,加上自己水平有限。於是總是想着再找幾本patterns的書來看。後來找到幾本書,口碑還不錯,不過水平高下,一比就出來了,還是那本《Design Patterns》最經典,最耐看。英文版出來之後,兩個版本對照看,明白多了。現在覺得,其實就設計模式來講,把這本看明白了就很不錯了,不用再花費很多心思找其他的書。我現在的包里始終夾着這本書,隨身攜帶,有備無患。
至於說設計模式的副作用,和可能帶來的弊端,我的體會也挺多。不過是這樣,我們想一想,究竟什麼情況下設計模式可以用得很好呢?一種是有經驗豐富的人引導,比如要是Robert Martin帶隊,你在某個地方用錯了設計模式,他就會指出來,說這裡不對,將來會產生什麼樣的弊端。對於他來說,豐富的實踐經驗足以支持他進行“預測型”設計。但是大部分人沒這個能力,因此我們只好走第二條路和第三條路,就是“試探型”設計和“重構型”設計。遇到一個問題,你覺得用某種模式挺合適的,就大膽地用了,成功是積累經驗,發現不好,出了問題了,只好改回來,那也是積累教訓。這叫做“試探型”。至於重構,應該算是最有組織、成功率最高的工程化方法。先把問題“quick and dirty”地解決了,所有的暗礁都暴露出來,然後再根據實際情況採用合適的模式優化設計。現在XP和UP都高度重視refactory,UP在Elaboration和Construction階段都鼓勵抽出專門的iterations進行重構。所以說如果組織快速的軟件開發,當然比較傾向於這條路——打成功率嘛。
透明:講到重構,我順便說說《Refactoring》這本書的影響。從工程本身的角度來說,你所謂的“重構型設計”是沒有什麼問題的。但中國的開發者(也包括我在內)往往比較衝動,比較容易相信銀彈的存在。曾經有那麼一段時間,我在Java中嘗試過了重構的方法之後,又拿到C++中去嘗試。結果發現,在Java中速度非常快的重構過程,到C++中就被減慢了。究其原因,就是因為C++和Java的約束條件不同。拿着Java中成功的案例直接套C++,不失敗才怪。
所以,我必須說:《Refactoring》這本書很有價值。但對於C++程序員來說,它的價值是讓你思考,思考這種方法的可行性。如果一個C++程序員沒有打算遷移到Java,那麼我必須告訴他:《Refactoring》這本書不是讓你照着它用的,甚至不是讓你去相信它的。對於C++程序員,《Refactoring》全書可以放心相信的只有第13章,其他的部分,都必須非常謹慎地對待。
夢魘:我還要就“試探型”的方法多說兩句,我覺得對於個人發展來講,“試探”也是必不可少的,撞牆不可怕,高水平的人不都是撞出來的嗎?你失敗了一次,就知道這個模式有什麼潛在的問題,下次再用,就會多看幾步,像下棋似的。撞的多了,路數就出來了。
我不知道你們是否有這個感覺:用錯了模式,吃了虧,再回過頭去翻翻《Design Patterns》,看到人家早就指出來這個問題,不過就是那麼幾句話,原來看上去乾巴巴的,現在覺得句句都講到心坎上,GoF的形象馬上就高大起來,還帶着光環,感覺是既興奮又懊悔。
透明:現在回頭來看,我更欣賞myan推薦給我的《Designing Object-Oriented C++ Applications Using Booch Method》。這本書能夠幫助C++程序員理清思路培養習慣,可惜國內沒有引進。相比後來商業味濃厚的UML系列書籍,我覺得這本書對於面向對象的闡釋精闢獨到,至今未有能出其右者。
夢魘:剛才我們兩人都說到Robert Martin,他可是我的榜樣。那本1995年的《Designing Object Oriented C++ Application》,我覺得是每一個C++軟件工程師都應該反覆研讀的書。可惜不僅國內沒有引進,在國外的名氣也不大。如果你覺得面向對象的那些道理你好像都明白,可就是一遇到實際問題就使不上勁,那這本書就是你的最佳導師。
提到理清思路,還有一本書不得不提,就是Andrew Koenig的《Ruminations On C++》。每個人都應該問自己,我學了這麼多年的C++,究竟什麼是C++最基本的設計理念?遇到問題我第一個直覺是什麼?第一個試探型的解決方案應該具有那些特點?如果你不能給出明確的答案,就應該認真地去讀這本書,讀完了你就有了“主心骨”。
透明:插一句話,談談“推薦書”的問題。入門書基本上是放之四海而皆準的,所以推薦的意義也不大。而入門後的發展方向,每個人不同,這個時候就需要“高人”的指點。舉個例子:我學C++的時候,myan還不認識我,所以也沒有給我推薦書,我還是學過來了,所以即使你當時向我推薦了《Essential C++》或者《C++ Primer》,我也不會太感謝你;但在我認真研究OO的時候,你推薦Robert Martin那本書給我,對我幫助就特別大,而且我從別的地方也很難找到類似的推薦,所以我就很感謝你。
一個程序員,必須有framework的意識,要學會用framework,還要主動去分析framework(在這方面,《Design Patterns》能有一定的幫助)。但是,真正高質量、成氣候的framework的書恐怕也就只有針對MFC的。從這個角度來說,MFC縱有千般不是,C++程序員都非常有必要先去用它、熟悉它、研究它,甚至藉助《深入淺出MFC》這樣的書來剖析它。不然,很難有framework的意識和感覺。
當然,另一個framework也很好,那就是STL。不管用不用MFC、STL,對這兩個東西的掌握和理解都是極有幫助的。最近我又在看《深入淺出MFC》,雖然已經不用MFC編程了,但幫助是一定有的。
夢魘:MFC和STL方面,我還是比較推崇侯先生的兩本書《深入淺出MFC》和《STL源碼解析》。
《深入淺出MFC》這本書,名氣自然是大得不得了,不過也有不少人批評。其實書也沒有十全十美的,批評當然是少不了的,不過有的時候我看到有人評論這本書,把它跟Inside VC相比,真的是牛頭不對馬嘴。
你剛才其實說得很對,程序員應該有一點framework意識。而這本《深入淺出MFC》與其說是在講MFC編程,不如說通篇是在拿MFC為例分析Application Framework的架構和脈絡。所以無論你對於MFC本身是什麼態度,這本書對每一個C++程序員都有很大的益處。
透明:是的。《VC技術內幕》會告訴你“DYNAMIC_CREATE這個宏怎麼用”,《深入淺出MFC》則告訴你“DYNAMIC_CREATE這個宏是怎麼實現的”。所以,如果你只需要在VC下寫一些小應用程序,《深入淺出MFC》的價值並不太大;但是,如果你需要設計一個稍微大一點的東西(不一定是framework),MFC的設計思想就會有所幫助。
夢魘:另外,我覺得對於MFC也應該有一個公允的評價。過去是吹捧得天上有地下無,書店裡鋪天蓋地都是MFC的書,搞得大家只知有MFC,不知有C++,甚至直到現在還有人問:“我是學MFC呢,還是學C++?VC++是不是比C++更高級的語言?”MFC成了一尊神像,阻礙了人們的視線。所以得把它從神壇上拉下來。這就是過去一兩年有很多人,包括我在內批評MFC的一個目的。可是現在大家視野開闊了,.NET也出來了,MFC不再是神像了,少數人就開始以貶損MFC為樂了。我覺得這種態度是不對的。
什麼叫好的框架?我覺得在十幾年的時間能夠象MFC這樣保持穩定並且不斷進步的框架就是好的框架。可能我們在一些具體的設計問題上有不同看法,覺得“這個地方這麼設計不是更漂亮嗎?”很多時候是的,但是這不重要,重要的是MFC成熟穩定、有十幾年的成功經驗,這是最了不起的東西。
另外一點,MFC中間包括着學習Win32 API編程的最佳資料。這是除了其framework方面之外的另一個亮點。我現在使用Win32 API開發,但是經常參考MFC的源代碼,收穫很大。
透明:STL方面,我對於剖析它的源代碼興趣並不大,畢竟裡面源代碼多是算法問題。所以,《STL源碼剖析》我也只是隨便翻翻就束之高閣了。我覺得這本書用來做計算機系的數據結構和算法教材不錯,不知道有沒有老師樂意這樣做。
對於STL,我的態度一向都是“應用至上”。不過,我一直認為SGI STL本身就是一本精彩的書,一本數據結構和算法的經典參考書,同時也是泛型技術的參考書。想知道一個算法是如何實現的,看看STL源代碼就行;想知道如何使用type traits,STL源代碼裡面也有例子。看別人寫的書,總覺得隔着一層紗,有點撓不到癢處的感覺。SGI STL的代碼寫得非常漂亮,一個C++程序員如果不看看這本書,實在是可惜。
夢魘:至於STL,除了《STL源碼解析》之外,我舉賢不避親,強烈推薦侯先生與我合譯的那本《The C++ Standard Library》。這本書質量之高是無需懷疑的。我現在手邊常備此書,隨時查閱,對我幫助很大。
透明:C++和Java相比,最大的優勢就是它沒有一個專門的公司來管它,最大的弱點也是它沒有一個專門的公司來管它。Java程序員在學會簡單的語法之後,立刻進入SUN提供的framework,一邊用這個現成的framework做實際開發,一邊在開發過程中繼續學習Java一些幽深的特性。而這個時候,C++程序員恐怕還在問“VC和BCB哪個好”呢。這無疑是浪費時間。
夢魘:剛才你說Java和C++的優劣,這個話題已經成了我們這個年代永不消失的聲波了。我也不想再談這個。不過有一點我得說清楚:現在我們很多用C++的人吃了不少苦頭,探過脖子去看看Java,覺得它真是太可愛了,這種印象是不準確的。另外,Java也不簡單,而且會越來越龐大複雜。在很多場合,Java還不具有競爭力。至於將來如何,我看有些Java愛好者也過分樂觀了,似乎計算機科學界幾十年解決不了的問題都可以藉著Java的東風解決掉,恐怕沒那麼容易。
透明:那當然。我再次強調:No Silver Bullet。讀書很重要,但古人說“行萬里路,讀萬卷書”,還是把“行路”放在“讀書”前面。尤其對於技術書籍,如果它不能幫我解決問題、不能給我帶來非常實際的利益,那麼我是不會去讀它的。惡魔說得對,我們這個社會很快餐,我們這個行業尤其很快餐,我們也只能努力適應它。
我想學C語言 如何才能學好呢
首先學習之前要明確自己的目標,你說多電腦感興趣,是不是指的編程,這一點很重要,學習一定要和自己的興趣和實際需要結合起來,才可能學得好學得精,否則只是一時興趣可能最後即學不好C又對學習計算機的其他知識產生了畏懼感
當然在明確了學習目的後,開始學習C也是需要注意一些細節的,比如你說到的教材,全世界無數的人學習C,其中的教材也很多,有些是很經典的教材,選擇一本適合自己的教材的確非常重要,比如著名的 C程序設計思想,英文名think in c;《C程序設計教程》英文名《C how to program》;c語言聖經
英文名:the c programming language ;還有國內高校普遍採用的清華大學譚浩強主編的《C語言程序設計》,目前應該是第三版 等等
客觀的說以上的書都很經典,建議找一本盯着看,看透一本就可以了,日後有空的話再看看別的資料
說完了教材,另外最關鍵的就是要多多做練習,自己編寫小的代碼,把課後的練習都做作,並且找一些C語言上機練習來做,學習C語言除了要看懂教材之外,最重要的就是要花費大量的時間進行上機編程練習,只有通過上機調試程序才能把C學好,這和學習其他理論知識不同
當然如果有條件的話可以找一些現成的程序來閱讀和研究,特別是一些正規的C程序,研究別人的編程思想和習慣也是很好的提高自己編程能力的方法
最關鍵要有毅力有決心,並且不怕困難,世界上任何事情想要學會容易,想要作好不花工夫都是不可能的,C本身是很強大的語言工具,當然他並不是適用在所有場合,但是只要學好了C以後再學習其他編程工具上手就容易的多了,如果你有變成的意想,我個人建議在看C的時候不妨看看JAVA或者C++,語法和代碼都很類似但是比傳統的C又有擴展,即面向對象的語言,當然VB,VB.net也不錯,這些可以在你掌握了C語言之後來研究
要學好C語言不是只簡單的學學C,個人建議學了C的基礎本分後要去學習 〈〈數據結構〉〉這個東西是編程的基礎
不小心點了匿名回答,不好意思
我的ID叫細細的鐵絲,我也在學習計算機,大家一起學習吧
C語言課程設計報告要求
一 、 設計題目
萬年曆的設計
二 、設計要求
1、能夠顯示星期;
2、能夠顯示年月日;
3、能夠修改;
4、當系統時間變動時,能自動跳到相應的時間。
三 、 設計目的
1. 通過本項課程設計,可以培養獨立思考、 綜合運用所學有關相應知識的能力,能更好的鞏固《C語言程序設計》課程學習的內容,掌握 工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關!更加了解了c語言的好處和其可用性!同時增加了同學之間的團隊合作精神!更加也體會到以後在工作中團隊合作的重要性和必要性!
2. 通過C語言課程設計,使學生了解高級程序設計語言的結構,掌握基本的程序設計過程和技巧,掌握基本的分析問題和利用計算機求解問題的能力,具備初步的高級語言程序設計能力。為後續各門計算機課程的學習和畢業設計打下堅實基礎。
四 、設計思想及過程
【一】由於萬年曆具有以下特點:
1。平年365天(52周+1天),閏年366天(52周+2天)。平年2月28天,閏年2月29天。
由於公元1月1日設為星期六,故3月1日為星期三。 ——注意這個“三”
為使算法達到最簡,故本算法以“星期”為計算單位。且選3月1日為基月。
2。每400年整一閏,或每4年且不為百年的一閏。(原因:地球繞太陽一周的時間是365天5小時46秒,為了使一年的天數為整數,將一年的天數定為365天,餘下的時間積累起來,四年就是23小時15分4秒,將近一天,把這一天加在某年的二月而成29天,該年稱為閏年,其它年稱為平年。但四年加一天又多用了44分56秒,這個數積滿400年為三天。因此400年中只能有97個閏年,所以凡能被400整除,或不能被100整除但能被4整除的年份為閏年。)
所以百年%4=0閏或(年%4=0並且年0)閏。
3。每 4年(3個平年+1個閏年)共208周+5天 ——注意這個“5天”
每百年共100*(208周+5天)-1天=5217周+5天 ——注意這個“5天”(整百年暫設為平年)
每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天——注意這個“0天”和
“1天”(4個整百年只有一個閏年)
即400年一輪迴!(原來萬年曆400年前是一家)
【二】根據萬年曆以上特點進行編寫:
首先對萬年曆年、月、日進行編寫,編寫程序先定義每月的天數為28天,如月份為1、3、5、7、8、10、12就定義天數為31天反之如果月份為4、6、9、11就輸出天數為30天,由上可見2月份為28天但是如果為閏年就有29天就要定義另一個函數#define Year(x) (x%4==0x%100!=0||x%400==0) ? 1:0當為閏年時可得1加上該程序便可得到每月的天數。 具體程序見(五、萬年曆程序)
再對其中的星期進行編寫:由於公元1月1日設為星期六,故3月1日為星期三,可以用萬年3月1日星期算法(特別是那個三)
由於其公式為:
某年3月1日星期幾=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
某年3月1日星期幾=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
或 某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
閏4百年3月1日星期算法(百年%4=0)
其公式為:
某年3月1日星期幾=(年+年/4+月星期表+日+2天)%7
例:0000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
1600年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
2000年3月1日星期幾=(0+0/4+0+1+2)%7=3%7=星期三
2001年3月1日星期幾=(1+1/4+0+1+2)%7=4%7=星期四
2004年3月1日星期幾=(4+4/4+0+1+2)%7=8%7=星期一
2008年3月1日星期幾=(8+8/4+0+1+2)%7=13%7=星期六
2042年3月1日星期幾=(42+42/4+0+1+2)%7=55%7=星期六
平4百年3月1日星期算法(百年%40)
其公式為:
某年3月1日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
例:1700年3月1日星期幾=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平年)
1800年3月1日星期幾=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平年)
1900年3月1日星期幾=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平年)
1901年3月1日星期幾=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
1918年3月1日星期幾=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
1958年3月1日星期幾=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
1988年3月1日星期幾=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
1999年3月1日星期幾=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
2100年3月1日星期幾=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)
2101年3月1日星期幾=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
2102年3月1日星期幾=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
2103年3月1日星期幾=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
2104年3月1日星期幾=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:2104年是閏年)
9999年3月1日星期幾=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
註:按400年一輪迴!(400年前是一家)的說法
1600年,2000年是一樣的;
1700年,2100年是一樣的;
1800年,2200年是一樣的;
1900年,2300年是一樣的。
其中萬年某日星期算法
其公式為:
某日星期幾=(百年%4*5天+年+年/4+月星期表+日+2天)%7
通同星期偏差表
閏年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天數 31 29 31 30 31 30 31 31 30 31 30 31
星期 3 6 0 3 5 1 3 6 2 4 0 2
平年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
天數 31 28 31 30 31 30 31 31 30 31 30 31
星期 4 0 0 3 5 1 3 6 2 4 0 2
為對以上的萬年曆星期的算法是正確的對其進行了以下的計算:
⒈對於二十世紀任意日期可以用公式某日星期幾=(百年%4*5天+年+年/4+平年月星期表+日+2天)%7=(19%4*5天+年+年/4+平年月星期表+日+2天)%7=(15天+年+年/4+平年月星期表+日+2天)%7以下就是根據上面對其進行的計算:
1900年元旦 1日=(0/4*5+0%4+1+3)%7=(0+0+4)%7=4
1月表=4(平年) 故 4+4=1 即1900年元旦是星期一
1949年國慶 1日=(49/4*5+49%4+1+3)%7=(60+1+4)%7=2
10月表=4(平年) 故 4+2=6 即1949年國慶是星期六
1999年12月31日 31日=(99/4*5+99%4+31+3)%7=(120+3+34)%7=3
12月表=2(平年) 故 2+3=5 即1999年12月31日是星期五
⒉對於二十一世紀新前年蟲算法(20%4*5=0)可以用公式:某日星期幾=(百年%4*5天+年+年/4+閏年月星期表+日+2天)%7 =(20%4*5天+年+年/4+閏年月星期表+日+2天)%7以下就是根據上面對其進行的計算:
2000年元旦 1日=(0+0/4+1+2)%7=(0+0+1+2)%7=3
1月表=3(閏年) 故 3+3-6 即2027年元旦是星期六
2018年春節 16日=(18+18/4+16+2)%7=(18+4+16+2)%7=5
2月表=0(平年) 故 0+5=5 即2018年春節是星期五
2099年12月31日 31日=(99/4*5+99%4+31+2)%7=(120+3+33)%7=2
12月表=2(平年) 故 2+2=4 即2099年12月31日是星期四
對於上面的分析以及公式的推論和計算證明可以對萬年曆中的星期進行了編寫具體編寫程序見(五 、萬年曆程序)中。
五 、萬年曆源程序
#include”stdio.h”
#include”dos.h”
#include”conio.h”
#include”stdlib.h”
#define Year(x) (x%4==0x%100!=0||x%400==0) ? 1:0 /*判斷閏年*/
int numofMonth(int y,int m){
int day,t=28;
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
day=31; /*定義以上月份為31天*/
else if(m==4||m==6||m==9||m==11)
day=30; /*定義以上月份為30天*/
else{t+=Year(y);
day=t;} /*閏年二月29天,平年28天*/
return day;}
int numofYear(int y){
int t=365; /*平年365天*/
t+=Year(y);/*閏年366天*/
return t;}
int numofbeforeDays(int y,int m,int d){
int sum=d,i;
for(i=1;im;i++)
sum+=numofMonth(y,i);
return sum;}
int numofafterDays(int y,int m,int d){
int sum=0,i;
for(i=m;i=12;i++)
sum+=numofMonth(y,i);
sum-=d;
return sum;}
int isDay(int y,int m,int d){
int year=1900,month=1,week=1,i; /*定義萬年曆是從1900年開始*/
long sum=0;
for(i=year;iy;i++)
sum+=numofYear(i);
for(i=1;im;i++)
sum+=numofMonth(y,i);
/* ++sum;*/
i=sum%7;
week=(week+i)%7;
return week;}
void empty(int n){
int i;
for(i=0;in;i++)
printf(“%*c”,6,’ ‘);}
void OutPutCalender(int y,int m,int d)/*計算x年x月x是星期幾*/{
int week,i,num,t;
week=isDay(y,m,1);
printf(“%6d/%02d/%02d\n”,y,m,d);
printf(“%6s%6s%6s%6s%6s%6s%6s\n”,”Sun”,”Mon”,”Tue”,”Wed”,”Thu”,”Fri”,”Sat”);
empty(week);
num=numofMonth(y,m);
for(i=1;i=num;i++){
printf(“%6d”,i);
t=(week+i)%7;
if(t==0)
printf(“\n”);} /*光標移到下一行*/
printf(“\n”);}
long numBTDays(int y1,int m1,int d1,int y2,int m2,int d2)/*定義兩個不同日期*/{
int i;
long sum=0;
for(i=y1+1;iy2;i++)
sum+=numofYear(i);
if(y1==y2){ sum-=d1;
for(i=m1;im2;i++)
sum+=numofMonth(y1,i);
sum+=d2;}
else{sum+=numofafterDays(y1,m1,d1);
sum+=numofbeforeDays(y2,m2,d2);}
return sum;}
int Select_mean(){
int sm;
printf(“1. OutPut Calender\n”); /*輸出當前月份的日曆*/
printf(“2. Help\n”); /*幫助*/
printf(“0. Quit\n”); /*退出*/
printf(“Please enter choose(0–2):”); /*從0-2中選擇*/
do
scanf(“%d”,sm); /*輸入sm*/
while(sm0||sm3);
return sm;}
void Help()/*輸出幫助欄的內容*/{
printf(” 1. OutPut Calender\n”);
printf(” 2. System Help\n”);
printf(” 0. Quit\n”);
printf(“Page Up: Up year\n”); /*上一年*/
printf(“Page Down: next year\n”); /*下一年*/
printf(” — : next month\n”); /*上一月*/
printf(” — : Up month\n”);/*下一月*/}
main(){
int year=2006,year1=2006,month,day,y1,m1,d1,y2,m2,d2,c,t; /*定義運行後的日期是2006年*/
int inkeySCAN,inkey; /*輸入鍵盤操作信息*/
union REGS inregs,outregs;
inregs.h.ah=0x2a;
intdos(inregs,outregs);
/* year=outregs.xcx; */
month=outregs.h.dh;
day=outregs.h.dl;
year1=year;
printf(“%d/%02d/%02d\n”,year,month,day);
while(1)/*當選擇為1時,執行以下語句*/{
switch(Select_mean()){
case 1:
OutPutCalender(year,month,day);
while(1){
inkey=bioskey(0);
inkeySCAN=(inkey0xFF00)8;
if(inkeySCAN==77){
if(month==12){month=1;year1++;
OutPutCalender(year1,month,day);/*輸出日曆*/}
else{month++;
OutPutCalender(year1,month,day);
}}
if(inkeySCAN==75){
if(month==1){month=12;year1–;
OutPutCalender(year1,month,day);}
else{month–;OutPutCalender(year1,month,day);}}
if(inkeySCAN==73){
if(year1==1900) year1=year;
else{year1–;OutPutCalender(year1,month,day);}}
if(inkeySCAN==81){
year1++;OutPutCalender(year1,month,day);}
if(inkeySCAN==28)break;}
break; /*終止循環*/
case 2:
Help();
break;
case 0:
exit(0);
default:
printf(“Enter ERROR!\n”);
break;} }
}
六 運行過程
1.雙擊TC
1. 當對上面的程序進行了調試後運行會出現下面所示:
第一行所顯示的就是系統時間!滿足了第一條要求“顯示年、月、日”。
而當改變系統時間後!再運行該程序上面的日期也隨系統時間改變,所以滿足第四條“當系統時間變動時,能自動跳到相應的時間。”
2. 在光標處按下“1”後回車,將會顯示:
以上的顯示也證明了條件的第2條可以“顯示星期!”
3. 在光標處按下“2”後回車,將會顯示:
按着幫助所講進行了運行可知:按“ Page Up ”鍵其下面接着會顯示上一年該月的萬年曆,按“ Page Down ”鍵其下面會接着顯示下一年該月的萬年曆;按“ ← ”鍵下面將會接着顯示當年上一個月的萬年曆,按“ → ”鍵將會接着在下面顯示去下一個月的萬年曆。
4.
由上所顯示鍵入“0”後將會退去該程序。
由以上運行的結果可知該c語言所設計的萬年曆滿足設計要求!
七、在C語言編程中常見錯誤
C語言的最大特點是:功能強、使用方便靈活。C編譯的程序對語法檢查並不象其它高級語言那麼嚴格,這就給我們留下“靈活的餘地”,但還是由於這個靈活給程序的調試帶來了許多不便,尤其對我們這些初學C語言的人來說,經常會出一些連自己都不知道錯在哪裡的錯誤。看着有錯的程序,不知該如何改起,我通過這次編程,也積累了一些C編程時常犯的錯誤:
1. 書寫標識符時,忽略了大小寫字母的區別。
編譯程序把a和A認為是兩個不同的變量名,而顯示出錯信息。C語言認為大寫字母和小寫字母是兩個不同的字符。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。
2.忽略了變量的類型,進行了不合法的運算。
%是求余運算,得到a/b的整餘數。整型變量a和b可以進行求余運算,而實型變量則不允許進行“求余”運算。
3.將字符常量與字符串常量混淆。
混淆了字符常量與字符串常量,字符常量是由一對單引號括起來的單個字符,字符串常量是一對雙引號括起來的字符序列。C規定以“\”作字符串結束標誌,它是由系統自動加上的,所以字符串“a”實際上包含兩個字符:‘a’和‘\’,而把它賦給一個字符變量是不行的。
4.忽略了“=”與“==”的區別。
在C語言中,“=”是賦值運算符,“==”是關係運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1 b=2
編譯時,編譯程序在“a=1”後面沒發現分號,就把下一行“b=2”也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf(“%f”,t);
}
對於複合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個複合語句,如:
{ z=x+y;
t=z/100;
printf(“%f”,t);
};
複合語句的花括號後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I5;I++);
{scanf(“%d”,x);
printf(“%d”,x);}
本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。
7.輸入變量時忘記加地址運算符“”。
int a,b;
scanf(“%d%d”,a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。“a”指a在內存中的地址。
8.輸入數據的方式與要求不符。scanf(“%d%d”,a,b);輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
scanf(“%d,%d”,a,b);C規定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數據時應輸入與這些字符相同的字符。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字符是不對的。
3 4 3:4
又如:
scanf(“a=%d,b=%d”,a,b);
輸入應如以下形式:
a=3,b=4
9.輸入字符的格式與要求不一致。
在用“%c”格式輸入字符時,“空格字符”和“轉義字符”都作為有效字符輸入。
scanf(“%c%c%c”,c1,c2,c3);
如輸入a b c
字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因為%c只要求讀入一個字符,後面不需要用空格作為兩個字符的間隔。
10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf(“%f%d\n”,a,b);
語法錯
邏輯錯 運行錯
0.忘記定義變量:
main()
{x=3;y=6;
printf(“%d\n”,x+y);
11.C語言的變量一定要先定義才能使用;
12.輸入輸出的數據的類型與所用格式說明符不一致
int a=3;float b=4.5;printf(“%f%d\n”,a,b);
它們並不是按照賦值的規則進行轉換(如把4.5轉換為4),而是將數據在存儲單元中的形式按格式符的要求組織輸出(如b佔4個字節,只把最後兩個字節的數據按%d,作為整數輸出)
13.未注意int型數據的數值範圍
int型數據的數值範圍(-32768~32768)
int num=89101;
printf(“%d”,num);
會將超過低16位的數截去從而得到23563
注意:定義了long型,而在輸出時仍用”%d”說明符,仍會出現以上錯誤
14.輸入變量時忘記使用地址符
scanf(“%d%d”,a,b);
15.輸入時數據的組織與要求不符
對scanf函數中格式字符串中除了格式說明符外,對其他字符必須按原樣輸入
16.誤把”=“作為”等於”比較符
“=“為附值運算符
“==“為比較運算符
17.語句後面漏分號
{
t=a;
a=b;
b=t
}
它是pascal的語法
18.不該加分號的地方加了分號
if(ab);
printf(“a is larger than b\n”);
for(i=0;i10;i++);
{
scanf(“%d”,x);
printf(“%d\n”,x*x);
}
19.對應該有花括弧的複合語句,忘記加花括弧
sum=0;
i=1;
while(i=100)
sum=sum+1;
i++;
20.括弧不配對
while((c=getchar()!=‘#’)
putchar(c);
11.在用標識時,忘記了大寫字母和小寫字母的區別
{
int a,b,c;
a=2;
b=3;
C=A+B;
printf(“%d+%d=%D”,A,B,C);
}
12.引用數組元素時誤用發圓括弧
{
int i,a(10);
for(i=0;i10;i++)
scanf(“%d”,a(i));
}
13.在定義數組時,將定義的”元素個數”誤認為是”可使用的最大下標值
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int i;
for(i=1;i=10;i++)
printf(“%d”,a[i]);
}
14.對二維或多維數組的定義和引用的方法不對
{
int a[5,4];
…
printf(“%d”,a[1+2,2+2]);
…
}
15.誤以為數組名代表數組中全部元素
{int a[4]={1,2,3,4};
printf(“%d%d%d%d”,a);
}
16.混淆字符數組與字符指針的區別
main()
{
char str[40];
str=“Computer and c”;
printf(“%s\n”,str);
}
17.在引用指針變量之前沒有對它賦予確定的值
{
char *p;
scanf(“%s”,p);
}
{
char *p,c[20];
p=c;
scanf(“%s”,p);
}
18.switch語句的各分支中漏寫 break語句
混淆字符和字符串的表示形式
…
char sex;
sex=“M”;
…
19.使用自加(++)和自減(–)運算符時出的錯誤
{
int *p,a[5]={1,3,5,7,9};
p=a;
printf(“%d”,*p++);
}
注意於*(++p)的區別;
20.所調用的函數在調用語句之後才定義,而又在調用前未加說明
main()
{float x,y,z;
x=3.5;y=-7.6;
z=max(x,y);
printf(“%f”,z);
}
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。
八、心得體會
1. 目前流行的計算機日曆程序,比較典型的是Windows各版本中的日曆程序以及基礎於該程序所開發的各種應用程序中的日曆程序。然而,這些程序都千篇一律的局限在一個很短的時間範圍內。(Windows各個版本一般都局限在1980年至2099年這一範圍內),但是,在很多情況下,特別是在眾多的科學研究領域中,一個時間跨度較大的日曆程序是很有參考價值的。C程序設計語言充分發揮了其自身無與倫比的優越性,用極短的程序文本填補了這一領域的空白,同時用鐵的事實強有力的告訴世人:C程序設計語言作為計算機語言家族的新生事物,其發展前景是極為廣闊的。
2. 經過上一個學期對《C程序設計》的學習,我們學習了理論知識,了解了C語言程序設計的思想,這些知識都為我們的下一步學習打下了堅實的基礎。通過課程設計,一方面是為了檢查我們一個學期來我們學習的成果,另一方面也是為了讓我們進一步的掌握和運用它,同時也讓我們認清自己的不足之處和薄弱環節,加以彌補和加強。
3. 通過對c語言萬年曆的設計進一步的鞏固了用c語言編寫程序,並且有利於更好的掌握c語言!
4. 在萬年曆的編寫過程中也體會到了做事情一頂要細心、認真。更加知道了要掌握好基礎知識。還有體會到了成功的感覺!在萬年曆的設計過程中更加體會到了團隊合作的重要性,“一個諸葛亮比不上三個臭皮匠。”知道了只有團隊合作才會更好的完成設計!也體會到以後在工作中團隊合作的必要性和重要性!
5. 通過本項課程設計也培養了我獨立思考、 綜合運用所學有關相應知識的能力,掌握 工程軟件設計的基本方法,強化上機動手編程能力,闖過理論與實踐相結合的難關!
6. 由於C語言是近年在國內外得到迅速推廣應用的一種語言。C語言功能豐富,表達能力強,使用靈活方便,應用面廣,目標程序效率高,可移植性好,既具有高級語言的優點,又具有低級語言的許多特點。通過這次的c語言程序設計更加了解了c語言的好處和其可用性!
7. 在這次課程設計中也知道了自己的動手能力不強有待進一部的提高!在設計過程中不能夠把書本上的知識與實踐相結合,這也就增加了設計不好該程序的想法!在設計過程中的一次次設計錯誤增加了我放棄的想法!不過經過大家的努力終於完成了課程設計!完成該程序後想起自己以前的每一次對自己失去信心,就覺得並不是在知識掌握上打敗了,而是自己對自己缺乏信心!只要自己對自己不失去信心相信就可以完成那些以前認為完成不了的事情!也讓我懂得了要想成功首先就必須有很強的自信心!懂得了自己以後要在做任何事情時都要自信!當自己都不相信自己能夠成功時還可能會獲得成功嗎?
8. 在C語言程序設計的過程中也知道了自己在以前的學習中有很大的不足導致在設計過程中出現了很多的問題,有些地方看不懂也不知道怎麼去設計,但是在設計過程中也學習了很多,掌握了自己以前沒有學好的知識,雖然一時可以掌握完以前沒有學好的知識,不過也給自己敲響了警鐘,在學習中不可以伏於表面,要想學好每一門課程都要踏踏實實,做什麼都不是給別人看的!都是要更好的掌握該門知識,提高自己的自身的修養,提高自己的能力!為以後的工作打下良好的知識基礎和技能基礎!
九、參考文獻
⒈譚浩強編著.C程序設計第二版〔M〕.北京:清華大學出版社,1999
⒉陳朔鷹,陳英編著.C語言趣味程序百例精解〔M〕.北京:北京理工大學出版社,1994
⒊電腦知識與技術學術交流版〔J〕2005.2 (備註:來自網絡資源)
⒋Herbert Schildit著. 戴健鵬譯. C語言大全 (第二版)〔M〕.北京:電子工業出版社,1994
⒌譚浩強,張基溫,唐永炎編著. C語言程序設計教程.〔M〕北京: 高等教育出版社,1992
⒍秦友淑,曹化工編著. C語言程序設計教程. 〔M〕武漢:華中理工大學出版社,1996
⒎曹衍龍,林瑞仲,徐慧 編著.C語言實例解析精粹 〔M〕北京:人民郵電出版社,2005.3
⒏黃明等編著.21世紀進階輔導C語言程序設計. 〔M〕大連理工大學出版
學習c語言看什麼書好?
如果是自學的話,最好不要看潭浩強的書,他喜歡用數學公式做例題,不適合初學者或自學。
其實潭浩強的書並不怎麼樣,比國外的教程差遠了,只是國內高校缺乏創新意識,跟風現象嚴重,從高校到職校,《C程序設計》幾乎人手一本,這才創下了“發行量第一”現象。而且潭浩強已公開表示:不再就他的書回答任何技術性的問題!這分明是對自己技術沒信心、落後於時代的表現。
國外教程:
《21天學通C語言》
《C語言三日通》(很多人國外自學者都是看了這本書才入門的,所用的例題簡單易懂)
再介紹以下兩本真正經典的教材:
1.《The C Programming Language》
2.《Expert C Programming — Deep C Secrets》
如果E文好就看原版,否則只有買譯本了。
強調一句:如果您是自學(初學者),千萬別表譚浩強的書,否則你很難看懂。他的書到處都是,您自己找一本先體驗一下就知道了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/197069.html