Lect_fchap10_函數(shù)與程序結(jié)構(gòu)_第1頁(yè)
Lect_fchap10_函數(shù)與程序結(jié)構(gòu)_第2頁(yè)
Lect_fchap10_函數(shù)與程序結(jié)構(gòu)_第3頁(yè)
Lect_fchap10_函數(shù)與程序結(jié)構(gòu)_第4頁(yè)
Lect_fchap10_函數(shù)與程序結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩58頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Chap 10 函數(shù)與程序結(jié)構(gòu)函數(shù)與程序結(jié)構(gòu)本章要點(diǎn)本章要點(diǎn)n多個(gè)函數(shù)的組織多個(gè)函數(shù)的組織n函數(shù)嵌套調(diào)用函數(shù)嵌套調(diào)用n函數(shù)遞歸調(diào)用函數(shù)遞歸調(diào)用n宏宏n多文件模塊多文件模塊10.1 圓形體積計(jì)算器圓形體積計(jì)算器 10.2 漢諾塔問(wèn)題漢諾塔問(wèn)題 10.3 長(zhǎng)度單位轉(zhuǎn)換長(zhǎng)度單位轉(zhuǎn)換 10.4 大程序構(gòu)成大程序構(gòu)成n使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜問(wèn)題使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜問(wèn)題把大問(wèn)題分解成若干小問(wèn)題,小問(wèn)題再進(jìn)一步分解把大問(wèn)題分解成若干小問(wèn)題,小問(wèn)題再進(jìn)一步分解寫程序時(shí),用寫程序時(shí),用main()解決整個(gè)問(wèn)題,它調(diào)用解決小問(wèn)解決整個(gè)問(wèn)題,它調(diào)用解決小問(wèn)題的函數(shù)題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更

2、小問(wèn)題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問(wèn)題的函數(shù)從而形成函數(shù)的從而形成函數(shù)的嵌套調(diào)用嵌套調(diào)用10.1 圓形體積計(jì)算器圓形體積計(jì)算器 main( )函數(shù)函數(shù)1函數(shù)函數(shù)2函數(shù)函數(shù)m函數(shù)函數(shù)1_1函數(shù)函數(shù)1_2函數(shù)函數(shù)m_1函數(shù)函數(shù)m_n程序結(jié)構(gòu)程序結(jié)構(gòu)例例10-1 設(shè)計(jì)程序,計(jì)算常用圓形體體積:設(shè)計(jì)程序,計(jì)算常用圓形體體積: 輸入輸入1、2或或3,分別選擇計(jì)算球體、圓柱體、,分別選擇計(jì)算球體、圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。分析:分析:輸入輸入1、2、3選擇計(jì)算選擇計(jì)算3種體積,輸入其他結(jié)束種體積,輸入其他結(jié)束設(shè)計(jì)一個(gè)控制函數(shù)設(shè)計(jì)一個(gè)控制函數(shù)c

3、al(),辨別圓形體的類型,再辨別圓形體的類型,再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的設(shè)計(jì)單獨(dú)的3個(gè)函數(shù)計(jì)算不同圓形體的體積個(gè)函數(shù)計(jì)算不同圓形體的體積10.1.1 程序解析程序解析-計(jì)算常用圓形體體計(jì)算常用圓形體體積積嵌套調(diào)用嵌套調(diào)用3層結(jié)構(gòu),層結(jié)構(gòu),5個(gè)函數(shù)個(gè)函數(shù)降低程序的構(gòu)思、編寫、調(diào)試的復(fù)雜度降低程序的構(gòu)思、編寫、調(diào)試的復(fù)雜度可讀性好可讀性好程序結(jié)構(gòu)程序結(jié)構(gòu)main( )cal ( )vol_ball ( )vol_cylind ( )vol_cone ( )例例10-1源程序源程序#define PI 3.141592654void c

