C語言與程序設(shè)計實驗指導(dǎo)報告書_第1頁
C語言與程序設(shè)計實驗指導(dǎo)報告書_第2頁
C語言與程序設(shè)計實驗指導(dǎo)報告書_第3頁
C語言與程序設(shè)計實驗指導(dǎo)報告書_第4頁
C語言與程序設(shè)計實驗指導(dǎo)報告書_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精品C語言與程序設(shè)計實驗指導(dǎo)、報告書 班級:_姓名:_計算機科學(xué)與技術(shù)學(xué)院C程序設(shè)計語言課程是計算機專業(yè)和非計算機專業(yè)的一門技術(shù)基礎(chǔ)選修課程,大學(xué)一年級開設(shè),同時也是作為學(xué)生學(xué)習(xí)計算機的一種啟蒙語言。通過本課程的學(xué)習(xí)使學(xué)生更好地了解和應(yīng)用計算機,培養(yǎng)學(xué)生應(yīng)用計算機獨立解決問題的能力,讓學(xué)生基本掌握一門使用計算機的語言工具,為學(xué)生今后無論是從事計算機或非計算機工作都奠定了良好的、扎實的計算機語言基礎(chǔ)。C程序設(shè)計語言最早是由Dennis Richie于1973年設(shè)計并實現(xiàn)的。從那時開始,C語言已經(jīng)從其位于貝爾實驗室的發(fā)源地傳播到世界各地,它已成為全球程序員的公共語言,并由此也誕生了兩個新的主流語言

2、C+與Java它們都建立在C語言的語法和基本結(jié)構(gòu)的基礎(chǔ)上?,F(xiàn)在世界上的許多軟件都是在C語言及其衍生的各種語言的基礎(chǔ)上開發(fā)出來的。C程序設(shè)計語言課程是高強度的腦力勞動,不是聽會的,也不是看會的,而是自己練習(xí)會的。因此,要求大家在學(xué)習(xí)C程序設(shè)計語言課程時,不能滿足于能看懂書上的程序,而應(yīng)當(dāng)熟練地掌握程序設(shè)計的全過程,即能獨立地編寫出源程序,獨立地上機調(diào)試程序,獨立運行程序和分析結(jié)果。程序設(shè)計是一門實踐性很強的課程,必須十分重視實踐環(huán)節(jié),同時還必須保證應(yīng)有足夠的上機實驗時間。C程序設(shè)計實驗指導(dǎo)、報告書是為配合C程序設(shè)計語言課程而編寫的一本具有很強的實踐性教材。C程序設(shè)計語言課程為我校精品課程建設(shè)之一

3、,為了達(dá)到本課程各個教學(xué)環(huán)節(jié)的規(guī)范化,并且讓學(xué)生真正達(dá)到學(xué)以致用的效果,除了要求學(xué)生掌握本課程大綱所要求的知識點外,更重要的還要通過實踐教學(xué)環(huán)節(jié)來拓展學(xué)生程序設(shè)計的邏輯思維和提高程序設(shè)計的能力,同時也能讓學(xué)生深刻地了解關(guān)于如何運用軟件工程的理念去開發(fā)軟件。由于本課程是為面向全校各專業(yè)開設(shè),為此,對學(xué)生學(xué)習(xí)本課程的要求也有所不同,考慮這一點,在本教程的內(nèi)容安排上也有所不同,授課教師可根據(jù)授課專業(yè)的需要進(jìn)行必要的題目選擇。本實驗教程中內(nèi)容的編寫,是根據(jù)本課程教學(xué)大綱的指導(dǎo)下基本上是以學(xué)生的興趣和愛好為出發(fā)點進(jìn)行編排的,其中體現(xiàn)出在掌握了課堂教學(xué)環(huán)節(jié)上的理論知識,得以在本實踐環(huán)節(jié)中得到應(yīng)用。本實驗教

4、程共安排了5個實驗,每項實驗包括實驗學(xué)時、實驗?zāi)康?、實驗?nèi)容及部分思考題等。整個實驗建議用40學(xué)時完成,其中計劃學(xué)時20,另外20學(xué)時是對編程感興趣的同學(xué)安排的,可作為選項實驗題目,所以學(xué)生可以根據(jù)自己的情況進(jìn)行選做。 書山有路勤為徑 祝你成功! C程序設(shè)計課程教學(xué)組 2005年秋學(xué)期目 錄實驗1:簡單C程序設(shè)計 1.1 項目編程(1) 找出a,b,c中最大值(2) 按a,b,c值由小到大輸出(3) 報選體育科目統(tǒng)計程序1.2 課外選做題(1) 輸入100條數(shù)據(jù),找出最大值及位置(2) 統(tǒng)計輸入的字符串中,數(shù)字、字母與其他字符的個數(shù)(3) 打印簡單圖形實驗2:數(shù)組與排序2.1 項目編程(1)

5、交換數(shù)組元素(2) 排序程序(3) 查詢程序2.2 課外選做題(1) 矩陣運算(2) 級數(shù)求和(3) 電路計算(4) 字符串處理實驗3:模塊化編程3.1 項目編程(1) 矩陣運算(2) 字符串升序排序 (3) 排列方陣程序3.2 課外選做題(1) 計算某數(shù)的位數(shù)之積(2) 年齡統(tǒng)計程序(3) 字符插入操作實驗4:指針與鏈表4.1 項目編程(1) 利用行指針實現(xiàn)成績查詢(2) 建立鏈表程序(3) 字符刪除4.2 課外選做題(1) 字符統(tǒng)計(2) 結(jié)構(gòu)體數(shù)組的應(yīng)用(3) 字符串連接實驗5:綜合程序設(shè)計5.1 項目編程(1) 破譯密碼程序(2) 趣味編程(3) 人民幣面值統(tǒng)計(4) 考試成績處理5.

