結構化程序設計_第1頁
結構化程序設計_第2頁
結構化程序設計_第3頁
結構化程序設計_第4頁
結構化程序設計_第5頁
已閱讀5頁,還剩78頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第一講練習1第二講練習2第五章 函數5.1 概述結構化程序設計v基本思想:將一個大的程序按功能分割成一些小模塊,v特點:l各模塊相對獨立、功能單一、結構清晰、接口簡單l控制了程序設計的復雜性l提高元件的可靠性l縮短開發周期l避免程序開發的重復勞動l易于維護和功能擴充v開發方法: 自上向下,逐步分解,分而治之C是結構化程序設計語言源程序文件1預編譯命令說明部分執行部分函數1函數n源程序文件i源程序文件nC程序C程序結構&C是函數式語言&必須有且只能有一個名為main的主函數&C程序的執行總是從main函數開始,在main中結束&函數不能嵌套定義,可以嵌套調用函數分

2、類v從用戶角度l 標準函數(庫函數):由系統提供l 用戶自定義函數使用庫函數應注意:1、函數功能2、函數參數的數目和順序,及各參數意義和類型3、函數返回值意義和類型4、需要使用的包含文件Ch7_201.cP.288.v從函數形式l無參函數l有參函數5.2 函數的定義main () int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);輸出為:max=2輸出為:max=3if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);無返回值的函數m

3、ain () int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);if(a=b) printf(”max=%dn”,a);else printf(”max=%dn”,b);maxmaxmax( a, b)intint無返回值的函數main() int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);else printf(”max

4、=%dn”,b);maxmaxmax( a, b)intint(a,b);(a,b);輸出為:max=2輸出為:max=3有返回值的函數main() int a,b; a=1;b=2; a=2;b=3; if(a=b) printf(”max=%dn”,a);return(a);else printf(”max=%dn”,b);return(b);maxmaxmax( a, b)intint(a,b);(a,b);有返回值的函數main() int a,b;int c; a=1;b=2; c=2*max(a,b); a=2;b=3; c=2*max(a,b); c=2*2=4c=2*3=6c=

5、max(a,b);c=2c=max(a,b);c=3if(a=b) printf(”max=%dn”,a);return(a);else printf(”max=%dn”,b);return(b);max ( a, b)intint5.2 函數的定義一般格式合法標識符函數返回值類型缺省int型無返回值void函數體函數類型 函數名(形參類型說明表)說明部分語句部分 例 空函數 dummy( ) 函數體為空例 無參函數 printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 例 有參函數 int max(int x,int y) i

6、nt z; z=xy?x:y; return(z); 函數頭部5.3 函數的返回值返回語句v形式: return(表達式); 或 return 表達式; 或 return;v功能:使程序控制從被調用函數返回到調用函數中,同時把返值(表達式的值)帶給調用函數v說明:l函數中可有多個return語句l若無return語句,遇時,自動返回調用函數l對于基本類型,若函數類型與return語句中表達式值的類型不一致,按前者為準,自動轉換-函數調用轉換lvoid型函數例 無返回值函數 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例 無返回值