4、al ( int sel ); int main(void) int sel; while( 1 ) printf( 1-計(jì)算球體體積計(jì)算球體體積n); printf( 2-計(jì)算圓柱體積計(jì)算圓柱體積n); printf( 3-計(jì)算圓錐體積計(jì)算圓錐體積n); printf( 其他其他-退出程序運(yùn)行退出程序運(yùn)行n); printf( 請(qǐng)輸入計(jì)算命令:請(qǐng)輸入計(jì)算命令: ); scanf(%d,&sel); if (sel 3) break; /* 輸入非輸入非13,循環(huán)結(jié)束,循環(huán)結(jié)束 */ else cal (sel );/* 輸入輸入13,調(diào)用,調(diào)用cal() */ return 0;/*

5、 常用圓形體體積計(jì)算器的主控函數(shù)常用圓形體體積計(jì)算器的主控函數(shù) */void cal ( int sel ) double vol_ball(void ); double vol_cylind(void ); double vol_cone(void ); switch (sel) case 1: printf(球體積為:球體積為:%.2fn, vol_ball( );break; case 2: printf(圓柱體積為:圓柱體積為:%.2fn, vol_cylind( ) );break; case 3: printf(圓錐體積為:圓錐體積為:%.2fn, vol_cone( ) );br

6、eak;/* 計(jì)算球體體積計(jì)算球體體積 V=4/3*PI*r*r*r */double vol_ball( ) double r ; printf(請(qǐng)輸入球的半徑:請(qǐng)輸入球的半徑:); scanf(%lf,&r); return(4.0/3.0*PI*r*r*r);/* 計(jì)算圓柱體積計(jì)算圓柱體積 V=PI*r*r*h */double vol_cylind( ) double r , h ; printf(請(qǐng)輸入圓柱的底圓半徑和高:請(qǐng)輸入圓柱的底圓半徑和高:); scanf(%lf%lf,&r,&h); return(PI*r*r*h);/* 計(jì)算圓錐體積計(jì)算圓錐體積

7、V=h/3*PI*r*r */double vol_cone( ) double r , h ; printf(請(qǐng)輸入圓錐的底圓半徑和高:請(qǐng)輸入圓錐的底圓半徑和高:); scanf(%lf%lf,&r,&h); return(PI*r*r*h/3.0);10.1.2 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用n順序調(diào)用順序調(diào)用int main(void) y = fact(3); z = mypow(3.5, 2); double fact(int n) double mypow(double x, in n) mainfactmypowmainfactmypown嵌套調(diào)用嵌套調(diào)用int m

8、ain(void) cal (sel); void cal (int sel) vol_ball() double vol_ball( ) maincalvol_ballmaincalvol_ball10.1.2 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用例例10-1 分析分析int main(void) cal (sel);void cal (int sel) vol_ball(); vol_cylind(); vol_cone();double vol_ball( ) double vol_cylind( ) double vol_cone( ) main( )cal ( )vol_ball ( )vo

9、l_cylind ( )vol_cone ( )n一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)稱為函數(shù)的一個(gè)函數(shù)中調(diào)用另一個(gè)函數(shù)稱為函數(shù)的嵌套調(diào)嵌套調(diào)用用。如:函數(shù)如:函數(shù)A調(diào)用函數(shù)調(diào)用函數(shù)B,函數(shù)函數(shù)B再調(diào)用函數(shù)再調(diào)用函數(shù)C,具有嵌套調(diào)用函數(shù)的程序,需要:具有嵌套調(diào)用函數(shù)的程序,需要:n分別定義多個(gè)不同的函數(shù)體分別定義多個(gè)不同的函數(shù)體n每個(gè)函數(shù)體完成不同的功能每個(gè)函數(shù)體完成不同的功能n合起來(lái)可解決復(fù)雜的問(wèn)題。合起來(lái)可解決復(fù)雜的問(wèn)題。10.1.2 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用n限制函數(shù)的長(zhǎng)度。限制函數(shù)的長(zhǎng)度。一個(gè)函數(shù)語(yǔ)句數(shù)不宜過(guò)多。一個(gè)函數(shù)語(yǔ)句數(shù)不宜過(guò)多。n避免函數(shù)功能間的重復(fù)。避免函數(shù)功能間的重復(fù)。對(duì)于多處使用

10、的同一個(gè)操作,應(yīng)將其封裝成一個(gè)獨(dú)立的函數(shù)。對(duì)于多處使用的同一個(gè)操作,應(yīng)將其封裝成一個(gè)獨(dú)立的函數(shù)。n減少全局變量的使用。減少全局變量的使用。應(yīng)采用定義局部變量作為函數(shù)的臨時(shí)工作單元應(yīng)采用定義局部變量作為函數(shù)的臨時(shí)工作單元使用參數(shù)和返回值作為與外部的數(shù)據(jù)交換方式。使用參數(shù)和返回值作為與外部的數(shù)據(jù)交換方式。只有當(dāng)確實(shí)需要多個(gè)函數(shù)共享的數(shù)據(jù)時(shí),才定義其為全局變量。只有當(dāng)確實(shí)需要多個(gè)函數(shù)共享的數(shù)據(jù)時(shí),才定義其為全局變量。函數(shù)設(shè)計(jì)時(shí)應(yīng)注意的問(wèn)題函數(shù)設(shè)計(jì)時(shí)應(yīng)注意的問(wèn)題10.2 漢諾塔問(wèn)題漢諾塔問(wèn)題10.2.1 漢諾漢諾(Hanoi)塔問(wèn)題解析塔問(wèn)題解析 將將64 個(gè)盤從座個(gè)盤從座A搬到座搬到座B(1) 一次