6、2 課外選做題(1) 文本詞匯統(tǒng)計(2) 趣味編程(3) 選票統(tǒng)計附錄 本實驗總結(jié)附錄 編程必須注意的幾個問題附錄 程序調(diào)試與常見錯誤分析附錄 TC部分出錯信息注釋參考文獻(xiàn)實驗1 簡單C程序設(shè)計一、實驗學(xué)時:4二、實驗?zāi)康模?1、學(xué)習(xí)和了解C程序設(shè)計語言的數(shù)據(jù)類型及在內(nèi)存中的儲存方式,理解數(shù)據(jù)的層次結(jié)構(gòu);2、學(xué)習(xí)掌握輸入、輸出函數(shù)的基本格式和使用方法;3、了解C語言源代碼轉(zhuǎn)換成可執(zhí)行程序的過程;4、掌握選擇、循環(huán)語句的使用規(guī)則;5、能夠設(shè)計和編寫簡單的C應(yīng)用程序。三、必須學(xué)習(xí)和掌握的知識點:1、常用的數(shù)據(jù)類型及各類型數(shù)據(jù)的取值范圍(int、long int、float、double、char)

7、2、選擇語句:if-else switch 3、循環(huán)語句:while do-while for4、編譯程序圖1-1所表示的是一個簡化的編譯過程,它簡單地描述了計算機執(zhí)行程序的方式。實際編譯過程的細(xì)節(jié)是非常復(fù)雜的,且難以理解,在此不予討論。圖1-1 編譯過程 編程人員在編程語言中要編寫計算機將遵循的指令,類似于英語的命令稱為源代碼。計算機讀取這些代碼后,將其存入內(nèi)存,以便進(jìn)行后續(xù)處理。因為計算機不能執(zhí)行這種形式的源代碼,所以在處理之前,每條語句必須經(jīng)歷一系列的轉(zhuǎn)換過程。 圖1-1說明了在文本編輯器中輸入C語句來創(chuàng)建源程序。編譯器隨后將源程序轉(zhuǎn)換為一中間形式,稱為目標(biāo)程序Object Progra

8、m),目標(biāo)程序表示源代碼對應(yīng)的機器碼。編譯器讀取和檢查源程序的各個語句,在檢查過程中將源語句轉(zhuǎn)換為機器碼(即計算機可以理解的二進(jìn)制代碼),并檢查其語法錯誤。如發(fā)現(xiàn)錯誤,編譯器將標(biāo)記不正確的語句,并打印一系列錯誤診斷消息,簡要說明所有語法錯誤(即違反C語句有效編寫規(guī)則的代碼)。此時,編程人員需要修改錯誤并重新編譯程序。查找和修改錯誤的過程稱為調(diào)試,在編譯器指示編譯過程沒有錯誤之后,調(diào)試才告終止。C程序通常包含對預(yù)先編寫函數(shù)的引用,這些函數(shù)存儲于稱為頭文件的庫中,鏈接器的首要任務(wù)是引入預(yù)編譯的庫代碼,并將其插入到目標(biāo)程序中,以創(chuàng)建可執(zhí)行程序。5、程序流程圖程序流程圖是一個圖表,它顯示了計算機執(zhí)行程

