c語言程序設(shè)計實驗指導(dǎo)(學(xué)生用)_第1頁
c語言程序設(shè)計實驗指導(dǎo)(學(xué)生用)_第2頁
c語言程序設(shè)計實驗指導(dǎo)(學(xué)生用)_第3頁
c語言程序設(shè)計實驗指導(dǎo)(學(xué)生用)_第4頁
c語言程序設(shè)計實驗指導(dǎo)(學(xué)生用)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、c語言程序設(shè)計實驗指導(dǎo)(學(xué)生用)計算機(jī)基礎(chǔ)教研室c語言程序設(shè)計課程組2012年9月c語言程序設(shè)計是計算機(jī)科學(xué)技術(shù)系面向全校理工科開設(shè)的一門專業(yè)平 臺課程。通過這門課程的學(xué)習(xí),可以讓學(xué)生了解程序設(shè)計的思想和方法,掌握高 級語言程序設(shè)計的基本知識,提高問題求解和程序語言的應(yīng)用能力。c語言程序設(shè)計實驗指導(dǎo)書是c語言程序設(shè)計的配套指導(dǎo)書。本指 導(dǎo)書本著“厚基礎(chǔ),重實踐,以專業(yè)為導(dǎo)向”的原則,其中程序設(shè)計基礎(chǔ)、數(shù)組、 函數(shù)這三個實驗項fi是所有學(xué)科專業(yè)都必須掌握的,其他實驗項目根據(jù)專業(yè)特 點(diǎn),設(shè)計了不同的要求:對于普通專業(yè)側(cè)重循環(huán)、數(shù)組、函數(shù)、結(jié)構(gòu)體等,生化 類專業(yè)包含數(shù)據(jù)文件的處理,機(jī)械電了類專業(yè)包含

2、位運(yùn)算,數(shù)理類專業(yè)包含數(shù)值 計算等內(nèi)容。每個實驗本著循序漸進(jìn)的原則,由簡到難,逐步深化,另外配有相 應(yīng)的實驗練習(xí),學(xué)生可根據(jù)白己的情況選擇完成。本指導(dǎo)書所有程序代碼均在 visual c+環(huán)境卜調(diào)試通過。本指導(dǎo)書在編寫過程中得到了系領(lǐng)導(dǎo)的大力支持,土海燕主任在百忙中多次 參加我們的課程研討,莊波老師、宮鋒老師在大綱編寫、指導(dǎo)書任務(wù)設(shè)計方面給 出了切實可行的意見和建議,在此深表感謝。本指導(dǎo)書由計算機(jī)基礎(chǔ)教研室c語言程序設(shè)計課程組全體人員共同編寫, 謝玉華老師負(fù)責(zé)統(tǒng)籌妥排,實驗一、實驗二、實驗三、實驗七由張志芬老師編寫, 實驗四、實驗六由陳春華、薛紅芳老師編寫,實驗五由陳慶燕老師編寫,最后由 張志

3、芬老師統(tǒng)稿,在此一并感謝。由于水平有限,木指導(dǎo)書難免存在疏漏和不足z處,望各位老師在使用過程 中多提寶貴意見,有利于我們進(jìn)一步改進(jìn)。c語言程序設(shè)計課程組2012年9月實驗一基本控制結(jié)構(gòu)的應(yīng)用11熟悉編程環(huán)境11.2順序結(jié)構(gòu)程序設(shè)計11.3選擇結(jié)構(gòu)程序設(shè)計21.4循環(huán)結(jié)構(gòu)程序設(shè)計4實驗二數(shù)組的應(yīng)用72.1 一維數(shù)組的應(yīng)用72.2二維數(shù)組的應(yīng)用102.3字符數(shù)組的應(yīng)用12實驗三函數(shù)的應(yīng)用13實驗四位運(yùn)算的綜合應(yīng)用15實驗五 數(shù)據(jù)文件的處理22實驗六數(shù)值計算25實驗七簡單學(xué)生成績管理系統(tǒng)30實驗一基本控制結(jié)構(gòu)的應(yīng)用1.1熟悉編程環(huán)境一、實驗?zāi)康膇了解c語言程序的開發(fā)環(huán)境,掌握c語言源程序的編輯、編譯

4、、連接及運(yùn)行過程;2. 通過運(yùn)行簡單的c程序,初步了解c語言源程序的特點(diǎn)及基木結(jié)構(gòu)。二、實驗內(nèi)容1.在tc或vc+環(huán)境下,編輯如下所示的簡單c語言程序:#include <stdio.h> main() printf(uhello world!n);對其進(jìn)行編譯、連接及運(yùn)行,觀察程序的運(yùn)行結(jié)果。2.編程在顯示器上輸岀如下信息:how are you!三、實驗練習(xí)1.編程在顯示器上輸出如下信息:*2.求一個三位數(shù)的各位上數(shù)字之和并輸岀該和。1. 2順序結(jié)構(gòu)程序設(shè)計一、實驗?zāi)康?掌握運(yùn)算符的使用;2 .正確定義程序中的變量;3掌握c語言中數(shù)學(xué)公式的表示;4熟練使用輸入、輸岀語句;5 能

5、夠利用順序結(jié)構(gòu)進(jìn)行程序設(shè)計。二、實驗內(nèi)容已知三角形的三邊長分別為3,4,4,求三角形的面積。三、分析三角形三邊邊長已知,根據(jù)公式:面積=s(s-a)(s-b)(s-c),其中s= (a+b+c) /2即口j 求得面積。四、算法描述1. 定義三個邊長a,b,c為float型,其初值為3,4,4;2計算 s=(a+b+c)/2;3. 計算area=sqrt(s*(sa)*(sb)*(s-c),求得三角形的面積并輸出。五、程序#include <stdio.h>#include <math.h>main()/*定義變量*/*計算面積*/*輸出面枳*/六、實驗練習(xí):1. 從鍵盤

6、上輸入一個大寫字母,將其轉(zhuǎn)換成相應(yīng)的小寫字母并輸岀。2. 把560分鐘換算成小時和分鐘表示并輸出。3求解方程2x2+3x+1=0的解。1. 3選擇結(jié)構(gòu)程序設(shè)計一、實驗?zāi)康?掌握關(guān)系運(yùn)算及邏輯運(yùn)算;2掌握if語句;3掌握switch語句;4 .能夠利用選擇結(jié)構(gòu)進(jìn)行程序設(shè)計。二、實驗內(nèi)容根據(jù)輸入的三角形的三條邊,判斷是否能組成三角形,若可以則輸出它的面積及 三角形的類型。三、分析1 首先判斷是否能構(gòu)成三角形,如果滿足a,b,c三條邊大于0,并且滿足 a+b>c,b+c>a,a+c>b則能構(gòu)成三角形;否則不能構(gòu)成三角形;2若能構(gòu)成三角形時,計算三角形的面枳。再判斷三角形的類型,如果