11、只能搬一個(gè)盤子一次只能搬一個(gè)盤子(2) 盤子只能插在盤子只能插在A、B、C三個(gè)桿中三個(gè)桿中(3) 大盤不能壓在小盤上大盤不能壓在小盤上 A B C遞歸函數(shù)遞歸函數(shù)分析分析 A B C分析分析 A B C A B Cnn-1n-1分析分析 A B C A B Cn10.2.1 漢諾漢諾(Hanoi)塔問(wèn)題解析塔問(wèn)題解析n遞歸方法的兩個(gè)要點(diǎn)遞歸方法的兩個(gè)要點(diǎn)(1)遞歸出口:一個(gè)盤子的解決方法;)遞歸出口:一個(gè)盤子的解決方法;(2)遞歸式子:如何把搬動(dòng))遞歸式子:如何把搬動(dòng)64個(gè)盤子的問(wèn)題簡(jiǎn)個(gè)盤子的問(wèn)題簡(jiǎn)化成搬動(dòng)化成搬動(dòng)63個(gè)盤子的問(wèn)題。個(gè)盤子的問(wèn)題。n把漢諾塔的遞歸解法歸納成三個(gè)步驟:把漢諾塔的遞

12、歸解法歸納成三個(gè)步驟:n-1個(gè)盤子從座個(gè)盤子從座A搬到座搬到座C第第n號(hào)盤子從座號(hào)盤子從座A搬到座搬到座Bn-1個(gè)盤子從座個(gè)盤子從座C搬到座搬到座B算法:算法:hanio(n個(gè)盤,個(gè)盤,AB, C為過(guò)渡為過(guò)渡) if (n = 1) 直接把盤子直接把盤子AB else hanio(n-1個(gè)盤,個(gè)盤,AC, B為過(guò)渡為過(guò)渡) 把第把第n號(hào)盤號(hào)盤 AB hanio(n-1個(gè)盤,個(gè)盤,CB, A為過(guò)渡為過(guò)渡) A B Cn-110.2.2 遞歸函數(shù)基本概念遞歸函數(shù)基本概念10.2.2遞歸函數(shù)基本概念遞歸函數(shù)基本概念n例例10-2 用遞歸函數(shù)實(shí)現(xiàn)求用遞歸函數(shù)實(shí)現(xiàn)求n!遞推法n用循環(huán)計(jì)算用循環(huán)計(jì)算n!采

13、用的就是遞推法:!采用的就是遞推法:n!= 123nn即:即:result = 1;for(i = 1; i = n; i+) result = result * i;遞歸法nn!= n (n-1)!當(dāng)當(dāng)n1遞歸式子遞歸式子 = 1當(dāng)當(dāng)n=1或或n=0遞歸出口遞歸出口n即即fact (n)的實(shí)現(xiàn)依賴于的實(shí)現(xiàn)依賴于fact(n-1)。10.2.2遞歸函數(shù)基本概念遞歸函數(shù)基本概念 例例10-2 用遞歸函數(shù)求用遞歸函數(shù)求n!。#include double fact(int n);int main(void) int n; scanf (%d, &n); printf (%f, fact (

