C語言誕生已有幾十年。C語言標準也歷經多次修改,從傳統C,到C89、C89的95修正案,直至目前最新的C語言標準C99。C語言在進一步完善,進一步發展壯大。作為目前使用最廣泛的語言,一個計算機從業人員不可不懂C語言。幾十年來,各位頂級前輩用C語言編制的海量代碼早已成為人類的共同財富,人類不可能短期內拋棄這些財富。因此C語言的生命力不可能在未來10年、20年內枯竭。因此,學習者對C語言(特別是最新的C99標準的C語言)的時間投入將是值得的。C語言從其誕生之日起,一直保持著旺盛的生命力。縱然有C++、Java這樣的后繼者,但到目前為止,它們依然沒有取代C的跡象,精通C的精英們依然是各大軟件企業高薪獵取的對象。尤其C99標準發布以后,C語言的旺盛生命力再次得到了保持和延續。本教材主要作者群是大學教師,由于一直戰斗在各高等學校教學一線,承擔“C語言程序設計”課程的教學任務,有豐富的教學經驗,并長期從事C語言編程工作,并有著將自己認識、理解的“C語言程序設計”介紹給大家的強烈愿望,因為在教學實踐中,作者感受最深的就是,學習者普遍反映C語言難學難懂,而事實上,學習者感覺難的部分往往并不是C語言的核心內容,學習的過程就是一個學習者與教師,學習者與教材交互的過程,只要遵照一定的學習規律,這個交互過程并不難達成。
關于學習者與教材交互的概念讀者可能并不十分了解,這沒有關系,那不是讀者研究的問題,那是教材作者應該深入研究的問題。但是,學習者應該明白選擇一本交互性好的教材是至關重要的。不可否認,一些經典的C語言教材在教學中所起的巨大作用。但是,傳統教材過細的內容組織也讓學習者迷失了方向。看著滿篇的煩瑣內容,讀者根本不明白該學什么,更不明白C語言的重點是什么,唯一的感覺就是C語言難而煩。比如,有的教材開篇不久就花二十多頁篇幅介紹scanf( )的各種各樣的格式控制字符串,而學習者并不知道這對未來學習的意義,弄得學習者心里厭煩,覺得C語言花樣太多,太難懂了,哪里還有心思繼續學下去。作者認為弄懂基本的、主要的、核心的內容才是學習的重點,教材也應該圍繞核心內容組織。本教材就采用了這種組織方式。另外,本教材也特別強調實踐能力的培養,學習者首先應該學會用適當的工具編制、調試哪怕是最基本的程序,這是最主要的。“能夠動手編制程序、調試程序”這一概念就能激發學習者的信心和熱情。學習者在編程實踐中不斷遇到問題、不斷解決問題,自然就會明白許多細節。比如,編一個程序求定積分,這東西看起來很有趣,但是定積分的數學方法花了很長時間都沒有弄明白,哪里還有心思去編程序、讀程序。
有感于部分傳統教材深奧難讀、煩瑣煩心的現狀,本教材主張,在介紹核心語法的基礎上c語言流程圖生成器,以培養動手編程能力為首要目標,把那些煩瑣煩心的內容留待以后慢慢研究。另外,C語言標準是一種通用的行業標準,除了基本語法以外,標準庫函數也是C語言中非常重要的一個組成部分,所以C語言教與學的重點還需要放在引導學習者熟悉標準庫函數上面。C語言程序設計(C99版)前言本教材第1章闡述計算機的基本工作原理,并重點介紹了與C語言程序密切相關的計算機基礎知識。作者經過長期教學實踐后總結出,沒有對計算機基本原理方面的認識,就不可能學好C語言。傳統教材讓人看不明白,也讓人不知道自己為什么看不明白。這主要失敗于它們忽略了知識吸取的過程,我們對新知識的學習主要是基于我們原有的知識,也就是說學習的過程就是學習者用自己的舊知識去解釋新知識的過程。這就是本教材為什么要把那些看似無關的內容加進本教材的道理。本教材不太看重C語言的體系結構,我們更關注在介紹某一個新知識點以前,學習者們是否具備解釋這個新知識點的基礎知識。本教材在第2章用了大量的篇幅介紹C語言的核心要素,這也是編程中使用最多最基本的要素,這是學習的線索和重點。這部分內容學起來有趣,能夠學懂,也不煩瑣。
作者希望這部分內容能夠引發學習者學習的熱情。本教材拋棄了傳統C語言關于算法的深入描述和介紹,只在第1.5節簡單介紹了算法的基本概念和傳統流程圖,以讓讀者對此有所了解。在例題分析中本教材沒有采用傳統流程分析法,作者認為一步步的流程分析實際上干擾了C語言的教學組織。實際教學中幾乎沒有人用流程進行教學。本教材在內容組織上特別考慮了讀者的心理適應性,圍繞C語言的核心內容分層次展開,行文上盡量注意與讀者的交互,在讀者有可能遇到困難的地方作者都作了適當的補充。教材的交互性也主要體現在這些地方。另外,在學習中,讀者可能會發現本教材的部分內容有重復的地方,這其實是必要的,根據作者對學習過程、記憶規律的研究,讀者經常有倒回去翻閱的要求,適當的重復,反復的刺激更能夠加深讀者的印象和記憶。另外,在行文中,本教材力圖引發讀者編制健壯程序的觀念。作者認為能夠編程不見得一定是好事,大家在意識上要明白——編制有漏洞的程序,還不如不編,說不定所編的程序會讓別人浪費許多寶貴的時光。而有些C教材幾乎完全忽略了這一概念,它們以教授語法細節為主線,能夠編程就是目的,作者覺得這會浪費許多“社會時間”。本教材力圖體現C語言的最新發展。
在C89標準及其94、95修正案之后,1999年又公布了C99標準(最新C語言標準),也出現了滿足最新標準的編譯器。可是國內卻沒有一本體現這種改變的教材,甚至95修正案的內容也沒有任何體現,某些經典教材大量參考20世紀80年代和90年代初的資料,導致在C89標準中就已經被修改了的內容居然還在教材中大量出現,甚至還出現在許多國家級的考試中。例如,下面這段C語言教材的典型例題程序:void (charfrom,charto){for(;from!=′\\0 ′;from++,to++)to=from;to=′\\0 ′;}main(void){chara=″I am a .″;charb=″You are a .″;(″=%s\\=%s\\n″,a,b);(a,b);(″\\=%s\\=%s\\n″,a,b);}\[30\]大家不妨認真研究一下,該程序有錯嗎?它錯在哪里?初步觀察,除了( )的設計不夠健壯以外,沒有其他任何問題,錯就錯在實參上,它妄圖把一個字符串常量賦值給另一個字符串常量。
這在概念上就說不過去,怎么能改變常量呢?事實上,C語言標準對這種操作確實沒有定義,即使在部分編譯器上能夠正常運行,它也是錯誤的。所以寫這樣的程序是絕對沒有可移植性可言的。甚至,一些最新出版的C 語言教材(包括部分2005年后出版的教材),仍然常常遇到以下程序:void main( ){ }/新標準main不能返回void/main{ }/新標準不能默認返回int/int main( ){ ;}/新標準必須帶明確返回值/char c; while((c=( ))!=EOF){ }/c可能是無符號的,不可能取到-1/這些語句都有潛在錯誤。在一些國家級的考試中,有時候也會碰到以下類型的題目(也經常出現在教材和習題集中):int d, i = 2;/第一句/d = ii++;/第二句/i = i++;/第三句/union u1{ ch\[2\]; short int i}a; a.ch\[0\]=0x12;a.ch\[1\]=0x34;請問a.i=?/第四句/上述后3條語句都可能得到不同的答案c語言流程圖生成器,對第二、第三句,C標準沒有規定其執行順序,自然可能得到不同的結果,對于第四句答案可能是,也可能是,可我們的考題卻偏偏要考生從這兩者中選一個正確答案,這不是讓人為難嗎?誰也不知道為什么會出現這樣的現象。
因此本教材特別呼吁:拋棄教材中已經不適合新標準的內容教學,各門各類考試(尤其是那些國家級的考試)也應該盡量適應新標準的變化,拋棄那些不符合新標準的內容。只有這樣才能促使教學思維的改變、促使教學跟進時代的發展。不然,為了應付國家安排的考試,社會將不得不學習過時陳舊的知識。這將是社會人力資源的巨大浪費。對于c=f1( )+f2( )這樣的表達式,經典教材從來就沒有說過它們還存在求值順序的問題,更不用說讓學習者了解f1( )和f2( )還有可能調用順序不同這一事實。某位曾經編制了10萬行C代碼的資深程序員因為( )函數而失掉其夢寐以求的職業機會,原因僅僅是因為面試官說他沒有用好const。“C語言里面有const嗎?我咋不知道啦?我可把教材記得爛熟呀,我可編制了10萬行代碼呀?”。該資深程序員只有驚訝的份了,回頭找了幾本C語言發明者、C語言大師們寫的書籍仔細研讀后,才發現——原來自己寫的10萬行代碼,大部分有點類似垃圾的嫌疑。該程序員苦苦思索也無法弄明白是什么原因造成了這種結果。作者認為,高校決不能無視社會需求,教完學生上世紀80年代的計算機知識,然后讓他們去對付當今社會的全球就業競爭。
這樣怎能滿足社會需求?本教材力圖體現C99的最新發展。但是,基于作者的知識面,也為了照顧教學中編譯器的選擇面,本教材的例題在僅滿足C89標準的編譯器上也能夠運行。基于目前高校教學的現狀,本教材也主張采用實際工程開發環境進行教學。讓學習者接觸實際開發工具,才能為今后工作打下良好的基礎。本教材的所有程序都可以在實際工程環境中調試運行。本教材提供的例題程序已經在以下五種環境中調試通過。這五種環境是, C++ 6.0、DEV-C++、Turbo C 3.0、 C++、GCC。所使用的操作系統包括 XP、 2000、UNIX和Linux。本教材特別建議,不要過快陷入語法的細節。作者覺得告訴學習者程序的主體,引導學習者編程,并在編程中激發自主學習意識、激發自主學習觀念才是最重要的。另外,作者建議讀者,在學習時,除了教材以外,還得多看幾本參考書籍,在比較中學習,可以甄別出作者由于方方面面的原因導致的可能錯誤。如果學習者將要從事C語言的實際編程工作,以下幾本關于C語言的經典書籍不可不讀,比如Brian W. , M. 的《The C 》( ,1989,基于C89)、 的《C Traps and 》(1989,基于傳統C)以及 的《C The ( )》(2002,基于C99)等。
由于本教材是基于C99標準的,因此本教材作者會提供盡量多的教學支持。如果在教學中發現與本教材有關的任何問題都可以與作者聯系:,(陳良銀),作者將盡力滿足各位教師朋友的要求。本教材將提供所有例題程序源代碼,以及教學所需的ppt,教學大綱,教案等。您可以到清華大學出版社的網站下載,也可以到本教材作者的教學網站~下載。另外,作者在教學網站上建立了專門的教材討論區,希望各位讀者能夠抽出寶貴的時間到教學網站的BBS上發表對本教材的建議或意見,當然您也可以發表對國內的C語言課程教學的任何意見。學生的收獲是教育從業者教學成果的重要體現,本教材有可能會給學習者帶來更大的收獲。所以,作者認為學習C99標準的C語言是值得的。在本教材的編寫過程中參考了許多同行的著作,有的甚至還不方便列在參考目錄中,作者在此一并表達感謝之情。本教材要特別感謝四川大學計算機學院邰明松書記,正是邰書記希望把ACM引入C語言教學的思想,框定了本教材的主要構架,本教材在實例研究部分提供了那些精力充沛的學生深入研究的可能性。為了滿足不同層次的教學需求,本教材使用了分層設計的思想。
分層方法如下:未加“”號部分是基本內容,適合于全部學習者(包括參加計算機等級考試的考生,以及計算機、非計算機專業的學習者,這部分內容覆蓋了二級計算機等級考試大綱《C語言程序設計》的全部考點);加“”號部分,適合于計算機專業學生深入學習;加“”號部分適合于感興趣的同學研究;加“”號的部分適合于那些高級讀者,尤其是有志于ACM競賽的讀者可以適當研究。以上各部分都可以獨立教學,自成體系。教師可根據情況適當取舍。感謝四川大學計算機學院的各位領導、四川大學精品課程基金、四川大學計算機學院國家示范性軟件學院精品課程基金、青年基金的大力支持,正由于各位領導的大力支持及相關基金的支撐才使本教材得以成書付印。感謝清華大學出版社各位編輯,他們為本教材的出版傾注了大量的心血和熱情。也正是由于他們前瞻性的眼光和忙碌,才讓讀者有機會看到本教材。感謝Brian W. 、 M. (C語言發明者)、 和 等幾位語言大師,作者并不認識他們,但是作者詳細研讀了他們的著作:《The C 》、《C The ( )》,以及《C Traps and 》。
這些書籍的內容、良好的風格和組織結構思想( 尤其是《The C 》)對作者寫作本教材產生了重要影響。本教材也引用了這些書籍的部分實例程序。感謝為本教材提供直接或間接幫助的每一個朋友,你們熱情的幫助和鼓勵激發了作者的寫作熱情。如果您能夠愉快地讀完本教材,并告之身邊的朋友,原來C語言并不難學,那就是作者最大的欣慰。盡管作者盡了最大努力,也有良好而負責任的態度,但是由于作者學識所限,難免存在缺點和錯誤,從而影響寫作目的,因此,懇請各位讀者批評指正,以在再版時修訂。編者2006年8月18日
more >