7、三邊都相 等時等邊三角形;如果任意兩邊相等則為等腰三角形;如果兩邊平方之和等于第 三邊平方則為直角三角形;其他為一般三角形。四、算法描述1. 定義三個邊長a,b,c為float型,從鍵盤輸入三個邊長值;2判斷三邊是否能構(gòu)成三角形,條件是a,b,c三條邊大于0,并且 a+b>c,b+c>a,a+c>b,不滿足條件則不能構(gòu)成三角形;3如果能構(gòu)成三角形時,計算三角形的面積(面積二 sqrt(s(s-a)(s-b)(s-c),s=(a+b+c)/2);再判斷三角形的類型,如果三邊都相等時等 邊三角形;如果任意兩邊相等則為等腰三角形;如果兩邊平方之和等于第三邊平 方則為直角三角形;其他

8、為一般三角形。五、程序#include <stdio.h>#include <math.h>main()/*定義變量*/*輸入邊長*/*判斷能否構(gòu)成三角形,能則計算面枳判斷類型*/*計算三角形的面積*/*輸出三角形的面枳*/*判斷三角形的類型(等邊、等腰、直角或一般三角形)*/elseprintf(4三邊不合適,不能構(gòu)成三角形! n");六、實驗練習(xí)1編程實現(xiàn)從鍵盤輸入四個整數(shù),把這四個數(shù)曲小到大輸出。2. 編程判斷從鍵盤輸入的整數(shù)的正負(fù)性及奇偶性。3根據(jù)鍵盤輸入x的值求y值,其公式如下:廠 5x4-11sinx+cosx0<=x<2020<

9、=x<40y= vex-140<=x<60ln(x-i-l)60<=x<80< 0其他值4. 輸入一個字符,如果這個字符是小寫字母將這個字符轉(zhuǎn)換成大寫字母輸出,否 則輸出原字符。5. 編程實現(xiàn)如下功能的簡單計算器:從鍵盤輸入兩個運(yùn)算數(shù)及算術(shù)運(yùn)算符,最后 輸岀計算結(jié)果。6. 求解方程ax2+bx+c=o的解。1.4循環(huán)結(jié)構(gòu)程序設(shè)計一、實驗?zāi)康? 掌握while語句;2. 掌握do-while語句;3掌握for語句;4 能夠利用循環(huán)結(jié)構(gòu)進(jìn)行程序設(shè)計;5能夠綜合利用順序結(jié)構(gòu)、選擇結(jié)構(gòu)及循環(huán)結(jié)構(gòu)進(jìn)行程序設(shè)計。二、實驗內(nèi)容根據(jù)輸入的三角形的三條邊,判斷是否能組成三角形

10、,若不能則重新輸入三邊, 直到能構(gòu)成三角形為止;若能則計算三角形的面積,并判斷三角形的類型,重復(fù) 輸入三角形的邊長,使每種類型的三角形都岀現(xiàn)一次。三、分析1 首先判斷是否能構(gòu)成三角形,如果滿足a,b,c三條邊大于0,并且滿足 a+b>c,b+c>a,a+ob則能構(gòu)成三角形;否則不能構(gòu)成三角形;2若能構(gòu)成三角形時,計算三角形的面積。再判斷三角形的類型,如果三邊都相 等時等邊三角形;如果任意兩邊相等則為等腰三角形;如果兩邊平方之和等于第 三邊平方則為一直角三角形;其他為一般三角形。當(dāng)為某一類型,其計數(shù)加1,若 冇沒出現(xiàn)過的類型,再循環(huán)輸入各邊,直到每種類型都出現(xiàn)過。四、算法描述1定義三