14、n) ); return 0;double fact(int n) /* 函數(shù)定義函數(shù)定義 */ double result; if (n=1 | n = 0) /* 遞歸出口遞歸出口 */ result = 1; else result = n * fact(n-1); return result;遞歸式遞歸式fact(n)=n*fact(n-1);main() fact(3) fact(2) fact(1) . . . . printf(fact(3) f=3*fact(2) f=2*fact(1) f=1 return(f) return(f) return(f) 遞歸函數(shù)遞歸函數(shù) fa

15、ct( n )的實(shí)現(xiàn)過(guò)程的實(shí)現(xiàn)過(guò)程fact(3)= 3*fact(2) 2*fact(1) fact(1)12*1=23*2=6同時(shí)有同時(shí)有4個(gè)函數(shù)在運(yùn)個(gè)函數(shù)在運(yùn)行,且都未完成行,且都未完成10.2.3 遞歸程序設(shè)計(jì)遞歸程序設(shè)計(jì)用遞歸實(shí)現(xiàn)的問(wèn)題,滿足兩個(gè)條件:用遞歸實(shí)現(xiàn)的問(wèn)題,滿足兩個(gè)條件:n問(wèn)題可以逐步簡(jiǎn)化成自身較簡(jiǎn)單的形式(問(wèn)題可以逐步簡(jiǎn)化成自身較簡(jiǎn)單的形式(遞歸式遞歸式)n! = n * (n-1)! n n-1i = n + i i=1 i=1n遞歸最終能結(jié)束遞歸最終能結(jié)束(遞歸出口遞歸出口)兩個(gè)條件缺一不可兩個(gè)條件缺一不可解決遞歸問(wèn)題的兩個(gè)著眼點(diǎn)解決遞歸問(wèn)題的兩個(gè)著眼點(diǎn)10.2.3

16、遞歸程序設(shè)計(jì)遞歸程序設(shè)計(jì)n例例10-3 編寫遞歸函數(shù)編寫遞歸函數(shù)reverse(int n)實(shí)現(xiàn)將實(shí)現(xiàn)將整數(shù)整數(shù)n逆序輸出。逆序輸出。 分析分析:n遞歸出口:如果遞歸出口:如果n=9(1位數(shù)),直接輸出位數(shù)),直接輸出nn遞歸式子:如果遞歸式子:如果n為多位數(shù),輸出個(gè)位數(shù)為多位數(shù),輸出個(gè)位數(shù)n%10,再,再遞歸調(diào)用遞歸調(diào)用reverse(n/10) 輸出前輸出前n-1位位void reverse(int num) /*不需要返回,故用不需要返回,故用void*/if(num%cn, a, b); else hanio(n-1, a, c, b); printf(%c-%cn, a, b); h

17、anio(n-1, c, b, a); hanio(n個(gè)盤,個(gè)盤,AB) / C為過(guò)渡為過(guò)渡 if (n = 1) 直接把盤子直接把盤子AB else hanio(n-1個(gè)盤個(gè)盤, AC,B過(guò)渡過(guò)渡) 把把n號(hào)盤號(hào)盤 AB hanio(n-1個(gè)盤個(gè)盤, CB,A過(guò)渡過(guò)渡) 源程序源程序 /* 搬動(dòng)搬動(dòng)n個(gè)盤,從個(gè)盤,從a到到b,c為中間過(guò)渡為中間過(guò)渡 */void hanio(int n, char a, char b, char c) if (n = 1) printf(%c-%cn, a, b); else hanio(n-1, a, c, b); printf(%c-%cn, a, b)

18、; hanio(n-1, c, b, a); int main(void) int n; printf(input the number of disk: ); scanf(%d, &n); printf(the steps for %d disk are:n,n); hanio(n, a, b, c) ; return 0;input the number of disk: 3the steps for 3 disk are:a-ba-cb-ca-bc-ac-ba-bn=1,a=a,b=b,c=cprintf(%c-%cn, a, b);a-bn=1,a=b,b=c,c=aprint

19、f(%c-%cn, a, b);b-cn=1,a=c,b=a,c=bprintf(%c-%cn, a, b);B-An=1,a=a,b=b,c=cprintf(%c-%cn, a, b);a-bn=2,a=a,b=c, c=bhanoi(1,a,b,c)printf(%c-%cn,a,b);a-chanoi(1,b,c,a)n=2,a=c,b=b, c=ahanoi(1,c,a,b)printf(%c-%cn,a,b);c-bhanoi(1,a,b,c)n=3 a=ab=b c=chanoi(2,a,c,b)printf(%c-%cn,a,b);a-bhanoi(2,c,b,a)函數(shù)體if (

20、n = 1) printf(%c-%cn,a,b);else hanio(n-1, a, c, b); printf(%c-%cn,a,b); hanio(n-1, c, b, a);當(dāng)n=3時(shí)運(yùn)行結(jié)果為:a-b,a-c,b-c,a-b,c-a,c-b,a-b執(zhí)行:hanoi(3,a,b,c) 課堂練習(xí):利用遞歸函數(shù)計(jì)算課堂練習(xí):利用遞歸函數(shù)計(jì)算x的的n次冪次冪int mi(int x, int n) if (n=1) return x; else return x*mi(x,n-1); 10.3 長(zhǎng)度單位轉(zhuǎn)換長(zhǎng)度單位轉(zhuǎn)換 n10.3.1 程序解析程序解析 n10.3.2 宏宏基本定義基本定義

21、 n10.3.3 帶參數(shù)的宏定義帶參數(shù)的宏定義 n10.3.4 文件包含文件包含 n10.3.5 編譯預(yù)處理編譯預(yù)處理 10.3.1 程序解析程序解析 n例例10-5 歐美國(guó)家長(zhǎng)度使用歐美國(guó)家長(zhǎng)度使用英制單位,英制單位,1英里英里=1609米,米,1英尺英尺=30.48厘米,厘米,1英寸英寸=2.54厘米。編寫單位轉(zhuǎn)換程序。厘米。編寫單位轉(zhuǎn)換程序。#include #define Mile_to_meter 1609/* 1英里英里=1609米米 */#define Foot_to_centimeter 30.48 /* 1英尺英尺=30.48厘米厘米 */#define Inch_to_ce

22、ntimeter 2.54 /* 1英寸英寸=2.54厘米厘米 */int main(void) float foot, inch, mile;/* 定義英里,英尺,英寸變量定義英里,英尺,英寸變量 */ printf(Input mile,foot and inch:); scanf(%f%f%f, &mile, &foot, &inch); printf(%f miles=%f metersn, mile, mile * Mile_to_meter); /* 英里英里米數(shù)米數(shù) */ printf(%f feet=%f centimetersn, foot, foot

23、 * Foot_to_centimeter); /* 英尺英尺厘米厘米 */ printf(%f inches=%f centimetersn, inch, inch * Inch_to_centimeter); /* 英寸英寸厘米厘米 */ return 0;Input mile,foot and inch:1.2 3 5.11.200000 miles=1930.800077 meters3.000000 feet=91.440000 centimeters5.100000 inches=12.954000 centimeters10.3.2 宏基本定義宏基本定義#define 宏名標(biāo)識(shí)符

24、宏名標(biāo)識(shí)符 宏定義字符串宏定義字符串編譯時(shí),程序中所有與宏名相同的字符串,用宏定義字編譯時(shí),程序中所有與宏名相同的字符串,用宏定義字符串替代符串替代#define PI 3.14#define arr_size 4說(shuō)明說(shuō)明:宏名一般用大寫字母,以與變量名區(qū)別宏名一般用大寫字母,以與變量名區(qū)別宏定義不是語(yǔ)句,后面不得跟分號(hào)宏定義不是語(yǔ)句,后面不得跟分號(hào)宏定義可以嵌套使用宏定義可以嵌套使用#define PI 3.14#define S 2*PI*PI多用于符號(hào)常量多用于符號(hào)常量n宏定義可以寫在程序中任何位置宏定義可以寫在程序中任何位置n宏定義作用范圍:從定義書寫處到文件尾。宏定義作用范圍:從定義

25、書寫處到文件尾。n可以通過(guò)可以通過(guò)“#undef”強(qiáng)制指定宏的結(jié)束范圍。強(qiáng)制指定宏的結(jié)束范圍。10.3.2 宏基本定義宏基本定義#define A This is the first macrovoid f1() printf(An );#define B This is the second macroA 的有效范圍的有效范圍void f2( ) printf( B ) ; B 的有效范圍的有效范圍#undef Bint main(void) f1( ); f2( ); return 0;宏的作用范圍宏的作用范圍10.3.3 帶參數(shù)的宏定義帶參數(shù)的宏定義例例10-6 簡(jiǎn)單的帶參數(shù)的宏定義。簡(jiǎn)

26、單的帶參數(shù)的宏定義。#include #define MAX(a, b) a b ? a: b#define SQR(x) x * xint main(void) int x , y; scanf (%d%d , &x, &y) ; x = MAX (x, y);/* 引用宏定義引用宏定義 */ y = SQR(x); /* 引用宏定義引用宏定義 */ printf(%d %dn , x, y) ; return 0;10.3.3 帶參數(shù)的宏定義帶參數(shù)的宏定義例:例: #define f(a) a*a*a int main(void) /* 水仙花數(shù)水仙花數(shù) */ int i,

27、x,y,z; for (i=1; i= a) & (c) = 0) & (c) = 9) ? c - 0 : -1) #define F(x) x - 2#define D(x) x*F(x)int main() printf(%d,%d, D(3), D(D(3) ;return 0;練習(xí)練習(xí)帶宏定義的程序輸出帶宏定義的程序輸出D(3) = x*F(x) = x*x-2 = 3*3-2 = 7D(D(3) = D(x*x-2) = x*x-2* F(x*x-2) = x*x-2* x*x-2-2 = 3*3-2*3*3-2-2 = -13n閱讀帶宏定義的程序,先全部替換好,最

