C語(yǔ)言與程序設(shè)計(jì)_第1頁(yè)
C語(yǔ)言與程序設(shè)計(jì)_第2頁(yè)
已閱讀5頁(yè),還剩70頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語(yǔ)言與程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)、報(bào)告書(shū)班級(jí):____________________姓名:____________________計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院-1-C程序設(shè)計(jì)語(yǔ)言計(jì)算機(jī)專(zhuān)業(yè)的一門(mén)技一年級(jí)開(kāi)設(shè),同時(shí)也的一種啟蒙語(yǔ)言。課程是計(jì)算機(jī)專(zhuān)業(yè)和非術(shù)基礎(chǔ)選修課程,大學(xué)是作為學(xué)生學(xué)習(xí)計(jì)算機(jī)算機(jī)獨(dú)立解決問(wèn)題的能力,讓學(xué)生基本掌握一門(mén)使用計(jì)算機(jī)的語(yǔ)言工具,算機(jī)語(yǔ)言基礎(chǔ)。C程序設(shè)計(jì)語(yǔ)言最早是由DennisRichie于1973年設(shè)計(jì)并實(shí)現(xiàn)的。從那時(shí)開(kāi)始,C語(yǔ)言已經(jīng)從其位于貝爾實(shí)驗(yàn)室的發(fā)源地傳播到世界各地,C++與Java—它們都建立在C語(yǔ)言的語(yǔ)法和基本結(jié)構(gòu)的基礎(chǔ)上?,F(xiàn)在世界上的許多軟件都是在C語(yǔ)言及其衍生的各種語(yǔ)言的基礎(chǔ)上開(kāi)發(fā)出來(lái)的。C的,而是自己練習(xí)會(huì)的。因此,要求大家在學(xué)習(xí)C程序設(shè)計(jì)語(yǔ)言課程時(shí),保證應(yīng)有足夠的上機(jī)實(shí)驗(yàn)時(shí)間?!禖C程序設(shè)計(jì)語(yǔ)言課程而編寫(xiě)的一本具有很強(qiáng)的實(shí)踐性教材。C程序設(shè)計(jì)語(yǔ)言課程為我校精品課程建的還要通過(guò)實(shí)踐教學(xué)環(huán)節(jié)來(lái)拓展學(xué)生程序設(shè)計(jì)的邏輯思維和提高程序設(shè)發(fā)軟件。-2-師可根據(jù)授課專(zhuān)業(yè)的需要進(jìn)行必要的題目選擇。環(huán)節(jié)上的理論知識(shí),得以在本實(shí)踐環(huán)節(jié)中得到應(yīng)用。本實(shí)驗(yàn)教程共安排了5個(gè)實(shí)驗(yàn),每項(xiàng)實(shí)驗(yàn)包括實(shí)驗(yàn)學(xué)時(shí)、實(shí)驗(yàn)?zāi)康?、?shí)驗(yàn)內(nèi)容及部分思考題等。整個(gè)實(shí)驗(yàn)建議用40學(xué)時(shí)完成,其中計(jì)劃學(xué)時(shí)20,另外20學(xué)時(shí)是對(duì)編程感興趣的同學(xué)安排的,可作為選項(xiàng)實(shí)驗(yàn)題目,所以學(xué)生可以根據(jù)自己的情況進(jìn)行選做。書(shū)山有路勤為徑祝你成功!C程序設(shè)計(jì)課程教學(xué)組2005年秋學(xué)期-3-目錄實(shí)驗(yàn)1:簡(jiǎn)單C程序設(shè)計(jì)1.1項(xiàng)目編程(1)找出a,b,c中最大值(2)按a,b,c值由小到大輸出(3)報(bào)選體育科目統(tǒng)計(jì)程序1.2課外選做題(1)輸入100條數(shù)據(jù),找出最大值及位置(2)統(tǒng)計(jì)輸入的字符串中,數(shù)字、字母與其他字符的個(gè)數(shù)(3)打印簡(jiǎn)單圖形實(shí)驗(yàn)2:數(shù)組與排序2.1項(xiàng)目編程(1)交換數(shù)組元素(2)排序程序(3)查詢(xún)程序2.2課外選做題(1)矩陣運(yùn)算(2)級(jí)數(shù)求和(3)電路計(jì)算(4)字符串處理實(shí)驗(yàn)3:模塊化編程3.1項(xiàng)目編程(1)矩陣運(yùn)算(2)字符串升序排序(3)排列方陣程序3.2課外選做題(1)計(jì)算某數(shù)的位數(shù)之積(2)年齡統(tǒng)計(jì)程序(3)字符插入操作-4-實(shí)驗(yàn)4:指針與鏈表4.1項(xiàng)目編程(1)利用行指針實(shí)現(xiàn)成績(jī)查詢(xún)(2)建立鏈表程序(3)字符刪除4.2課外選做題(1)字符統(tǒng)計(jì)(2)結(jié)構(gòu)體數(shù)組的應(yīng)用(3)字符串連接實(shí)驗(yàn)5:綜合程序設(shè)計(jì)5.1項(xiàng)目編程(1)破譯密碼程序(2)趣味編程(3)人民幣面值統(tǒng)計(jì)(4)考試成績(jī)處理5.2課外選做題(1)文本詞匯統(tǒng)計(jì)(2)趣味編程(3)選票統(tǒng)計(jì)附錄Ⅰ本實(shí)驗(yàn)總結(jié)附錄Ⅱ編程必須注意的幾個(gè)問(wèn)題附錄Ⅲ程序調(diào)試與常見(jiàn)錯(cuò)誤分析附錄ⅣTC部分出錯(cuò)信息注釋參考文獻(xiàn)-5-1實(shí)驗(yàn)簡(jiǎn)單C程序設(shè)計(jì)一、實(shí)驗(yàn)學(xué)時(shí):4二、實(shí)驗(yàn)?zāi)康模?、學(xué)習(xí)和了解C程序設(shè)計(jì)語(yǔ)言的數(shù)據(jù)類(lèi)型及在內(nèi)存中的儲(chǔ)存方式,理解數(shù)據(jù)的層次結(jié)構(gòu);2、學(xué)習(xí)掌握輸入、輸出函數(shù)的基本格式和使用方法;3、了解C語(yǔ)言源代碼轉(zhuǎn)換成可執(zhí)行程序的過(guò)程;4、掌握選擇、循環(huán)語(yǔ)句的使用規(guī)則;5、能夠設(shè)計(jì)和編寫(xiě)簡(jiǎn)單的C應(yīng)用程序。三、必須學(xué)習(xí)和掌握的知識(shí)點(diǎn):1、常用的數(shù)據(jù)類(lèi)型及各類(lèi)型數(shù)據(jù)的取值范圍(、long、、、)2、選擇語(yǔ)句:if-elseswitch3、循環(huán)語(yǔ)句:whiledo-whilefor4、編譯程序圖1-1討論。圖1-1編譯過(guò)程-6-必須經(jīng)歷一系列的轉(zhuǎn)換過(guò)程。圖1-1說(shuō)明了在文本編輯器中輸入C將源程序轉(zhuǎn)換為一中間形式,稱(chēng)為目標(biāo)程序ObjectProgram查其語(yǔ)法錯(cuò)誤。C編程人員需要修改錯(cuò)誤并重新編譯程序。查找和修改錯(cuò)誤的過(guò)程稱(chēng)為調(diào)試,在編譯器指示編譯過(guò)程沒(méi)有錯(cuò)誤之后,調(diào)試才告終止。C序中,以創(chuàng)建可執(zhí)行程序。5、程序流程圖1-2為設(shè)計(jì)者提供的程序流程圖所用的標(biāo)準(zhǔn)符號(hào),請(qǐng)參考。圖1-2程序流程圖標(biāo)準(zhǔn)符號(hào)-7-四、實(shí)驗(yàn)項(xiàng)目:1、將下列源代碼輸入計(jì)算機(jī)并運(yùn)行,然后分析其運(yùn)行結(jié)果。{}(1)本程序段要求學(xué)生對(duì)C語(yǔ)言的數(shù)據(jù)類(lèi)型的理解,并通過(guò)實(shí)際運(yùn)行結(jié)果觀察到常用的數(shù)據(jù)類(lèi)型在內(nèi)存的存儲(chǔ)方式及占用存儲(chǔ)空間的字節(jié)數(shù);(2)源代碼中的sizeof()函數(shù):實(shí)現(xiàn)計(jì)算數(shù)據(jù)類(lèi)型字節(jié)的長(zhǎng)度。2、將下列由程序流程圖描述的算法,轉(zhuǎn)換為C源代碼并填寫(xiě)到圖1-3b框中,然后輸入計(jì)算機(jī)并運(yùn)行后分析其運(yùn)行結(jié)果。{}圖1-3a程序流程圖圖1-3b轉(zhuǎn)換后C語(yǔ)言源代碼-8-3、項(xiàng)目編程(1)請(qǐng)向計(jì)算機(jī)輸入a,b,c三個(gè)值,經(jīng)過(guò)程序處理后,要求輸出其中最大的一個(gè)。項(xiàng)目要求:①畫(huà)出程序流程圖;②根據(jù)流程圖編寫(xiě)程序程序流程圖{}-9-(2)請(qǐng)向計(jì)算機(jī)輸入a,b,c三個(gè)值,經(jīng)過(guò)程序處理后,要求按值從小到大輸出。項(xiàng)目要求:①畫(huà)出程序流程圖;②根據(jù)流程圖編寫(xiě)程序項(xiàng)目提示:①可采用if結(jié)構(gòu);②a,b,c由scanf函數(shù)輸入程序流程圖/*將a,b,c三個(gè)值由小到大輸出*/{}-10-(3)編程實(shí)現(xiàn)打印下列由字母組成的樹(shù)形。次時(shí),則內(nèi)循環(huán)變量中的值要變化若干循環(huán)變量代表需打印字符的個(gè)數(shù)。②左右邊界字符打印的位置圖1-4字母A-G組成的樹(shù)形{}-11-(4)設(shè)計(jì)報(bào)選體育科目統(tǒng)計(jì)程序排球、體操、兵乓球和網(wǎng)球。請(qǐng)為某班級(jí)(30人)統(tǒng)計(jì)報(bào)選各體育科目人數(shù)。項(xiàng)目要求:①畫(huà)出程序流程圖;②根據(jù)流程圖編寫(xiě)源程序項(xiàng)目提示:可采用switch與for結(jié)構(gòu)程序流程圖{}-12-五、知識(shí)點(diǎn)檢查:(1)解釋下列語(yǔ)句的作用,為什么要在變量名之前加&符號(hào)?,解答:(2)若忘記在上文中的scanf()&”符號(hào),則輸出結(jié)果將會(huì)如何?解答:(3)請(qǐng)將下列給出的兩個(gè)程序段分別輸入計(jì)算機(jī)后,分析其運(yùn)行結(jié)果,并解答為什么輸出如此的結(jié)果(不要求助別人,需自己查找資料)。①main(){intnum;num=32767;printf(“num=%d\n”,++num);}解答:②main(){inta=-2;printf(“%d,%o,%d\n”,a,a,--a);}解答:-13-(5)決的?解答:六、課外選做題:1100這個(gè)最大的數(shù)是第幾次輸入的。2、分別統(tǒng)計(jì)出在輸入的字符串中字母、數(shù)字和其他字符的個(gè)數(shù)。3、請(qǐng)編程實(shí)現(xiàn)打印由部分字母組成的圖形,如圖1-5所示。圖1-5字母組成圖形-14-2實(shí)驗(yàn)數(shù)組與排序一、實(shí)驗(yàn)學(xué)時(shí):4二、實(shí)驗(yàn)?zāi)康模?、理解數(shù)組的作用、下標(biāo)的用法及數(shù)組元素在內(nèi)存中的存儲(chǔ);2、學(xué)習(xí)并掌握一維數(shù)組與多維數(shù)組的應(yīng)用;3、學(xué)習(xí)并掌握常用的排序算法;4、了解字符數(shù)組的特殊應(yīng)用。三、必須學(xué)習(xí)和掌握的知識(shí)點(diǎn):1、數(shù)組的定義、特點(diǎn)和使用規(guī)則2、數(shù)組的查找、排序和插入四、項(xiàng)目編程1、將下列一組數(shù)讀入到aa數(shù)組中找出其中最大的a數(shù)組中找出最小的元素并與最后一個(gè)數(shù)互換,而其余元素的位置不變。例如,圖2-1所示。圖2-1a數(shù)組中部分元素位置的變化(1)編程技巧與注意事項(xiàng):①數(shù)組是用來(lái)在內(nèi)存中存儲(chǔ)一組相關(guān)數(shù)據(jù)項(xiàng)??蓪?duì)存儲(chǔ)于內(nèi)存的數(shù)據(jù)進(jìn)行反復(fù)處理,而不必再重新輸入。②在C中雖然允許在同一行中定義多個(gè)數(shù)組,但最好還是每行只定程中,也便于查找數(shù)組名。-15-(2)本項(xiàng)目編程指南:①需定義一個(gè)一維數(shù)組aint型變量主要用于儲(chǔ)存最大數(shù)和最大數(shù)的位置及最小數(shù)和最小數(shù)的位置項(xiàng)目要求:①畫(huà)出程序流程圖;②根據(jù)流程圖編寫(xiě)源程序項(xiàng)目提示:可采用switch與for結(jié)構(gòu){}-16-2、32a(1)本項(xiàng)目編程指南:這是一個(gè)關(guān)于排序的問(wèn)題。所謂的排序是按給定順序排列數(shù)據(jù)的過(guò)排列,若元素為數(shù)值型可按值的大?。瓷蚧蚪敌颍┡帕?。選擇法比較交換法冒泡法和shell法其他參考書(shū)籍。冒泡排序序方法。思路是將被排序的元素個(gè)數(shù)為N,可以對(duì)此元素做N-1次處理。在第k次(k=0,1,2,??,N-1)處理時(shí),需比較前N-k個(gè)元素。此排序處理的N-kN-1次處理后就使所有的元素被排好序了。教科書(shū)第124頁(yè)。Shell排序Shell排序由DonaldShell10個(gè)左右時(shí),Shell排序和冒泡排序的執(zhí)行次數(shù)相當(dāng)。但如果對(duì)于一個(gè)排序列表在含有100Shell排序所執(zhí)行的時(shí)間高出5是一個(gè)包含有1000個(gè)項(xiàng)目元素的列表而言,冒泡排序就要比Shell排序所執(zhí)行的時(shí)間高出30倍。Shell排序也是比較和交換元素。但不同的是,它-17-直到元素按指定順序排列為止。本項(xiàng)目要求學(xué)生采用冒泡法排序方法完成上述給出的學(xué)生成績(jī)的排序。(2)項(xiàng)目要求:①畫(huà)出程序流程圖;②根據(jù)流程圖編寫(xiě)源程序(3)項(xiàng)目提示:①利用一維數(shù)組與for結(jié)構(gòu){}-18-3、按照下列要求編寫(xiě)一個(gè)查詢(xún)程序。某汽車(chē)維修廠倉(cāng)庫(kù)存有多種型號(hào)的汽車(chē)零件,請(qǐng)為該倉(cāng)庫(kù)管理員編寫(xiě)一查詢(xún)程序用于查詢(xún)庫(kù)中每種零件的庫(kù)存量。圖2-2設(shè)置的零件型號(hào)與對(duì)應(yīng)的庫(kù)存量(1)項(xiàng)目要求:①②具有重復(fù)查詢(xún)功能;③具有數(shù)據(jù)檢測(cè)功能。(2)項(xiàng)目說(shuō)明:①當(dāng)程序運(yùn)行時(shí),首先在屏幕上顯示“請(qǐng)輸入要查詢(xún)的零件編150003編號(hào)及該編號(hào)所對(duì)應(yīng)的庫(kù)存量,如:150003230。②屏幕上顯示出“您輸入的是錯(cuò)誤的零件編號(hào),請(qǐng)選擇:重新輸入(Y),退出查詢(xún)(N)”。③應(yīng)顯示出“您還繼續(xù)查詢(xún)嗎(Y/N)?”,如果繼續(xù)查,則可輸入Y否則輸入N,即結(jié)束此次查詢(xún)。(3)利用二維數(shù)組②采用if結(jié)構(gòu)和嵌套式循環(huán)結(jié)構(gòu)(4)編程技巧與注意事項(xiàng):①二維數(shù)組表示的是以行列格式排列的數(shù)據(jù)表;②可通過(guò)行下標(biāo)和列下標(biāo)來(lái)訪問(wèn)二維數(shù)組中存儲(chǔ)的元素;③如何使用行下標(biāo)和列下標(biāo)來(lái)操縱二維數(shù)組是一個(gè)令很多學(xué)生感教科書(shū)中第129頁(yè)例7.5題中的代碼,認(rèn)真領(lǐng)會(huì)示例,確保完全理解其工作原理。同-19-習(xí)的越多,成功率也就越高。④祝你好運(yùn)。/*汽車(chē)零件查詢(xún)?cè)创a*/{}-20-五、思考題:(1)下標(biāo)在數(shù)組中起什么作用?取值范圍?解答:(2)在使用數(shù)組時(shí),如果數(shù)組元素個(gè)數(shù)超過(guò)了數(shù)組定義的個(gè)數(shù)時(shí),將會(huì)產(chǎn)生什么現(xiàn)象,是嚴(yán)重問(wèn)題嗎?解答:(3)字符數(shù)組在使用規(guī)則與數(shù)值型數(shù)組有哪些不同之處?解答:-21-六、課外選做題:1、請(qǐng)編程計(jì)算下列給出直流電路中a,b兩端的等效電阻R。圖2-3串并聯(lián)直流電路項(xiàng)目提示:①圖2-3中的R1,R2,R0電阻值均由鍵盤(pán)輸入。②由for循環(huán)結(jié)構(gòu)實(shí)現(xiàn)。2、請(qǐng)編程計(jì)算下列給出的二維數(shù)組周邊元素之和。3、請(qǐng)編寫(xiě)一個(gè)程序,其功能是統(tǒng)計(jì)一個(gè)子字符串在另一個(gè)字符串中出現(xiàn)的次數(shù)。例如,假設(shè)輸入的字符串是“Thisisastring符串為“is”,則輸出結(jié)果是2。-22-3實(shí)踐模塊化編程一、實(shí)驗(yàn)學(xué)時(shí):4二、實(shí)驗(yàn)?zāi)康模?、深刻理解模塊結(jié)構(gòu)化編程的概念及其優(yōu)點(diǎn);2、了解如何將程序分解為一系列的獨(dú)立模塊;3、學(xué)習(xí)和掌握模塊結(jié)構(gòu)化編程的規(guī)則與方法;4、學(xué)會(huì)運(yùn)用自頂向下設(shè)計(jì)的思想和模塊結(jié)構(gòu)化編程技巧來(lái)編寫(xiě)C程序。三、必須學(xué)習(xí)和掌握的知識(shí)點(diǎn):1、模塊的劃分規(guī)則2、函數(shù)的調(diào)用規(guī)則3、全局與局部變量4、變量的存儲(chǔ)類(lèi)別四、知識(shí)點(diǎn)講解1、模塊(Model2、模塊結(jié)構(gòu)化編程是一個(gè)設(shè)計(jì)策略,用來(lái)管理、組織和開(kāi)發(fā)計(jì)算機(jī)分而治之的邏輯單元。模塊結(jié)構(gòu)化編程旨只提供一種管理編程編程的方法。通過(guò)這個(gè)方法,塊要比一次性完成整個(gè)項(xiàng)目要容易的多。讀性,且更易于測(cè)試和調(diào)試。在C3個(gè)學(xué)生四門(mén)33-1計(jì)算平均成績(jī)程序的層次圖所示。-23-圖3-1計(jì)算平均成績(jī)程序?qū)哟螆D3、層次圖:也稱(chēng)框圖(blockdiagram),將程序系。如圖3-1顯示了計(jì)算每個(gè)學(xué)生平均成績(jī)的處理過(guò)程。第一層模塊顯示的是程序的目的,第二層顯示的是程序執(zhí)行的處理模塊,由成績(jī)輸入、求平均值和輸出成績(jī)單三個(gè)子模塊組成。4、程序流程圖:是對(duì)每個(gè)模塊所要處理的任務(wù)執(zhí)行過(guò)程的一個(gè)描述。如圖3-2為圖3-1計(jì)算平均成績(jī)程序?qū)哟螆D中三個(gè)子模塊的程序流程圖。圖3-2a第一層程序流程圖圖3-2b第二層程序流程圖-24-圖3-2描述的程序流程所對(duì)應(yīng)的C源代碼如下:{}}/*輸出平均成績(jī)模塊代碼*/{}}在上述C程序所完成的功能是計(jì)算3名學(xué)生四門(mén)課程每名學(xué)生的平均在main函數(shù)之前所定義的變量和數(shù)組均為全局量,因?yàn)椋旅娴娜齻€(gè)子函數(shù)都要用這些變量。可讀性,無(wú)論是寫(xiě)程序的人或是讀程序的人都可以很輕松地分析C程序,符合結(jié)構(gòu)化程序設(shè)計(jì)的思想。-25-來(lái)提高自己軟件開(kāi)發(fā)的能力。五、模塊結(jié)構(gòu)化編程的指導(dǎo)原則為了讓學(xué)生能達(dá)到最佳的項(xiàng)目編程效果,以下提供幾條適于模塊結(jié)構(gòu)化編程的指導(dǎo)原則,可供學(xué)生參考。13-2中的控制流從各模塊的頂部流入,從底部返回處退出。2將無(wú)關(guān)的任務(wù)放于同一模塊中,只將完成同一任務(wù)的語(yǔ)句組合在一起。3、編程注意事項(xiàng):·程序應(yīng)有自我記錄。即可利用描述變量、模塊和函數(shù)的標(biāo)識(shí)符·利用注釋記錄代碼,并說(shuō)明特殊或復(fù)雜的處理·利用簡(jiǎn)單的代碼編寫(xiě)結(jié)構(gòu)·利用注釋標(biāo)識(shí)模塊和函數(shù)·每個(gè)模塊包含的語(yǔ)句不應(yīng)超過(guò)20條以上列出的編程指導(dǎo)原則只要大家理解了,是不難做到的,真誠(chéng)地時(shí),你一定能夠享受到模塊結(jié)構(gòu)化編程所帶來(lái)的如下所說(shuō)的好處:(1)更易于維護(hù)程序。即便于更新或修改。(2)更易于設(shè)計(jì)和編寫(xiě)程序,開(kāi)發(fā)期間出現(xiàn)的錯(cuò)誤將大量減少。(3)程序的可靠性更高,生產(chǎn)運(yùn)行期間出現(xiàn)的錯(cuò)誤將大量減少。(4)更易于其他人(甚至是不熟悉程序的人)讀取和理解程序。(5)更易于測(cè)試調(diào)試程序。(6)更易于編寫(xiě)和維護(hù)文檔。-26-六、項(xiàng)目編程1、矩陣運(yùn)算。請(qǐng)輸入一個(gè)3行3列矩陣的所有元素,然后輸出兩條對(duì)角線元素之和。(1)要求:①該程序應(yīng)由一個(gè)主函數(shù)和3素輸入、兩條對(duì)角線元素求和、輸出結(jié)果。②畫(huà)出層次圖、程序流程圖及源代碼清單。(2)對(duì)下標(biāo)。與矩陣相關(guān)的主要問(wèn)題包括:①計(jì)算矩陣的對(duì)角線元素之和(此時(shí)矩陣為方陣,M=N,對(duì)角線可以②計(jì)算矩陣的周邊元素之和,即四周的元素和;③矩陣的上三角或下三角之和;④兩矩陣之和矩陣,即將兩個(gè)矩陣的各個(gè)元素對(duì)應(yīng)求和;⑤矩陣及其轉(zhuǎn)置矩陣之和;⑥兩矩陣的乘積矩陣。(3)本項(xiàng)目設(shè)計(jì)步驟:①項(xiàng)目層次圖圖3-3矩陣運(yùn)算層次圖-27-②請(qǐng)完成其它三個(gè)子模塊的程序流程圖圖3-4a主程序流程圖圖3-4b輸入矩陣元素程序流程圖圖3-4c矩陣運(yùn)算程序流程圖圖3-4d打印輸出程序流程圖-28-③C源代碼清單-29-2、將下列給出的城市名列表按降序排序。AtlantaBostonChicagoDenverHostonLosAngelesMiamiNewYork(1)項(xiàng)目要求:①可利用StrCmp()、StrCopy()函數(shù)。②該程序應(yīng)由一個(gè)主函數(shù)和2名列表的排序和輸出排序后的城市名列表。③畫(huà)出層次圖、程序流程圖及源代碼清單。(2)相關(guān)知識(shí):①StrCmp():字符串比較函數(shù)。格式:strcmp(字符串1,字符串2)說(shuō)明:函數(shù)結(jié)果可由如下函數(shù)值得出:字符串1=字符串2,函數(shù)值為0;字符串1>字符串2,函數(shù)值為一正整數(shù);字符串1<字符串2,函數(shù)值為一負(fù)整數(shù);②StrCopy():字符串復(fù)制函數(shù)格式:strcpy(字符數(shù)組1,字符串2)功能:將字符串2復(fù)制到字符數(shù)組1中。(3)請(qǐng)畫(huà)出main函數(shù)與城市名表列排序和打印輸出函數(shù)的流程圖。(4)程序流程圖-30-(5)C源代碼清單-31-3fun4個(gè)整數(shù)后,應(yīng)如下規(guī)律輸出。如輸入整數(shù)1,2,3,4,則程序運(yùn)行后將輸出以下方陣:要求:①該程序由一個(gè)主函數(shù)和一個(gè)fun函數(shù)組成②按以下給出程序結(jié)構(gòu)填寫(xiě)fun函數(shù)中的C代碼#defineM4main(){inta[M];fun(a);}intfun(inta[]){inti,j,k,m;for(i=0;i<M;i++)scanf(“%d”,&a[i]);}-32-七、思考題:(1)函數(shù)都有哪些調(diào)用方式?解答:(2)參數(shù)在進(jìn)行信息傳遞時(shí),都具有哪些傳遞方式,各有什么特點(diǎn)(即實(shí)參與形參的傳遞)?解答:(3)根據(jù)你對(duì)局部變量和全局變量的理解,在什么情況下用局部變量合適,在什么情況下用全局變量合適?解答:(4)從課堂的教學(xué)以及上機(jī)的實(shí)踐教學(xué)中,你是如何理解模塊化程序設(shè)計(jì)的?為什么提倡模塊化?(如果你沒(méi)有充分理解的話,可去書(shū)店或上網(wǎng)查閱有關(guān)這方面的資解答:-33-九、課外選做題:1、請(qǐng)編寫(xiě)一個(gè)funnum如,若輸入252,則應(yīng)輸出結(jié)果是,20;輸入202,輸出結(jié)果是0。2、設(shè)某學(xué)校在校生的年齡在17歲到23歲,請(qǐng)編寫(xiě)一個(gè)fun函數(shù),用于統(tǒng)計(jì)該校5000人各年齡的人數(shù)。3、請(qǐng)編寫(xiě)fun函數(shù),在下列給出的一個(gè)有序的數(shù)列中插入一個(gè)數(shù),且當(dāng)該數(shù)插入后,應(yīng)使該數(shù)列仍然有序。-34-4實(shí)驗(yàn)指針與鏈表一、實(shí)驗(yàn)學(xué)時(shí):4二、實(shí)驗(yàn)?zāi)康模?、深刻理解指針的特點(diǎn)和作用2、學(xué)習(xí)并應(yīng)用指針來(lái)設(shè)計(jì)算法3、學(xué)習(xí)和掌握利用指針對(duì)內(nèi)存進(jìn)行動(dòng)態(tài)分配4、學(xué)習(xí)和掌握指針的編程技巧三、必須學(xué)習(xí)和掌握的知識(shí)點(diǎn):1、指向變量的指針變量2、指向數(shù)組和多維數(shù)組的指針變量3、指向函數(shù)的指針變量4、指向字符串的指針變量5、指針數(shù)組6、用指針處理鏈表四、主要知識(shí)點(diǎn)講解1、內(nèi)存的動(dòng)態(tài)分配:動(dòng)態(tài)內(nèi)存管理使程序員可以在程序運(yùn)行過(guò)程中隨時(shí)申請(qǐng)一塊空閑內(nèi)用也必須占用內(nèi)存。2、動(dòng)態(tài)內(nèi)存管理函數(shù):(1)malloc函數(shù)的一般使用格式(類(lèi)型*)malloc(字節(jié)數(shù))返回的是該內(nèi)存塊的首地址,否則返回值為0。例如,float*p;p=(float*)malloc(5*sizeof(float));上述語(yǔ)句表示,malloc函數(shù)動(dòng)態(tài)分配到了5個(gè)內(nèi)存塊,每個(gè)內(nèi)存塊為4-35-p將指向的是5個(gè)內(nèi)存塊的首字節(jié)的地址。見(jiàn)圖4-1所示。圖4-1指針p指向5個(gè)內(nèi)存塊的首地址(2)free函數(shù)的一般使用格式free(動(dòng)態(tài)分配的內(nèi)存塊首地址)其作用是釋放掉由malloc函數(shù)分配的內(nèi)存空間,也就是將該內(nèi)存空間歸還給系統(tǒng),以便另行分配使用。例如,float*p;p=(float*)malloc(5*sizeof(float));free(p);3、指向變量的指針變量,示例:floata,*p1;p1=&a;圖4-2指針p指向變量a的首字節(jié)地址變量a所占用的存儲(chǔ)空間是由42000a所占用內(nèi)存的地址編號(hào)應(yīng)該是2000,200120022003,而指針p中所存放的地址編號(hào)是2000,也就是變量a的首字節(jié)地址。4、指向一維數(shù)組和多維數(shù)組的指針變量,示例:floata[3],b[2][3],*p1,(*p2)[3];p1=a;p2=b;圖4-3a指針p1指向數(shù)組a的首地址-36-指針p1p1=a指針變量p1具有的是一維數(shù)a的首地址(C語(yǔ)言規(guī)定,數(shù)組名代表地址4-3a。如果該首地址編號(hào)是FFB6,則a代表的是FFB6p1++p1向高字節(jié)方向增加1時(shí),相當(dāng)于增加4個(gè)字節(jié)的長(zhǎng)度,此時(shí),p1將具有a[1]元素的地址,地址編號(hào)是FFBA,見(jiàn)圖4-3b所示,依次類(lèi)推。圖4-3b指針p1指向a[1]元素的地址指針p2被定義為是指向二維數(shù)組的指針變量指針,也稱(chēng)為p2是行指針。此時(shí),p2具有二維數(shù)b的首地址,地址編號(hào)是FFA6,見(jiàn)圖4-3c。圖4-3c指針p2指向數(shù)組b的首地址如果此時(shí)執(zhí)行了p2++操作時(shí),也就是讓指針p2向高字節(jié)方向增加1時(shí),相當(dāng)于增加12p2也就是a[1][0]元素的地址,地址編號(hào)是FFB2,依次類(lèi)推。見(jiàn)圖4-3c所示。圖4-3d指針p2指向b[1][0]元素的地址-37-請(qǐng)同學(xué)們思考b數(shù)組中的所有元素的地址和所有元素值的話,則代碼將如何編寫(xiě)?5、指向函數(shù)的指針變量,示例:intfun(),(*p)(),a=5,b=7,c;p=fun;??指針p具有函數(shù)fun口點(diǎn)即為該函數(shù)的入口地址),本例函數(shù)的入口地址編號(hào)是0046,見(jiàn)圖4-4C此時(shí),函數(shù)名fun為一個(gè)入口地址常量,且把fun賦給p,則指針p稱(chēng)為funp進(jìn)行函數(shù)的調(diào)用了。圖4-4指針p指向fun函數(shù)的入口地址如有下面的語(yǔ)句行:c=(*p)(a,b);此語(yǔ)句就相當(dāng)于函數(shù)調(diào)用的語(yǔ)句:c=fun(a,b);。6、字符串指針變量,示例:Char*str=“student”;圖4-5字符串指針str所指向字母s的地址7、指針數(shù)組,示例:inta[3][4],*p[3],i;for(i=0;i<3;i++)p[i]=&a[i][0];圖4-6指針數(shù)組p指向數(shù)組a的首列地址-38-指針p被定義的是指針數(shù)組,即在該數(shù)組中的每一個(gè)元素值都是地址值。在該示例中p具有三個(gè)指針元素,即p[0],p[1],p[2]它們分別具有數(shù)組a[0][0]a[1][0]和a[2][0]4-6利用指針數(shù)組間接對(duì)a數(shù)組進(jìn)行操作。指針數(shù)組應(yīng)用最多的還是對(duì)字符串的處理,如利用指針數(shù)組對(duì)字符3題就涉及到指針數(shù)組的應(yīng)用。關(guān)于該知識(shí)點(diǎn)的詳細(xì)內(nèi)容請(qǐng)參閱教科書(shū)第248頁(yè)。8、鏈表鏈表屬于動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu),可以類(lèi)比成一“環(huán)”接一“環(huán)”的鏈條,這里的每一“環(huán)”可以視作一個(gè)結(jié)點(diǎn),如果把結(jié)點(diǎn)串在一起就形成了鏈表。態(tài)數(shù)據(jù)結(jié)構(gòu)。這種結(jié)構(gòu)的最大的優(yōu)點(diǎn)是插入和刪除結(jié)點(diǎn)方便,無(wú)須移動(dòng)大批數(shù)據(jù),只須修改指針的指向即可。這是編程中十分重要的一種數(shù)據(jù)結(jié)構(gòu)。在以下項(xiàng)目編程中的第2題就是關(guān)于鏈表的問(wèn)題。-39-五、項(xiàng)目編程1fun函數(shù)用于查詢(xún)?cè)摂?shù)組中一門(mén)課程以上不及格的學(xué)生并打印他們?nèi)空n程的成績(jī)。(要求利用行指針作為函數(shù)的傳遞參數(shù))。(1)提供部分代碼如下,并請(qǐng)完成其他全部代碼:#defineM3#defineN4main(){floatstu[M][N]={{68,90,66,80},{56,78,80,90},{50,68,56,98}};floatfun();fun(stu,M);}floatfun(float(*p)[N],intn){}2、請(qǐng)為下列給出的某班級(jí)C程序編碼員列表,建立一個(gè)鏈表。圖4-7C程序編碼員列表-40-(1)說(shuō)明:①4出生月和指針。然后用指針將每個(gè)節(jié)點(diǎn)鏈接起來(lái)。②節(jié)點(diǎn)鏈接的條件是生日大者在前,小者在后。③最后輸出已按順序排好的并具有54-8編碼員鏈表所示。圖4-8程序編碼員鏈表(2)本題相關(guān)知識(shí)這是一個(gè)關(guān)于建立單向動(dòng)態(tài)鏈表的問(wèn)題。所謂建立動(dòng)態(tài)鏈表是指在各節(jié)點(diǎn)的數(shù)據(jù)值,并建立起前后相鏈的關(guān)系。針的動(dòng)態(tài)地開(kāi)辟節(jié)點(diǎn)以及輸出已建立的動(dòng)態(tài)鏈表等項(xiàng)內(nèi)容。①內(nèi)存管理,即利用malloc函數(shù);②描述單向鏈表的數(shù)據(jù)類(lèi)型:?jiǎn)蜗蜴湵淼囊话憬Y(jié)構(gòu)如圖4-9所示。圖4-9a單向鏈表為了實(shí)現(xiàn)鏈表必須定義能夠描述鏈表中節(jié)點(diǎn)的數(shù)據(jù)類(lèi)型,該類(lèi)型應(yīng)包含有數(shù)值和地址兩大部分。見(jiàn)圖4-9b。③關(guān)于鏈表動(dòng)態(tài)建立和鏈表輸出的具體實(shí)現(xiàn)過(guò)程,請(qǐng)參閱教科書(shū)第275頁(yè)到279頁(yè)。圖4-9b鏈表節(jié)點(diǎn)-41-④插入和刪除操作(參照教科書(shū)的第281-286(3)要求:設(shè)計(jì)一個(gè)主函數(shù)和兩個(gè)子函數(shù)(即建立鏈表模塊和輸出(4)請(qǐng)?jiān)谝韵驴臻g內(nèi)完成本題的C源程序。-42-3、編寫(xiě)一個(gè)fun函數(shù),其功能是將字符指針s所指字符串(見(jiàn)圖4-10a)所有下標(biāo)值為奇數(shù)的字符刪除,然后將串中剩余字符存放到由字符指針t所指的字符數(shù)組中(例如圖4-10b(1)要求:利用字符指針變量作fun函數(shù)中的形參(2)本題相關(guān)知識(shí):在字符串相關(guān)的所有操作中,包括有計(jì)算給定字符串的長(zhǎng)度、對(duì)奇句“遍歷”字符串的每一個(gè)下標(biāo)。①字符串的理解字符串是由一串字符組成的整體,包括常量和變量。但字符串不是一種專(zhuān)門(mén)的數(shù)據(jù)類(lèi)型,而是由字符數(shù)組充當(dāng)。hello”,這些字符在內(nèi)存中都是以ASCII\0符串的結(jié)束標(biāo)記。②指向字符串常量的指針在程序設(shè)計(jì)中,可以用字符象指針變量記載字符串常量的首地址,char*p=”hello”;或char*p;p=”hello”;以上兩種形式含義相同,都使指針phello”的p首地址存儲(chǔ)在p中。這樣變量p即可具有與字符數(shù)組相同的用法和功能。-43-③字符數(shù)組作為字符串變量常用的一種構(gòu)成字符串變量的方法是使用char在沒(méi)對(duì)數(shù)組賦值之前并不能稱(chēng)其為字符串:charstr[10];事實(shí)上,上述定義僅定義了一個(gè)數(shù)組而已。如果需要將其用作字符串,最好應(yīng)該在定義數(shù)組的時(shí)候就賦以初值,如:charstr[10]=“astring!”;經(jīng)過(guò)上述賦值后,系統(tǒng)就會(huì)將字符串常量“astring!”完整地存儲(chǔ)到數(shù)組str‘\0’。\0’是至關(guān)重要的一環(huán)。因?yàn)镃為結(jié)束符作為判定字符串結(jié)束的依據(jù)。另者,還值得注意的一點(diǎn)是,字符串結(jié)束符號(hào)‘\0’的ASCII碼值是整數(shù)0,也就是說(shuō),‘\0’與整數(shù)0相同,當(dāng)它不同于字符‘0’,應(yīng)為對(duì)于字符‘0’的ASCII碼值是48,故可以說(shuō),‘0’與整數(shù)48相同。(3)提供main函數(shù)代碼如下,并請(qǐng)完成fun函數(shù)的全部代碼:main(){charch[100],t[100],fun();gets(ch);fun(ch,t);}charfun(char*s,char*t){}-44-六、課外選題1、請(qǐng)?jiān)O(shè)計(jì)一個(gè)funss所指的字符串中指定字符的個(gè)數(shù),并將此統(tǒng)計(jì)結(jié)果返回給主函數(shù)。例如,若輸入字符串:123412132,再輸入1,則應(yīng)輸出為3,也就是說(shuō),該字符串的數(shù)字中含有數(shù)字1的個(gè)數(shù)有3個(gè)。請(qǐng)完成fun函數(shù)中的C代碼。main(){charss[100],ch;intc;gets(ss);scanf(“%c”,&ch);c=fun(ss,&ch);printf(“%d\n”,c);}charfun(char*s,char*t){??}2N名學(xué)生的數(shù)據(jù)已存在主函數(shù)中的結(jié)構(gòu)體數(shù)組s中,如圖4-11所示。請(qǐng)?jiān)O(shè)計(jì)一個(gè)fun函數(shù),其功hfun函數(shù)返回分?jǐn)?shù)最低的學(xué)生人數(shù)。注意,分?jǐn)?shù)最低的學(xué)生可能不止一個(gè),請(qǐng)完成fun函數(shù)中的C代碼。圖4-11結(jié)構(gòu)體數(shù)組s-45-#defineN6typedefstruct{charnum[10];ints;}STREC;main(){STRECs[N]={{“10010”,85},{“10011”,64},{“10012”,69},{“10013”,91},{“10014”,72},{“10015”,64}};STRECh[N];inti,n;n=fun(s,h);printf(“%d\n”,n);for(i=0;i<n;i++)printf(“s,&4d\n”,h[i].num,h[i].s);}intfun(STREC*a,STREC*b){??}3、字符串的連接。請(qǐng)?jiān)O(shè)計(jì)一個(gè)fun函數(shù),其功能是:將s所指的字符串進(jìn)行正序和反序的連接,然后形成一個(gè)新的串寫(xiě)入由t所指的字符數(shù)組中。例如,由s所指字符串為:ABCD,形成新的串并由t所指的串為:ABCDDCBA。main(){chars[100],t[100];fun(s,t);scanf(“%s”,s);printf(“%s\n”,t);}intfun(char*s,char*t){??}-46-七、思考題(1)設(shè)有如下定義和語(yǔ)句:ints[6],i;doublea[3][4],(*p1)[4],*p[3];p1=a;for(i=0;i<3;i++)p[i]=&a[i][0];①根據(jù)已給出的s[0]的地址,如圖4-12所示,請(qǐng)?jiān)谠搱D中標(biāo)出s[1]-s[5]的地址。圖4-12數(shù)組s[0]-s[5]②已知指針p1中的值是FFA6即數(shù)組a首的地址,如圖4-13所示,請(qǐng)?jiān)谠搱D中標(biāo)出a數(shù)組各元素在內(nèi)存所占用的地址。圖4-13二維數(shù)組a與行指針p1③已知數(shù)組a首的地址為FFD6p中的三個(gè)元素分別指向了a數(shù)組的三個(gè)首列元素,如圖4-13所示,請(qǐng)?jiān)趐數(shù)組的三個(gè)單元中標(biāo)出它所指向的三個(gè)元素的地址值。-47-圖4-14二維數(shù)組a與指針數(shù)組p(2)請(qǐng)編程實(shí)現(xiàn)利用指針p1輸出間接地輸出a數(shù)組中各元素及各元素的地址。注意,地址可用十六進(jìn)制輸出。圖4-14二維數(shù)組a與指針數(shù)組p和指針變量p1-48-(3)inta[3][5]={{10,12,14,16,18},{20,22,24,26,28},{30,32,34,36,38}};①下標(biāo)法②③④⑤(4)“指針運(yùn)算”指的是什么操作的運(yùn)算(可以舉例說(shuō)明)?解答:(5)通過(guò)本次實(shí)驗(yàn),即從編程輸入、運(yùn)行、調(diào)試以及直到最后輸出解決的?解答:-49-5實(shí)驗(yàn)綜合程序設(shè)計(jì)經(jīng)過(guò)了前面的4個(gè)(16學(xué)時(shí))上機(jī)實(shí)驗(yàn),學(xué)生已基本掌握了程序設(shè)生在本實(shí)驗(yàn)中盡情地發(fā)揮自己聰明才智,設(shè)計(jì)出最佳、最滿意的C程序。請(qǐng)記?。侯^腦使用才會(huì)敏銳,掙扎努力才會(huì)生產(chǎn)力量。一、實(shí)驗(yàn)學(xué)時(shí):4二、實(shí)驗(yàn)?zāi)康模?、進(jìn)一步掌握結(jié)構(gòu)化程序設(shè)計(jì)方法和編程技巧2、掌握算法的重要性和靈活性3、提高編程解題的思路及擴(kuò)充知識(shí)面4、重點(diǎn)掌握程序調(diào)試技術(shù)和出錯(cuò)分析三、學(xué)習(xí)心態(tài):12、知難而進(jìn)3、充滿信心4、加油啊!三、項(xiàng)目編程1、請(qǐng)?jiān)O(shè)計(jì)一個(gè)破譯密碼程序。人再將其譯回原文。例如,可以按下面規(guī)律譯成密碼:將每一個(gè)字母變成它后面的一個(gè)字母,如將‘A’變成‘B’,‘a(chǎn)’變成‘b’,‘Z’變成‘A’,‘z’變成‘a(chǎn)以‘!’作為電文結(jié)束標(biāo)志?,F(xiàn)設(shè)有一段電文:Youareright!按上述給出的譯文規(guī)則,則應(yīng)破譯成:Zpvbsfsjhiu!-50-(1)要求:①畫(huà)程序流程圖②C源代碼清單(2)畫(huà)程序流程圖(3)C源代碼清單-51-2、趣味編程深林里有m只猴子競(jìng)選大王,選舉辦法如下:所有猴子按1?m進(jìn)行編號(hào)并圍坐一圈,從第1號(hào)開(kāi)始按順序1、2、3、?、n報(bào)數(shù),凡報(bào)n號(hào)的猴子退出圈外,如此的循環(huán)報(bào)數(shù),直到圈內(nèi)只剩下一只猴子時(shí),則這只猴子就晉升為大王。其中的m和n(1)說(shuō)明這個(gè)趣味題是由古羅馬著名史學(xué)家Josephus提出的問(wèn)題演變而來(lái)的,所以也通常稱(chēng)為Josephus問(wèn)題。(2)本項(xiàng)目編程指南m=8,n=3,可利用具有8個(gè)元素的一維數(shù)組aa[p]來(lái)存放第p號(hào)猴子報(bào)過(guò)數(shù)后下一只該報(bào)數(shù)的猴子號(hào)碼,因此,在一開(kāi)始,a數(shù)組的內(nèi)容如圖5-1(a)13時(shí)則退出(a)(b)(c)圖5-1報(bào)數(shù)時(shí)位置的變化見(jiàn)圖5-1(c)所示,為此第1輪編號(hào)3退出,從編號(hào)4又重復(fù)報(bào)數(shù),此時(shí),編號(hào)6退出,依次類(lèi)推。(3)程序流程圖-52-(4)C源代碼清單-53-3、在全國(guó)計(jì)算機(jī)等級(jí)考試報(bào)名工作中,工作人員需為考生辦理報(bào)名100元的人民幣要換成5元、1元和0.5元面值的票子,但要求換以上的零錢(qián)共100張,且要求每種不少于1張,請(qǐng)計(jì)算應(yīng)有幾種組合方式。(1)程序流程圖-54-(2)C程序代碼-55-4、請(qǐng)按照?qǐng)D5-1給出模塊圖為本班級(jí)設(shè)計(jì)一個(gè)[C課程考試成績(jī)]處理程序。該模塊應(yīng)包含有四個(gè)部分,可分別用4個(gè)子函數(shù)來(lái)完成。圖5-2成績(jī)處理模塊圖各子模塊要求如下:(1)[C課程考試成績(jī)]錄入到一個(gè)數(shù)小排序。(2)學(xué)生本課程的考試成績(jī)。查詢(xún)要求:①能夠重復(fù)查詢(xún);②具有數(shù)據(jù)檢測(cè)功能,例如,如果學(xué)號(hào)輸入有誤,該子模塊應(yīng)提示“數(shù)據(jù)輸入有誤,是繼續(xù)還是退出(Y/Q)字樣的提示信息,以便得到正確的查詢(xún)數(shù)據(jù);(3)成績(jī)統(tǒng)計(jì):統(tǒng)計(jì)各成績(jī)段的學(xué)生人數(shù)。成績(jī)段可分為:90-10080-8970-7960-6960以下為不及格。(4)打印成績(jī)單:按兩種規(guī)格打印成績(jī)單,一張是打印60分以下的本課程成績(jī)單,另一張為90分(包括90)以上的成績(jī)單。-56-成績(jī)錄入模塊程序流程圖成績(jī)錄入模塊源代碼成績(jī)查詢(xún)模塊程序流程圖成績(jī)查詢(xún)模塊源代碼-57-成績(jī)統(tǒng)計(jì)模塊程序流程圖成績(jī)統(tǒng)計(jì)模塊源代碼打印成績(jī)單模塊程序流程圖打印成績(jī)單模塊源代碼-58-四、課外選做題1、請(qǐng)?jiān)O(shè)計(jì)一個(gè)文本詞匯統(tǒng)計(jì)程序。80格隔開(kāi),請(qǐng)統(tǒng)計(jì)該文本行單詞的個(gè)數(shù)。2、趣味編程口袋中有紅、黃、藍(lán)、白、黑五種顏色的小球,每次從口袋中取出三個(gè)球,問(wèn)最多可有幾種不同顏色的組合。3、統(tǒng)計(jì)選票5-2所示,選票上提供了3個(gè)后選人的名單。請(qǐng)?jiān)O(shè)計(jì)一個(gè)C程序,用于統(tǒng)計(jì)所有選票中各后選人的得票數(shù)。(1)要求:采用結(jié)構(gòu)體數(shù)組作為選票計(jì)數(shù)器。圖5-3選票格式-59-總結(jié)附錄Ⅰ實(shí)驗(yàn)20個(gè)計(jì)劃學(xué)時(shí)和20個(gè)課外學(xué)時(shí)的實(shí)驗(yàn)內(nèi)容,累計(jì)項(xiàng)目編程題(包括課外選做題)為31道。在這些內(nèi)容程技巧方面的內(nèi)容。最有價(jià)值的知識(shí)和感受。(也可以包括對(duì)本課程的實(shí)踐教學(xué)提出更好的方法和建議)。達(dá)出自己對(duì)學(xué)習(xí)這門(mén)課程的感受與收獲,??。-60-附錄Ⅱ編程必須注意的幾個(gè)問(wèn)題一、C程序設(shè)計(jì)風(fēng)格“風(fēng)格(style自己作品題材的一種方式。在這里的風(fēng)格(codeingstyle)則指的是計(jì)認(rèn)的、良好的codingstyle可以減少編碼的錯(cuò)誤,減少讀程序的時(shí)間,從而提高軟件開(kāi)發(fā)的效率。從70一致的codingstyle。以下從兩個(gè)方面來(lái)闡述C程序設(shè)計(jì)風(fēng)格問(wèn)題:1、源代碼的書(shū)寫(xiě)格式對(duì)于C比較大,非常隨意,但這也意味著給程序的可讀性帶來(lái)不便,如下面的C程序的書(shū)寫(xiě)格式。也增強(qiáng)了程序修改的難度,顯然這不是好codingstyle。比較好的代碼書(shū)寫(xiě)格式是采用“縮進(jìn)式”的書(shū)寫(xiě)風(fēng)格,即對(duì)每一組修改帶來(lái)很大的方便。如下面采用的是縮進(jìn)格式書(shū)寫(xiě)的C程序。-61-性的角度來(lái)評(píng)價(jià)這兩段代碼,哪一個(gè)更Ok。2、程序注釋“注釋?zhuān)╟ommentsC/*“*/”符號(hào)作為結(jié)尾。注釋是非常重要的一種機(jī)制。千萬(wàn)不能被忽視了。沒(méi)有注釋的程序例如,微軟公司在開(kāi)發(fā)Windows2000時(shí),就軟件開(kāi)發(fā)人員1700余人,可想而之,程序注釋的重要性。關(guān)于程序注釋內(nèi)容通常由以下幾項(xiàng)組成:-62-(1)程序名稱(chēng)(2)程序功能(3)程序的思路和特點(diǎn)(4)編程的人與合作者(5)一些特殊變量的說(shuō)明(6)編程的日期及修改后的第幾版本(7)模塊接口等以下是某程序段,請(qǐng)大家注意其中的注釋部分。二、程序的運(yùn)行效率efficiency一般是指對(duì)處理機(jī)時(shí)間和存儲(chǔ)空間的使用效下面以一個(gè)典型的小程序段來(lái)說(shuō)明如何利用好時(shí)間和空間的問(wèn)題。舉例:請(qǐng)編程實(shí)現(xiàn)求解下列問(wèn)題。員一定會(huì)按下列方法設(shè)計(jì)程序:-63-在對(duì)上述的程序的分析中,從書(shū)寫(xiě)風(fēng)格來(lái)說(shuō),程序的可讀性比較好,果要從效率來(lái)分析的話,就會(huì)發(fā)現(xiàn)有問(wèn)題所在:①?gòu)难h(huán)次數(shù)來(lái)看,內(nèi)循環(huán)要執(zhí)行20*4=80次,再加上外循環(huán)所要執(zhí)行的21次,所以總循環(huán)為101次。如果我們做一次調(diào)整,則循環(huán)次數(shù)會(huì)有所變化,請(qǐng)觀察以下被調(diào)整后的C程序:3*21=634次,總循環(huán)為67次。所以,通過(guò)運(yùn)行調(diào)整后,我們可以得出,應(yīng)該把循環(huán)變量變化大的值位于內(nèi)循環(huán)。②從對(duì)求和的表達(dá)式來(lái)看,其中的j+2運(yùn)算只與外循環(huán)的變量j有關(guān)系,j+2運(yùn)算共執(zhí)行了3*20=60次,其中有57次是重復(fù)的運(yùn)算。如果后的C程序:-64-從對(duì)調(diào)整后的程序分析得出,j+2運(yùn)算只執(zhí)行了3次。從而可以總結(jié)出:應(yīng)盡量把與本循環(huán)無(wú)關(guān)的運(yùn)算移到循環(huán)外面。i+1運(yùn)算中,每做一次循環(huán)則要執(zhí)行2次i+1運(yùn)算,這樣總共就要執(zhí)行2*60=120次,顯然要有60次是重復(fù)計(jì)算的。進(jìn)一步調(diào)整程序:對(duì)于調(diào)整后的程序中的i+1運(yùn)算只要執(zhí)行60次,減少了一倍。要求大家養(yǎng)成良好的編程習(xí)慣:·程序構(gòu)思要有說(shuō)明·強(qiáng)調(diào)可讀性·變量要加注釋·學(xué)會(huì)如何調(diào)試程序·對(duì)運(yùn)行結(jié)果要做正確與否的分析-65-附錄Ⅲ程序調(diào)試與常見(jiàn)錯(cuò)誤分析減少可能的錯(cuò)誤,卻無(wú)法完全避免錯(cuò)誤。程序中的錯(cuò)誤常被稱(chēng)為Bug致程序不能運(yùn)行或程序結(jié)果不正常,大則可能會(huì)引起操作系統(tǒng)的崩潰。Debug可以形成可執(zhí)行文件并運(yùn)行程序了。進(jìn)行分析。代碼中的語(yǔ)法錯(cuò)誤。在Win-TC環(huán)境下,操作菜單項(xiàng)[運(yùn)行]中的“編譯連II-1所示。圖附錄II-1Win-TC環(huán)境下的編譯連接C語(yǔ)言中的編譯錯(cuò)誤主要分為警告(warning)和錯(cuò)誤(error-66-一、警告類(lèi)錯(cuò)誤(1)‘xxx’isassignedavaluethatisneverused。該類(lèi)錯(cuò)誤信息是提示“變量xxx下列程序:#include<stdio.h>voidmain(){intx=100;inty=10;printf(“%d\n”,y);}該程序編譯后,顯示如下信息:這種變量除了運(yùn)行時(shí)占用內(nèi)存單元外不會(huì)對(duì)程序產(chǎn)生其他不良影響,但感覺(jué)上還是可疑的。所以不需要的變量應(yīng)盡量刪除掉。(2)Codehasnoeffect。說(shuō)明程序沒(méi)有包含有實(shí)際作用的代碼,如下列程序中的“x+3;”#include<stdio.h>voidmain(){intx=10;x+3;printf(“%d\n”,x);}++種寫(xiě)法是對(duì)表達(dá)式錯(cuò)誤的理解,應(yīng)引起注意。(3)Redeclarationof‘main’。一個(gè)程序文件中的主函數(shù)main多于一個(gè)。因?yàn)椋贑中要求一個(gè)程序文件只能有一個(gè)main函數(shù)。(4)Non-portablepointerconversion如下列程序段中的“*p=10;”。-67-#include<stdio.h>voidmain(){int*p=10;*p=3+2;printf(“%d\n”,*p);}由于在本程序段所定義的指針p是用于指向具有2個(gè)字節(jié)的整型變量p段中的p所以C編譯提出了警告。正確的寫(xiě)法應(yīng)該是:int*p,x;p=&x;*p=10;(5)Possibleusedof‘xxx’beforedefinationx和p。#include<stdio.h>voidmain(){intx;inty=x+2;printf(“%d\n”,*p);}或#include<stdio.h>Voidf(intx){x=10;}voidmain(){int*p;f(*p);printf(“%d\n”,*p);}(6)Suspiciouspointerconversion為可疑的指針轉(zhuǎn)換。通常是使用了基類(lèi)型不匹配的指針。如下例中-68-的語(yǔ)句“p=&x;”#include<stdio.h>voidmain(){int*p;floatx=3.5;p=&x;printf(“%f\n”,*p);}上述程序段所定義的指針是指向2在函數(shù)體的執(zhí)行位置上卻讓指針p指向的是具有4個(gè)字節(jié)的實(shí)型變量的地址,顯然基類(lèi)型是不匹配的。修正的方法可以采用強(qiáng)制類(lèi)型轉(zhuǎn)換,如:#include<stdio.h>voidmain(){int*p;floatx=3.5;p=(int*)&x;printf(“%f\n”,*((float*)p));}強(qiáng)制類(lèi)型轉(zhuǎn)換:是指利用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符將一個(gè)表達(dá)式轉(zhuǎn)換成所需要的類(lèi)型。程序段中的語(yǔ)句“p=(int*)&x;”的含義是指將x強(qiáng)制轉(zhuǎn)換成int參照教科書(shū)第56頁(yè)。遇到的,希望同學(xué)們要逐漸積累,引起關(guān)注。二、錯(cuò)誤執(zhí)行。錯(cuò)誤可分以下3種:1、語(yǔ)法錯(cuò)誤:如果在程序運(yùn)行中檢測(cè)出錯(cuò)誤,說(shuō)明程序中包含若干輸入錯(cuò)誤而造成的,例如,將printf錯(cuò)寫(xiě)為pintf、括號(hào)不匹配、語(yǔ)句-69-碼。2、邏輯錯(cuò)誤:程序無(wú)語(yǔ)法錯(cuò)誤,也能正常運(yùn)行,但輸出結(jié)果不對(duì)。例如,求s=1+2+3+??+100,有人寫(xiě)出以下語(yǔ)句:for(s=0,i=1;i<100;i++)s=s+i;程序運(yùn)行后,語(yǔ)法上沒(méi)有錯(cuò)誤,但求出的結(jié)果是s=1+2+3+??+99之和,的程序調(diào)試經(jīng)驗(yàn)來(lái)解決。3、運(yùn)行錯(cuò)誤:如果程序即無(wú)語(yǔ)法錯(cuò)誤,又無(wú)邏輯錯(cuò)誤,但程序不能本身不合適以及數(shù)據(jù)類(lèi)型不匹配等。例如下面是求n!的程序段。intf(intn){intk,s=1;for(k=1;k<=n;k++)s*=k;return(s);}voidmain(){printf(“%d\n”,f(20));}20!不是int類(lèi)型所能存儲(chǔ)的。因此,需要根據(jù)實(shí)際數(shù)據(jù)范圍,小心地選擇數(shù)據(jù)類(lèi)型,包括函數(shù)f()的返回類(lèi)型、變量s的類(lèi)型、printf()中的輸出格式,應(yīng)定在long數(shù)據(jù)類(lèi)型千萬(wàn)不要忽視了這一點(diǎn)。關(guān)于運(yùn)行錯(cuò)誤,請(qǐng)分析下面的語(yǔ)句:int*x,*y;printf(“%d\n”,*x);*y=10;上述代碼將產(chǎn)生的是指針未初始化錯(cuò)誤。在使用一個(gè)指針變量時(shí),xy-70-機(jī)地指向內(nèi)存中某個(gè)地址。像第二行的引用一般不會(huì)引起太嚴(yán)重的問(wèn)題,存中重要的數(shù)據(jù),或帶來(lái)系統(tǒng)的崩潰。通常對(duì)于初次接觸編程學(xué)生而言卻無(wú)奈地發(fā)現(xiàn),第一次嘗試編程時(shí),度。-71-附錄ⅣTC部分出錯(cuò)信息注釋Badcallofinlinefunction內(nèi)部函數(shù)的不合法調(diào)用。Irreducibleexpressiontree不可約表達(dá)式樹(shù):文件中的表達(dá)式使得代碼生成程序無(wú)法為其產(chǎn)生代碼。應(yīng)避免使用這種表達(dá)式。Registerallocationfailure成代碼。此時(shí)應(yīng)簡(jiǎn)化這種繁瑣的表達(dá)式或干脆避免使用它。#operatornotfollowedbymacroargumentname“#”運(yùn)算符后沒(méi)跟宏變?cè)诤甓x中,#用來(lái)標(biāo)識(shí)一宏變?cè)谴?。?”后必須跟一宏變?cè)??!畑xxxxxxx’notanargument“xxxxxxxx數(shù),但此標(biāo)識(shí)符沒(méi)有在函數(shù)的參數(shù)表中出現(xiàn)。Ambiguoussymbol‘xxxxxxxx’xxxxxxxx構(gòu)名。Argument#missi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論