11、個邊長a,b,c為float型,從鍵盤輸入三個邊長值;2判斷三邊是否能構(gòu)成三角形,條件是a,b,c三條邊大于0,并且 a+b>c,b+c>a,a+c>b,不滿足條件則不能構(gòu)成三角形;3如果能構(gòu)成三角形時,計算三角形的面積(面積 =sqrt(s(s-a)(s-b)(s-c) ,s=(a+b+c)/2);再判斷三角形的類型,如果三邊都相等時等 邊三角形;如果任意兩邊相等則為等腰三角形;如果兩邊平方之和等于第三邊平 方則為直角三角形;其他為一般三角形。4當(dāng)為某一類型的三角形時,其計數(shù)加1,若冇沒出現(xiàn)過的類型,再循環(huán)輸入各 邊,直到每種類型都岀現(xiàn)過。其中輸入各種類型三角形邊長為外循環(huán)

12、,輸入合適 邊長為內(nèi)循環(huán)。五、程序#include <stdio.h>#include <math.h>main()float a,b,c,s,area;int i=o,j=o,k=o,l=o;/*i,j,k,l分別用來統(tǒng)計每種類型的三角形出現(xiàn)的次數(shù)*/do/*輸入三角形的邊長*/while()/*循環(huán)輸入三邊直到能構(gòu)成三角形*/ /*計算三角形的面積*/*判斷三角形的類型(等邊、等腰、直角或一般三角形),并統(tǒng)計各種類型三角形出現(xiàn)的次數(shù)*/while(i&&j&&k&&l)=0);六、實驗練習(xí)1 雞兔問題:假設(shè)雞兔共有30

13、只,腳數(shù)共冇90只,利用循環(huán)編寫一個程序求出雞和兔各有多少只。2.從鍵盤輸入若干學(xué)生某門課程的成績,計算出平均成績并輸出低丁 60分的學(xué)生成績,當(dāng)輸入負(fù)數(shù)時結(jié)束輸入。3判斷從鍵盤輸入的數(shù)m是否為索數(shù)(索數(shù):只能被1和本身整除的數(shù))。4. 利用循環(huán)從鍵盤輸入100個數(shù),找出其中的最小值。99值。5編程求1冷+冷+丄6編程求 s= 1 +(1 +2)+(1 +2+3)+(1 +2+3+n)的值。7. 輸入n個整數(shù),求這n個數(shù)之屮的偶數(shù)平均值,并輸岀。8. 編程打印一下圖形(行n的值由鍵盤輸入)。*9. 輸出100-999之間的所有水仙花數(shù),每行輸出5個(水仙花數(shù):三位數(shù)的各位 數(shù)字的立方之和等于這

14、個三位數(shù)本身,如153=1*1*1+5*5*5+3*3*3)。10. 編寫一個程序,打印如下乘法“九九表”。1*1=1 1*2二21*3=31*4=41*5=51*6 二 61*7=71*8=81*9=92*2=42*3=62*4=82*5二102*6122*7二142*8=162*9=183*3=93*4=123*5二153*6183*7=213*8=243*9二274*4=164*5=204*6244*7二284*8=324*9二365*5二255*6305*7=355*8=405*9=456*6366*7=426*8=486*9二547*7二497*8二567*9二638*8二64 8*

15、9二729*9=81 11從鍵盤輸入6名學(xué)生的5門成績,分別統(tǒng)計出每個學(xué)生的平均成績。實驗二數(shù)組的應(yīng)用2. 1 一維數(shù)組的應(yīng)用一、實驗?zāi)康? 掌握一維數(shù)組的定義及初始化;2 掌握一維數(shù)組元索的引用;3 掌握幾種常見的排序方法;4 .能夠利用一維數(shù)組進(jìn)行程序設(shè)計。二、實驗內(nèi)容從鍵盤輸入10個學(xué)生的一門課程的成績,從高到低排序后輸出每個學(xué)生的成績。方法1:選擇排序三、分析選擇排序方法通過選擇最大值的方法,依次將最大、第2大、第3犬的數(shù)挑選出來,順序調(diào)換到數(shù)組的第1個、第2個、第3個元索中。四、算法描述1 定義n個長度的數(shù)組用來存放n個元素;2第1趟將第1個元索和它后面的元索逐個進(jìn)行比較,冇更大的則

16、與第1個元索 進(jìn)行交換,再繼續(xù)和后面的元索比較。經(jīng)過若干次比較和交換,從n個元索中找 岀了最大數(shù)并交換到第1個元素中;3第2趟用同樣的方法,在剩下的ml個元索中找出第2大的數(shù),并把它調(diào)換到 第2個元索中;4. 第i趟再用同樣的方法,在剩下的ni+l個元素中找出第i大的數(shù),并把它調(diào)換 到第i個元索中。i不斷增加,一趟趟重復(fù)此過程,直到i=nl最后一趟比較完為 止;5. 程序用雙重循環(huán)實現(xiàn),外循環(huán)用i控制趟數(shù),找第i個元素。內(nèi)循環(huán)比第i個元 索和它后面的元索逐個進(jìn)行比較,冇更大的則交換到第i個元索。五、程序#include <stdio.h>#define n 10main()/*定義

17、數(shù)組*/*通過循環(huán)輸入n個成績,保存在數(shù)組中*/*變量i用來控制比較的趟數(shù),需進(jìn)行n1趟*/*第i個元索和具后各元索進(jìn)行n(i+1)次比較,變量j用來控制其后元索*/*如果逆序則交換*/printf(“排序后的成績:e);/*通過循環(huán)輸出排好序的數(shù)組中的元索*/方法2:插入排序三、分析插入排序方法通過將要插入的元索從冇序數(shù)組的最后元索開始逐個進(jìn)行比較,如 果逆序則后移數(shù)組元素,一直到找到合適為止插入。如正序則直接插入。四、算法描述1 定義n個長度的數(shù)組用來存放n個元索;2. 第1個數(shù)直接存在數(shù)組第1個位置,再輸入新數(shù)3. 從數(shù)組最后一個元索開始,逐個將數(shù)組元索與數(shù)m進(jìn)行比較,如果逆序則將數(shù) 組

18、元索后移一個單元,直到找到合適正序位置并插入;如果第一次比較正序,則 將數(shù)m插入到數(shù)組最后。再輸入新數(shù)4重復(fù)第3步,直到n個數(shù)全部有序插入。五、程序#include <stdio.h>#define n 6main()/*定義數(shù)組*/*先輸入一個數(shù)*/*就一個數(shù)時必是有序的,直接存到數(shù)組第零個元素中*/*通過循環(huán)利用i控制輸入的元索個數(shù)*/*再輸入一個新數(shù),和數(shù)組中已有元素進(jìn)行比較*/*利用循環(huán)從現(xiàn)冇數(shù)組的最后一個元索開始往前逐個比較*/*如果逆序,則把數(shù)組中元索逐個后移*/*如果正序,則退出循環(huán)*/*把該數(shù)放在數(shù)組中第j個元索之后*/printf(“排序后的成績:n”);/*通過

19、循環(huán)輸出排好序的數(shù)組中的元索*/方法3:冒泡排序三、分析冒泡排序方法每趟順序比較相鄰的兩個數(shù),如果兩數(shù)逆序,則交換兩數(shù),最多進(jìn) 行ml趟,即完成n個數(shù)由高到低順序排列。四、算法描述1 定義n個長度的數(shù)組用來存放n個元索;2.第1趟比較第1個和第2個元索,逆序則交換,再依次比較第2個和第3個、 第3個和第4個,每次比較中若是逆序則交換。經(jīng)過這趟比較和交換,最小 的數(shù)到最后一個元索中;3第2趟用同樣的方法,在前面“1個元素中依次進(jìn)行比較和交換,第2小的數(shù) 到倒數(shù)第2個元索中;4第i趟再用同樣的方法,在剩下的n-i+l個元索中依次進(jìn)行比較和交換,第i 小的數(shù)到倒數(shù)第i個元素中。一趟趟重復(fù)此過程,宜到