28、后再統(tǒng)一計(jì)算閱讀帶宏定義的程序,先全部替換好,最后再統(tǒng)一計(jì)算n不可一邊替換一邊計(jì)算,更不可以人為添加括號(hào)不可一邊替換一邊計(jì)算,更不可以人為添加括號(hào)D(3) = x*F(x) 先用先用x替換展開替換展開 = x*x-2 進(jìn)一步對(duì)進(jìn)一步對(duì)F(x)展開,這里不能加括號(hào)展開,這里不能加括號(hào) = 3*3-2 = 7 最后把最后把x=3代進(jìn)去計(jì)算代進(jìn)去計(jì)算D(D(3) = D(x*x-2) 先對(duì)先對(duì)D(3)用用x替換展開,替換展開, = x*x-2* F(x*x-2) 拿展開后的參數(shù)對(duì)拿展開后的參數(shù)對(duì)D進(jìn)一步進(jìn)行宏替換進(jìn)一步進(jìn)行宏替換 = x*x-2* x*x-2-2 拿展開后的參數(shù)對(duì)拿展開后的參數(shù)對(duì)F進(jìn)

29、一步進(jìn)行宏替換進(jìn)一步進(jìn)行宏替換 = 3*3-2*3*3-2-2 = -13最后把最后把x=3代進(jìn)去計(jì)算代進(jìn)去計(jì)算運(yùn)行結(jié)果:運(yùn)行結(jié)果:7 -13結(jié)果分析結(jié)果分析10.3.4 文件包含文件包含n系統(tǒng)以系統(tǒng)以stdio.h、math.h頭文件等形式提供頭文件等形式提供n實(shí)用系統(tǒng)往往有自己諸多的宏定義等內(nèi)容,實(shí)用系統(tǒng)往往有自己諸多的宏定義等內(nèi)容,也可以以也可以以.h的形式組織、調(diào)用的形式組織、調(diào)用n使用使用include可把若干可把若干.h頭文件連接成一個(gè)完頭文件連接成一個(gè)完整的程序整的程序n格式格式 # include # include 需包含的文件名需包含的文件名n作用作用編譯連接時(shí),把指定文件

30、內(nèi)容插到編譯連接時(shí),把指定文件內(nèi)容插到 #include 所所在位置,合起來(lái)生成可執(zhí)行代碼。在位置,合起來(lái)生成可執(zhí)行代碼。n注意注意編譯預(yù)處理命令,以編譯預(yù)處理命令,以#開頭。開頭。編譯時(shí)起作用,不是真正編譯時(shí)起作用,不是真正C語(yǔ)句,行尾沒有分號(hào)。語(yǔ)句,行尾沒有分號(hào)。文件包含文件包含系統(tǒng)文件夾系統(tǒng)文件夾當(dāng)前文件夾當(dāng)前文件夾+系統(tǒng)文件夾系統(tǒng)文件夾例例10-7 將例將例10-5中長(zhǎng)度轉(zhuǎn)換的宏,定義成頭文件中長(zhǎng)度轉(zhuǎn)換的宏,定義成頭文件length.h,并寫出主函數(shù)文件。并寫出主函數(shù)文件。頭文件頭文件length.h源程序源程序#define Mile_to_meter 1609/* 1英里英里=16

31、09米米 */#define Foot_to_centimeter 30.48/* 1英尺英尺=30.48厘米厘米 */#define Inch_to_centimeter 2.54 /* 1英寸英寸=2.54厘米厘米 */主函數(shù)文件主函數(shù)文件prog.c源程序源程序#include #include length.h /* 包含自定義頭文件包含自定義頭文件 */ int main(void) float foot, inch, mile;/* 定義英里,英尺,英寸變量定義英里,英尺,英寸變量 */ printf(Input mile,foot and inch:); scanf(%f%f%f

32、, &mile, &foot, &inch); printf(%f miles=%f metersn, mile, mile * Mile_to_meter); printf(%f feet=%f centimetersn, foot, foot * Foot_to_centimeter); printf(%f inches=%f centimetersn, inch, inch * Inch_to_centimeter); return 0;將例將例10-1的的5個(gè)函數(shù)分別存儲(chǔ)在個(gè)函數(shù)分別存儲(chǔ)在2個(gè)個(gè).C文件上,文件上,要求通過(guò)文件包含把它們聯(lián)結(jié)起來(lái)。要求通過(guò)文件包含