7、函數 void max(int a,int b ) if(a=b) printf(”max=%dn”,a); else printf(”max=%dn”,b); 5.4 函數的調用調用形式 函數名(實參表);說明:l實參與形參個數相等,類型一致,按順序一一對應l實參表求值順序,因系統而定(Turbo C 自右向左)調用方式v函數語句:無返回值的函數只能使用此種方式 例 printstar(); max(a,b); printf(“Hello,World!n”);v函數表達式:有返回值的函數 例 m=max(a,b)*2; printf(“%d”,max(a,b); m=max(a,max(b,

8、c);函數說明v對被調用函數要求:l必須是已存在的函數 庫函數: #include 用戶自定義函數: 函數類型說明v函數說明l一般形式: 函數類型 函數名(形參類型 形參名,. ); 或 函數類型 函數名();l作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗l函數定義與函數說明不同l若被調用函數定義出現在主調函數之前,可不作函數說明; 若不說明,則會把第一次遇到的該函數形式(函數定義或函數調用)作為函數的說明,并將函數類型默認為 int 型l有些系統(如Borland C+)要求函數說明指出函數返值類型和形參類型,并且對void 和 int 型函數也要進行函數說明例 函數說明舉例/*ch

9、7_5.c*/float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被調函數的定義出現在主調函數之前,不必函數說明/*ch7_5.c*/void main(void) float add(float,float); /*function declaration*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(

10、sum is %f,c);float add(float x, float y) float z; z=x+y; return(z);5.5 函數參數及其傳遞方式形參與實參v形式參數:定義函數時函數名后面括號中的變量名v實際參數:調用函數時函數名后面括號中的表達式 c=max(a,b); (main 函數) (max 函數)int max(int x, int y) int z; z=xy?x:y; return(z); 例 比較兩個數并輸出大者int max(int x, int y) int z; z=xy?x:y; return(z);void main(void) int a,b,c;

11、 scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);形參實參v說明:l實參必須有確定的值l形參必須指定類型l形參與實參類型一致,個數相同l若形參與實參類型不一致,自動按形參類型轉換函數調用轉換l形參在函數被調用前不占內存;函數調用時為形參分配內存;調用結束,內存釋放5.5 函數參數及其傳遞方式形參與實參v形式參數:定義函數時函數名后面括號中的變量名v實際參數:調用函數時函數名后面括號中的表達式函數調用的執行過程:1、程序在執行過程中一旦遇到一個函數調用,系統首先為每個形參分配一定數目的臨時存儲單元(存儲單元的字節數由參數的類

12、型決定);然后計算實參表達式的值,并將實參的值送到形參對應的存儲單元中(實參與形參按位置對應);2、將執行的控制轉移到被調用函數的第一個執行語句處開始執行,直到函數體末尾或遇到一個return語句為止;3、當執行到函數體末尾或執行return語句時,如果函數有返回值,則將控制返回到調用點同時返回一個值,這個返回值就是函數調用表達式的值;否則只返回控制。另外,返回后,形參所占的臨時存儲單元被釋放??刂品祷氐秸{用函數之后,從函數調用點繼續向后執行。例 計算x的立方#include float cube(float x) return(x*x*x);void main(void) float a,

13、product; printf(Please input value of a:); scanf(%f,&a); product=cube(a); printf(”Cube of %.4f is %.4fn,a,product);xaproduct28參數傳遞方式v值傳遞方式l方式:函數調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值l特點:u形參與實參占用不同的內存單元u單向傳遞void swap(int x,int y) int temp; temp=x; x=y; y=temp;void main(void)

14、int a=10,b=20; swap(a,b); printf(“a=%d,b=%dn,a,b);例 交換兩個變量的值.10變量a 變量b(main)20 變量temp 變量y 變量x(swap)101020 1020COPY目錄void swap(int x,int y) int temp; temp=x; x=y; y=temp;void main(void) int a=10,b=20; swap(a,b); printf(“a=%d,b=%dn,a,b);例 交換兩個變量的值.10變量a 變量b(main)20目錄運行結果:a=10,b=20#include long sum(int

15、 a, int b); long factorial(int n);void main(void) int n1,n2; long a; scanf(%d,%d,&n1,&n2); a=sum(n1,n2); printf(a=%1d,a); long sum(int a,int b) long c1,c2; c1=factorial(a); c2=factorial(b); return(c1+c2); long factorial(int n) long rtn=1; int i; for(i=1;i=n;i+) rtn*=i; return(rtn); 文件包含編譯預處理

16、命令函數類型說明函數調用函數調用函數返回值形參實參函數定義5.6 函數的嵌套與遞歸調用嵌套調用C規定:函數定義不可嵌套,但可以嵌套調用函數main( )調用函數a結束a函數b函數調用函數b例 求三個數中最大數和最小數的差值#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main(void) int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn

17、,d); Ch7_202.cint dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z); main( )調用函數dif輸出結束dif函數max函數調用函數max調用函數minmin函數遞歸調用v定義:函數直接或間接的調用自身叫函數的遞歸調用f( )調f調f2調f1f1( )f2( )v說明lC編譯系統對遞歸

18、函數的自調用次數沒有限制l每調用函數一次,在內存堆棧區分配空間,用于存放函數變量、返回值等信息,所以遞歸次數過多,可能引起堆棧溢出int f(int x) int y,z; z=f(y); . return(2*z);int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);遞歸函數的算法是遞推公式(或稱為遞歸定義)。數學上有很多計算方法使用的是遞推公式。例如,計算n的階乘的遞推公式: 1 ,n=0n!= n*(n-1)! ,n0計算m與n的最大公約數的遞推公式: m

19、,n=0gcd(m,n)= gcd(n,m%n) ,n0上述計算問題都可以寫成遞歸函數。從以上遞推公式可見,遞歸算法都有一個計算的初始條件,這個初始條件也是遞歸調用的結束條件。也就是說,遞歸函數必須有遞歸結束條件;否則遞歸過程將永不終止,即所謂的無窮遞歸。無窮遞歸的最后結果是使系統不能正常工作甚至“死機”。用遞歸法求用遞歸法求 n! 分析:分析: 4!=3!*43!=2!*3 2!=1!*2 float fac( int n) float f; if(n=0) f=1; else f=n*fac(n-1); return (f); n*(n-1)! ,n01 ,n=0n!=例例5.10 用遞歸

20、的方法求用遞歸的方法求n!#includeunsigned long fac( int n) unsigned long h; if (!n) h= 1; else h= n* fac(n-1); return(h); main( ) int n; unsigned long h; h=fac(3); printf(“%d!=%lu n”,n,h); 例例5.10 用遞歸的方法求用遞歸的方法求n!main( ) int n; unsigned long h; h=fac(3); printf(“%d!=%lu n”,n,h); unsigned long h; if (!n) h= 1; el

21、se h=3* fac(3-1); return(h);unsigned long h; if (!n) h= 1; else h= 2* fac(2-1); return(h);unsigned long h; if (!n) h= 1; else h=1* fac(1-1); return(h);unsigned long h; if (!n) h= 1; else h=n* fac(n-1); return(h);1!2!3!1用遞歸的方法打印#includefac( int n) if (!n) return 0; else fac(n-1); printf(“%d * ”,n); m

22、ain( ) fac(3);main( ) fac(3);if (!n) return 0; else fac(3-1); printf(“%d * ”,3); if (!n) return 0; else fac(2-1); printf(“%d * ”,2); unsigned long h; if (!n) return 0; else fac(1-1); printf(“%d * ”,1); if (!n) return 0; else fac(n-1); printf(“%d * ”,3); 1 * 2 * 3 * 遞歸方法一般既能用遞歸函數實現也能用循環實現。 遞歸函數使算法簡化、

23、程序結構緊湊、程序代碼簡潔,但遞歸函數在存儲空間上和運行速度上都不如循環效率高: 因為執行遞歸調用時,每次調用都要把本次調用的參數和局部標量的值保存到棧頂(稱為進棧);每當從下一層調用返回道上一層調用時,又要從棧頂恢復本層調用原來的參數和局部變量的值(稱為退棧)。進棧和退棧既需要開銷存儲空間,也需要開銷處理時間;此外,函數調用要執行控制轉移,這也需要開銷時間。 因此對于遞推方法,能用循環實現時最好不用遞歸函數。5.7 數組作為函數參數數組元素作函數實參值傳遞例 兩個數組大小比較432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in

24、=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b為有10個元素的整型數組比較兩數組對應元素變量n,m,k記錄aibi, ai=bi,aik,認為數組ab 若nk,認為數組ab 若n=k,認為數組a=b#include main() int a10,b10,i,n=0,m=0,k=0; printf(Enter array a:n); for(i=0;i10;i+)scanf(%d,&ai); printf(Enter array b:n); for(i=0;i10;i+)scanf(%d,&bi); for(i=0;iy)

25、flag=1; else if(xy) flag=-1; else flag=0; return(flag);數組名作函數參數v地址傳遞v在主調函數與被調函數分別定義數組,且類型應一致v形參數組大小(多維數組第一維)可不指定v形參數組名是地址變量例 求學生的平均成績 #include float average(int stu10, int n); void main() int score10, i; float av; printf(Input 10 scores:n); for( i=0; i10; i+ ) scanf(%d, &scorei); av=average(scor

26、e,10); printf(Average is:%.2f, av); float average(int stu10, int n) int i; float av,total=0; for( i=0; in; i+ ) total += stui; av = total/n; return av; 實參用數組名形參用數組定義, int stu .2109score562312.88stu例 數組元素與 數組名 作函數參數比較12a調用前a0a112a調用a0a112xy21xy交換12a返回#include void swap2(int x,int y) int z; z=x; x=y;

27、y=z;main() int a2=1,2; swap2(a0,a1); printf(a0=%dna1=%dn,a0,a1);值傳遞12a調用前12ax調用21ax交換21a返回#include void swap2(int x) int z; z=x0; x0=x1; x1=z;main() int a2=1,2; swap2(a); printf(a0=%dna1=%dn,a0,a1);地址傳遞例 數組元素與 數組名 作函數參數比較例 數組排序-簡單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(

28、j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例 數組排序-簡單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;i

29、n-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=10123456789a9132732495768768899arrayi=8例

30、數組排序-簡單選擇排序void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; if(k!=i) t=arrayi; arrayi=arrayk; arrayk=t; main() int a10,i; for(i=0;i10;i+)scanf(%d,&ai); sort(a,10); for(i=0;i10;i+) printf(%d ,ai); printf(n);例 求二維數組中最大元素值1 3 5 72 4 6 815 17 34 12

31、ijmax=11 3 5 72 4 6 815 17 34 12ijmax=31 3 5 72 4 6 815 17 34 12ijmax=5j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=7j1 3 5 72 4 6 815 17 34 12imax=34int max_value(int array34) int i,j,k,max; max=array00; for(i=0;i3;i+) for(j=0;jmax) max=arrayij; return(max);main() int a34=1,3,5,7,

32、 2,4,6,8,15,17,34,12; printf(max value is %dn,max_value(a);多維形參數組第一維維數可省略,第二維必須相同 int array4例 求二維數組中各行元素之和get_sum_row(int x3, int result ,int row, int col) int i,j; for(i=0;irow;i+) resulti=0;for(j=0;jcol;j+) resulti+=xij; main() int a23=3,6,9,1,4,7; int sum_row2,row=2,col=3,i; get_sum_row(a,sum_row

33、,row,col); for(i=0;irow;i+) printf(The sum of row%d=%dn,i+1,sum_rowi);314679asum_rowxresult1812上機練習1:1.請將教材 P.69. 例 3.3 的最后三句定義成函數實現2.匯編7.22,添加主函數,在主函數中進行:(1)輸入數組,輸入要查找的整數(2)調用 binary 函數(3)結果輸出完整程序應能實現在10個升序整數中查找的功能,找到則輸出其下標,未找到則輸出 1 。3. 匯編: 15,17,22,28,40課件下載:74. 上

34、傳作業:(1)保證學號文件夾中有相應的 exe 文件(2)將學號文件夾復制到: /incoming/3班第5章練習15.8 變量的存儲屬性概述v變量是對程序中數據的存儲空間的抽象內存.main() int a; a=10; printf(“%d”,a);編譯或函數調用時為其分配內存單元1020002001程序中使用變量名對內存操作v變量的屬性l數據類型:變量所持有的數據的性質(操作屬性)l存儲屬性u存儲器類型:寄存器、靜態存儲區、動態存儲區u生存期:變量在某一時刻存在-靜態變量與動態變量u作用域:變量在某區域內有效-局部變量與全局變量v變量的存儲類型laut

35、o -自動型lregister-寄存器型lstatic -靜態型lextern -外部型v變量定義格式: 存儲類型 數據類型 變量表;5.8 變量的存儲屬性概述v變量是對程序中數據的存儲空間的抽象如: int sum; auto int a,b,c; register int i; static float x,y;局部變量與全局變量v局部變量-內部變量l定義:在函數內定義,只在本函數內有效l說明:umain中定義的變量只在main中有效u不同函數中同名變量,占不同內存單元u形參屬于局部變量u可定義在復合語句中有效的變量u局部變量可用存儲類型:auto register static (默認為

36、auto)float f1(int a) int b,c; .char f2(int x,int y) int i,j; main() int m,n; .a,b,c有效x,y,i,j有效m,n有效例 不同函數中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);例 復合語句中變量#define N 5main() int i; int aN=1,2,3,4

37、,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);運行結果:5 4 3 2 1例 復合語句中變量#define N 5main() int i; int aN=1,2,3,4,5; for(i=0;iN/2;i+) int temp;temp=ai;ai=aN-i-1;aN-i-1=temp; for(i=0;iN;i+) printf(%d ,ai);例 不同函數中同名變量main() int a,b; a=3; b=4; printf(main:a=%d,b=

38、%dn,a,b); sub(); printf(main:a=%d,b=%dn,a,b);sub() int a,b; a=6; b=7; printf(sub:a=%d,b=%dn,a,b);運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4v全局變量 在所有函數外定義l 外部變量u有效范圍:從定義變量的位置開始到本文件結束, 通過做引用說明,可將作用域擴大到整個程序的所有文件中的函數 定義 說明u次數: 只能1次 可說明多次u位置: 所有函數之外 函數內或函數外u分配內存: 分配內存,可初始化 不分配內存,不可初始化 應盡量少使用全局變量,因為:Y全局變量在程

39、序全部執行過程中占用存儲單元Y降低了函數的通用性、可靠性,可移植性Y降低程序清晰性,容易出錯u外部變量說明: extern 數據類型 變量表;u外部變量定義與外部變量說明不同u若外部變量與局部變量同名,則外部變量被屏蔽l外部靜態變量:staticu所說明的變量只限于本文件引用,而不能被其他文件引用y?x:y; return(z);main() extern int a,b; printf(max=%d,max(a,b);int a=13,b=-8;運行結果:max=13extern int a,b;int max() int z; z=ab?a:b; return(z);main() prin

40、tf(max=%d,max();int a=13,b=-8;/*ch7_17.c*/int a=3,b=5;max(int a, int b) int c; c=ab?a:b; return(c);main() int a=8; printf(max=%d,max(a,b);例 外部變量與局部變量同名運行結果:max=8int i;main() void prt(); for(i=0;i5;i+) prt();void prt() for(i=0;i5;i+) printf(“%c”,*); printf(“n”);例 外部變量副作用運行結果:*動態變量與靜態變量v存儲方式l靜態存儲:程序運行

41、期間分配固定存儲空間l動態存儲:程序運行期間根據需要動態分配存儲空間v內存用戶區程序區靜態存儲區動態存儲區全局變量、局部靜態變量形參變量局部動態變量(auto register)函數調用現場保護和返回地址等v生存期l靜態變量:從整個兒程序開始執行到最后結束l動態變量:從包含該變量定義的函數開始執行至該函數執行結束變量存儲類型靜態動態存儲方式程序整個運行期間函數調用開始至結束生存期編譯時賦初值,只賦一次每次函數調用時賦初值自動賦初值0或空字符不確定未賦初值靜態存儲區動態區存儲區寄存器局部變量全局變量作用域定義變量的函數或復合語句內本文件可其它文件u局部變量默認為auto型,全局變量默認為exte

42、rn型uregister型變量個數受限u局部static變量具有全局壽命和局部可見性(使得錯誤局部化)u局部static變量具有可繼承性uextern可擴展外部變量作用域register局部staticauto外部staticextern存儲類別例 文件file1.cint a;main( ) . . f2; . f1; .f1( ) auto int b; f2; .f2( ) static int c; C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例 auto 變量的作用域main() int x=1; void prt(void); in

43、t x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x);void prt(void) int x=5; printf(“3th x=%dn”,x);運行結果:3th x=52nd x=31st x=1x=1作用域x=1作用域x=3作用域x=5作用域main() void increment(void); increment(); increment(); increment();void increment(void) int x=0; x+; printf(“%dn”,x);例 局部靜態變量值具有可繼承性運行結果:1 1 1mai

44、n() void increment(void); increment(); increment(); increment();void increment(void) static int x=0; x+; printf(“%dn”,x);運行結果:1 2 3例 變量的壽命與可見性#include int i=1;void main() static int a; register int b=-10; int c=0; printf(-MAIN-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); c=c+8; other(); printf(-MAIN-n)

45、; printf(i:%d a:%d b:%d c:%dn,i,a,b,c); i=i+10; other();other() static int a=2; static int b; int c=10; a=a+2; i=i+32; c=c+5; printf(-OTHER-n); printf(i:%d a:%d b:%d c:%dn,i,a,b,c); b=a;-Main-i:1 a:0 b:-10 c:0 -Other-i:33 a:4 b:0 c:15 -Main-i:33 a:0 b:-10 c:8-Other-i:75 a:6 b:4 c:15全局i1main: a0b:-10

46、registermain:c0靜態存儲區動態存儲區other: a2other: b0other: c10843315443other: c10675156main() void gx(),gy(); extern int x,y; printf(“1: x=%dty=%dn”,x,y); y=246; gx(); gy();void gx() extern int x,y; x=135; printf(“2: x=%dty=%dn”,x,y);int x,y;void gy() printf(“3: x=%dty=%dn”,x,y);例 用extern擴展外部變量作用域運行結果:1: x=0

47、 y=02: x=135 y=2463: x=135 y=246例 引用其它文件中的外部變量int global;extern float x;main() int local;.extern int global;static int number;func2().float x;static int number;func3() extern int global;.file1.cfile2.cfile3.c例 引用其它文件中的變量,輸出ab和a的m次方int a;main() int power(int n); int b=3,c,d,m; printf(Enter the number

48、 a and its power:n); scanf(%d,%d,&a,&m); c=a*b; printf(%d*%d=%dn,a,b,c); d=power(m); printf(%d*%d=%d,a,m,d);extern int a;int power(int n) int i,y=1; for(i=1;i=n;i+)y*=a; return(y);(y)?(x):(y) .main() int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展開:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy

49、?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 例 用宏定義和函數實現同樣的功能v帶參的宏與函數區別帶參宏函數處理過程不分配內存簡單的字符置換分配內存先求實參值,再代入形參處理時間編譯時程序運行時參數類型無類型問題定義實參,形參類型程序長度變長不變運行速度不占運行時間調用和返回占時間5.9.2 文件包含(文件嵌入)功能:一個源文件可將另一個源文件的內容全部包含進來一般形式: #include “文件名” 或 #include #include “file2.c”file1.cfile2.cfile1.cfile2.cABA處理過程:預編譯時,用被包含

50、文件的內容取代該預處理命令,再對“包含”后的文件作一個源文件編譯 直接按標準目錄搜索“” 先在當前目錄搜索,再搜索標準目錄可指定路徑被包含文件內容v源文件(*.c)v頭文件(*.h)宏定義數據結構定義函數說明等文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cAfile3.cfile2.c例 文件包含舉例/* powers.h */#define sqr(x) (x)*(x)#define cube(x) (x)*(x)*(x)#define quad(x) (x)*(x)*(x)*(x)/*c

51、h8_10.c*/#include #include d:fengyibkcpowers.h#define MAX_POWER 10void main() int n; printf(numbert exp2t exp3t exp4n); printf(-t-t-t-n); for(n=1;n=MAX_POWER;n+) printf(%2dt %3dt %4dt %5dn,n,sqr(n),cube(n),quad(n);課后練習1:匯編第七章 15,17,22,28,40課后練習2: 54,59,61,62,66第八章14,7,8,21,22,4345上機練習2:1.有 n=4 個整數,用

52、冒泡法從小到大輸出這 n 個數。要求:用函數 void sort(int m ,int n)實現排序編寫主函數 main(),完成數據的輸入和排序后的輸出參考:7.632. 匯編7.88,編寫完整程序,包括自定義函數和主函數3. 匯編: 54,59,61,62,66課件下載:74. 上傳作業:(1)保證學號文件夾中有相應的 exe 文件(2)將學號文件夾復制到: /incoming/4班第5章練習2習題:第七章25,917,19,2232,34,3740,4250,5269,7276,78,

53、79,82上機編程:(1) 8388,9093(2) 有四個整數:82,31,65,9,用冒泡法從小到大輸出這四個數。要求:a.用函數 void sort(int m ,int n)實現排序b.編寫主函數 main(),完成數據的輸入和排序后的輸出(3) 有四個整數:82,31,65,9,用選擇法從小到大輸出這四個數。要求:a.用函數 void sort(int m ,int n)實現排序b.編寫主函數 main(),完成數據的輸入和排序后的輸出第八章14,7,8,21,22,4345例 5.11 Hanoi(漢諾)塔問題。有三根桿A,B,C。A桿上有64個盤子,大的在下小的在上。要把這64個

54、盤子從A移到B,在移動過程中可以借助C,每次只允許移動一個盤子,且在移動過程中在三根桿上始終都要保持大盤在下,小盤在上。要求編出程序打印出移動的步驟。漢諾塔問題04030201030201abc04分析: 1. 將A上的n-1個盤借助B先移到C上; (n-1,a,c,b) 2將A上第n個盤移到B上; 3將n-1個盤從C上借助A移到B上。 (n-1,c,b,a)void hanoi(int n,char a,char b,char c) if(n=1) printf(%d: %c-%cn,n,a,b); else hanoi(n-1,a,c,b); printf(%d: %c-%cn,n,a,b); hanoi (n-1,c,b,a); main( ) int n; printf(input n:); scanf(%d,&n); hanoi(n,A,B,C);4個盤執行情況個盤執行情況input n: 41:

溫馨提示

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

評論

0/150

提交評論