20、i=nl最后一趟比較完為 止;5程序用雙重循環(huán)實現(xiàn),外循環(huán)用i控制趟數(shù),找第i個元索。內(nèi)循環(huán)j比較兩個 相鄰元素,若逆序則交換。五、程序#include <stdio.h>#define n 10main()/*定義數(shù)組*/*通過循環(huán)輸入n個成績,保存在數(shù)組中*/*變量i用來控制比較的趟數(shù)*/*依次比較相鄰的兩個數(shù),共比較ni個*/*如果逆序則交換*/printf(“排序后的成績:e);/*通過循環(huán)輸出排好序的數(shù)組中的元素*/六、實驗練習(xí)1. 從鍵盤輸入10個學(xué)生的成績存儲在數(shù)組中,求成績最高者的序號和成績。2從鍵盤輸入n個數(shù)到數(shù)組中,統(tǒng)計其中的正數(shù)個數(shù),并計算它們的和。3將整型數(shù)

21、組中的所冇元索鏡像對調(diào)(第一個與最后一個對調(diào),第二個與倒數(shù)第 二個對調(diào)),按對調(diào)后的結(jié)果輸岀。2. 2二維數(shù)組的應(yīng)用一、實驗?zāi)康? 掌握二維數(shù)組的定義及初始化;2 掌握二維數(shù)組元索的引用;3 能夠利用二維數(shù)組進(jìn)行程序設(shè)計。二、實驗內(nèi)容從鍵盤輸入10個學(xué)生的三門課程的成績,求每個學(xué)生各門課程的平均分,并按平均分從高到低的順序輸出每個學(xué)生各門課程的成績和平均成績。三、分析要存儲10個學(xué)生三門課程的成績需要定義二維數(shù)組,要存儲10個學(xué)生的平均成 績需要定義一維數(shù)組,利用循環(huán)輸入成績、計算平均分,再利用循環(huán)選用一種排 序方法按平均成績進(jìn)行排序,最后利用循環(huán)按耍求輸岀。四、算法描述1 定義數(shù)組int s

22、n存儲n=10個學(xué)生三門課程的成績,數(shù)組float an存儲10個學(xué)生的平均成績;2用for循環(huán)從鍵盤按行輸入每個學(xué)生三門課的成績;3用for循環(huán)計算岀每個學(xué)生的平均成績并存入數(shù)組a中;4. 按照平均成績從高到底的順序排序(可選用選擇排序、冒泡排序、插入排序、快速排序等多種排序方法用選擇排序);5 按要求輸出。五、程序#include <stdio.h>#include <math.h>#define n 10main()/*定義二維數(shù)組用來保存n個學(xué)生的3門成績*/*定義一維數(shù)組用來保存n個學(xué)生的平均成績*/*通過循環(huán)輸入n學(xué)生的三門課成績*/*通過循環(huán)計算n個學(xué)生的

23、平均成績*/for(i=0;i<n-1 ;i+)for(j=i+1 ;j <n ;j+)/*比較平均成績,高則平均成績高者進(jìn)行交換*/*通過循環(huán)交換三門課的成績*/*交換平均成績*/printf("按平均分排序后的成績?yōu)?n”);printfc課程一課程二課程三平均分ni4-l);/*通過循環(huán)輸出排好序的n個學(xué)生的三門課成績及平均成績*/六、實驗練習(xí)1 從鍵盤輸入矩陣a的值,將a的轉(zhuǎn)置矩陣存入矩陣b,輸出矩陣b。2. 找出6粥矩陣每列絕對值最大的元索,并與同列對角線元索交換。3. 輸岀楊糠三角形(行數(shù)由鍵盤輸入)。11 11 2 113 3114 6 414 .矩陣求積。

24、2. 3字符數(shù)組的應(yīng)用一、實驗?zāi)康? 掌握字符數(shù)組的定義及初始化;2 常握字符數(shù)組元索的引用;3 掌握字符串處理函數(shù);4. 能利用字符數(shù)組及字符串處理函數(shù)進(jìn)行程序設(shè)計。二、實驗內(nèi)容從鍵盤輸入n個學(xué)生的姓名存儲在字符數(shù)組中,并按字典順序輸出。三、分析因為姓名為字符串,要存儲n個學(xué)生姓名需要定義二維字符數(shù)組,每行存儲一 個學(xué)生的姓名,用選擇排序法按字典順序比較人小時用strcmpo函數(shù),交換時賦 值用strcpy()函數(shù)。四、算法描述1 .定義數(shù)組intsn12存儲n個學(xué)生的姓名,數(shù)組strn用于交換時的中間變量;2. 用for循環(huán)從鍵盤按行輸入每個學(xué)生三門課的成績;3用for循環(huán)計算岀每個學(xué)生的

25、平均成績并存入數(shù)組a中;4.按照平均成績從高到底的順序排序(口j選用選擇排序、冒泡排序、插入排序、 快速排序等多種排序方法用選擇排序);5 按要求輸出。五、程序#include <stdio.h>#include <string.h>#define n 10main()/*定義二維數(shù)組保存n個學(xué)生的姓名*/*定義一維數(shù)組保存在交換時一個學(xué)生的姓名*/*通過循環(huán)輸入n個學(xué)生姓名*/*通過選擇排序?qū)個學(xué)生姓名進(jìn)行排序*/for(j =i+1 ;j <n ;j+)/*調(diào)用strcmp函數(shù)進(jìn)行比較勺/*交換時調(diào)用strcpy函數(shù)進(jìn)行賦值*/printf(“排好序的成績?yōu)?/p>

