




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Chap 10 函數(shù)與程序結(jié)構(gòu)函數(shù)與程序結(jié)構(gòu)10.1 圓形體積計(jì)算器圓形體積計(jì)算器 10.2 漢諾塔問題漢諾塔問題 10.3 長度單位轉(zhuǎn)換長度單位轉(zhuǎn)換 10.4 大程序構(gòu)成大程序構(gòu)成 本章要點(diǎn)本章要點(diǎn)n怎樣把多個(gè)函數(shù)組織起來?怎樣把多個(gè)函數(shù)組織起來?n怎樣用結(jié)構(gòu)化程序設(shè)計(jì)的思想解決問題?怎樣用結(jié)構(gòu)化程序設(shè)計(jì)的思想解決問題?n怎樣用函數(shù)嵌套求解復(fù)雜的問題?怎樣用函數(shù)嵌套求解復(fù)雜的問題?n怎樣用函數(shù)遞歸解決問題?怎樣用函數(shù)遞歸解決問題?n如何使用宏?如何使用宏?n如何使用多文件模塊構(gòu)建較大規(guī)模程序如何使用多文件模塊構(gòu)建較大規(guī)模程序使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜的問題使用結(jié)構(gòu)化程序設(shè)計(jì)方法解決復(fù)雜的
2、問題把大問題分解成若干小問題,小問題再進(jìn)一步分解成把大問題分解成若干小問題,小問題再進(jìn)一步分解成若干更小的問題若干更小的問題寫程序時(shí),用寫程序時(shí),用main()解決整個(gè)問題,它調(diào)用解決小問解決整個(gè)問題,它調(diào)用解決小問題的函數(shù)題的函數(shù)這些函數(shù)又進(jìn)一步調(diào)用解決更小問題的函數(shù),從而形這些函數(shù)又進(jìn)一步調(diào)用解決更小問題的函數(shù),從而形成函數(shù)的嵌套調(diào)用成函數(shù)的嵌套調(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ì)一個(gè)常用圓形體體積計(jì)算器,采用設(shè)計(jì)一個(gè)常用圓形體體積計(jì)算器,采用命令方
3、式輸入命令方式輸入1、2、3,分別選擇計(jì)算球體、,分別選擇計(jì)算球體、圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)圓柱體、圓錐體的體積,并輸入計(jì)算所需相應(yīng)參數(shù)。參數(shù)。分析:分析:輸入輸入1、2、3選擇計(jì)算選擇計(jì)算3種體積,其他輸入結(jié)束計(jì)種體積,其他輸入結(jié)束計(jì)算算設(shè)計(jì)一個(gè)控制函數(shù)設(shè)計(jì)一個(gè)控制函數(shù)cal(),經(jīng)它辨別圓形體的類型經(jīng)它辨別圓形體的類型再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)再調(diào)用計(jì)算球體、圓柱體、圓錐體體積的函數(shù)設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積設(shè)計(jì)單獨(dú)的函數(shù)計(jì)算不同圓形體的體積10.1.1 程序解析程序解析-計(jì)算常用圓形體體計(jì)算常用圓形體體積積3層結(jié)構(gòu),層結(jié)構(gòu),5個(gè)函數(shù)個(gè)函數(shù)降低程序的構(gòu)
4、思、編寫、調(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 cal ( int sel ); double vol_ball(void ); double vol_cylind(void ); double vol_cone(void );int main(void) int sel; while( 1 ) printf( 1-計(jì)算球體體積計(jì)算球體體積n); printf( 2-計(jì)算圓柱
5、體積計(jì)算圓柱體積n); printf( 3-計(jì)算圓錐體積計(jì)算圓錐體積n); printf( 其他其他-退出程序運(yùn)行退出程序運(yùn)行n); printf(“ 請輸入計(jì)算命令:請輸入計(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;/* 常用圓形體體積計(jì)算器的主控函數(shù)常用圓形體體積計(jì)算器的主控函數(shù) */void cal ( int sel ) switch (sel) case 1: printf(球體積為:球體
6、積為:%.2fn, vol_ball( );break; case 2: printf(圓柱體積為:圓柱體積為:%.2fn, vol_cylind( ) );break; case 3: printf(圓錐體積為:圓錐體積為:%.2fn, vol_cone( ) );break;/* 計(jì)算球體體積計(jì)算球體體積 V=4/3*PI*r*r*r */double vol_ball( ) double r ; printf(請輸入球的半徑:請輸入球的半徑:); scanf(%lf,&r); return(4.0/3.0*PI*r*r*r);/* 計(jì)算圓柱體積計(jì)算圓柱體積 V=PI*r*r*h
7、*/double vol_cylind( ) double r , h ; printf(請輸入圓柱的底圓半徑和高:請輸入圓柱的底圓半徑和高:); scanf(%lf%lf,&r,&h); return(PI*r*r*h);/* 計(jì)算圓錐體積計(jì)算圓錐體積 V=h/3*PI*r*r */double vol_cone( ) double r , h ; printf(請輸入圓錐的底圓半徑和高:請輸入圓錐的底圓半徑和高:); 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)
8、用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 main(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 分析分析vol_ball();vol_cylind();vol_cone
9、();int main(void) cal (sel);void cal (int sel) double vol_ball( ) double vol_cylind( ) double vol_cone( ) main( )cal ( )vol_ball ( )vol_cylind ( )vol_cone ( )n在一個(gè)函數(shù)中再調(diào)用其它函數(shù)的情況稱為在一個(gè)函數(shù)中再調(diào)用其它函數(shù)的情況稱為函數(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,一個(gè)調(diào)用一個(gè)地嵌套下去,構(gòu)成了函數(shù)的嵌套一個(gè)調(diào)用一個(gè)地嵌套下去,構(gòu)成了函數(shù)的嵌套調(diào)用。調(diào)用。具有嵌套調(diào)用函數(shù)
10、的程序,需要分別定義多個(gè)具有嵌套調(diào)用函數(shù)的程序,需要分別定義多個(gè)不同的函數(shù)體,每個(gè)函數(shù)體完成不同的功能,不同的函數(shù)體,每個(gè)函數(shù)體完成不同的功能,它們合起來解決復(fù)雜的問題。它們合起來解決復(fù)雜的問題。10.1.2 函數(shù)的嵌套調(diào)用函數(shù)的嵌套調(diào)用結(jié)構(gòu)化程序設(shè)計(jì)方法結(jié)構(gòu)化程序設(shè)計(jì)方法 n自頂向下,逐步求精,函數(shù)實(shí)現(xiàn)自頂向下,逐步求精,函數(shù)實(shí)現(xiàn) 自頂向下:程序設(shè)計(jì)時(shí),應(yīng)先考慮總體步驟,后考慮步自頂向下:程序設(shè)計(jì)時(shí),應(yīng)先考慮總體步驟,后考慮步驟的細(xì)節(jié);先考慮全局目標(biāo),后考慮局部目標(biāo)。先從最驟的細(xì)節(jié);先考慮全局目標(biāo),后考慮局部目標(biāo)。先從最上層總目標(biāo)開始設(shè)計(jì),逐步使問題具體化。不要一開始上層總目標(biāo)開始設(shè)計(jì),逐步
11、使問題具體化。不要一開始就追求眾多的細(xì)節(jié)。就追求眾多的細(xì)節(jié)。 逐步求精:對于復(fù)雜的問題,其中大的操作步驟應(yīng)該再逐步求精:對于復(fù)雜的問題,其中大的操作步驟應(yīng)該再將其分解為一些子步驟的序列,逐步明晰實(shí)現(xiàn)過程。將其分解為一些子步驟的序列,逐步明晰實(shí)現(xiàn)過程。函數(shù)實(shí)現(xiàn):通過逐步求精,把程序要解決的全局目標(biāo)分函數(shù)實(shí)現(xiàn):通過逐步求精,把程序要解決的全局目標(biāo)分解為局部目標(biāo),再進(jìn)一步分解為具體的小目標(biāo),把最終解為局部目標(biāo),再進(jìn)一步分解為具體的小目標(biāo),把最終的小目標(biāo)用函數(shù)來實(shí)現(xiàn)。問題的逐步分解關(guān)系,構(gòu)成了的小目標(biāo)用函數(shù)來實(shí)現(xiàn)。問題的逐步分解關(guān)系,構(gòu)成了函數(shù)間的調(diào)用關(guān)系。函數(shù)間的調(diào)用關(guān)系。n限制函數(shù)的長度。一個(gè)函數(shù)
12、語句數(shù)不宜過多,既便于閱限制函數(shù)的長度。一個(gè)函數(shù)語句數(shù)不宜過多,既便于閱讀、理解,也方便程序調(diào)試。若函數(shù)太長,可以考慮把讀、理解,也方便程序調(diào)試。若函數(shù)太長,可以考慮把函數(shù)進(jìn)一步分解實(shí)現(xiàn)。函數(shù)進(jìn)一步分解實(shí)現(xiàn)。n避免函數(shù)功能間的重復(fù)。對于在多處使用的同一個(gè)計(jì)算避免函數(shù)功能間的重復(fù)。對于在多處使用的同一個(gè)計(jì)算或操作過程,應(yīng)當(dāng)將其封裝成一個(gè)獨(dú)立的函數(shù),以達(dá)到或操作過程,應(yīng)當(dāng)將其封裝成一個(gè)獨(dú)立的函數(shù),以達(dá)到一處定義、多處使用的目的,以避免功能模塊間的重復(fù)。一處定義、多處使用的目的,以避免功能模塊間的重復(fù)。n減少全局變量的使用。應(yīng)采用定義局部變量作為函數(shù)的減少全局變量的使用。應(yīng)采用定義局部變量作為函數(shù)的
13、臨時(shí)工作單元,使用參數(shù)和返回值作為函數(shù)與外部進(jìn)行臨時(shí)工作單元,使用參數(shù)和返回值作為函數(shù)與外部進(jìn)行數(shù)據(jù)交換的方式。只有當(dāng)確實(shí)需要多個(gè)函數(shù)共享的數(shù)據(jù)數(shù)據(jù)交換的方式。只有當(dāng)確實(shí)需要多個(gè)函數(shù)共享的數(shù)據(jù)時(shí),才定義其為全局變量。時(shí),才定義其為全局變量。函數(shù)設(shè)計(jì)時(shí)應(yīng)注意的問題函數(shù)設(shè)計(jì)時(shí)應(yīng)注意的問題10.2 漢諾塔問題漢諾塔問題 10.2.1 程序解析程序解析10.2.2 遞歸函數(shù)基本概念遞歸函數(shù)基本概念10.2.3 遞歸程序設(shè)計(jì)遞歸程序設(shè)計(jì)10.2.1 漢諾漢諾(Hanoi)塔問題解析塔問題解析 將將64 個(gè)盤從座個(gè)盤從座A搬到座搬到座B(1) 一次只能搬一個(gè)盤子一次只能搬一個(gè)盤子(2) 盤子只能插在盤子只
14、能插在A、B、C三個(gè)桿中三個(gè)桿中(3) 大盤不能壓在小盤上大盤不能壓在小盤上 A B C分析分析 A B C分析分析 A B C A B Cnn-1n-1分析分析 A B C A B Cn10.2.1 漢諾漢諾(Hanoi)塔問題解析塔問題解析n遞歸方法的兩個(gè)要點(diǎn)遞歸方法的兩個(gè)要點(diǎn)(1)遞歸出口:一個(gè)盤子的解決方法;)遞歸出口:一個(gè)盤子的解決方法;(2)遞歸式子:如何把搬動(dòng))遞歸式子:如何把搬動(dòng)64個(gè)盤子的問題簡個(gè)盤子的問題簡化成搬動(dòng)化成搬動(dòng)63個(gè)盤子的問題。個(gè)盤子的問題。n把漢諾塔的遞歸解法歸納成三個(gè)步驟:把漢諾塔的遞歸解法歸納成三個(gè)步驟:n-1個(gè)盤子從座個(gè)盤子從座A搬到座搬到座C第第n號(hào)盤
15、子從座號(hào)盤子從座A搬到座搬到座Bn-1個(gè)盤子從座個(gè)盤子從座C搬到座搬到座B算法:算法:hanio(n個(gè)盤,個(gè)盤,AB, C為過渡為過渡) if (n = 1) 直接把盤子直接把盤子AB else hanio(n-1個(gè)盤,個(gè)盤,AC, B為過渡為過渡) 把第把第n號(hào)盤號(hào)盤 AB hanio(n-1個(gè)盤,個(gè)盤,CB, A為過渡為過渡) A B Cn-110.2.2遞歸函數(shù)基本概念遞歸函數(shù)基本概念n例例10-2 用遞歸函數(shù)實(shí)現(xiàn)求用遞歸函數(shù)實(shí)現(xiàn)求n!遞推法n在學(xué)習(xí)循環(huán)時(shí),計(jì)算在學(xué)習(xí)循環(huán)時(shí),計(jì)算n!采用的就是遞推法:!采用的就是遞推法:n!= 123nn用循環(huán)語句實(shí)現(xiàn):用循環(huán)語句實(shí)現(xiàn):result =
16、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即求即求n!可以在!可以在(n-1)!的基礎(chǔ)上再乘上!的基礎(chǔ)上再乘上n。如果把求。如果把求n!寫成函!寫成函數(shù)數(shù)fact(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, &a
17、mp;n); printf (%f, fact (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;10.2.2 遞歸函數(shù)基本概念遞歸函數(shù)基本概念遞歸式遞歸式遞歸出口遞歸出口例例10-2分析分析求求n! 遞歸定義遞歸定義n! = n * (n-1)! (n 1) n! = 1 (n = 0,1)#include double fact(int n
18、);int main(void) int n; scanf (%d, &n); printf (%f, fact (n) ); return 0;double fact(int n) 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) retur
19、n(f) return(f) 遞歸函數(shù)遞歸函數(shù) fact( n )的實(shí)現(xiàn)過程的實(shí)現(xiàn)過程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)的問題,滿足兩個(gè)條件:用遞歸實(shí)現(xiàn)的問題,滿足兩個(gè)條件:n問題可以逐步簡化成自身較簡單的形式(問題可以逐步簡化成自身較簡單的形式(遞歸式遞歸式)n! = n * (n-1)! n n-1i = n + i i=1 i=1n遞歸最終能結(jié)束遞歸最終能結(jié)束(遞歸出口遞歸出口)兩個(gè)條件缺一不可兩個(gè)條件缺一不可解決遞歸問
20、題的兩個(gè)著眼點(diǎn)解決遞歸問題的兩個(gè)著眼點(diǎn)10.2.3 遞歸程序設(shè)計(jì)遞歸程序設(shè)計(jì)n例例10-3 編寫遞歸函數(shù)編寫遞歸函數(shù)reverse(int n)實(shí)現(xiàn)將實(shí)現(xiàn)將整數(shù)整數(shù)n逆序輸出。逆序輸出。 分析分析:將整數(shù)將整數(shù)n逆序輸出可以用循環(huán)實(shí)現(xiàn),且循環(huán)次數(shù)逆序輸出可以用循環(huán)實(shí)現(xiàn),且循環(huán)次數(shù)與與n的位數(shù)有關(guān)。遞歸實(shí)現(xiàn)整數(shù)逆序輸出也需要的位數(shù)有關(guān)。遞歸實(shí)現(xiàn)整數(shù)逆序輸出也需要用位數(shù)作為控制點(diǎn)。歸納遞歸實(shí)現(xiàn)的兩個(gè)關(guān)鍵用位數(shù)作為控制點(diǎn)。歸納遞歸實(shí)現(xiàn)的兩個(gè)關(guān)鍵點(diǎn)如下:點(diǎn)如下:n遞歸出口:直接輸出遞歸出口:直接輸出n,如果,如果n=9,即,即n為為1位數(shù)位數(shù)n遞歸式子:輸出個(gè)位數(shù)遞歸式子:輸出個(gè)位數(shù)n%10,再遞歸調(diào)
21、用,再遞歸調(diào)用reverse(n/10) 輸出前輸出前n-1位,如果位,如果n為多位數(shù)為多位數(shù)10.2.3 遞歸程序設(shè)計(jì)遞歸程序設(shè)計(jì)n由于結(jié)果是在屏幕上輸出,因此函數(shù)返回類型為由于結(jié)果是在屏幕上輸出,因此函數(shù)返回類型為void void reverse(int num)if(num%cn, a, b); else hanio(n-1, a, c, b); printf(%c-%cn, a, b); hanio(n-1, c, b, a); int main(void) int n; printf(input the number of disk: ); scanf(%d, &n); p
22、rintf(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-b A B Cinput the number of disk: 3the steps for 3 disk are:a-ba-cb-ca-bc-ac-ba-b課堂練習(xí):利用遞歸函數(shù)計(jì)算課堂練習(xí):利用遞歸函數(shù)計(jì)算x的的n次冪次冪int mi(int x, int n) if (n=1) return x; else re
23、turn x*mi(x,n-1); 10.3 長度單位轉(zhuǎn)換長度單位轉(zhuǎn)換 n10.3.1 程序解析程序解析 n10.3.2 宏基本定義宏基本定義 n10.3.3 帶參數(shù)的宏定義帶參數(shù)的宏定義 n10.3.4 文件包含文件包含 n10.3.5 編譯預(yù)處理編譯預(yù)處理 10.3.1 程序解析程序解析 n例例10-5 歐美國家長度使用英制單位,歐美國家長度使用英制單位,1英里英里=1609米,米,1英英尺尺=30.48厘米,厘米,1英寸英寸=2.54厘米。請編寫程序轉(zhuǎn)換。厘米。請編寫程序轉(zhuǎn)換。#include #define Mile_to_meter 1609/* 1英里英里=1609米米 */#de
24、fine Foot_to_centimeter 30.48 /* 1英尺英尺=30.48厘米厘米 */#define Inch_to_centimeter 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
25、_to_meter);/* 計(jì)算英里的米數(shù)計(jì)算英里的米數(shù) */ printf(%f feet=%f centimetersn, foot, foot * Foot_to_centimeter);/* 計(jì)算英尺的厘米數(shù)計(jì)算英尺的厘米數(shù) */ printf(%f inches=%f centimetersn, inch, inch * Inch_to_centimeter);/* 計(jì)算英寸的厘米數(shù)計(jì)算英寸的厘米數(shù) */ return 0;Input mile,foot and inch:1.2 3 5.11.200000 miles=1930.800077 meters3.000000 feet=
26、91.440000 centimeters5.100000 inches=12.954000 centimeters10.3.2 宏基本定義宏基本定義 #define 宏名標(biāo)識(shí)符宏名標(biāo)識(shí)符 宏定義字符串宏定義字符串編譯時(shí),把程序中所有與宏名相同的字符串,用宏定義字編譯時(shí),把程序中所有與宏名相同的字符串,用宏定義字符串替代符串替代#define PI 3.14#define arr_size 4說明說明:宏名一般用大寫字母,以與變量名區(qū)別宏名一般用大寫字母,以與變量名區(qū)別宏定義不是語句,后面不得跟分號(hào)宏定義不是語句,后面不得跟分號(hào)宏定義可以嵌套使用宏定義可以嵌套使用#define PI 3.14
27、#define S 2*PI*PI多用于符號(hào)常量多用于符號(hào)常量n宏定義可以寫在程序中任何位置,它的作用范宏定義可以寫在程序中任何位置,它的作用范圍從定義書寫處到文件尾。圍從定義書寫處到文件尾。n可以通過可以通過“#undef”強(qiáng)制指定宏的結(jié)束范圍。強(qiáng)制指定宏的結(jié)束范圍。10.3.2 宏基本定義宏基本定義#define A “This is the first macro”void f1() printf( “An” );#define B “This is the second macro”A 的有效范圍的有效范圍void f2( ) printf( B ) ; B 的有效范圍的有效范圍#un
28、def Bint main(void) f1( ); f2( ); return 0;宏的作用范圍宏的作用范圍10.3.3 帶參數(shù)的宏定義帶參數(shù)的宏定義例例10-6 簡單的帶參數(shù)的宏定義。簡單的帶參數(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” ,
29、 x, y) ; return 0;10.3.3 帶參數(shù)的宏定義帶參數(shù)的宏定義例:例: #define f(a) a*a*a int main(void) /* 水仙花數(shù)水仙花數(shù) */ int i,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í)帶宏定義的程序輸出帶宏定義的程序輸出n閱讀帶宏定義的程序,先全部替換好,最后再統(tǒng)一計(jì)算閱讀
30、帶宏定義的程序,先全部替換好,最后再統(tǒng)一計(jì)算n不可一邊替換一邊計(jì)算,更不可以人為添加括號(hào)不可一邊替換一邊計(jì)算,更不可以人為添加括號(hào)D(3) = x*F(x) 先用先用x替換展開替換展開 = x*x-2 進(jìn)一步對進(jìn)一步對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) 先對先對D(3)用用x替換展開,替換展開, = x*x-2* F(x*x-2) 拿展開后的參數(shù)對拿展開后的參數(shù)對D進(jìn)一步進(jìn)行宏替換進(jìn)一步進(jìn)行宏替換 = x*x-2* x*x-2-2 拿展開后的參數(shù)對拿展開后的參數(shù)對F進(jìn)一步進(jìn)行宏替換進(jìn)
31、一步進(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等形式供編程等形式供編程者調(diào)用者調(diào)用n實(shí)用系統(tǒng)往往有自己諸多的宏定義,也以實(shí)用系統(tǒng)往往有自己諸多的宏定義,也以.h的形式組織、調(diào)用的形式組織、調(diào)用n問題:如何把若干問題:如何把若干.h頭文件連接成一個(gè)完整頭文件連接成一個(gè)完整的可執(zhí)行程序?的可執(zhí)行程序?文件包含文件包含 includen格式格式 # include # include “需包含的文件名需包含的文件名”n作用作用
32、把指定的文件模塊內(nèi)容插入到把指定的文件模塊內(nèi)容插入到 #include 所在的所在的位置,當(dāng)程序編譯連接時(shí),系統(tǒng)會(huì)把所有位置,當(dāng)程序編譯連接時(shí),系統(tǒng)會(huì)把所有 #include 指定的文件拼接生成可執(zhí)行代碼。指定的文件拼接生成可執(zhí)行代碼。n注意注意編譯預(yù)處理命令,以編譯預(yù)處理命令,以#開頭。開頭。在程序編譯時(shí)起作用,不是真正的在程序編譯時(shí)起作用,不是真正的C語句,行尾語句,行尾沒有分號(hào)。沒有分號(hào)。文件包含文件包含系統(tǒng)文件夾系統(tǒng)文件夾當(dāng)前文件夾當(dāng)前文件夾+系統(tǒng)文件夾系統(tǒng)文件夾例例10-7 將例將例10-5中長度轉(zhuǎn)換的宏,定義成頭文件中長度轉(zhuǎn)換的宏,定義成頭文件length.h,并寫出主函數(shù)文件。并
33、寫出主函數(shù)文件。頭文件頭文件length.h源程序源程序#define Mile_to_meter 1609/* 1英里英里=1609米米 */#define Foot_to_centimeter 30.48/* 1英尺英尺=30.48厘米厘米 */#define Inch_to_centimeter 2.54 /* 1英寸英寸=2.54厘米厘米 */主函數(shù)文件主函數(shù)文件prog.c源程序源程序#include #include “l(fā)ength.h” /* 包含自定義頭文件包含自定義頭文件 */ int main(void) float foot, inch, mile;/* 定義英里,英尺,
34、英寸變量定義英里,英尺,英寸變量 */ printf(Input mile,foot and inch:); scanf(%f%f%f, &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
35、 0;將例將例10-1的的5個(gè)函數(shù)分別存儲(chǔ)在個(gè)函數(shù)分別存儲(chǔ)在2個(gè)個(gè).C文件上,要文件上,要求通過文件包含把它們聯(lián)結(jié)起來。求通過文件包含把它們聯(lián)結(jié)起來。頭文件頭文件length.hlength.h#define Mile_to_meter 1609#define Mile_to_meter 1609#define Foot_to_centimeter 30.48#define Foot_to_centimeter 30.48#define Inch_to_centimeter 2.54 #define Inch_to_centimeter 2.54 主函數(shù)文件主函數(shù)文件prog.cprog.c#
36、include #include #include #include “l(fā)ength.hlength.h”int main(void) int main(void) float mile,foot,inch; float mile,foot,inch; return 0; return 0; 編譯連接后生成的程序 stdio.h stdio.h的內(nèi)容的內(nèi)容#define Mile_to_meter 1609#define Foot_to_centimeter 30.48#define Inch_to_ centimeter 2.54 int main(void) float mile,foot
37、,inch; return 0;nctype.h 字符處理字符處理nmath.h 與數(shù)學(xué)處理函數(shù)有關(guān)的說明與定義與數(shù)學(xué)處理函數(shù)有關(guān)的說明與定義nstdio.h 輸入輸出函數(shù)中使用的有關(guān)說明和定義輸入輸出函數(shù)中使用的有關(guān)說明和定義nstring.h 字符串函數(shù)的有關(guān)說明和定義字符串函數(shù)的有關(guān)說明和定義nstddef.h 定義某些常用內(nèi)容定義某些常用內(nèi)容nstdlib.h 雜項(xiàng)說明雜項(xiàng)說明ntime.h 支持系統(tǒng)時(shí)間函數(shù)支持系統(tǒng)時(shí)間函數(shù)常用標(biāo)準(zhǔn)頭文件常用標(biāo)準(zhǔn)頭文件n編譯預(yù)處理是語言編譯程序的組成部分,編譯預(yù)處理是語言編譯程序的組成部分,它用于解釋處理語言源程序中的各種預(yù)它用于解釋處理語言源程序中的
38、各種預(yù)處理指令。處理指令。n文件包含文件包含(#include)和宏定義和宏定義(#define)都都是編譯預(yù)處理指令是編譯預(yù)處理指令在形式上都以在形式上都以“#”開頭,不屬于開頭,不屬于C語言中真語言中真正的語句正的語句增強(qiáng)了增強(qiáng)了C語言的編程功能,改進(jìn)語言程序設(shè)語言的編程功能,改進(jìn)語言程序設(shè)計(jì)環(huán)境,提高編程效率計(jì)環(huán)境,提高編程效率10.3.5 編譯預(yù)處理編譯預(yù)處理nC程序的編譯處理,目的是把每一條程序的編譯處理,目的是把每一條C語句語句用若干條機(jī)器指令來實(shí)現(xiàn),生成目標(biāo)程序。用若干條機(jī)器指令來實(shí)現(xiàn),生成目標(biāo)程序。n由于由于#define等編譯預(yù)處理指令不是等編譯預(yù)處理指令不是C語句,語句,不
39、能被編譯程序翻譯,需要在真正編譯之前不能被編譯程序翻譯,需要在真正編譯之前作一個(gè)預(yù)處理,解釋完成編譯預(yù)處理指令,作一個(gè)預(yù)處理,解釋完成編譯預(yù)處理指令,從而把預(yù)處理指令轉(zhuǎn)換成相應(yīng)的從而把預(yù)處理指令轉(zhuǎn)換成相應(yīng)的C程序段,程序段,最終成為由純粹最終成為由純粹C語句構(gòu)成的程序,經(jīng)編譯語句構(gòu)成的程序,經(jīng)編譯最后得到目標(biāo)代碼。最后得到目標(biāo)代碼。編譯預(yù)處理編譯預(yù)處理n編譯預(yù)處理的主要功能:編譯預(yù)處理的主要功能: 文件包含(文件包含(#include) 宏定義(宏定義(#define) 條件編譯條件編譯編譯預(yù)處理功能編譯預(yù)處理功能n條件編譯條件編譯#define FLAG 1#if FLAG 程序段程序段1#
40、else 程序段程序段2#endif編譯預(yù)處理功能編譯預(yù)處理功能10.4 大程序構(gòu)成大程序構(gòu)成 多文件模塊的學(xué)生信息庫系統(tǒng)多文件模塊的學(xué)生信息庫系統(tǒng) n10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng)n10.4.2 C程序文件模塊程序文件模塊 n10.4.3 文件模塊間的通信文件模塊間的通信 10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng) 學(xué)生信息庫系統(tǒng)main()計(jì)算平均成績average()平均成績排序sort()修改modify()建立new_student()輸出output_student()查詢search_student()例10-8 請綜合例9-1
41、、例9-2、例9-3和例9-4,分模塊設(shè)計(jì)一個(gè)學(xué)生信息庫系統(tǒng)。該系統(tǒng)包含學(xué)生基本信息的建立和輸出、計(jì)算學(xué)生平均成績、按照學(xué)生的平均成績排序以及查詢、修改學(xué)生的成績等功能。 函數(shù)建立為: 10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng) n由于整個(gè)程序規(guī)模較大,按照功能圖,分成三個(gè)程由于整個(gè)程序規(guī)模較大,按照功能圖,分成三個(gè)程序文件模塊,并把結(jié)構(gòu)體定義等寫成一個(gè)頭文件。序文件模塊,并把結(jié)構(gòu)體定義等寫成一個(gè)頭文件。 頭文件頭文件student.h 輸入輸出程序文件輸入輸出程序文件input_void new_student (struct student students )nvoi
42、d output_student(struct student students )計(jì)算平均成績與平均成績排序程序文件計(jì)算平均成績與平均成績排序程序文件aver_void average(struct student students )nvoid sort(struct student students )查詢修改程序文件查詢修改程序文件void modify(struct student students )nvoid search_student(struct student students , int num)10.4.1 分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng)分模塊設(shè)計(jì)學(xué)生信息庫系統(tǒng) n一共定義
43、了三個(gè)一共定義了三個(gè).c程序文件和一個(gè)程序文件和一個(gè).h頭文件,它們頭文件,它們各自獨(dú)立,再通過主函數(shù)各自獨(dú)立,再通過主函數(shù)main()調(diào)用。主函數(shù)放在調(diào)用。主函數(shù)放在student_system.c文件中,各文件存放在同一個(gè)文件中,各文件存放在同一個(gè)文件夾下,相互間的連接采用文件包含的形式。文件夾下,相互間的連接采用文件包含的形式。 主函數(shù)程序文件主函數(shù)程序文件student_system.c#include “student.h”#include “input _output.c”#include “aver_sort.c”#include “modify.c”int Count = 0;
44、 /* 全局變量,記錄當(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è)人所編寫的程序會(huì)保存在自己的.c文件中文件中n為了避免一個(gè)文件過長,也會(huì)把程序分別保存為為了避免一個(gè)文件過長,也會(huì)把程序分別保存為幾
45、個(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ù)書寫的載體。只是函數(shù)書寫的載體。 n當(dāng)大程序分成若干文件模塊后,可以對各文件模塊當(dāng)大程序分成若干文件模塊后,可以對各文件模塊分別編譯,然后通過連接,把編譯好的文件模塊再分別編譯,然后通過連接,把編譯好的文件模塊再合起來,連接生成可執(zhí)行程序。合起來,連接生成可執(zhí)行程序。n問題:如何把若干程序文件模塊連接成一個(gè)完整的問題:如何把若干程序文件模塊連接成一個(gè)完整的可執(zhí)行程序?可執(zhí)行程序?文件包含文件包含 工程文件(由具體語言系統(tǒng)提供)工程文件(由具體語言系統(tǒng)提供)10.4.2 C程序文件模塊程序文件模塊n程序文件函數(shù)關(guān)系程序文件函數(shù)關(guān)系小程序:主函數(shù)小程序:主函數(shù)+若干函數(shù)若干函數(shù) 一個(gè)文件一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物供貨合同范本
- 醫(yī)療機(jī)構(gòu)設(shè)備更新的必要性分析
- 排水防澇設(shè)施現(xiàn)狀分析
- 女裝行業(yè)女性時(shí)尚觀念的轉(zhuǎn)變
- 教育培訓(xùn)基地建設(shè)質(zhì)量控制與監(jiān)督
- 中國醫(yī)藥用純化水處理設(shè)備市場發(fā)展現(xiàn)狀調(diào)研及投資趨勢前景分析報(bào)告
- 變配電擴(kuò)容項(xiàng)目可行性分析
- 起重機(jī)項(xiàng)目可行性研究報(bào)告
- 2025年中國家紡繡品行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 繪圖紙行業(yè)市場發(fā)展現(xiàn)狀及趨勢與投資分析研究報(bào)告
- 《汽車保險(xiǎn)與理賠》-教學(xué)設(shè)計(jì)
- 2024至2030年中國礦用隔爆型監(jiān)控?cái)z像儀行業(yè)投資前景及策略咨詢研究報(bào)告
- 路橋工程檢測技術(shù) 課件 1公路工程試驗(yàn)檢測管理
- 2025高中物理《課時(shí)作業(yè)》人教版選擇性必修第1冊課時(shí)分層作業(yè)(八)
- 地震災(zāi)害避險(xiǎn)與自救手冊
- 腦卒中-腦卒中的康復(fù)治療
- 疫情統(tǒng)計(jì)學(xué)智慧樹知到答案2024年浙江大學(xué)
- 2024住院患者靜脈血栓栓塞癥預(yù)防護(hù)理與管理專家共識(shí)要點(diǎn)(全文)
- 火鍋店后廚培訓(xùn)計(jì)劃
- CJJ6-2009 城鎮(zhèn)排水管道維護(hù)安全技術(shù)規(guī)程
- JT-T-1253-2019道路運(yùn)輸車輛衛(wèi)星定位系統(tǒng)車輛終端檢測方法
評論
0/150
提交評論