33、把它們聯(lián)結(jié)起來(lái)。nctype.h 字符處理字符處理nmath.h 與數(shù)學(xué)處理函數(shù)有關(guān)的說(shuō)明與定義與數(shù)學(xué)處理函數(shù)有關(guān)的說(shuō)明與定義nstdio.h 輸入輸出函數(shù)中使用的有關(guān)說(shuō)明和定義輸入輸出函數(shù)中使用的有關(guān)說(shuō)明和定義nstring.h 字符串函數(shù)的有關(guān)說(shuō)明和定義字符串函數(shù)的有關(guān)說(shuō)明和定義nstddef.h 定義某些常用內(nèi)容定義某些常用內(nèi)容nstdlib.h 雜項(xiàng)說(shuō)明雜項(xiàng)說(shuō)明ntime.h 支持系統(tǒng)時(shí)間函數(shù)支持系統(tǒng)時(shí)間函數(shù)常用標(biāo)準(zhǔn)頭文件常用標(biāo)準(zhǔn)頭文件n編譯預(yù)處理是語(yǔ)言編譯程序的組成部分編譯預(yù)處理是語(yǔ)言編譯程序的組成部分用于解釋處理源程序中的各種預(yù)處理指令。用于解釋處理源程序中的各種預(yù)處理指令。在真正