26、:it);/*通過循環(huán)輸出排好序的姓名*/六、實驗練習(xí)1輸入一行字符,統(tǒng)計其中有多少個單詞,單詞之間用空格分隔開。2.輸入一行字符,刪除字符串中的空格。實驗三函數(shù)的應(yīng)用一、實驗?zāi)康? 常握函數(shù)的定義;2 掌握函數(shù)的調(diào)用方法;3 掌握函數(shù)之間的值傳遞方式;4 能夠利用函數(shù)進(jìn)行綜合程序設(shè)計。二、實驗內(nèi)容求兩位的所有絕對素數(shù),并輸出(一個素數(shù)經(jīng)過任意次調(diào)換位,仍然為素數(shù),則 為絕對索數(shù),例如:13 (31)就是一個絕對索數(shù))。三、分析求所有兩位數(shù)的絕對素數(shù),可定義一個判斷這個數(shù)是否為絕對素數(shù)的函數(shù),在實 現(xiàn)該函數(shù)時需要判斷該數(shù)是否為索數(shù)及換位后是否為索數(shù),所以還應(yīng)定義一個函 數(shù)判斷一個數(shù)是否為索數(shù)的

27、函數(shù)。四、算法描述1 定義索數(shù)函數(shù)判斷一個數(shù)是否為索數(shù),判斷時需考慮數(shù)小于2、等于2及大于2的情況,大于2時需用循環(huán)進(jìn)行判斷。是索數(shù)返回1,不是則返回0;2.定義絕對素數(shù)函數(shù)判斷一個數(shù)是否為絕對素數(shù),判斷吋需調(diào)用已定義的素數(shù)函 數(shù)來判斷原數(shù)及換位后的數(shù)是否為索數(shù)。是絕對索數(shù)返回1,不是則返回0;3在main函數(shù)中對10至99的數(shù)調(diào)用絕對索數(shù)函數(shù),如果是絕對索數(shù)則輸出這 個數(shù)。五、程序#include <stdio.h>#include <math.h>/*定義sushu函數(shù)用來判斷一個數(shù)是否為素數(shù)*/int sushu(int n)/*如果小于2,不是素數(shù)返回0*/*如

28、果是2,是索數(shù)返回1*/*大于2的需要判斷是不是索數(shù),是則返回1,不是返回0*/*定義jueduisushu函數(shù)用來判斷一個數(shù)是否為絕對索數(shù)*/int jueduisushu(int in)/*得到m各位交換后的數(shù)*/*調(diào)用sushu()w斷原數(shù)和交換后的數(shù)是否為索數(shù),是則返回1,不是返回0*/main()int i;for(i=10;i<100;i+)/*判斷10到99的數(shù)是否為絕對索數(shù)*/*調(diào)用jueduisushu()lj斷是否為絕對素數(shù),是則輸出*/六、實驗練習(xí)1. 編寫一個程序,已知一個圓筒的半徑、外徑和高,計算該圓筒的體積。2. 編寫一個判斷某數(shù)是否為水仙花數(shù)的函數(shù),在mai

29、n函數(shù)中求100到999之間 的全部水仙花數(shù)。3. 編寫一個函數(shù),輸入整數(shù)m的全部索數(shù)因子(例如:m=120,因子為22,2,3,5。)。4. 編寫一個函數(shù),求10000以內(nèi)所有的完數(shù)(完數(shù)是指一個數(shù)正好是它的所有約數(shù)之和。例如6就是一個完數(shù),6的因子有1,2,3,并且6=1+2+3)。5. 編寫一個函數(shù),求10000以內(nèi)的所冇互滿數(shù)(如果冇兩個數(shù),每一個數(shù)的所冇 約數(shù)(除它木身以外)的和正好等于對方,則稱這兩個數(shù)為互滿數(shù))。實驗ui位運(yùn)算的綜合應(yīng)用一、實驗?zāi)康膯纹瑱C(jī)又稱為微控制器,由于其具有集成度高、功能強(qiáng)、速度快、體積小、 功耗低、使用方便、性能可靠、價格低廉等特點(diǎn),因此在工業(yè)控制、智能儀

30、器儀 表、數(shù)據(jù)采集和處理、通信系統(tǒng)、汽車工業(yè)、國防工業(yè)、家用電器等領(lǐng)域冇著十 分廣泛的應(yīng)用。位運(yùn)算在單片機(jī)、arm等硬件程序設(shè)計中有著較為廣泛的應(yīng)用,通過設(shè)計c 語言程序,模擬單片機(jī)操縱相關(guān)器件,實現(xiàn)流水燈、串行通信等效果,激發(fā)學(xué)生 學(xué)習(xí)c語言課程的熱情,使其熟練掌握位運(yùn)算知識,提高其分析問題與解決問 題的能力,以及將c語言程序設(shè)計技能運(yùn)用于專業(yè)領(lǐng)域的意識,為學(xué)生后續(xù)相 關(guān)專業(yè)課程的學(xué)習(xí)打下堅實的基礎(chǔ)。同時,通過實驗,培養(yǎng)學(xué)生的算法描述能力 以及養(yǎng)成良好的編碼風(fēng)格。二、實驗內(nèi)容1 流水燈效果模擬2 串行通信模擬三、項目分析1 流水燈效果模擬1)背景知識根據(jù)單片機(jī)的型號以及任務(wù)要求的不同,線路接

31、法會有所不同,下面以 at89s52單片機(jī)為例進(jìn)行說明。圖中,將8個led燈接在了 p2 口上,p2 口的 每個引腳對應(yīng)著一個led燈,當(dāng)p2 口有低電平輸出時,就會點(diǎn)亮相應(yīng)的led 燈,而將低電平轉(zhuǎn)為高電平后,相應(yīng)的燈會熄滅。利用這個特點(diǎn),就很容易操縱 圖中的 8 個 led 燈,如向 p2 口輸送 01100011 (即 0x63)吋,p2_0= p2_3= p2_4= p2_5=0,就會點(diǎn)亮di、d4、d5、d6。如果在暫停一段吋間后,令p2的各個位 向左或向右移位,再點(diǎn)亮相應(yīng)的燈,就會給人一種燈在流動的感覺,即所謂的流 水燈效果。-h5-ftc.tl pi 1ft2ex rip tin