9、序的詳細(xì)處理步驟和順序,在書中用于描述求解問題的算法。圖1-2為設(shè)計者提供的程序流程圖所用的標(biāo)準(zhǔn)符號,請參考。圖1-2 程序流程圖標(biāo)準(zhǔn)符號 四、實驗項目: 1、將下列源代碼輸入計算機并運行,然后分析其運行結(jié)果。 main() int a; long int b; float c; double d; char e; printf(“sizeof a=%dn”, sizeof(a); printf(“sizeof b=%dn”, sizeof(b); printf(“sizeof c=%dn”, sizeof(c); printf(“sizeof d=%dn”, sizeof(d); print

10、f(“sizeof e=%dn”, sizeof(e); (1)本程序段要求學(xué)生對C語言的數(shù)據(jù)類型的理解,并通過實際運行結(jié)果觀察到常用的數(shù)據(jù)類型在內(nèi)存的存儲方式及占用存儲空間的字節(jié)數(shù);(2)源代碼中的sizeof()函數(shù):實現(xiàn)計算數(shù)據(jù)類型字節(jié)的長度。 / * C語言源代碼 */main() 2、將下列由程序流程圖描述的算法,轉(zhuǎn)換為C源代碼并填寫到圖1-3b框中,然后輸入計算機并運行后分析其運行結(jié)果。圖1-3a 程序流程圖 圖1-3b 轉(zhuǎn)換后C語言源代碼3、項目編程(1)請向計算機輸入a,b,c三個值,經(jīng)過程序處理后,要求輸出其中最大的一個。/* 輸出最大值 */main() 程序流程圖 項目要

11、求: 畫出程序流程圖; 根據(jù)流程圖編寫程序(2)請向計算機輸入a,b,c三個值,經(jīng)過程序處理后,要求按值從小到大輸出。程序流程圖 /* 將a,b,c三個值由小到大輸出 */main() 項目要求: 畫出程序流程圖; 根據(jù)流程圖編寫程序項目提示: 可采用if結(jié)構(gòu); a,b,c由scanf函數(shù)輸入(3)編程實現(xiàn)打印下列由字母組成的樹形。說明:本項目編程的知識點是讓學(xué)生對雙重循環(huán)語句結(jié)構(gòu)的理解,清楚雙重循環(huán)的特點(即當(dāng)外循環(huán)變量中的值變化一次時,則內(nèi)循環(huán)變量中的值要變化若干次)。提示:可用外循環(huán)變量代表行數(shù);內(nèi)循環(huán)變量代表需打印字符的個數(shù)。難點:字符個數(shù)是按奇數(shù)變化遞增 左右邊界字符打印的位置 /

12、* 打印圖形 */main() 圖1-4字母A-G組成的樹形 (4)設(shè)計報選體育科目統(tǒng)計程序設(shè)某學(xué)校在新生入學(xué)時,需報選體育選修科目。體育科目包括:籃球、排球、體操、兵乓球和網(wǎng)球。請為某班級(30人)統(tǒng)計報選各體育科目人數(shù)。項目要求: 畫出程序流程圖; 根據(jù)流程圖編寫源程序C語言源代碼main() 程序流程圖 項目提示:可采用switch與for結(jié)構(gòu) 五、知識點檢查: (1) 解釋下列語句的作用,為什么要在變量名之前加&符號? float x; scanf(“%f ”, &x); 解答:(2) 若忘記在上文中的scanf()的語句中加入“&”符號,則輸出結(jié)果將會如何?

13、解答: (3) 請將下列給出的兩個程序段分別輸入計算機后,分析其運行結(jié)果,并解答為什么輸出如此的結(jié)果(不要求助別人,需自己查找資料)。 main() int num; num=32767; printf(“num=%dn”,+num); 解答: main() int a=-2; printf(“%d,%o,%dn”,a,a,-a); 解答:(5) 通過本次實驗,即從編程輸入、運行、調(diào)試以及直到最后輸出正確的結(jié)果,你從中得到了哪些收獲?對于程序運行所出現(xiàn)的錯誤是如何解決的?解答:六、課外選做題: 1、從鍵盤輸入100條整型數(shù)據(jù),請找出其中最大的一個數(shù),并指出這個最大的數(shù)是第幾次輸入的。2、分別統(tǒng)

14、計出在輸入的字符串中字母、數(shù)字和其他字符的個數(shù)。3、請編程實現(xiàn)打印由部分字母組成的圖形,如圖1-5所示。 圖1-5 字母組成圖形實驗2 數(shù)組與排序一、實驗學(xué)時:4二、實驗?zāi)康模?、理解數(shù)組的作用、下標(biāo)的用法及數(shù)組元素在內(nèi)存中的存儲;2、學(xué)習(xí)并掌握一維數(shù)組與多維數(shù)組的應(yīng)用;3、學(xué)習(xí)并掌握常用的排序算法;4、了解字符數(shù)組的特殊應(yīng)用。三、必須學(xué)習(xí)和掌握的知識點:1、數(shù)組的定義、特點和使用規(guī)則2、數(shù)組的查找、排序和插入四、項目編程1、 將下列一組數(shù)讀入到a數(shù)組中,然后從a數(shù)組中找出其中最大的元素并與第一個數(shù)互換;然后從a數(shù)組中找出最小的元素并與最后一個數(shù)互換,而其余元素的位置不變。例如,圖2-1所示。

15、 圖2-1 a數(shù)組中部分元素位置的變化(1) 編程技巧與注意事項: 數(shù)組是用來在內(nèi)存中存儲一組相關(guān)數(shù)據(jù)項??蓪Υ鎯τ趦?nèi)存的數(shù)據(jù)進(jìn)行反復(fù)處理,而不必再重新輸入。 在C中雖然允許在同一行中定義多個數(shù)組,但最好還是每行只定義一個數(shù)組,這樣做可以消除將逗號錯寫為分號的可能性;另外在調(diào)試過程中,也便于查找數(shù)組名。(2)本項目編程指南: 采用循環(huán)結(jié)構(gòu); 需定義一個一維數(shù)組a,四個int型變量主要用于儲存最大數(shù)和最大數(shù)的位置及最小數(shù)和最小數(shù)的位置項目要求: 畫出程序流程圖; 根據(jù)流程圖編寫源程序C語言源代碼main() 程序流程圖 項目提示:可采用switch與for結(jié)構(gòu) 2、 以下是某班級(32人)高數(shù)的

16、考試成績。要求將此成績輸入到a數(shù)組中,然后按其值由高分到低分進(jìn)行排列,并輸出其排列后的成績清單。(1) 本項目編程指南: 這是一個關(guān)于排序的問題。所謂的排序是按給定順序排列數(shù)據(jù)的過程,可根據(jù)數(shù)組內(nèi)容按升序或降序排列元素。通常都按數(shù)據(jù)的輸入順序?qū)?shù)據(jù)加載到數(shù)組中;如果改變輸入順序,若元素為字符型則應(yīng)按字母順序排列,若元素為數(shù)值型可按值的大小(即升序或降序)排列。為計算機開發(fā)的排序算法種類繁多,如選擇法、比較交換法、冒泡法和shell法等。以下簡介兩種典型的排序算法,其他排序方法學(xué)生可查閱其他參考書籍。冒泡排序:也稱“起泡排序”或“氣泡排序”,是一種比較簡單的排序方法。思路是將被排序的元素個數(shù)為N

17、,可以對此元素做N-1次處理。在第k次(k=0,1,2,,N-1)處理時,需比較前N-k個元素。此排序方法是,連續(xù)從前到后比較相鄰的兩個元素,如果后面的元素大于前面的元素,則應(yīng)將二者交換,否則不交換??梢娒拷?jīng)過一次處理,至少此次被處理的N-k個元素中最小的元素被移到本次處理的最后位置,所以經(jīng)過了N-1次處理后就使所有的元素被排好序了。從分析中可以得出,對長列表而言,冒泡排序的效率并不高。它比較適合于對短列表元素的排序,其原因就在于它是反復(fù)比較和交換元素,直至數(shù)據(jù)按指定順序排列為止。關(guān)于冒泡排序方法示例請參考教科書第124頁。Shell排序:Shell排序由Donald Shell開發(fā)。這種排序