34、編譯之前作預(yù)處理,解釋完成編譯預(yù)在真正編譯之前作預(yù)處理,解釋完成編譯預(yù)處理指令,轉(zhuǎn)換成相應(yīng)的處理指令,轉(zhuǎn)換成相應(yīng)的C程序段程序段n文件包含文件包含(#include)和宏定義和宏定義(#define)都都是編譯預(yù)處理指令是編譯預(yù)處理指令形式上都以形式上都以“#”開頭,不屬于開頭,不屬于C語(yǔ)言中真正語(yǔ)言中真正的語(yǔ)句的語(yǔ)句增強(qiáng)了增強(qiáng)了C語(yǔ)言的編程功能,改進(jìn)語(yǔ)言程序設(shè)語(yǔ)言的編程功能,改進(jìn)語(yǔ)言程序設(shè)計(jì)環(huán)境,提高編程效率計(jì)環(huán)境,提高編程效率10.3.5 編譯預(yù)處理編譯預(yù)處理nC程序的編譯處理,目的是把每一條程序的編譯處理,目的是把每一條C語(yǔ)句語(yǔ)句用若干條機(jī)器指令來(lái)實(shí)現(xiàn),生成目標(biāo)程序。用若干條機(jī)器指令來(lái)實(shí)

35、現(xiàn),生成目標(biāo)程序。n由于由于#define等編譯預(yù)處理指令不是等編譯預(yù)處理指令不是C語(yǔ)句,語(yǔ)句,不能被編譯程序翻譯,需要在真正編譯之前不能被編譯程序翻譯,需要在真正編譯之前作一個(gè)預(yù)處理,解釋完成編譯預(yù)處理指令,作一個(gè)預(yù)處理,解釋完成編譯預(yù)處理指令,從而把預(yù)處理指令轉(zhuǎn)換成相應(yīng)的從而把預(yù)處理指令轉(zhuǎn)換成相應(yīng)的C程序段,程序段,最終成為由純粹最終成為由純粹C語(yǔ)句構(gòu)成的程序,經(jīng)編譯語(yǔ)句構(gòu)成的程序,經(jīng)編譯最后得到目標(biāo)代碼。最后得到目標(biāo)代碼。編譯預(yù)處理編譯預(yù)處理n編譯預(yù)處理的主要功能:編譯預(yù)處理的主要功能: 文件包含(文件包含(#include) 宏定義(宏定義(#define) 條件編譯條件編譯編譯預(yù)處理

36、功能編譯預(yù)處理功能n條件編譯條件編譯#define FLAG 1#if FLAG 程序段程序段1#else 程序段程序段2#endif編譯預(yù)處理功能編譯預(yù)處理功能10.4 大程序構(gòu)成大程序構(gòu)成 多文件模塊的學(xué)生信息庫(kù)系統(tǒng)多文件模塊的學(xué)生信息庫(kù)系統(tǒng) n10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng)n10.4.2 C程序文件模塊程序文件模塊 n10.4.3 文件模塊間的通信文件模塊間的通信 10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng) 學(xué)生信息庫(kù)系統(tǒng)main()計(jì)算平均成績(jī)average()平均成績(jī)排序sort()修改modify()建立new_student()

37、輸出output_student()查詢search_student()例10-8 請(qǐng)綜合例9-1、例9-2、例9-3和例9-4,分模塊設(shè)計(jì)一個(gè)學(xué)生信息庫(kù)系統(tǒng)。該系統(tǒng)包含學(xué)生基本信息的建立和輸出、計(jì)算學(xué)生平均成績(jī)、按照學(xué)生的平均成績(jī)排序以及查詢、修改學(xué)生的成績(jī)等功能。 函數(shù)建立為: 10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng) n由于整個(gè)程序規(guī)模較大,按照功能圖,分成三個(gè)程由于整個(gè)程序規(guī)模較大,按照功能圖,分成三個(gè)程序文件模塊,并把結(jié)構(gòu)體定義等寫成一個(gè)頭文件。序文件模塊,并把結(jié)構(gòu)體定義等寫成一個(gè)頭文件。 頭文件頭文件student.h 增加學(xué)生與輸出學(xué)生信息程序文件增加學(xué)生與