32、p14f15f»0fi7tf3ri imn ip33at3 nj 少心 町少mj ; i "mpp2£ep2 1«p22zmd p2a11 p7s.v 陀qqp2cukm p2.7.'a15"jwrb p2 1eq irtr/itfn.i. ip3atop3<jrif3 owp3 7面xl2玄亠罐笑4<.tfrti2.算法分析1) 定義一數(shù)組bit用于存放p2的各位值;2) 通過宏定義定義一組p2_i,用于指向bit_p 的各個元素,將來通過對p2的操作,模擬對p2 口的各個引腳的操作;3) 定義函數(shù)void getbit(

33、uchar p),用于取得p 的各個位存入緩存buffer,然后再逆序存入bit_p;4) 定義函數(shù) void display_p_bit(),通過對 p2 的各個引腳的操作,輸出不同的字符,以模擬當(dāng)前 各個燈光的明暗效果;開始給p2賦值取得p2的位存入bit. p按位輸出燈光效果延時p2按位循環(huán)移動一位5) 定義函數(shù)delay(),用以延時;6) 在主函數(shù)中,對p2進(jìn)行循環(huán)移位,實現(xiàn)流水效果。3、程序框架及部分代碼 typedef unsigned char uchar;#define p2_i bit_pi/*定義 p2_i,通過對 p2_0、p2_l、p2_2 等的操作模擬對 p2 的各

34、個引腳的操作,如果想完成單獨(dú)對某個p2_i操作,可以通過如下宏定義來 實現(xiàn)*/#define p2_0 bit_po #define p2_l bit_pl #define p2_2 bit_p2#define p2_3 bit_p #define p2_4 bit_p4 #define p2_5 bit_p5#define p2_6 bit_p61 #define p2_7 bit_p7 */typedef unsigned char uchar;int bit_p8;void delay(int n,int m)延口寸函數(shù)void getbit(uchar p) /取得p的位,逆序存入緩存

35、buffer,然后再逆序轉(zhuǎn)存入bit_p 中void display_p_led()/通過對p2_i的操作,將p的各位對應(yīng)的燈光效果輸出到屏 幕上void display_p_bits()/將p的各個位的值輸出到屏幕上main()uchar p2=0xc6,p2_temp;/p2的值口j以修改為其他的值while(l)printf(nnnnttt流水燈模擬效果與相應(yīng)位的真實移動的展示”);printf(hnttt”);getbit(p2);printf(hnnttth);printf(n 模擬流水燈效果:”);display_p_led();printf(hntttn);printfc* p2

36、實際循環(huán)右移:n);display_p_bits();printf(nnnnn);delay(20000,50000);putchar(7);/燈光變換前聲音提示在此處自己完成實現(xiàn)p2的循環(huán)右移,清屏后進(jìn)行下一輪的輸出最終效果如卜圖所示,圖中齊個字符代表相應(yīng)的燈亮或滅,并實現(xiàn)循環(huán)亮滅的功 能。在設(shè)計時,可以對功能進(jìn)行擴(kuò)展,比如輸出選擇菜單,通過選擇不同的流水燈效 果,實現(xiàn)不同的效果展示。注:1、由于算法效率的原因,在程序執(zhí)行過程屮沒冇直接把p2的各個位輸出到 相應(yīng)引腳上,而是先存入了一個數(shù)組bit.p中,然后再從該數(shù)組中輸出,但是在 程序屮通過p2_i與bit_pi的對應(yīng)模擬了輸出p2 口的各

37、個“引腳”(各個p2_i)o 2、程序中的一些功能需自己實現(xiàn)。2、串行通信模擬背景知識:一般來說,只能接受或只能發(fā)送的稱為單工串行;既可接收又可發(fā)送, 但不能同時進(jìn)行的稱為半雙工;能同時接收和發(fā)送的串行口稱為全雙工串行口。 串行通信是指數(shù)據(jù)一位一位地按順序傳送的通信方式,其突出優(yōu)點(diǎn)是只需一根傳 輸線,可大大降低硬件成本,適合遠(yuǎn)距離通信。其缺點(diǎn)是傳輸速度較低。與單片機(jī)串行通信相關(guān)的寄存器介紹:sbuf寄存器:它是兩個在物理上獨(dú)立的 接收、發(fā)送緩沖器,可同時發(fā)送、接收數(shù)據(jù),可通過指令對sbuf的讀寫來區(qū)別 是對接收緩沖器的操作述是對發(fā)送緩沖器的操作。從而控制外部兩條獨(dú)立的收發(fā)信號線rxd (p3.

38、0)、txd (p3. 1),同時發(fā)送、接收數(shù)據(jù),實現(xiàn)全雙工。 串行口控制寄存器sco"(見表1)。sm1sm2rentb8rb8ti表屮各位(從左至右為從高位到低位)含義如下。smo和sm1 :串行口工作方式控制位。sm2 :多機(jī)通信控制位。ren :串行接收允許位:ren二0時,禁止接收;ren =1時,允許接收。tb8 :在方式2、3中,tb8是發(fā)送機(jī)要發(fā)送的第9位數(shù)據(jù)。在多機(jī)通信屮它代 表傳輸?shù)牡刂坊驍?shù)據(jù),tb8=0為數(shù)據(jù),tb8=1時為地址。rb8 :在方式2、3屮,rb8是接收機(jī)接收到的第9位數(shù)據(jù),該數(shù)據(jù)正好來自發(fā) 送機(jī)的tb8,從而識別接收到的數(shù)據(jù)特征。t1 :串行口發(fā)

39、送中斷請求標(biāo)志。當(dāng)cpu發(fā)送完一串行數(shù)據(jù)后,此時sblf寄存 器為空,碩!件使t1置1,請求中斷。cpu響應(yīng)中斷后,由軟件對t1清零。r1 :串行口接收中斷請求標(biāo)志。當(dāng)串行口接收完一幀串行數(shù)據(jù)時,此時sbuf寄 存器為滿,硬件使r1置1,請求中斷。cpu響應(yīng)中斷后,用軟件對r1清零。 算法分析:我們在模擬串行通信時,定義位段scon,將其各位與上述寄存器各 位對應(yīng)(也可以通過定義一變量unsigned char并賦值來實現(xiàn)),當(dāng)輸入要傳 輸?shù)臄?shù)據(jù)時,如果發(fā)送信息為空,則不允許發(fā)送并提示重新輸入,否則將scon. ri 置1,允許將數(shù)據(jù)按位發(fā)送到緩存,當(dāng)讀取到8位后,將scon. ri置零,然后