18、算法速度比較快,效率高。如果需排序列表較小,所含項目元素在10個左右時,Shell排序和冒泡排序的執(zhí)行次數(shù)相當(dāng)。但如果對于一個排序列表在含有100個項目元素時,則冒泡排序比Shell排序所執(zhí)行的時間高出5倍;如果要是一個包含有1000個項目元素的列表而言,冒泡排序就要比Shell排序所執(zhí)行的時間高出30倍。與冒泡排序一樣,Shell排序也是比較和交換元素。但不同的是,它是通過計算一系列間距(指兩個項目元素間的距離)反復(fù)比較和交換元素,直到元素按指定順序排列為止。本項目要求學(xué)生采用冒泡法排序方法完成上述給出的學(xué)生成績的排序。(2) 項目要求: 畫出程序流程圖; 根據(jù)流程圖編寫源程序C語言源代碼m

19、ain() 程序流程圖 (3) 項目提示: 利用一維數(shù)組與for結(jié)構(gòu) 3、 按照下列要求編寫一個查詢程序。某汽車維修廠倉庫存有多種型號的汽車零件,請為該倉庫管理員編寫一查詢程序用于查詢庫中每種零件的庫存量。圖2-2 設(shè)置的零件型號與對應(yīng)的庫存量(1) 項目要求: 具有交互式輸入(提示操作者從鍵盤輸入要查詢的零件編號); 具有重復(fù)查詢功能; 具有數(shù)據(jù)檢測功能。(2) 項目說明: 當(dāng)程序運行時,首先在屏幕上顯示“請輸入要查詢的零件編號:” ,例如,操作者輸入了 150003 后,則在屏幕上立即顯示出該零件編號及該編號所對應(yīng)的庫存量,如:150003 230 。 如果操作者輸入的零件編號超出了該庫中

20、所規(guī)定的范圍,則應(yīng)在屏幕上顯示出“您輸入的是錯誤的零件編號,請選擇:重新輸入(Y),退出查詢(N)” 。 當(dāng)操作者正確地查詢到自己所要查詢的庫存數(shù)據(jù)后,則在屏幕上應(yīng)顯示出“您還繼續(xù)查詢嗎(Y/N)? ” ,如果繼續(xù)查,則可輸入Y否則輸入N,即結(jié)束此次查詢。(3) 項目提示: 利用二維數(shù)組 采用if結(jié)構(gòu)和嵌套式循環(huán)結(jié)構(gòu) (4) 編程技巧與注意事項: 二維數(shù)組表示的是以行列格式排列的數(shù)據(jù)表; 可通過行下標(biāo)和列下標(biāo)來訪問二維數(shù)組中存儲的元素; 如何使用行下標(biāo)和列下標(biāo)來操縱二維數(shù)組是一個令很多學(xué)生感到頭痛的問題。要想克服這個困難,最好的辦法是仔細(xì)參閱讀教科書中第129頁例7.5題中的代碼,認(rèn)真領(lǐng)會示例

21、,確保完全理解其工作原理。同時利用紙和筆,在程序處理期間,跟蹤記錄各個元素。這同投籃一樣,練習(xí)的越多,成功率也就越高。/* 汽車零件查詢 源代碼 */main() 祝你好運。五、思考題:(1)下標(biāo)在數(shù)組中起什么作用?取值范圍?解答:(2)在使用數(shù)組時,如果數(shù)組元素個數(shù)超過了數(shù)組定義的個數(shù)時,將會產(chǎn)生什么現(xiàn)象,是嚴(yán)重問題嗎?解答:(3) 字符數(shù)組在使用規(guī)則與數(shù)值型數(shù)組有哪些不同之處?解答:六、課外選做題: 1、 請編程計算下列給出直流電路中a,b兩端的等效電阻R。圖2-3 串并聯(lián)直流電路項目提示: 圖2-3中的R1,R2,R0電阻值均由鍵盤輸入。 由for循環(huán)結(jié)構(gòu)實現(xiàn)。2、 請編程計算下列給出的

22、二維數(shù)組周邊元素之和。3、 請編寫一個程序,其功能是統(tǒng)計一個子字符串在另一個字符串中出現(xiàn)的次數(shù)。例如,假設(shè)輸入的字符串是“This is a string”,子字符串為“is”,則輸出結(jié)果是 2 。 實踐3 模塊化編程一、實驗學(xué)時:4二、實驗?zāi)康模?、深刻理解模塊結(jié)構(gòu)化編程的概念及其優(yōu)點;2、了解如何將程序分解為一系列的獨立模塊;3、學(xué)習(xí)和掌握模塊結(jié)構(gòu)化編程的規(guī)則與方法;4、學(xué)會運用自頂向下設(shè)計的思想和模塊結(jié)構(gòu)化編程技巧來編寫C程序。三、必須學(xué)習(xí)和掌握的知識點:1、模塊的劃分規(guī)則2、函數(shù)的調(diào)用規(guī)則3、全局與局部變量4、變量的存儲類別四、知識點講解1、模塊(Model):是一個獨立程序邏輯單元,

23、它執(zhí)行一個主要處理任務(wù),在編寫和測試模塊之后,可將它們裝配起來,形成一個完整的程序。2、模塊結(jié)構(gòu)化編程是一個設(shè)計策略,用來管理、組織和開發(fā)計算機程序。它使用的是“分而治之”方法,將程序分解為一系列的被稱為模塊的邏輯單元。模塊結(jié)構(gòu)化編程旨只提供一種管理編程編程的方法。通過這個方法,可將一個大應(yīng)用程序分解為有限數(shù)量的模塊。由此看來,大程序細(xì)分為一系列更小的、邏輯相關(guān)的任務(wù),可獨立開發(fā)和測試。所以每次編寫一個模塊要比一次性完成整個項目要容易的多??傊?,模塊結(jié)構(gòu)化編程是一種編程技巧,它的理念是自頂向下的設(shè)計和模塊化編程。該發(fā)有助于設(shè)計和構(gòu)建高質(zhì)量的程序,使程序有更好的可讀性,且更易于測試和調(diào)試。在C程

