出版時間:2012-7 出版社:科學(xué)出版社 作者:杜友福 頁數(shù):186 字?jǐn)?shù):288000
內(nèi)容概要
《C語言程序設(shè)計導(dǎo)學(xué)(第三版)》是《C語言程序設(shè)計導(dǎo)學(xué)》的第三版,為C語言程序設(shè)計課程的學(xué)習(xí)指導(dǎo)和實(shí)驗(yàn)教材,既可與《C語言程序設(shè)計(第三版)》配套使用,也可獨(dú)立使用?!禖語言程序設(shè)計導(dǎo)學(xué)(第三版)》分為學(xué)習(xí)指導(dǎo)和實(shí)驗(yàn)指導(dǎo)兩部分,學(xué)習(xí)指導(dǎo)部分分為13章,每章包括學(xué)習(xí)要求、內(nèi)容要點(diǎn)、典型例題分析三個方面的內(nèi)容;實(shí)驗(yàn)指導(dǎo)部分根據(jù)C語言的教學(xué)需要,設(shè)計了11個實(shí)驗(yàn)。學(xué)習(xí)者通過學(xué)習(xí)與訓(xùn)練,能夠進(jìn)一步掌握C語言的基本概念、C程序設(shè)計的基本方法,并通過上機(jī)實(shí)驗(yàn)強(qiáng)化程序設(shè)計與調(diào)試的基本功,理解和掌握C語言的基本知識,達(dá)到學(xué)好和用好C語言的目的。
《C語言程序設(shè)計導(dǎo)學(xué)(第三版)》特別適合于本、??品怯嬎銠C(jī)專業(yè)的初學(xué)者,也可供計算機(jī)等級考試者和其他各類學(xué)習(xí)者使用參考。
作者簡介
杜友福
書籍目錄
學(xué)習(xí)指導(dǎo)第1章 C語言程序設(shè)計概述1.1 學(xué)習(xí)要求1.2 內(nèi)容要點(diǎn)1.3 典型例題分析第2章 數(shù)據(jù)類型、運(yùn)算符與表達(dá)式2.1 學(xué)習(xí)要求2.2 內(nèi)容要點(diǎn)2.3 典型例題分析第3章 順序結(jié)構(gòu)程序設(shè)計3.1 學(xué)習(xí)要求3.2 內(nèi)容要點(diǎn)3.3 典型例題分析第4章 選擇結(jié)構(gòu)程序設(shè)計4.1 學(xué)習(xí)要求4.2 內(nèi)容要點(diǎn)4.3 典型例題分析第5章 循環(huán)結(jié)構(gòu)程序設(shè)計5.1 學(xué)習(xí)要求5.2 內(nèi)容要點(diǎn)5.3 典型例題分析第6章 數(shù)組6.1 學(xué)習(xí)要求6.2 內(nèi)容要點(diǎn)6.3 典型例題分析第7章 函數(shù)7.1 學(xué)習(xí)要求7.2 內(nèi)容要點(diǎn)7.3 典型例題分析第8章 用戶標(biāo)識符的作用域和存儲類8.1 學(xué)習(xí)要求8.2 內(nèi)容要點(diǎn)8.3 典型例題分析第9章 編譯預(yù)處理9.1 學(xué)習(xí)要求9.2 內(nèi)容要點(diǎn)9.3 典型例題分析第10章 指針10.1 學(xué)習(xí)要求10.2 內(nèi)容要點(diǎn)10.3 典型例題分析第11章 結(jié)構(gòu)體、共用體和用戶定義類型11.1 學(xué)習(xí)要求11.2 內(nèi)容要點(diǎn)11.3 典型例題分析第12章 位運(yùn)算12.1 學(xué)習(xí)要求12.2 內(nèi)容要點(diǎn)12.3 典型例題分析第13章 文件13.1 學(xué)習(xí)要求13.2 內(nèi)容要點(diǎn)13.3 典型例題分析實(shí)驗(yàn)指導(dǎo)實(shí)驗(yàn)一 順序結(jié)構(gòu)程序設(shè)計實(shí)驗(yàn)二 選擇結(jié)構(gòu)程序設(shè)計實(shí)驗(yàn)三 循環(huán)結(jié)構(gòu)程序設(shè)計(一)實(shí)驗(yàn)四 循環(huán)結(jié)構(gòu)程序設(shè)計(二)實(shí)驗(yàn)五 數(shù)組(一)實(shí)驗(yàn)六 數(shù)組(二)實(shí)驗(yàn)七 函數(shù)(一)實(shí)驗(yàn)八 函數(shù)(二)實(shí)驗(yàn)九 指針實(shí)驗(yàn)十 結(jié)構(gòu)體實(shí)驗(yàn)十一 文件附錄 在Visual C++ 6.0集成開發(fā)環(huán)境下運(yùn)行C程序
章節(jié)摘錄
1.1 學(xué)習(xí)要求掌握程序及程序設(shè)計的基本概念、程序的運(yùn)行過程、算法及其特點(diǎn)、算法的描述及其表示方法、C 語言程序的基本結(jié)構(gòu)。熟悉設(shè)計程序時應(yīng)遵循的基本原則。了解利用計算機(jī)解決實(shí)際問題的過程、結(jié)構(gòu)化程序設(shè)計方法,并在以后的程序設(shè)計中應(yīng)用和逐步熟練掌握?;疽螅耗軐⑷粘I钪薪鉀Q一些簡單問題的步驟用算法描述,掌握N唱S 圖的算法表示方法。1.2 內(nèi)容要點(diǎn)【知識點(diǎn)】(1) 程序就是用計算機(jī)能夠識別的語言所描述的解決某個特定問題的方法和步驟,是由一組相關(guān)的指令組成的。程序= 數(shù)據(jù)結(jié)構(gòu)+ 算法(2) 程序設(shè)計就是利用計算機(jī)解決問題的全過程。通常是對問題進(jìn)行分析并建立數(shù)學(xué)模型;在此基礎(chǔ)上設(shè)計出相應(yīng)的數(shù)據(jù)結(jié)構(gòu)和算法;然后用某種程序設(shè)計語言編寫相應(yīng)的程序代碼;最后調(diào)試程序,使之運(yùn)行后能產(chǎn)生預(yù)期的結(jié)果。(3) 程序設(shè)計語言可分為機(jī)器語言、匯編語言、高級語言和面向?qū)ο蟮母呒壵Z言四類。(4) 高級語言程序通常要經(jīng)過編輯、編譯后方能在計算機(jī)上運(yùn)行,少數(shù)語言以解釋方式執(zhí)行。(5) 設(shè)計程序時應(yīng)遵循的基本原則包括:正確性、可靠性、簡明性、有效性、可維護(hù)性和可移植性。(6) 計算機(jī)算法是為計算機(jī)解題設(shè)計的有明確意義的運(yùn)算步驟的有限集合。算法應(yīng)具有有窮性、確定性、有效性、有輸入輸出等特點(diǎn)。(7) 算法可以用自然語言、偽代碼、傳統(tǒng)流程圖、結(jié)構(gòu)化流程圖等方法表示。(8) 結(jié)構(gòu)化程序設(shè)計方法要求在設(shè)計程序時只使用順序、選擇、循環(huán)三種基本結(jié)構(gòu)。這三種基本結(jié)構(gòu)有以下共同特點(diǎn):只有一個入口、只有一個出口、結(jié)構(gòu)內(nèi)的每一部分都有機(jī)會被執(zhí)行到、結(jié)構(gòu)內(nèi)不存在“死循環(huán)”(無終止的循環(huán)) 。(9) 結(jié)構(gòu)化程序設(shè)計方法的基本思路是,把一個復(fù)雜問題的求解過程分階段進(jìn)行,每個階段處理的問題都控制在人們?nèi)菀桌斫夂吞幚淼姆秶鷥?nèi)。結(jié)構(gòu)化程序設(shè)計方法的基本原則是:自頂向下、逐步細(xì)化、模塊化設(shè)計、結(jié)構(gòu)化編碼。(10) 函數(shù)是C 程序的基本單位。一個函數(shù)由函數(shù)的首部和函數(shù)體兩個部分組成。函數(shù)的首部描述該函數(shù)的外觀(即該函數(shù)的名字,該函數(shù)需要外部提供哪些信息,執(zhí)行完畢后能為外部提供哪些結(jié)果等) ,函數(shù)體則定義該函數(shù)的內(nèi)涵(即該函數(shù)將對什么數(shù)據(jù)執(zhí)行何種操作) 。(11) 一個C 源程序至少包含一個函數(shù)(即main 函數(shù)) 。一個C 程序總是從main 函數(shù)開始執(zhí)行并在該函數(shù)結(jié)束。main 函數(shù)可以放在程序的任意位置。(12) C 程序書寫格式自由,一行內(nèi)可以寫多個語句,一個語句也可以寫在多行上。分號是C 語句的必要組成部分。(13) C 程序的輸入和輸出操作是通過調(diào)用庫函數(shù)scanf 和printf 來完成的。(14) C 程序中可以用“/ *… … */”對程序的任何部分作注釋;也可以用“// … … ”作為一個單獨(dú)的注釋行。注釋對程序的執(zhí)行沒有任何影響。【重點(diǎn)】(1) 算法的特點(diǎn)及簡單算法的設(shè)計。(2) C 程序的基本結(jié)構(gòu)。【難點(diǎn)】(1) 算法的設(shè)計思想。(2) 用傳統(tǒng)流程圖和結(jié)構(gòu)化流程圖表示算法?!镜湫湾e誤分析】1.算法設(shè)計中的邏輯錯誤對初學(xué)者來說,最常見的邏輯錯誤包括:忘記對計數(shù)器、總數(shù)等變量進(jìn)行初始化;選用的用于控制輸入循環(huán)結(jié)束的標(biāo)記值也是一個合法的輸入數(shù)據(jù)值;一個作為除數(shù)的變量的值為0 等。在用C 語言編程實(shí)現(xiàn)算法后,編譯程序往往不能發(fā)現(xiàn)這類錯誤,但程序運(yùn)行時的結(jié)果可能是不正確的。排除源程序中的錯誤(包括語法錯誤和邏輯錯誤)是進(jìn)行程序設(shè)計所必須具備的能力,是對所學(xué)知識的綜合檢驗(yàn)過程,需要清醒的頭腦,嚴(yán)謹(jǐn)細(xì)致的工作作風(fēng),扎實(shí)的基礎(chǔ)知識以及邏輯分析能力。對于初學(xué)者,調(diào)試程序時應(yīng)注意以下兩點(diǎn):(1) C 編譯程序盡管能夠指出大多數(shù)程序的語法錯誤,但不可能完全準(zhǔn)確地指出錯誤發(fā)生的源程序行,有時應(yīng)當(dāng)綜觀上下文、參考出錯信息進(jìn)行綜合分析判斷,不要死摳所報的出錯行號。(2) 程序中一處發(fā)生的錯誤會產(chǎn)生若干連帶的錯誤信息,即若干條錯誤信息可能只有第一條是真正的錯誤,改掉這一錯誤,所有其他出錯信息將隨之消失。因此查錯糾錯應(yīng)從最前面的出錯點(diǎn)開始,糾正某個錯誤后,若不能發(fā)現(xiàn)其他錯誤,則應(yīng)再次編譯源程序,按照新的提示信息查找錯誤。2.分號使用錯誤分號是C 語句的組成部分,初學(xué)者往往容易遺漏分號而造成語句的不完整,導(dǎo)致編譯程序?qū) 語句無法正確理解。3.注釋使用錯誤正確的注釋形式是/ *注釋內(nèi)容*/ 。初學(xué)者容易犯以下錯誤:忘記了注釋的結(jié)束符*/ ,或者注釋用*/開頭,或用/ *結(jié)束,或者在注釋符號中插入了空格,即寫成/ *… … * /的形式。C 編譯程序?qū)τ谧⑨尣糠郑ㄆ鹗挤? *與結(jié)束符*/之間)是不進(jìn)行任何處理的,也就是說,編譯時,一旦遇到/ *符號就對其后的任何符號不予處理,直到遇到*/符號為止。而對于其他部分則作為C 的語句進(jìn)行處理。因此注釋符號使用錯誤會導(dǎo)致編譯程序?qū)Τ绦虻腻e誤翻譯,從而出現(xiàn)語法錯誤。1.3 典型例題分析一、選擇題例1.1 C 編譯程序是。A.C 程序的機(jī)器語言版本B.一組機(jī)器語言指令C.將C 源程序翻譯成目標(biāo)程序的程序D.由制造廠家提供的一套應(yīng)用軟件解 本題的關(guān)鍵是掌握編譯程序的作用。C 語言編寫的源程序要執(zhí)行,必須經(jīng)過以下步驟:用編輯程序?qū)⒃闯绦蜉斎氩⒋娣旁谟嬎銠C(jī)的存儲設(shè)備中,然后通過C 編譯程序?qū)⒃闯绦蚍g成計算機(jī)能識別的目標(biāo)程序,最后通過連接裝配程序?qū)⒛繕?biāo)指令模塊組合成完整的可執(zhí)行程序才能在計算機(jī)上運(yùn)行。C 編譯程序是系統(tǒng)軟件的一部分,并非應(yīng)用軟件。C 程序的機(jī)器語言版本稱為目標(biāo)程序。因此選項A 、D 均不正確。雖說能夠運(yùn)行的程序都是一組機(jī)器語言指令,但選項B 是籠統(tǒng)的,不準(zhǔn)確的。因此,正確答案為選項C 。例1.2 以下敘述中正確的是。A.C 程序由主函數(shù)組成 B.C 程序由函數(shù)組成C.C 程序由函數(shù)和過程組成D.C 程序中的注釋由/ *開頭,由* /結(jié)束解 本題的關(guān)鍵是掌握C 程序的基本構(gòu)成。在初學(xué)階段,由于程序較小,可能只需main( )函數(shù)即可,但解決規(guī)模較大的實(shí)際問題的最好辦法是把程序分成較小的模塊,每一模塊完成一個獨(dú)立的功能,這樣便于管理和調(diào)試。C 語言的程序模塊就是函數(shù),因此讀者應(yīng)該明確且牢記:C 程序是由函數(shù)組成的。每個C 語言的源程序可以包含多個函數(shù),但必須有一個且只能有一個主函數(shù)。因此,選項A 是片面的。在C 程序中不存在“過程”這一程序結(jié)構(gòu),故選項C 也是錯誤的。程序設(shè)計中可以對源程序進(jìn)行必要的注釋,以便于閱讀和維護(hù)。C 程序中的注釋行由/ *開頭,由*/結(jié)束,“/”和“ *”必須緊接著,在這兩個字符之間不得插入空格。在選項D 中“/”和“ *”之間都插有空格,故選項D 也是錯誤的。因此,正確答案為選項B 。例1.3 C 函數(shù)由構(gòu)成。A.函數(shù)首部和函數(shù)體B.執(zhí)行語句和非執(zhí)行語句C.自變量和因變量D.定義域和值域解 本題的關(guān)鍵是掌握C 函數(shù)的組成。從數(shù)學(xué)角度來說,一個函數(shù)有自變量和因變量,也有其定義域和值域,但從C 語言的角度來說,函數(shù)分為函數(shù)首部和函數(shù)體兩個部分,函數(shù)的首部描述該函數(shù)的外觀,函數(shù)體則定義該函數(shù)的內(nèi)涵,各種語句用來在函數(shù)體中定義各種數(shù)據(jù)及對這些數(shù)據(jù)的操作。因此,正確答案為選項A 。例1.4 一個C 程序的執(zhí)行是。A.從main( )函數(shù)開始,直到main( )函數(shù)結(jié)束B.從第一個函數(shù)開始,直到最后一個函數(shù)結(jié)束C.從第一個語句開始,直到最后一個語句結(jié)束D.從main( )函數(shù)開始,直到最后一個函數(shù)結(jié)束解 本題的關(guān)鍵是掌握C 程序的執(zhí)行過程。C 程序中必須要有一個而且也只能有一個main( )函數(shù),不論main( )函數(shù)處于程序中的什么位置,C 程序執(zhí)行時總是從main( )函數(shù)開始。C 程序的執(zhí)行與函數(shù)位置無關(guān)。故選項B 是不正確的。C 程序中除了順序結(jié)構(gòu)的語句執(zhí)行與排列順序一致外,選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)都會改變語句的執(zhí)行順序。因而選項C 是不正確的。如果程序中有多個函數(shù),其他函數(shù)要通過調(diào)用才能執(zhí)行。而且被調(diào)用函數(shù)在執(zhí)行完畢后,必須返回到調(diào)用函數(shù)處。故選項D 也不正確。因此,正確答案為選項A 。二、填空題例1.5 C 語言源程序文件的后綴是,經(jīng)過編譯后生成文件的后綴是,經(jīng)過連接后生成文件的后綴是。解 文件的后綴即文件的擴(kuò)展名,主要用來表示該文件的類型。一般情況下,C 語言源程序文件的擴(kuò)展名為C ;C 語言源程序經(jīng)過編譯生成目標(biāo)程序,其擴(kuò)展名為OBJ ;目標(biāo)程序必須經(jīng)過連接生成可執(zhí)行程序才能運(yùn)行,其擴(kuò)展名為EXE 。因此,本題答案:C ,OBJ ,EXE 。例1.6 在事先不知道需要連續(xù)輸入多少個數(shù)據(jù)的情況下,可用一個值控制輸入循環(huán)的終止。解 這是一道關(guān)于算法設(shè)計方面的題。算法設(shè)計中,經(jīng)常會在某種條件下重復(fù)執(zhí)行某些操作,這種情況稱為循環(huán)。例如,要連續(xù)輸入多個數(shù)據(jù),就可以用循環(huán)來實(shí)現(xiàn),循環(huán)次數(shù)有時是固定數(shù),有時是通過條件來控制的。就本題來說,由于不知道需要連續(xù)輸入多少個數(shù)據(jù),此時通常采用的辦法是設(shè)置一個標(biāo)記值(flag)來控制循環(huán)結(jié)束,當(dāng)輸入值為標(biāo)記值時表示所有數(shù)據(jù)已輸入完畢。顯然該標(biāo)記值應(yīng)該小心選擇,其值不應(yīng)該在合法輸入數(shù)據(jù)的范圍內(nèi)。類似的問題在循環(huán)中經(jīng)常會遇到。因此,本題答案:標(biāo)記。例1.7 結(jié)構(gòu)化程序設(shè)計方法使用的三種基本結(jié)構(gòu)是、和。解 這是一道基本概念題。結(jié)構(gòu)化程序設(shè)計方法要求程序中只使用順序、選擇、循環(huán)三種基本結(jié)構(gòu)。這三種基本結(jié)構(gòu)構(gòu)成的算法不存在無規(guī)律的轉(zhuǎn)向,屬于結(jié)構(gòu)化的算法,而且已經(jīng)證明,由以上三種基本結(jié)構(gòu)構(gòu)成的算法可以解決任何復(fù)雜的問題。因此,本題答案:順序、選擇、循環(huán)。三、閱讀題例1.8 下述算法用于求1 *2 *3 *4 *5 。設(shè)兩個變量,一個變量p 代表被乘數(shù)(同時用于存放每一步驟的當(dāng)前所得乘積) ,一個變量i 代表乘數(shù)。算法如下:S1 :使p = 1S2 :使i = 1S3 :使p *i ,乘積仍放在變量p 中,可表示為p *i → pS4 :使i 的值加1 ,即i + 1 → iS5 :如果i 不大于5 ,返回重新執(zhí)行步驟S3 以及其后的步驟S4 和S5 ,否則,算法結(jié)束。最后得到p 的值就是5 ! 的值如何改動使其成為求1 *3 *5 *7 *9 *11 。如果要求1 + 2 + … + 100 ,應(yīng)如何修改?解 首先分析一下上述算法中每一步的作用。步驟S1 、S2 兩步是對變量賦初值,即設(shè)置初始乘積為1 ,第一個乘數(shù)為1 。S3 是進(jìn)行乘法運(yùn)算,并將結(jié)果存放到當(dāng)前所得乘積p 中。S4 通過改變i 的值得到下一個乘數(shù)。S5 判斷是否所有的運(yùn)算已執(zhí)行完畢。求1 *3 *5 *7 *9 *11 與求1 *2 *3 *4 *5 的差別主要在于,下一個乘數(shù)比前一個乘數(shù)多2 ,且最后一個乘數(shù)是11 。通過以上分析可知,只需作很少的改動即可:S1 :1 → p52 :1 → iS3 :p *i → pS4 :i + 2 → iS5 :若i ≤ 11 ,返回S3 ;否則,結(jié)束可以看出,用這種方法表示的算法具有通用性、靈活性。S3 到S5 組成一個循環(huán),在實(shí)現(xiàn)算法時,要反復(fù)多次執(zhí)行S3 、S4 、S5 等步驟,直到某一時刻,執(zhí)行S5 步驟時經(jīng)過判斷,乘數(shù)i 已超過規(guī)定的數(shù)值而不返回S3 步驟為止。此時算法結(jié)束,變量p 的值就是所求結(jié)果。如果對這個算法適當(dāng)修改實(shí)現(xiàn)求累加和,只需改動以下幾點(diǎn):(1) 使p 的初值為0(為什么? 請讀者考慮) 。(2) S3 中乘法運(yùn)算改為加法運(yùn)算。(3) S5 中改為與100 比較。由于計算機(jī)是高速進(jìn)行運(yùn)算的自動機(jī)器,可以高速地、不厭其煩地進(jìn)行重復(fù)性操作。計算機(jī)中多次重復(fù)執(zhí)行同類操作稱為循環(huán)(或迭代) 。所有計算機(jī)高級語言中都有實(shí)現(xiàn)循環(huán)的語句。因此,上述算法不僅是正確的,而且是計算機(jī)能實(shí)現(xiàn)的較好的算法。四、算法設(shè)計題例1.9 開發(fā)一個程序求全班學(xué)生某門課程的平均成績。要求程序每次運(yùn)行時班級人數(shù)可為任意。解 采用結(jié)構(gòu)化程序設(shè)計方法(“自頂向下、逐步求精”的方法)來解決這個問題并用偽代碼來表示求精過程中得到的算法。為使初學(xué)者比較容易讀懂,偽代碼采用中文來表示。首先,頂層描述程序的整個功能,然后將其分解為一系列較小的任務(wù),并按照執(zhí)行順序列出這些任務(wù)。每一步的求精都是一個完整的算法說明,只是每層的細(xì)節(jié)在變化。重復(fù)上述求精過程直到表示每一任務(wù)的偽代碼能夠轉(zhuǎn)化為程序設(shè)計語言的程序段為止。對于上述問題,頂層可用一句偽代碼來表示:求未知人數(shù)班級的平均成績首先考慮需要使用的數(shù)據(jù)量(變量) 。顯然,本例中需要使用的數(shù)據(jù)量有:總成績(記為total) ,成績個數(shù)計數(shù)器(記為counter) ,每次輸入的成績(記為score) ,全班平均成績(記為average) 。對數(shù)據(jù)進(jìn)行分析后,再來考慮程序應(yīng)該如何完成上述功能。許多程序可從邏輯上分為三個階段:① 初始化階段(對程序變量初始化) ;② 處理階段(輸入數(shù)據(jù)值并對程序中的變量作相應(yīng)調(diào)整) ;③ 終止階段(計算和打印最終結(jié)果) 。本程序也不例外,因此可以將頂層分解為以下三個小任務(wù):初始化變量;輸入、求和及對輸入的成績計數(shù);計算并打印班級平均成績;對初始化階段,由于每次輸入的成績值score 和平均成績average 會被后面的讀入過程覆蓋,故不需要初始化。做如下求精:初始化總成績t ot a l為0;初始化計數(shù)器count er為0;由于本例中成績個數(shù)是不定的,可以使用一個專門的值來指示數(shù)據(jù)輸入的結(jié)束,這個值稱為“標(biāo)記值”(flag) 。顯然標(biāo)記值必須小心選擇,使它有別于準(zhǔn)備接收的成績值。因?yàn)榭荚嚦煽兺ǔJ欠秦?fù)的,可以選擇- 1 作為標(biāo)記值。因此可以讓程序重復(fù)讀入成績值,當(dāng)遇到標(biāo)記值時結(jié)束讀入。每讀入一個成績值,就將其加到總成績total 中,計數(shù)器加1 。……
圖書封面
評論、評分、閱讀與下載
C語言程序設(shè)計導(dǎo)學(xué) PDF格式下載