40、把 scon. t1置1,系統(tǒng)檢測到scon. t1為1后將數(shù)據(jù)從緩存屮按位取出,讀滿8位 后,將結(jié)果按位取出并轉(zhuǎn)成相應(yīng)字符并輸出,直到讀到最后一個字符,同時將 scon. t1置零,停止發(fā)送,進(jìn)入讀取下一個字符并發(fā)送的過程屮。效果圖如下圖 所示:信息發(fā)送過程中示意圖gfjklkggfd繼續(xù)發(fā)送宿息<°v/n->?- xca mf:chuantdebugtongxin. exe信息發(fā)送完成示意圖據(jù)卄 數(shù)kg 的kl 送fj畢發(fā)2兀 要畛心自心注:1、這一項目的目的主要是為了讓同學(xué)們進(jìn)一步熟悉掌握位運(yùn)算的應(yīng)用,以 及對串行通信的大致過程產(chǎn)生初步印彖。由于復(fù)雜性原因,該模擬過

41、程只是進(jìn)行 了部分模擬,其屮的:tk r1應(yīng)由硬件置1,軟件置0,都改為了由軟件設(shè)置; 發(fā)送和接收使用了同一個緩存;沒冇設(shè)置數(shù)據(jù)的開始位與停止位以及奇偶校驗等 位;移位脈沖shift電平的變化過程對讀取數(shù)據(jù)的控制沒有體現(xiàn)等。2、程序屮的部分代碼需自己實現(xiàn)程序框架及部分代碼如下:#include<stdio.h>#include<string.h>#define max 200typedef unsigned char uchar;struct sconunsigned smo:l;unsigned sml:l;unsigned sm2:1;unsigned ren:1

42、;unsigned tbs: 1 unsigned rb8:1;unsigned ti:1 ;unsigned ri:1;scon;void initial();void recive();void send(char * string);void delay(int njnt m);int buffer8;main()char datamax;/ffl以存儲要發(fā)送的完整信息char ch;initial();printf("w輸入要發(fā)送的數(shù)據(jù):”);while(l)gets(data);fflush(stdin);/*如果輸入的信息為空,則不允許發(fā)送,否則軟件設(shè)置scon.ri=1

43、接收開始, 接收完成后設(shè)置scon.ri=0,以停止接收*/*發(fā)送完畢后詢問是否發(fā)送,如果是則繼續(xù)輸入信息并發(fā)送,否則退出程序*/void send(char string)/*諸位發(fā)送信息,對于string的每個字符采取諸位發(fā)送的方式(諸位存入buffer), 當(dāng)發(fā)送完8位后,軟件設(shè)置scon.ti=1允許接收,當(dāng)接收完該字符的8個位后 設(shè)置scon.ti為0停止接收*/void recive()將讀取信息并最終將明文輸出到屏幕上void delay(int n,int m)延時void initial()/模擬初始化scon寄存器的各個位scon.smo=0; scon.sm1=1;sco

44、n.sm2=0; scon.ren=1;scon.rb8=0; scon.tb8=0;scon.ri=0; scon.ti=0;四、實驗練習(xí)1編程實現(xiàn)取一個整數(shù)number從右端開始的第2-5位。例如numbei*=217,其二 進(jìn)制形式為11011001,其2-5位為1100即十進(jìn)制的12;2定義unsigned int data ,修改其指定的某幾位,其余位保持不變;3對于上題中的data,程序隨機(jī)產(chǎn)生一隨機(jī)數(shù)temp,接下來程序修改data的第 temp位,其余不變,然后將修改后的結(jié)果輸岀;4. 編程模擬實現(xiàn)八個中的一個led燈點(diǎn)亮,然后左循環(huán)四次后右循環(huán)三次;5. 編程模擬實現(xiàn)一個le

45、d亮,閃爍三次,再循環(huán)到下個燈再閃爍三次,依此下 去;6. 通過對p2賦值,實現(xiàn)點(diǎn)亮八個led燈中的左數(shù)第2、4、7三個,然后這三 個燈熄滅,其余五個燈點(diǎn)亮,如此重復(fù)若干次;(提示:利用按位取反進(jìn)行操作) 7串行通信項目中的接收信息是在send函數(shù)里面調(diào)用recive實現(xiàn)的,修改上面的 程序,實現(xiàn)將所冇信息按位發(fā)送出去后,再曲函數(shù)recive按位接收并輸出結(jié)果。 即在主函數(shù)中的調(diào)用順序為:send(); recive();實驗五數(shù)據(jù)文件的處理一、實驗?zāi)康? 掌握文件和文件指針的概念以及文件的定義方法;2掌握文件打開、關(guān)閉、讀、寫等文件操作函數(shù);3掌握對文件的建立,以及對文件的基本操作。二、實驗

46、內(nèi)容建立一個班級的學(xué)生情況表,表中數(shù)據(jù)項應(yīng)該包括學(xué)號、姓名、百分制記分的三 門課程的成績(離散數(shù)學(xué)、數(shù)據(jù)結(jié)構(gòu)、程序設(shè)計語言)。具體內(nèi)容包括:(1) 從鍵盤輸入以上數(shù)據(jù),計算出平均成績,將原冇數(shù)據(jù)和計算出的平均分?jǐn)?shù)存放在 磁盤文件“stu_list”中;(2)將文件“stu_list”中的學(xué)生數(shù)據(jù),按平均分進(jìn)行 排序處理,將已排序的學(xué)生數(shù)據(jù)存入一個新文件ustu_sort"中;(3)向文件 "stu_sort"中插入一個學(xué)生的3門課成績,先計算新插入學(xué)生的平均成績,然 后將它按成績高低順序插入,插入后建立一個新文件。三、分析1 定義學(xué)生結(jié)構(gòu)體;2 定義學(xué)生數(shù)組;3.