24、序中是利用函數(shù)來實現(xiàn)模塊的功能。例如,在求3個學(xué)生四門課程中,每個學(xué)生的平均成績的程序,就是由3個模塊構(gòu)架起來的。見圖3-1計算平均成績程序的層次圖所示。 圖3-1 計算平均成績程序?qū)哟螆D3、層次圖:也稱框圖(block diagram),將程序劃分為若干個任務(wù)等級(模塊),并顯示任務(wù)之間的關(guān)系。如圖3-1顯示了計算每個學(xué)生平均成績的處理過程。第一層模塊顯示的是程序的目的,第二層顯示的是程序執(zhí)行的處理模塊,由成績輸入、求平均值和輸出成績單三個子模塊組成。 4、程序流程圖:是對每個模塊所要處理的任務(wù)執(zhí)行過程的一個描述。如圖3-2為圖3-1計算平均成績程序?qū)哟螆D中三個子模塊的程序流程圖。 圖3-2

25、a 第一層程序流程圖 圖3-2b 第二層程序流程圖 圖3-2描述的程序流程所對應(yīng)的C源代碼如下:/* 求平均成績模塊代碼 */int average() int sum;for(i=0;i<3;i+) sum=0; for(j=0;j<4;j+) sum+=sij; avei=sum/4; /* 輸出平均成績模塊代碼 */int output() for(i=0;i<3;i+) printf(“%f”,avei); /* 主模塊代碼 */int i,j,s34;float ave3;main() intput();average();output(); /* 成績輸入模塊代碼

26、 */int input() for(i=0;i<3;i+)for(j=0;j<4;j+) scanf(“%d,”,s34); 在上述C程序所完成的功能是計算3名學(xué)生四門課程每名學(xué)生的平均成績。其中主函數(shù)(即主模塊)主要是完成子函數(shù)(也稱子模塊)的調(diào)用,在main函數(shù)之前所定義的變量和數(shù)組均為全局量,因為,下面的三個子函數(shù)都要用這些變量。從上述的模塊結(jié)構(gòu)化編程的示例過程和結(jié)果來看,的確提高了程序的可讀性,無論是寫程序的人或是讀程序的人都可以很輕松地分析C程序,符合結(jié)構(gòu)化程序設(shè)計的思想。所以從本實驗開始,要求學(xué)生必須遵循模塊結(jié)構(gòu)化設(shè)計程序的原則來設(shè)計程序,逐漸養(yǎng)成良好的編程習(xí)慣,不斷

27、地積累模塊結(jié)構(gòu)化編程的經(jīng)驗,來提高自己軟件開發(fā)的能力。 五、模塊結(jié)構(gòu)化編程的指導(dǎo)原則為了讓學(xué)生能達(dá)到最佳的項目編程效果,以下提供幾條適于模塊結(jié)構(gòu)化編程的指導(dǎo)原則,可供學(xué)生參考。1、模塊應(yīng)有一個入口點和一個退出點。如圖3-2中的控制流從各模塊的頂部流入,從底部返回處退出。2、每個模塊只執(zhí)行一個任務(wù)。例如在計算學(xué)生平均成績的示例中成績輸入、求平均以及輸出計算結(jié)果是三個不同的任務(wù),應(yīng)分別處理,不要將無關(guān)的任務(wù)放于同一模塊中,只將完成同一任務(wù)的語句組合在一起。3、編程注意事項:·程序應(yīng)有自我記錄。即可利用描述變量、模塊和函數(shù)的標(biāo)識符·利用注釋記錄代碼,并說明特殊或復(fù)雜的處理

28、3;利用簡單的代碼編寫結(jié)構(gòu)·利用注釋標(biāo)識模塊和函數(shù)·每個模塊包含的語句不應(yīng)超過20條以上列出的編程指導(dǎo)原則只要大家理解了,是不難做到的,真誠地希望參與本實驗的學(xué)生一定會在更短的時間內(nèi)編出高質(zhì)量的程序來,到那時,你一定能夠享受到模塊結(jié)構(gòu)化編程所帶來的如下所說的好處: (1) 更易于維護(hù)程序。即便于更新或修改。(2) 更易于設(shè)計和編寫程序,開發(fā)期間出現(xiàn)的錯誤將大量減少。(3) 程序的可靠性更高,生產(chǎn)運行期間出現(xiàn)的錯誤將大量減少。(4) 更易于其他人(甚至是不熟悉程序的人)讀取和理解程序。(5) 更易于測試調(diào)試程序。(6) 更易于編寫和維護(hù)文檔。 六、項目編程1、矩陣運算。請輸入

29、一個3行3列矩陣的所有元素,然后輸出兩條對角線元素之和。(1) 要求:該程序應(yīng)由一個主函數(shù)和3個子函數(shù)構(gòu)成,子函數(shù)分別完成矩陣元素輸入、兩條對角線元素求和、輸出結(jié)果。畫出層次圖、程序流程圖及源代碼清單。(2)相關(guān)知識:矩陣運算。在軟件開發(fā)中,矩陣是一種常見的數(shù)據(jù)組織形式,在語言上矩陣與二維數(shù)組相對應(yīng),故通常總是用二維數(shù)組存儲矩陣元素。有時在試題中會給出計算公式。因此,計算過程中的主要工作是核對下標(biāo)。與矩陣相關(guān)的主要問題包括:計算矩陣的對角線元素之和(此時矩陣為方陣,M=N,對角線可以是一條或兩條,通常為一條,即主對角線);計算矩陣的周邊元素之和,即四周的元素和;矩陣的上三角或下三角之和;兩矩陣

