本書采用以解決實際應(yīng)用問題為導(dǎo)向、以具體編程任務(wù)為驅(qū)動的模式,將C語言的知識無縫融入每個實際應(yīng)用程序中。作者精心設(shè)計了100多個應(yīng)用案例,每個案例均有實現(xiàn)特定功能的、完整的、可運行的程序代碼。本書圖表豐富,對程序設(shè)計的概念、求解問題的思路和方法、程序背后的原理和機制進行了深入剖析。全書共9章。第1章從簡單程序入手,將程序設(shè)計相關(guān)的基礎(chǔ)性概念融入案例,使讀者對C程序設(shè)計有一個整體的、直觀的、感性的認識。第2章闡述表達復(fù)雜邏輯的分支和循環(huán)語句的用法,使讀者對應(yīng)用問題中的邏輯具有較好的表達能力。第3章闡述了利用數(shù)組處理批量數(shù)據(jù)。第4章闡述了如何存儲和處理文本型數(shù)據(jù)。第5章全面地闡述了函數(shù)這一模塊化程序設(shè)計利器。第6章對具有內(nèi)存間接訪問能力的指針進行了深入闡述。第7章講解如何利用結(jié)構(gòu)體類型創(chuàng)建用戶所需新數(shù)據(jù)類型。第8章闡述了如何利用文件實現(xiàn)數(shù)據(jù)持久化。第9章講解了位運算的規(guī)則和用法。
本書采用大量具有實際生活應(yīng)用背景的實例系統(tǒng)地、通俗地、透徹地講解了如何運用C語言設(shè)計程序解決實際問題。本書提出的基于應(yīng)用導(dǎo)向與任務(wù)驅(qū)動的學習方法是值得推薦的程序設(shè)計學習方法。本書從形式到內(nèi)容都具有一定創(chuàng)新性。本書內(nèi)容組織獨具匠心、敘述方式通俗易懂、編程實例力求原創(chuàng)、任務(wù)驅(qū)動邏輯清晰、代碼注釋別具一格、知識擴展開拓思路。
本書是大學工科類專業(yè)的*門程序設(shè)計課程的*教材,也是廣大零基礎(chǔ)學習程序設(shè)計讀者不二之選。
本書具有六大特色:
1、以應(yīng)用導(dǎo)向,將C語言的知識融匯貫穿在對實際問題求解的過程中,盡量避免單純語法的講解。
2、每個編程任務(wù)目標明確、源于生活、意趣兼?zhèn)。以實際任務(wù)驅(qū)動編程,更加生動有趣。全書共150多個編程實例,可使用程序設(shè)計練習系統(tǒng)在線評判,方便上機練習。
3、本書大量運用圖解、表格、小貼士、小問答等形式,運用類比、對比等方法,盡量用直觀的形式幫助讀者理解程序設(shè)計中相對抽象的概念、原理、機制。
4、本書內(nèi)容深入淺出,表里兼顧,幫助讀者深入地理解程序底層的運行機制和原理。使讀者在編程時做到知其然且知其所以然。本書語言通俗、可讀性好、方便自學又不失深度。
5、程序代碼與相應(yīng)注釋之間用箭頭連接,代碼和注釋,一目了然,方便閱讀。
6、本書始終站在程序設(shè)計者的角度即人的角度,來講解程序設(shè)計,而不是站在C語言的角度即語法的角度,來講解程序設(shè)計。本書始終以工具(C語言作為程序設(shè)計的)服務(wù)于目標(求解實際問題)視角來展開討論。從這樣的視角出發(fā),讀者更容易理解和接受程序代碼。
前 言
當您第一眼見到這本書,一定詫異于它的厚度,但只要您翻開閱讀,我想,您一定不會覺得這是一本難啃的大部頭,而像是一本娓娓道來的程序設(shè)計故事書。
當我想要編寫一本關(guān)于程序設(shè)計的教材時,難抑內(nèi)心的激動。我的第一門程序設(shè)計語言是BASIC,然后學習C語言,后來學過C 、Java、Python等程序設(shè)計語言。多數(shù)學過程序設(shè)計的人,對第一門程序設(shè)計語言的印象大抵是艱難而晦澀的。一些人秉承對程序設(shè)計的執(zhí)著和熱愛,從這種艱難中走過來了,并且從此愛上了程序設(shè)計,享受程序設(shè)計在解決現(xiàn)實生活的實際應(yīng)用問題后帶來的快樂和成就感。但更多的人對編程望而生畏,面對堪如天書的代碼,始終難解心中諸多困惑:這些代碼是如何寫出來的?為什么要寫成這樣?必須寫成這樣嗎?為什么我這樣寫就不對呢?解決此問題還有其他寫法嗎?為何當我面對實際應(yīng)用問題時總感到無從下手呢?怎樣才能創(chuàng)造出屬于自己的程序呢?
我盡最大努力,使程序設(shè)計的每個細節(jié)變得簡單清晰。為了讓您理解程序的來龍去脈,對于每次需要解決的編程任務(wù),不是一次性地拋出最終程序代碼,而是必須對解決此問題的思路、方法進行詳盡分析。并且遵循由簡單到復(fù)雜,由低級到高級的設(shè)計過程,盡可能完整地展示程序是怎樣煉成的。對于同一編程任務(wù),提供盡可能多的設(shè)計思路和不同的算法以及實現(xiàn)代碼,幫助您打開程序設(shè)計思維的匣子。
本書側(cè)重于培養(yǎng)您作為程序設(shè)計者必須具備的計算思維。所謂的計算思維,就是以計算機的方式去思考問題的求解過程。作為機器的計算機思考問題的方式與作為萬物之靈的人的思考問題方式是不同的。人通過學習程序設(shè)計去理解并掌握計算機思考問題的方式,這個過程就是培養(yǎng)計算思維的過程。因此,本書以求解具體應(yīng)用問題為目標,驅(qū)動相關(guān)程序設(shè)計知識的應(yīng)用。
本書強調(diào),程序設(shè)計語言是求解問題的工具,程序設(shè)計語言是為求解問題服務(wù)的。本書對語法的講解以夠用為準,不提倡代碼中應(yīng)用古怪、費解的語法。當然,程序設(shè)計必須掌握相關(guān)語法,有語法錯誤的程序過不了編譯關(guān)。掌握C語言語法不是程序設(shè)計學習的重點,更不是學習目的。培養(yǎng)計算思維,能利用程序設(shè)計語言解決實際應(yīng)用問題才是最終目的,學習程序設(shè)計必須過實際運行關(guān)。
C語言具有語法簡潔、概念清晰、底層控制力強等優(yōu)點,是值得程序設(shè)計初學者首選的語言。C語言雖是面向過程的程序設(shè)計語言,但是學好C語言將為面向?qū)ο蟮某绦蛟O(shè)計語言(如C 、Java、C#、Python等)的學習打下堅實基礎(chǔ)。
學好編程沒有捷徑,上機練習、獨立思考、保持興趣、學用結(jié)合、日積月累、持之以恒是成為編程高手的秘籍。關(guān)于如何學習程序設(shè)計的建議請參見附錄10.1關(guān)于程序設(shè)計的學習方法(掃描前言中的二維碼)。
本書特色:
一、本書貫徹以求解應(yīng)用問題(實際應(yīng)用問題的一部分或?qū)嶋H應(yīng)用問題的簡化問題)為導(dǎo)向,以具體編程任務(wù)為驅(qū)動的程序設(shè)計學習方法,將每個知識點融入實際編程任務(wù)中。因此,展現(xiàn)在您面前的代碼是一個完整的、可運行的、有輸入/輸出的、實現(xiàn)了一定功能的應(yīng)用程序,而不是僅僅為了講解某個知識點的片段的、不完整的代碼。
二、作為例題的編程任務(wù)生動有趣。每個編程任務(wù)力求有現(xiàn)實生活應(yīng)用背景,讓您時刻不忘學習程序設(shè)計的目的是能運用計算機程序解決現(xiàn)實生活中或大或小的實際問題,體會計算機是如何按您的意圖行動的,體會計算機給我們生活帶來的方便,體會計算機的威力與魅力。編程不再是單純地學習C語言語法,也不是純粹為了實現(xiàn)數(shù)學的數(shù)值計算。
三、圖表豐富。本書秉承能用圖和表表達的,一定畫圖做表的思想。因此,書中配有大量圖解、表格,大量地運用了類比、對比、小貼士、小問答等形式,盡量用直觀的形式幫助您理解程序設(shè)計的概念、原理、機制等方面。
四、講解深入淺出。本書融入了我多年程序設(shè)計教學經(jīng)驗、教學成果、應(yīng)用軟件開發(fā)經(jīng)驗和對程序設(shè)計的體會與理解。對程序中諸多概念的理解,需要程序設(shè)計者(以后簡稱為程序員)對操作系統(tǒng)的有關(guān)原理有一定的理解。因此,本書在講解程序的同時,盡量對發(fā)生在程序運行背后的機制特別是操作系統(tǒng)中與編程相關(guān)的機制進行了深入剖析。對操作系統(tǒng)和計算機原理的介紹,能幫助程序員深入地理解程序在底層的運行機制,使程序員在編程時做到知其然且知其所以然。
五、程序代碼箭指代碼解釋,閱讀代碼一目了然、易讀易懂。對于程序代碼中每個重要語句,均引出箭頭指向相應(yīng)的代碼解釋,代碼和對應(yīng)的解釋是左鄰右舍、如影相隨的,方便閱讀。此外,在排版上,也盡量將一個完整程序或函數(shù)模塊的代碼排在同一頁中,確保代碼的形式整體性。
六、本書站在程序員的角度來看待和學習C語言,而不是站在C語言的角度羅列C語言知識本身。站在程序員的角度,面對編程任務(wù)時,我們應(yīng)該思考的是如何運用C語言為我(即程序員)的設(shè)計目標服務(wù)。從這個角度出發(fā),您就更容易理解和接受C語言的知識了。
本書的例題全部采用編程任務(wù)的形式給出。每個編程任務(wù)由8部分構(gòu)成:標題、任務(wù)描述、輸入、輸出、輸入舉例、輸出舉例、分析,以及參考代碼。本書例題采用此形式是基于以下四點考慮的。
其一,這種方式對要解決的任務(wù)有清晰、準確的編程描述,因此每個程序代碼需要達到的目標和需要實現(xiàn)的功能非常明確。學習程序設(shè)計是為了能用自己設(shè)計的程序解決實際問題,因此,我們將本書讀者的角色定為軟件開發(fā)者。軟件開發(fā)是軟件開發(fā)者按照用戶提出的需求進行軟件設(shè)計的過程。設(shè)計得到的軟件必須達到指定功能,滿足軟件用戶的需求。描述清晰、準確的軟件需求對軟件開發(fā)至關(guān)重要。因為需求的小變化,可能導(dǎo)致軟件設(shè)計的巨大改變,甚至從頭重新設(shè)計。
其二,有利于獨立思考和尋求解決問題的多種方法,培養(yǎng)計算思維。在達到既定軟件開發(fā)目標的情況下,鼓勵讀者學會分析問題,開動腦筋獨立思考,嘗試用不同思路、不同算法或不同的代碼去完成同一個任務(wù),對比不同實現(xiàn)方式之間的優(yōu)缺點。對于每個編程任務(wù),本書代碼僅供參考。本書絕不鼓勵讀者僅滿足于將本書代碼照抄照搬,死記硬背。
其三,對C語言知識點均采用融入具體編程任務(wù)的方式講解,使我們對每個C語言知識要素所適用的實際應(yīng)用場合有最感性的認識。
其四,方便使用OJ作為程序設(shè)計在線練習平臺。本書的編程任務(wù)便于自動裁判(可簡單地將裁判理解為教師批改學生所交的程序設(shè)計作業(yè)這一過程)。國內(nèi)外有許多大學和組織提供了開放式的在線裁判系統(tǒng)(Online Judge,OJ),它能對提交的程序源代碼進行自動裁判。OJ系統(tǒng)24小時在線練習資源豐富,裁判結(jié)果公正客觀。OJ系統(tǒng)原本為程序設(shè)計競賽所用,但是好的工具為什么不能用于學習呢?參加過信息學競賽(IOI,NOI)或大學生程序設(shè)計競賽(CPC)的讀者一定對這種編程任務(wù)的形式不陌生,因為競賽題采用此形式。希望本書讀者不要對此表示疑惑,學習程序設(shè)計當然不是為了參加比賽。在此,只是取其長而用之,更好地服務(wù)于學習程序設(shè)計這一目標。我早在2009年就開始將OJ系統(tǒng)作為練習平臺引入到信息類本科專業(yè)的C程序設(shè)計課程教學中,得到了學生和同行的好評與認可。目前,將OJ作為程序設(shè)計教學練習平臺的做法在越來越多的學校的程序設(shè)計教學中得到運用。
本書提供所有編程任務(wù)的描述、測試用例數(shù)據(jù)和標程,并且不斷補充高質(zhì)量的編程任務(wù)作為練習或測試用。讀者(包括教師或?qū)W生)可在OJ上練習、實驗、測試和上機考試。如果您所在學校尚未建立OJ系統(tǒng),可自主開發(fā)OJ,也可利用開源系統(tǒng)部署自己的OJ,或者直接利用互聯(lián)網(wǎng)上開放的OJ系統(tǒng)。如果OJ上沒有想要練習的編程任務(wù),則需要先在OJ上添加它。歡迎使用湖南農(nóng)業(yè)大學程序設(shè)計在線練習系統(tǒng)(http://210.43.224.19/oj)。
本書適合作為本科低年級程序設(shè)計課程教材,也非常適合程序設(shè)計初學者自學使用。對參加奧林匹克信息學競賽的隊員和參加ACM/ICPC大學生程序設(shè)計競賽的隊員來說,也是一本非常好的入門教材。對于有一定程序設(shè)計基礎(chǔ)的讀者,本書也不失參考價值。書中有許多對程序深入的剖析很有啟發(fā)意義,值得一讀。
眾所周知,C程序設(shè)計課程是計算機類專業(yè)、信息類專業(yè)極其重要的專業(yè)基礎(chǔ)課。我從事本科程序設(shè)計專業(yè)基礎(chǔ)課一線教學十余年,希望能有一本讀起來不那么枯燥,同時又不失專業(yè)性和系統(tǒng)性的面向程序設(shè)計初學者的C語言圖書,這是我寫本書的意圖。如何利用本書,各位見仁見智。
希望通過本書帶給讀者更多愉悅的程序設(shè)計經(jīng)歷,提振編程信心,激發(fā)編程的興趣,為今后的學習、工作、科研培養(yǎng)良好的計算思維和軟件設(shè)計基礎(chǔ)。
本書的寫作是我將頭腦中紛繁的思緒變成有條理文字的過程,既艱辛又充滿快樂。常常為了設(shè)計一個恰到好處的編程任務(wù)或為了更好地表述某個概念,靈感突現(xiàn),即使是已臥床或半夜醒來,也立刻記錄,唯恐遺漏。本書力求知識更加系統(tǒng)、表述更加準確、語言更加通俗、例子更加貼近生活,這使寫作過程充滿挑戰(zhàn)性,字句斟酌,直到自己滿意為止,以致成書過程如此漫長。對本書內(nèi)容安排、章節(jié)設(shè)置、設(shè)置每個例子代碼甚至每段表述,都經(jīng)過反復(fù)琢磨和權(quán)衡,力求語言描述精準、思想表達透徹。漫長的成書過程,讓我體會到了寫書的不易,不過,本書寫作過程帶給我更多的是快樂。在寫作期間,不僅有將存在于腦海的點滴心得隨著鍵盤的敲擊變成文字的快感,而且,在此期間我的兒子不經(jīng)意間長成了帥小伙,陪伴他的時間總是短暫而歡快的。我的妻子雖常常擔心因長時伏案而有腰椎疾病的我,但她送來鍵盤旁的一杯熱茶、一碟水果,頓時讓我滿血復(fù)活。特別感謝我的妻子陳海燕女士包容我無數(shù)個日夜以計算機為伴而少有陪伴她,家務(wù)操持多勞她費心,雖偶有抱怨,但忍韌而堅強。謹以此書獻給我的家人。
感謝電子工業(yè)出版社高等教育分社譚海平社長和冉哲編輯對我蝸牛般寫稿進度的容忍。
感謝我的學生盧晨曦、邵振宇、王舒心、王鵬、陳慧、張洋、唐朝宇、廖顏勤、姚沛豐、熊嘉奇、唐航、周子翔、沈煜恒為本書的校對付出了辛勤勞動。
雖然我對本書寫作用心盡力,但由于學識水平有限,錯誤與不足之處在所難免,懇請批評指正(我的郵箱:390199309@qq.com)。
限于篇幅,本書第1章至第9章的綜合應(yīng)用實例和知識拓展部分以及附錄部分,以掃描二維碼下載相應(yīng)文檔的形式提供。
附錄:
賀細平
博士,國防科技大學計算機學院計算機應(yīng)用專業(yè)。湖南農(nóng)業(yè)大學信息科學技術(shù)學院電商系主任,副教授。中國計算機學會會員,湖南省高教學會計算機教育專業(yè)委員會會員。出版教材:現(xiàn)代計算機網(wǎng)絡(luò)系統(tǒng)原理及技術(shù)研究,中國商務(wù)出版社,2013年。