47、 從鍵盤輸入一組學(xué)生信息到數(shù)組中;4. 將學(xué)生數(shù)組保存到文件ustu_list”文件中;5. 將文件“stuist”中的數(shù)據(jù)讀取到數(shù)組中;6按平均分對學(xué)生數(shù)組進(jìn)行排序,將排序后的學(xué)生數(shù)組保存到文件“stu_sort”文 件中;7 .添加一個學(xué)生到數(shù)組末尾;8調(diào)用排序函數(shù)根據(jù)平均分進(jìn)行重新排序,將排序后的數(shù)組保存到“sui_sort2” 文件中;四、算法描述1學(xué)生結(jié)構(gòu)體的定義,主要成員包括:學(xué)生的學(xué)號、姓名、三門課程成績及平均分。2定義學(xué)生結(jié)構(gòu)體類型的一維數(shù)組,用來存儲多條學(xué)生記錄;3定義input()子函數(shù),完成學(xué)生學(xué)號、姓名、課程成績的輸入并計算平均分。4. 定義save(char*file

48、name)子函數(shù),保存學(xué)生數(shù)組到文件中。5. 定義read(char*filename)子函數(shù),讀取文件到學(xué)生數(shù)組中。6. 定義print。子函數(shù),輸出所冇學(xué)生。7定義sort()子函數(shù),對學(xué)生數(shù)組按平均分進(jìn)行排序。&定義add()子函數(shù),添加一個學(xué)生到數(shù)組末尾。五、程序#include <stdio.h>/*定義結(jié)構(gòu)體*/*定義結(jié)構(gòu)體學(xué)生數(shù)組*/*函數(shù)原型*/void input();void save(char*filename);void read(char*filename);void print();void sort();void add();void main

49、()input();save(nstu_list.dat");printf("文件保存成功n“);read("stu_list.datn);printf(”文件讀取成功,以下為讀取的內(nèi)容:n”);print。;printf(”將要進(jìn)行排序n”);sort();printf(”排序結(jié)結(jié)束,排序后的結(jié)果如下:nh);print();save(nstu_sort.datn);printf(hrt序后的數(shù)據(jù)已經(jīng)保存到文件n”);/*添加學(xué)生,然后再排序*/*從鍵盤輸入一個學(xué)生*/void inputone(struct student * s)/*輸入一組學(xué)生信息到數(shù)組中

50、*/void input()/*保存學(xué)生數(shù)組到文件中*/void save(char*filename)/*讀取文件到學(xué)生數(shù)組中*/void read(char*filename)/*輸出一個學(xué)生*/void printone(struct student * s)/*輸出所有學(xué)生*/void print()/*對學(xué)生數(shù)組排序*/void sort()/*添加一個學(xué)生到數(shù)組末尾*/void add()實驗六數(shù)值計算一、實驗?zāi)康耐ㄟ^c語言程序設(shè)計,結(jié)合數(shù)學(xué)專業(yè)相關(guān)知識,實現(xiàn)-些數(shù)值計算問題的求解,提高學(xué)生分析問題與解決問題的能力,以及將c語言程序設(shè)計技能運(yùn)用于專業(yè)領(lǐng)域的意識。通過實驗過程,培養(yǎng)學(xué)

51、生的算法描述能力以及養(yǎng)成良好的編碼風(fēng) 格。二、實驗內(nèi)容1利用數(shù)值概率算法進(jìn)行求值:1)求圓周率龍的近似值;2)求在積分區(qū)間上的定積分。2. 利用遞推化梯形等方法求定積分;3. 哥德巴赫猜想的近似證明。三、算法思想1 利用數(shù)值概率算法進(jìn)行求值1)求闘周率兀的近似值背景知識:向第一象限內(nèi)的正方形內(nèi)任意投點(diǎn),隨機(jī)點(diǎn)落入1/4圓中的概率為1/4圓與第一象限內(nèi)正方形面積之比,因此概率的四倍即為兀的近似值。主要代碼:double getpi(long int n)long int count=0;float x,y;int i=0;while(i<n)x=random(101);y=random(1

52、01);if(xa2+ya2<=10000)cont+;i+;return 4.0* cont/n;2)求在積分區(qū)間上的定積分背景知識:如果被積函數(shù)在積分區(qū)間上不小于(), 則向矩形內(nèi)隨機(jī)投點(diǎn),點(diǎn)落入曲邊梯形的概率即為曲邊梯形的面積與矩形的面積之比。由此得到ds曲邊梯形/g勺點(diǎn)一 z- 丁»矩形矩形所以:f / (兀)d兀=s矩形 p投點(diǎn)其中,矩形的面積通過求被積函數(shù)在積分區(qū)間上的最大值(利用微分中值定理 相關(guān)理論)來求得;如果被積函數(shù)在積分區(qū)間上有的部分小于0,則求其絕對值 后再求解。主要代碼:double put_point(long int n)double x,y;lo

53、ng int i,count=0;srand(unsigned)time(null);for(i=0;i<n;i+)/*隨機(jī)投點(diǎn),如果點(diǎn)落入曲邊梯形內(nèi)就累加count*/return (double)count/n;2. 利用遞推化梯形等方法求定積分知識背景:根據(jù)定積分的幾何意義(右圖)知,函數(shù) 的定積分的值等于圖中曲邊梯形的面積。連接函數(shù)曲線的兩個端點(diǎn),得到梯形,其面積t二牛紅廣)+ /("),用它近似代替£ fx)dx 誤差較大,將區(qū)間a,b等分為2,分別為a, 晉出,b,在兩區(qū)間上分別使用計算兩相應(yīng)梯形面積得到兩梯形面積z和:/(二一) + /(d)弘)+ 2/

54、(寧)+蝕將a,bri等分,共有n+1個分點(diǎn),x嚴(yán)a + kh,其中h二上衛(wèi),k=0,l,2, 用7;表示等分后梯形面積的總和,貝吊:丁2tfl+-xf(xk+xk'1)2 2 k=q 2在求積分時,當(dāng)t2n-tn<e時結(jié)束,其中e為積分糟度。主要代碼:double fun_result(double x)被積函數(shù)求值函數(shù) double sum_result(double a,double b,double e)/a> b 為積分上、下限,e 為精度 double tl=0,t2=0,s=0,h,x;int flag;h=b-a;tl=h/2*(fun_result(a)+ fun_result(b);dos=0;x

溫馨提示

  • 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

提交評論