30、之和矩陣,即將兩個矩陣的各個元素對應(yīng)求和;矩陣及其轉(zhuǎn)置矩陣之和;兩矩陣的乘積矩陣。(3)本項目設(shè)計步驟:項目層次圖 圖3-3 矩陣運算層次圖請完成其它三個子模塊的程序流程圖圖3-4a 主程序流程圖 圖3-4b 輸入矩陣元素程序流程圖圖3-4c 矩陣運算程序流程圖 圖3-4d 打印輸出程序流程圖 C源代碼清單2、將下列給出的城市名列表按降序排序。Atlanta Boston Chicago Denver Hoston LosAngeles Miami NewYork (1) 項目要求: 可利用StrCmp()、StrCopy()函數(shù)。 該程序應(yīng)由一個主函數(shù)和2個子函數(shù)構(gòu)成,子函數(shù)分別完成城市名列

31、表的排序和輸出排序后的城市名列表。 畫出層次圖、程序流程圖及源代碼清單。(2) 相關(guān)知識:StrCmp():字符串比較函數(shù)。格式: strcmp(字符串1,字符串2)說明: 函數(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)請畫出main函數(shù)與城市名表列排序和打印輸出函數(shù)的流程圖。(4)程序流程圖(5) C源代碼清單3、請設(shè)計一個fun函數(shù),其功能是給一維數(shù)組輸入任意4個整

32、數(shù)后,應(yīng)如下規(guī)律輸出。如輸入整數(shù) 1,2,3,4,則程序運行后將輸出以下方陣:要求:該程序由一個主函數(shù)和一個fun函數(shù)組成按以下給出程序結(jié)構(gòu)填寫fun函數(shù)中的C代碼#define M 4main() int aM; fun(a); int fun(int a) int i,j,k,m; for(i=0;i<M;i+) scanf(“%d”, &ai); 七、思考題:(1) 函數(shù)都有哪些調(diào)用方式?解答:(2) 參數(shù)在進(jìn)行信息傳遞時,都具有哪些傳遞方式,各有什么特點(即實參與形參的傳遞)?解答:(3) 根據(jù)你對局部變量和全局變量的理解,在什么情況下用局部變量合適,在什么情況下用全局變

33、量合適?解答:(4) 從課堂的教學(xué)以及上機的實踐教學(xué)中,你是如何理解模塊化程序設(shè)計的?為什么提倡模塊化?(如果你沒有充分理解的話,可去書店或上網(wǎng)查閱有關(guān)這方面的資料,一定弄清楚這個問題?。┙獯穑?九、課外選做題: 1、 請編寫一個fun函數(shù),用于計算給定整數(shù)num各位數(shù)字之積。例如,若輸入252,則應(yīng)輸出結(jié)果是,20;輸入202,輸出結(jié)果是0。2、設(shè)某學(xué)校在校生的年齡在17歲到23歲,請編寫一個fun函數(shù),用于統(tǒng)計該校5000人各年齡的人數(shù)。3、請編寫fun函數(shù),在下列給出的一個有序的數(shù)列中插入一個數(shù),且當(dāng)該數(shù)插入后,應(yīng)使該數(shù)列仍然有序。60, 68, 78, 88, 90, 93, 95,

34、96, 98, 100實驗4 指針與鏈表一、實驗學(xué)時:4二、實驗?zāi)康模?、深刻理解指針的特點和作用 2、學(xué)習(xí)并應(yīng)用指針來設(shè)計算法 3、學(xué)習(xí)和掌握利用指針對內(nèi)存進(jìn)行動態(tài)分配 4、學(xué)習(xí)和掌握指針的編程技巧 三、必須學(xué)習(xí)和掌握的知識點:1、指向變量的指針變量2、指向數(shù)組和多維數(shù)組的指針變量3、指向函數(shù)的指針變量4、指向字符串的指針變量5、指針數(shù)組6、用指針處理鏈表四、主要知識點講解1、內(nèi)存的動態(tài)分配:動態(tài)內(nèi)存管理使程序員可以在程序運行過程中隨時申請一塊空閑內(nèi)存,在使用后即可釋放。比較之下,它比程序中定義的變量或數(shù)組更能靈活有效地使用并節(jié)約內(nèi)存。因為程序中變量或數(shù)組一經(jīng)定義,即使不再使用也必須占用內(nèi)存