38、輸出學(xué)生信息程序文件input_void new_student (struct student students )nvoid output_student(struct student students )計(jì)算平均成績(jī)與平均成績(jī)排序程序文件計(jì)算平均成績(jī)與平均成績(jī)排序程序文件aver_void average(struct student students )nvoid sort(struct student students )查詢修改程序文件查詢修改程序文件void modify(struct student students )nvoid search_student(struct s

39、tudent students , int num)10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫(kù)系統(tǒng) n一共定義了三個(gè)一共定義了三個(gè).c程序文件和一個(gè)程序文件和一個(gè).h頭文件,它們頭文件,它們各自獨(dú)立,再通過(guò)主函數(shù)各自獨(dú)立,再通過(guò)主函數(shù)main()調(diào)用。主函數(shù)放在調(diào)用。主函數(shù)放在student_system.c文件中,各文件存放在同一個(gè)文件中,各文件存放在同一個(gè)文件夾下,相互間的連接采用文件包含的形式。文件夾下,相互間的連接采用文件包含的形式。 主函數(shù)程序文件主函數(shù)程序文件student_system.c#include “student.h”#include “input _o

40、utput.c”#include “aver_sort.c”#include “modify.c”int Count = 0; /* 全局變量,記錄當(dāng)前學(xué)生總數(shù)全局變量,記錄當(dāng)前學(xué)生總數(shù) */int main(void) . /* 主函數(shù)調(diào)用各函數(shù)主函數(shù)調(diào)用各函數(shù) */10.4.2 C程序文件模塊程序文件模塊 n結(jié)構(gòu)化程序設(shè)計(jì)是編寫出具有良好結(jié)構(gòu)程序的有結(jié)構(gòu)化程序設(shè)計(jì)是編寫出具有良好結(jié)構(gòu)程序的有效方法效方法n一個(gè)大程序最好由一組小函數(shù)構(gòu)成一個(gè)大程序最好由一組小函數(shù)構(gòu)成n如果程序規(guī)模很大,需要幾個(gè)人合作完成的話,如果程序規(guī)模很大,需要幾個(gè)人合作完成的話,每個(gè)人所編寫的程序會(huì)保存在自己的每個(gè)人所編

41、寫的程序會(huì)保存在自己的.c文件中文件中n為了避免一個(gè)文件過(guò)長(zhǎng),也會(huì)把程序分別保存為為了避免一個(gè)文件過(guò)長(zhǎng),也會(huì)把程序分別保存為幾個(gè)文件。幾個(gè)文件。n一個(gè)大程序會(huì)由幾個(gè)文件組成,每一個(gè)文件又可一個(gè)大程序會(huì)由幾個(gè)文件組成,每一個(gè)文件又可能包含若干個(gè)函數(shù)。能包含若干個(gè)函數(shù)。我們把保存有一部分程序的文件稱我們把保存有一部分程序的文件稱為為程序文件模塊程序文件模塊 10.4.2 C程序文件模塊程序文件模塊 n一個(gè)大程序可由幾個(gè)程序文件模塊組成,每一個(gè)程一個(gè)大程序可由幾個(gè)程序文件模塊組成,每一個(gè)程序文件模塊又可能包含若干個(gè)函數(shù)。程序文件模塊序文件模塊又可能包含若干個(gè)函數(shù)。程序文件模塊只是函數(shù)書寫的載體。只是

42、函數(shù)書寫的載體。 n當(dāng)大程序分成若干文件模塊后,可以對(duì)各文件模塊當(dāng)大程序分成若干文件模塊后,可以對(duì)各文件模塊分別編譯,然后通過(guò)連接,把編譯好的文件模塊再分別編譯,然后通過(guò)連接,把編譯好的文件模塊再合起來(lái),連接生成可執(zhí)行程序。合起來(lái),連接生成可執(zhí)行程序。n問(wèn)題:如何把若干程序文件模塊連接成一個(gè)完整的問(wèn)題:如何把若干程序文件模塊連接成一個(gè)完整的可執(zhí)行程序?可執(zhí)行程序?文件包含文件包含 工程文件(由具體語(yǔ)言系統(tǒng)提供)工程文件(由具體語(yǔ)言系統(tǒng)提供)10.4 大程序構(gòu)成大程序構(gòu)成 多文件模塊多文件模塊n程序文件函數(shù)關(guān)系程序文件函數(shù)關(guān)系小程序:主函數(shù)小程序:主函數(shù)+若干函數(shù)若干函數(shù) 一個(gè)文件一個(gè)文件大程序:若干程序文件模塊(多個(gè)文件)大程序:若干程序文件模塊(多個(gè)文件) 每每個(gè)程序文件模塊可包含若干個(gè)函數(shù)個(gè)程序文件模塊可包含若干個(gè)函數(shù) 各程序各程序文件模塊分別編譯,再連接文件模塊分

溫馨提示

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

評(píng)論

0/150

提交評(píng)論