版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、5.3 自定義函數(shù)5.2 規(guī)范函數(shù)5.1 函數(shù)概述5.4 函數(shù)與數(shù)組的運用實例 5.5 遞歸算法與遞歸函數(shù) 第5章 程序的組織構造 5.1 函數(shù)概述構造化程序設計方法的中心是自頂向下,逐漸求精,詳細的實現(xiàn)戰(zhàn)略是將復雜的問題逐漸分解成相對簡單的子問題,這樣將有利于降低處理問題的難度,提高程序開發(fā)的效率。將一個問題分解成假設干個子問題的過程稱為模塊化。 在C程序中,模塊用函數(shù)實現(xiàn)。函數(shù)是構成C程序的根本單位。它由函數(shù)首部和函數(shù)體兩個部分組成,函數(shù)首部包含函數(shù)的前往類型、函數(shù)稱號和參數(shù)表的聲明,函數(shù)體包含實現(xiàn)特定功能所需求執(zhí)行的語句序列。 5.2 規(guī)范函數(shù)C言語提供了很多規(guī)范函數(shù),它們被放置在一同,
2、構成了一個規(guī)范函數(shù)庫。 函數(shù)原型 函數(shù)原型是指不包含函數(shù)體的函數(shù)聲明。 C言語規(guī)定,一切的函數(shù)必需先定義后調用。對于規(guī)范函數(shù)而言,由于它們的定義曾經在C言語提供的規(guī)范函數(shù)庫中,所以,人們在調用它們的時候,只需求在程序的前面利用編譯預處置命令include將相應的函數(shù)原型參與到程序中就可以了。例1:根據(jù)給定的兩個坐標點x1,y1和x2,y2,計算兩點之間的間隔。 問題分析計算兩點之間間隔的公式為 d=在這個公式中含有平方和開平方的運算,可以直接利用C言語提供的規(guī)范函數(shù)實現(xiàn)這兩個運算。 算法描畫 #include #include main( ) int x1, y1, x2, y2; doubl
3、e distance; printf(nEnter 2 coordinates(x1,y1,x2,y2)n); scanf(%d%d%d%d, &x1, &y1, &x2, &y2); printf(nThe first coordinate is (%d,%d), x1, y1); printf(nThe second coordinate is (%d,%d), x2, y2); distance = sqrt(pow(x2-x1, 2) + pow(y2-y1, 2); printf(nThe distance is %f, distance); 程序代碼例2:擲骰子游戲。骰子是一個有六
4、個面的正方體,每個面分別印有16之間的小圓點代表點數(shù)。假設這個游戲的規(guī)那么是:兩個人輪番擲骰子6次,并將每次投擲的點數(shù)累加起來。點數(shù)多者獲勝;點數(shù)一樣平局。請編寫程序,模擬這個游戲的過程,并給出玩100盤之后,誰是最終的獲勝者。 隨機數(shù)的產生及運用實例 問題分析由于每個人擲骰子所得到的點數(shù)是隨機的,所以需求借助隨機數(shù)發(fā)生器,每次產生一個16之間的整數(shù),以此模擬玩者擲骰子的點數(shù)。為了計算在每盤中,甲、乙兩人所擲的點數(shù),需求定義兩個int型變量d1,d2,用于作為記錄每個人投擲點數(shù)的累加器。為了記錄每個人的獲勝盤數(shù),需求再定義兩個int型變量c1,c2,用于記錄每個人獲勝的盤數(shù)。算法描畫 #inc
5、lude #include main() int d1, d2, c1, c2, i, j; c1 = c2 = 0; /* 初始化 */ randomize( ); /* 初始化隨機數(shù)產生器 */ for (i=1; i=100; i+) /* 模擬游戲過程 */ d1 = d2 = 0; for (j=1; jd2) c1+; /* 累加獲勝盤數(shù) */ else if (d1c2) /* 輸出最終獲勝者信息 */ printf(nThe first win.); else if (c1c2) printf(nThe second win.); else printf(They tie.);
6、程序代碼5.3 自定義函數(shù) 函數(shù)的定義 根本格式 ; 例: double distance(int x, int y) double d; d = sqrt(x*x+y*y); return d; C言語規(guī)定,一個函數(shù)可以有前往值,也可以沒有前往值。假設有前往值,前往值的類型在函數(shù)名前聲明,并在函數(shù)體中利用return 語句將前往值前往;假設沒有前往值,在函數(shù)名前聲明void。默許的前往類型是int。 函數(shù)名不但應該符合C言語的自定義標識符命名規(guī)范,還應該“見名知意。參數(shù)表是函數(shù)之間交換信息的接口。既可以經過它將外界的數(shù)據(jù)傳送給函數(shù),也可以經過它將函數(shù)的操作結果帶出函數(shù)。假設方式參數(shù)屬于一維數(shù)
7、組類型,無須指出一維數(shù)組的元素個數(shù)。函數(shù)體是函數(shù)的中心部分,在這里列出了需求執(zhí)行的語句序列。 函數(shù)的調用 函數(shù)調用語句的根本格式為: ;真實參數(shù)與方式參數(shù)的數(shù)據(jù)類型和個數(shù)一一對應。 函數(shù)的前往值在聲明函數(shù)的時候,函數(shù)名前運用了保管字void,闡明這個函數(shù)沒有前往值;否那么,這個函數(shù)執(zhí)行終了后,應該前往一個相應類型的數(shù)值。 return 表達式;參數(shù)的傳送 定義函數(shù)時所給的參數(shù)被稱為方式參數(shù),這是由于當函數(shù)沒有處于執(zhí)行形狀時,系統(tǒng)并不為這些參數(shù)分配存儲空間,換言之,這些參數(shù)此時并不存在,只是用來闡明在調用這個函數(shù)時需求在這個位置向函數(shù)提供的數(shù)據(jù)類型,因此,在調用函數(shù)之后,參數(shù)傳送需求閱歷兩個根本
8、步驟:首先,根據(jù)方式參數(shù)的聲明格式,為每一個方式參數(shù)分配存儲空間;然后再將真實參數(shù)的值賦給對應的方式參數(shù)。 例3:輸出乘法口訣表。乘法口訣表又被稱為“九九表,是一種小學生在學習乘法運算時需求熟背的一個口訣表。它是一個9行9列的二維表格,加上一個行標題和一個列標題,顯示出來應該是10行10列。自定義函數(shù)的運用實例 問題分析行與行之間可以采用假設干個“=或“-字符表示表格之間的線段,為此,可以定義一個函數(shù),專門用來延續(xù)地顯示假設干個字符,以防止在每次需求顯示線段的時候,都反復地書寫相應的語句序列。 #include void drawLine(int n,char ch); /* 延續(xù)顯示n個ch
9、字符 */main() int i,j; printf(n 9.9 tablen); /* 顯示表名 */ drawLine(30, =); /* 顯示每列的標題 */ printf(n 1 2 3 4 5 6 7 8 9); drawLine(30, =); for (i=1; i=9; i+) /* 顯示每行的內容 */ printf(n%3d, i); for (j=1; j=9; j+) printf(%3d, i*j); if (i9) drawLine(30, -); else drawLine(30, =); void drawLine(int n, char ch) /*延續(xù)顯
10、示n個ch字符*/ int i; putchar(n); /*換行*/ for (i=1; i=n; i+) putchar(ch); /*延續(xù)顯示n個字符ch*/ 例4:計算要求準確度到達10-6。 問題分析在這個公式中,第i項的分子是xi;分母是i!。為了便于計算每一項的數(shù)值,設計了兩個函數(shù)power( )和factorial( ) 分別用來完成計算xi和i!的義務。另外,為了更好地表達模塊化的設計思緒,再設計一個函數(shù)e( ) 用于計算ex。 算法描畫 #include long power(int x, int y);long factorial(int n);double e(int
11、x);main( ) int x; printf(nEnter x:); scanf(%d, &x); printf(ne%d=%f, x, e(x);long power(int x, int y) /* 計算xy */ long p = 1; int i; for (i=1; i=y; i+) p = p*x; return p;程序代碼long factorial(int n) /* 計算n! */ int i; long f = 1; for (i=2; i= 1E-6 ); /* 精度的檢查 */ return result;程序代碼5.4函數(shù)與數(shù)組的運用實例 計算最長文本行 所謂文
12、本行是指以換行符n作為終了標志的文本序列。 例5:從鍵盤輸入一組文本行,求出最長行并且輸出。 問題分析從問題的求解要求可知,沒有必要保管輸入的一切文本行。只需保管曾經輸入各行中的最長行,以及剛輸入的當前行。設計一個專門用于計算最長文本行的函數(shù)void readline(char maxline )。其實現(xiàn)過程為:一邊輸入文本行保管于數(shù)組line、一邊與當前最長的文本行長度進展比較。假設新輸入的文本行更長,那么更新記錄最長文本行的信息,最后得到的最長文本行將經過參數(shù)帶出去。算法描畫 #include #include void readline(char maxline );main() cha
13、r maxline80=; readline(maxline);/* 輸入并計算最長行 */ printf(nThe longest line is:n); puts(maxline);/* 輸出最長行 */程序代碼void readline(char maxline ) /* 輸入并計算最長文本行 */ char line80; int maxlength; int n; maxlength=0; /*初始化*/ line0=0; printf(nEnter text lines:n); do gets(line); /*輸入文本行*/ n = strlen(line); if (nstrl
14、en(maxline) /*與記錄的最長文本行進展比較*/ maxlength = n; /*更新記錄最長文本行的信息*/ strcpy(maxline, line); while (n0);程序代碼冒泡排序為了便于查找、統(tǒng)計,排序是一種經常需求進展的操作。排序的方法有很多種,上一章中引見的簡單項選擇擇排序是一種基于選擇手段實現(xiàn)的排序方法。冒泡排序的根本思緒是不斷地將一切相鄰數(shù)據(jù)進展比較,假設前面的數(shù)據(jù)大于后面的數(shù)據(jù)ajaj+1,就將兩個位置的數(shù)據(jù)進展交換,最終實現(xiàn)將一切的數(shù)據(jù)按照非遞減的順序重新陳列的目的。 問題分析將整個待排序的數(shù)據(jù)序列劃分成有序區(qū)域和無序區(qū)域。初始形狀有序區(qū)域為空,無序區(qū)
15、域包括一切待排序的數(shù)據(jù)。對無序區(qū)域從前向后依次對相鄰的兩個數(shù)據(jù)進展比較,假設逆序那么將其交換,從而使得較小的數(shù)據(jù)像泡沫一樣“飄浮向前,較大的數(shù)據(jù)“下沉向后。每經過一趟冒泡排序,都會使無序區(qū)域中的最大數(shù)據(jù)進入有序區(qū)域。假設有n個數(shù)據(jù)等待排序,那么最多經過n-1趟冒泡排序就可以將一切的數(shù)據(jù)陳列好。 例6:冒泡排序。 算法描畫 #include #include #define NUM 10void input(int value ); void output(int value );void sort(int value );main( ) int valueNUM; /* 存儲待排序的數(shù)據(jù)數(shù)列
16、*/ input(value); output(value); sort(value); output(value);void input(int value ) /* 輸入待排序數(shù)據(jù) */ int i; printf(nEnter %d integers:,NUM); for (i=0; iNUM; i+) scanf(%d, &valuei);程序代碼void output(int value ) /* 輸出顯示數(shù)據(jù)數(shù)列 */ int i; printf(n); for (i=0; i=1; i-) /* 控制排序趟數(shù) */ for (j=0; jvaluej+1) /* 假設兩個相鄰數(shù)據(jù)
17、逆序,交換 */ temp = valuej; valuej = valuej+1; valuej+1 = temp; 程序代碼5.5 遞歸算法與遞歸函數(shù) 概述n!其含義為1234(n-1) n。從這個數(shù)學公式中可以發(fā)現(xiàn), n!等于n與n-1!的乘積。即將計算n! 的過程分解成n與n-1!的乘積;這樣分解的子問題除了n的值以外,與原問題具有一樣的特征,所以求解子問題的根本方法與求解整個問題所采用的方法一樣。具有這種特征的求解算法被稱為遞歸算法, 實現(xiàn)階乘遞歸算法的遞歸函數(shù) long fact(int n) if (n=0) return 1;else return n* fact(n-1);
18、y=fact(3) 3*fact(2)2*fact(1)1*fact(0)111*112*123*26遞歸函數(shù)的調用過程 問題分析處理這個問題似乎有些復雜,但采用遞歸方式就簡單多了。3個數(shù)的全陳列是每個數(shù)輪番充任一次第一個數(shù),再加上后面n-1個數(shù)的全陳列,而求解n-1個數(shù)的全陳列方法與求解n個數(shù)的全陳列方法完全一樣,因此,可以設計一個遞歸函數(shù),實現(xiàn)求n個數(shù)全陳列的操作。思索到每次遞歸過程中,將針對n個數(shù)據(jù)進展陳列,而這些數(shù)據(jù)來自同一數(shù)據(jù)序列,故設置數(shù)組保管數(shù)據(jù)序列,以數(shù)組名和數(shù)據(jù)個數(shù)作為函數(shù)的參數(shù)。 例7:求解n個數(shù)據(jù)的全陳列。#include #define NUM 3void anagra
19、m(int , int);void print(int );main( ) int dNUM; int i; for (i=0; i=0; i-) printf(%d ,di); 程序代碼void anagram(int d , int n) /* 求解n的全陳列 */ int i, j, temp; if (n=1) /* n=1直接輸出 */ print(d); return; for (i=0; in; i+) anagram(d, n-1);/* 對后面n-1個數(shù)全陳列 */ temp = d0; /* 輪換第一個位置的數(shù) */ for (j=1; j=n-1; j+) dj-1 =
20、dj;/* 將每個數(shù)據(jù)向前移 */ dn-1 = temp; 程序代碼用遞歸函數(shù)實現(xiàn)二分查找二分查找的問題,它是對有序數(shù)列進展查找操作的一種有效方法。實踐上,這種查找方法是一個遞歸的過程。 問題分析二分查找也是信息處置中常用的一個算法。為了提高這個算法的重用性,單獨設置一個函數(shù)來實現(xiàn)該算法是適當?shù)摹6植檎宜惴梢悦璁嫗椋横槍σ粋€曾經從小到大排序的數(shù)據(jù)序列,用給定數(shù)據(jù)key與查找區(qū)間中央位置的數(shù)據(jù)比較,假設相等那么闡明查找勝利;否那么,假設key比中央位置的數(shù)據(jù)小,那么在前半個區(qū)間用同樣的方法繼續(xù)查找;否那么在后半個區(qū)間用同樣的方法繼續(xù)查找。因此,這是一個遞歸的過程。當查找區(qū)間的長度為0時,闡
21、明查找不勝利。 例8:采用遞歸方式實現(xiàn)二分查找。 #include #include #define NUM 10void input(int value );void output(int value );int search(int value , int key, int low, int high);main( ) int valueNUM, result, key; input(value); /* 輸入有序序列 */ output(value); /* 輸出有序數(shù)列 */ printf(nEnter a key:); /* 輸入待查找的數(shù)值 */ scanf(%d, &key);
22、result = search(value, key, 0, NUM-1); /* 調用二分查找函數(shù)進展查找 */ if (result!=-1) /* 輸出查找結果 */ printf(nThe %d is the %dth element, key, result); else printf(nFail to find %d, key);程序代碼void input(int value ) /* 創(chuàng)建有序數(shù)列 */ int i; for (i=0; iNUM; i+) scanf(%d, &valuei);void output(int value ) /* 輸出數(shù)列 */int i;pr
23、intf(n);for (i=0; ihigh) return -1;/* 查找區(qū)間為空 */ mid = (low+high)/2;/* 求中間位置 */ if (valuemid=key)return mid;/* 得到查找的數(shù)據(jù)位置 */ if (keyvaluemid) return search(value, key, low, mid-1);/* 在下半?yún)^(qū)查找 */ else return search(value, key, mid+1, high);/* 在上半?yún)^(qū)查找 */ 程序代碼變量的生存期與作用域變量是存儲空間在程序中的一種表示,它承當著存儲操作數(shù)據(jù)和結果的重擔,是程序中不可短少的主要元素。C言語規(guī)定,每個變量必需先定義后援用。人們將變量占據(jù)存儲空間的時間稱為變量的生存期,將變量可以援用的區(qū)域稱為變量的作用域。從作用域角度劃分全局變量:在函數(shù)外部定義的變量被稱為全局變量。部分變量:在函數(shù)內部定義的變量,包括參數(shù)表中定義的方式參數(shù)被稱為部分變量。 在復合語句中定義的變量被稱為塊變量。 生存期在復合語句中定義的變量,其生存期為所在的復合語句塊中。 在函數(shù)內部和方式參數(shù)表中定義的變量都屬于部分變量。作用域是定義這些變量的函數(shù)。全局變量的生存期是定義這個變量的程序文件,作用域是從定義處開場到程序文件的終了處為止。假設程序文件中的某些部分變量與之同名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新能源汽車動力電池回收利用合同范本4篇
- 2024食用菌種植基地環(huán)境保護與生態(tài)修復合同3篇
- 2024版美容院產品購銷合同
- 2025年度商業(yè)地產項目租賃收益分成合同范本4篇
- 編制加油站生產建設項目可行性研究報告編制說明
- 2025年綠色建筑裝修垃圾清運及節(jié)能減排合同2篇
- 2025年度個人樓房房買賣合同標準范本下載4篇
- 2025年社區(qū)商業(yè)綜合體商鋪租賃管理協(xié)議3篇
- 2025年版影視作品版權轉讓合同范本3篇
- 2025年度個人股東股權轉讓協(xié)議范本全面規(guī)范股權轉讓手續(xù)2篇
- 2024年09月2024興業(yè)銀行總行崗測評筆試歷年參考題庫附帶答案詳解
- 山東省煙臺市招遠市2024-2025學年九年級上學期期末考試英語(筆試)試題(含答案)
- 2025年安徽銅陵市公安局第二批輔警招聘158人歷年高頻重點提升(共500題)附帶答案詳解
- 駱駝祥子讀書筆記一至二十四章
- 急診科輸液的規(guī)律護理
- 商會年會策劃方案范例(3篇)
- 2022年公務員多省聯(lián)考《申論》真題(安徽C卷)及答案解析
- 【高考語文】2024年全國高考新課標I卷-語文試題評講
- 大型活動保安培訓
- 中心食堂(蔬菜類、豆制品、畜肉、禽肉類、水產類) 投標方案(技術方案)
- 信息系統(tǒng)運維服務類合同6篇
評論
0/150
提交評論