35、。2、動態(tài)內(nèi)存管理函數(shù):(1) malloc函數(shù)的一般使用格式(類型*)malloc(字節(jié)數(shù))以字節(jié)數(shù)為單位,動態(tài)分配存儲空間。當(dāng)存儲空間被分配成功時,將返回的是該內(nèi)存塊的首地址,否則返回值為0。 例如,float *p; p=(float *)malloc(5*sizeof(float);上述語句表示,malloc函數(shù)動態(tài)分配到了5個內(nèi)存塊,每個內(nèi)存塊為4個字節(jié)(即實型數(shù)的存儲長度),并且指針變量p將指向的是5個內(nèi)存塊的首字節(jié)的地址。見圖4-1所示。圖4-1 指針p指向5個內(nèi)存塊的首地址(2) free函數(shù)的一般使用格式free(動態(tài)分配的內(nèi)存塊首地址)其作用是釋放掉由malloc函數(shù)分配的

36、內(nèi)存空間,也就是將該內(nèi)存空間歸還給系統(tǒng),以便另行分配使用。 例如,float *p; p=(float *)malloc(5*sizeof(float); free(p); 3、指向變量的指針變量,示例:float a,*p1;p1=&a; 圖4-2 指針p指向變量a的首字節(jié)地址變量a所占用的存儲空間是由4個字節(jié)組成,如果假設(shè)地址編號是從2000開始,則變量a所占用內(nèi)存的地址編號應(yīng)該是2000,2001,2002,2003,而指針p中所存放的地址編號是 2000,也就是變量a的首字節(jié)地址。 4、指向一維數(shù)組和多維數(shù)組的指針變量,示例:float a3,b23,*p1,(*p2)3;p1

37、=a;p2=b;圖4-3a 指針p1指向數(shù)組a的首地址指針p1被定義為是指向一維數(shù)組的指針變量。如果執(zhí)行了p1=a;該指針變量p1具有的是一維數(shù)a的首地址(C語言規(guī)定,數(shù)組名代表地址常量,即該數(shù)組的首地址),見圖4-3a。如果該首地址編號是FFB6,則a代表的是FFB6。而當(dāng)執(zhí)行p1+時,也就是讓指針p1向高字節(jié)方向增加1時,相當(dāng)于增加4個字節(jié)的長度,此時,p1將具有a1元素的地址,地址編號是FFBA,見圖4-3b所示,依次類推。圖4-3b指針p1指向a1元素的地址指針p2被定義為是指向二維數(shù)組的指針變量指針,也稱為p2是行指針。此時,p2具有二維數(shù)b的首地址,地址編號是FFA6,見圖4-3c

38、。圖4-3c 指針p2指向數(shù)組b的首地址如果此時執(zhí)行了p2+操作時,也就是讓指針p2向高字節(jié)方向增加1時,相當(dāng)于增加12個字節(jié)的長度(就即相當(dāng)于p2具有了下一行的首列地址),也就是a10元素的地址,地址編號是FFB2,依次類推。見圖4-3c所示。圖4-3d 指針p2指向b10元素的地址 請同學(xué)們思考:若要求利用行指針輸出上述b數(shù)組中的所有元素的地址和所有元素值的話,則代碼將如何編寫?5、指向函數(shù)的指針變量,示例:int fun( ),(*p)( ),a=5,b=7,c;p=fun; 指針p具有函數(shù)fun的入口地址(每個函數(shù)都有一個入口點,稱該入口點即為該函數(shù)的入口地址),本例函數(shù)的入口地址編號

39、是0046,見圖4-4。在C語言中,函數(shù)的名字是一個指針,其值就是該函數(shù)的入口地址。此時,函數(shù)名fun為一個入口地址常量,且把fun賦給p,則指針p稱為指向函數(shù)的指針變量,也就是在進(jìn)行函數(shù)fun的調(diào)用時,也可利用指針p進(jìn)行函數(shù)的調(diào)用了。圖4-4 指針p指向fun函數(shù)的入口地址如有下面的語句行:c=(*p)(a,b); 此語句就相當(dāng)于函數(shù)調(diào)用的語句:c=fun(a,b); 。6、字符串指針變量,示例:Char *str=“student”;圖4-5 字符串指針str所指向字母s的地址7、指針數(shù)組,示例:int a34,*p3,i;for(i=0;i<3;i+)pi=&ai0;圖4-

40、6指針數(shù)組p指向數(shù)組a的首列地址指針p被定義的是指針數(shù)組,即在該數(shù)組中的每一個元素值都是地址值。在該示例中p具有三個指針元素,即p0,p1,p2它們分別具有數(shù)組a00,a10和a20的地址,如圖4-6所示。此時,可利用指針數(shù)組間接對a數(shù)組進(jìn)行操作。指針數(shù)組應(yīng)用最多的還是對字符串的處理,如利用指針數(shù)組對字符串的排序、查找以及字符的統(tǒng)計操作等。在本實驗中的項目編程中的第3題就涉及到指針數(shù)組的應(yīng)用。關(guān)于該知識點的詳細(xì)內(nèi)容請參閱教科書第248頁。8、鏈表鏈表屬于動態(tài)數(shù)據(jù)結(jié)構(gòu),可以類比成一“環(huán)”接一“環(huán)”的鏈條,這里的每一“環(huán)”可以視作一個結(jié)點,如果把結(jié)點串在一起就形成了鏈表。這種數(shù)據(jù)結(jié)構(gòu)非常靈活,結(jié)點

41、數(shù)目無須指定,可以臨時生成。每個結(jié)點有自己的存儲空間,結(jié)點間的存儲空間也無須連接,結(jié)點之間的串連是由指針來完成的,而指針的操作又極為靈活方便,習(xí)慣上稱這種數(shù)據(jù)結(jié)構(gòu)為動態(tài)數(shù)據(jù)結(jié)構(gòu)。這種結(jié)構(gòu)的最大的優(yōu)點是插入和刪除結(jié)點方便,無須移動大批數(shù)據(jù),只須修改指針的指向即可。這是編程中十分重要的一種數(shù)據(jù)結(jié)構(gòu)。 在以下項目編程中的第2題就是關(guān)于鏈表的問題。五、項目編程1、請建立一個學(xué)生成績數(shù)組然后調(diào)用一個fun函數(shù)用于查詢該數(shù)組中一門課程以上不及格的學(xué)生并打印他們?nèi)空n程的成績。(要求利用行指針作為函數(shù)的傳遞參數(shù))。(1) 提供部分代碼如下,并請完成其他全部代碼:#define M 3#define N 4m

42、ain() float stuMN=68,90,66,80,56,78,80,90,50,68,56,98; float fun(); fun(stu,M); float fun(float (*p)N,int n) 2、請為下列給出的某班級C程序編碼員列表,建立一個鏈表。圖4-7 C程序編碼員列表(1)說明: 在上表中,每人為一個節(jié)點,節(jié)點中有4個成員:姓名、出生年、出生月和指針。然后用指針將每個節(jié)點鏈接起來。 節(jié)點鏈接的條件是生日大者在前,小者在后。 最后輸出已按順序排好的并具有5個節(jié)點的鏈表,如圖4-8編碼員鏈表所示。 圖4-8 程序編碼員鏈表 (2)本題相關(guān)知識這是一個關(guān)于建立單向動態(tài)

43、鏈表的問題。所謂建立動態(tài)鏈表是指在程序執(zhí)行過程中從無到有地建立起一鏈表,即一個一個地開辟節(jié)點和輸入各節(jié)點的數(shù)據(jù)值,并建立起前后相鏈的關(guān)系。在做本實驗時之前,首先應(yīng)弄清楚節(jié)點數(shù)據(jù)類型的定義、如何利用指針的動態(tài)地開辟節(jié)點以及輸出已建立的動態(tài)鏈表等項內(nèi)容。 動態(tài)數(shù)據(jù)結(jié)構(gòu):本題主要是鏈表的建立,它的實現(xiàn)依賴于動態(tài)的內(nèi)存管理,即利用malloc函數(shù); 描述單向鏈表的數(shù)據(jù)類型:單向鏈表的一般結(jié)構(gòu)如圖4-9所示。 圖4-9a 單向鏈表為了實現(xiàn)鏈表必須定義能夠描述鏈表中節(jié)點的數(shù)據(jù)類型,該類型應(yīng)包含有數(shù)值和地址兩大部分。見圖4-9b。 關(guān)于鏈表動態(tài)建立和鏈表輸出的具體實現(xiàn)過程,請參閱教科書第275頁到279頁。

44、 圖4-9b鏈表節(jié)點 除了上述建立、輸出鏈表,則與本題相關(guān)的內(nèi)容還有關(guān)于鏈表的插入和刪除操作(參照教科書的第281-286頁)。(3) 要求:設(shè)計一個主函數(shù)和兩個子函數(shù)(即建立鏈表模塊和輸出鏈表模塊)。(4) 請在以下空間內(nèi)完成本題的C源程序。3、編寫一個fun函數(shù),其功能是將字符指針s所指字符串(見圖4-10a)所有下標(biāo)值為奇數(shù)的字符刪除,然后將串中剩余字符存放到由字符指針t所指的字符數(shù)組中(例如圖4-10b所示)。 (1)要求:利用字符指針變量作fun函數(shù)中的形參 (2)本題相關(guān)知識:在字符串相關(guān)的所有操作中,包括有計算給定字符串的長度、對奇數(shù)位操作、對偶數(shù)位操作等一系列問題。在這些操作中

45、,需要利用循環(huán)語句“遍歷”字符串的每一個下標(biāo)。 字符串的理解字符串是由一串字符組成的整體,包括常量和變量。但字符串不是一種專門的數(shù)據(jù)類型,而是由字符數(shù)組充當(dāng)。字符串的常量是以雙引號括起來的若干個字符的集合,如“hello”,這些字符在內(nèi)存中都是以ASCII碼值形式進(jìn)行存儲的。并以“0”作為字符串的結(jié)束標(biāo)記。 指向字符串常量的指針在程序設(shè)計中,可以用字符象指針變量記載字符串常量的首地址,從而形成了一類“字符串變量”。例如:char *p=”hello”; 或 char *p; p=”hello”;以上兩種形式含義相同,都使指針p存儲著字符串常量“hello”的首地址。此時,應(yīng)注意一定不能認(rèn)為字符

46、串存儲在變量p中,而是僅僅是首地址存儲在p中。這樣變量p即可具有與字符數(shù)組相同的用法和功能。 字符數(shù)組作為字符串變量常用的一種構(gòu)成字符串變量的方法是使用char類型的一維數(shù)組,但在沒對數(shù)組賦值之前并不能稱其為字符串:char str10;事實上,上述定義僅定義了一個數(shù)組而已。如果需要將其用作字符串,最好應(yīng)該在定義數(shù)組的時候就賦以初值,如:char str10= “a string!”;經(jīng)過上述賦值后,系統(tǒng)就會將字符串常量“a string!”完整地存儲到數(shù)組str中(注意與指向字符串常量的指針變量的區(qū)別)。包括結(jié)束符 0。通過上述說明可以發(fā)現(xiàn),字符串的結(jié)束符0是至關(guān)重要的一環(huán)。因為C語言中并不

47、存儲字符串的長度,所以只能利用字符串中的元素是否為結(jié)束符作為判定字符串結(jié)束的依據(jù)。另者,還值得注意的一點是,字符串結(jié)束符號0的ASCII碼值是整數(shù)0,也就是說,0與整數(shù)0相同,當(dāng)它不同于字符0,應(yīng)為對于字符0的ASCII碼值是48,故可以說,0與整數(shù)48相同。(3) 提供main函數(shù)代碼如下,并請完成fun函數(shù)的全部代碼:main() char ch100,t100,fun(); gets(ch); fun(ch,t); char fun(char *s, char *t) 六、課外選題1、 請設(shè)計一個fun函數(shù),其功能是統(tǒng)計由字符指針ss所指的字符串中指定字符的個數(shù),并將此統(tǒng)計結(jié)果返回給主函數(shù)。例如,若輸入字符串:123412132 ,再輸入 1,則應(yīng)輸出為 3,也就是說,該字符串的數(shù)字中含有數(shù)字1的個數(shù)有3個。請完成fun函數(shù)中的C代碼。main() char ss100,ch; int c; gets(ss); scanf(“%c”, &a

溫馨提示

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

評論

0/150

提交評論