206c語言課件6-第七章函數_第1頁
206c語言課件6-第七章函數_第2頁
206c語言課件6-第七章函數_第3頁
206c語言課件6-第七章函數_第4頁
206c語言課件6-第七章函數_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六章函數§6.1

概述模塊化程序設計基本思想:將一個大的程序按功能分割成一些小模塊,特點:各模塊相對獨立、功能單一、結構清晰、接口簡單控制了程序設計的復雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復勞動易于

和功能擴充開發(fā)方法:

自上向下,逐步分解,分而治之C是模塊化程序設計語言源程序文件1預編譯命令說明部分執(zhí)行部分函數1函數n源程序文件i源程序文件nC程序C程序結構C是函數式語言必須有且只能有一個名為main的主函數C程序的執(zhí)行總是從main函數開始,在main中結束函數不能嵌套定義,可以嵌套調用函數分類從用戶角度標準函數(庫函數):由系統提供用戶自定義函數從函數形式無參函數有參函數使用庫函數應注意:1、函數功能2、函數參數的數目和順序,及各參數意義和類型3、函數返回值意義和類型4、需要使用的包含文件Ch7_201.c§6.2

函數的定義一般格式合法標識符函數返回值類型缺省int型無返回值void函數體函數類型

函數名(形參類型說明表){說明部分語句部分}現代風格:空例有參函數(現代風格)為例無參函數printstar(

){

printf(“**********\n”);

}或printstar(void){

printf(“**********\n”);

}函數類型

函數名(形參表)形參類型說明{說明部分語句部分}傳統風格:例有參函數(傳統風格)int

max(x,y)int

x,y;{ int

z;z=x>y?x:y;return(z);}{

int

z;z=x;

x=y;

y=z;printf("\nx=%d,y=%d",x

,y);}main(

){

int

a=

10,b=20;swap(a,b);printf("\na=%d,b=%d\n",a,b);}程序輸出結果:x=20,y=10a=10,b=20形式參數(形參)實際參數(實參)6.3

函數參數與函數的值1.函數的形式參數與實際參數【例7.4】編一程序,將主函數中的兩個變量的值傳遞給swap函數中的兩個形參,交換兩個形參的值。void

swap(int

x,

int

y)單向值傳遞有關形參和實參的說明:①

當函數被調用時才給形參分配內存單元。調用結束,所占內存被

。②實參可以是常量、變量或表達式,但要求它們有確定的值。③實參與形參類型要一致,字符型與整型可以兼容。④實參與形參的個數必須相等。在函數調用時,實參的值賦給與之相對應的形參?!皢蜗蛑祩鬟f”。注意:在TC中,實參的求值順序是從右到左。int

sum100(

){int

i,t=0;for

(i=1;

i<=100;

i++)t+=i;return

(t);}main(

){int

s;s=sum100(

);printf("%d\n",

s);}程序輸出結果:5050intsum(int

x

){inti,t=0;t+=i;return

(t);}main(

){ints;s=sum

(100);printf("%d\n",

s);}【例7.3】求1~100的累加和。思考:

for

(i=1;

i<=x;

i++)兩個程序有何不同程序輸出結果:50502.函數的返回值返回語句形式:

return(表達式);或或return

表達式;return;功能:使程序控制從被調用函數返回到調用函數中,同時把返值帶給調用函數說明:函數中可有多個return語句若無return語句,遇}時,自動返回調用函數若函數類型與return語句中表達式值的類型不一致,按前者為準,自動轉換------函數調用轉換void型函數例無返回值函數void

swap(int

x,int

y

){ inttemp;temp=x;x=y;y=temp;}printstar(){

printf("**********");}main(){ int

a;a=printstar();printf("%d",a);}例函數帶回不確定值輸出:10void

printstar(){

printf("**********");}main(){ int

a;a=printstar();printf("%d",a);}編譯錯誤!例函數返回值類型轉換main(){ float

a,b;int

c;scanf("%f,%f",&a,&b);c=max(a,b);printf("Max

is

%d\n",c);}max(float

x,

float

y){ float

z;z=x>y?x:y;return(z);}§6.4

函數的調用調用形式函數名(實參表);說明:實參與形參個數相等,類型一致,按順序一一對應實參表求值順序,因系統而定(Turbo

C

自右向左)main(){ inti=2,p;p=f(i,++i);printf("%d",p);}int

f(int

a,int

b)c=0;{ int

c;

if(a>b)

c=1;else

if(a==b)else

c=-1;return(c);}例參數求值順序main(){ inti=2,p;p=f(i,

i++);printf("%d",p);}int

f(int

a,int

b)c=0;{ int

c;

if(a>b)

c=1;elseif(a==b)else

c=-1;return(c);}運行結果:0運行結果:1調用方式函數語句:例printstar();printf(“

o,World!\n”);函數表達式:例

m=max(a,b)*2;函數參數:例

printf(“%d”,max(a,b));m=max(a,max(b,c));函數說明對被調用函數要求:必須是已存在的函數庫函數:#include

<*.h>用戶自定義函數:函數類型說明函數說明一般形式:函數類型或

函數類型函數名(形參類型[形參名],…..);函數名();作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗函數定義與函數說明不同函數說明位置:程序的數據說明部分(函數內或外)下列情況下,可不作函數說明若函數返值是char或int型,系統自動按int型處理被調用函數定義出現在主調函數之前有些系統(如Borland

C++)要求函數說明

函數返值類型和形參類型,并且對void

int

型函數也要進行函數說明主調函數數說明說明)在函數行例函數說明舉例/*ch7_5.c*/main(){

float

add(float,float);

/*function

declaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);

printf("sumis%f",c);}float

add(float

x,float

y){ float

z;z=x+y;return(z);}floatadd();§6.5函數參數及其傳遞方式形參與實參形式參數:定義函數時函數名后面括號中的變量名實際參數:調用函數時函數名后面括號中的表達式c=max(a,b);(main

函數)max(int

x,

int

y)(max

函數){ int

z;z=x>y?x:y;return(z);}例比較兩個數并輸出大者main(){ inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);

printf("Max

is%d",c);}max(int x,int

y){ int

z;z=x>y?x:y;return(z);}形參實參§6.5函數參數及其傳遞方式形參與實參形式參數:定義函數時函數名后面括號中的變量名實際參數:調用函數時函數名后面括號中的表達式說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數相同若形參與實參類型不一致,自動按形參類型轉換———函數調用轉換形參在函數被調用前不占內存;函數調用時為形參分配內存;調用結束,內存例計算x的立方#include

<stdio.h>float

cube(float

x){

return(x*x*x);}main(){

float a,product;printf("Please

inputvalue

ofa:");scanf("%f",&a);product=cube(a);printf(”Cube

of%.4fis%.4f\n",a,product);}aproduct1.21.728參數傳遞方式值傳遞方式方式:函數調用時,為形參分配單元,并將實參的值到形參中;調用結束,形參單元被

,實參單元仍保留并維持原值特點:形參與實參占用不同的內存單元單向傳遞調用前:調用結束:7x:y:

11例交換兩個數/*ch7_2.c*/#include

<stdio.h>main(){ intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(int

a,int

b){ int

temp;temp=a;

a=b;b=temp;}調用:swap:x:7y:11x:7y:11a:7b:11x:7y:11a:11b:7temp地址作為參數傳遞給形參單元地址傳遞方式:函數調用時,將數據的特點:形參與實參占用同樣的“雙向”傳遞實參和形參必須是地址常量或變量/*ch9_3.c*/swap(p1,p2)int*p1,*p2;{

int

p;p=*p1;*p1=*p2;*p2=p;}main(){ int

a,b;scanf("%d,%d",&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“swapped:\n”);swap(&a,&b);printf(”a=%d,b=%d\n",a,b);}例 交換兩個數a59b調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:#include

<stdio.h>sum(int

a,

int

b);factorial(int

n);longlongmain(){ intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}long

sum(int

a,int

b){longc1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);}long

factorial(intn){ longrtn=1;int

i;for(i=1;i<=n;i++)rtn*=i;return(rtn);}long sum(int

a,

int

b);long factorial(int

n);文件包含編譯預處理命令函數類型說明函數定義函數調用函數調用函數返回值形參實參§6.6函數的嵌套與遞歸調用嵌套調用C規(guī)定:函數定義不可嵌套,但可以嵌套調用函數main(

)調用函數a結束a函數b函數調用函數b例求三個數中最大數和最小數的差值Ch7_202.c調用函數dif輸出結束int

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=x>y?x:y;return(r>z?r:z);}int

min(int

x,int

y,int

z){ int

r;r=x<y?x:y;return(r<z?r:z);函數}#include

<stdio.h>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(){ inta,b,c,d;scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);printf("Max-Min=%d\n",d);}main(

)

dif函數

max調用函數max調用函數minmin函數例用弦截法求方程根

5x

2

16x

80

0x3xyf(x)x2xx10f(x1)f(x2)f

(x2

)

f

(x1

)x

x1

f(x2

)

x2

f

(x1

)輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號求f(x1)與f(x2)連線與x軸的交點xy=f(x),y1=f(x1)真

y與y1同號

假x1=xy1=yx2=x直到|y|<root=x

輸出rootroot函數運行情況:Input

x1,x2:2,6A

root

of

equation

is

5.0000main(

)調用函數root輸出根

x結束root函數xpoint函數調用函數xpoint調用函數ff函數遞歸調用定義:函數直接或間接的調用自身叫函數的遞歸調用f(

)調f調f2

調f1f1(

)f2(

)說明C編譯系統對遞歸函數的自調用次數沒有限制每調用函數一次,在內存堆棧區(qū)分配空間,用于存放函數變量、返回值等信息,所以遞歸次數過多,可能引起堆棧溢出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的階乘n

(n

1)!(n

0,1)(n

1)n!

1/*ch7_8.c*/#include

<stdio.h>int

fac(int

n){ int

f;if(n<0) printf("n<0,data

error!");elseif(n==0||n==1)

f=1;else

f=fac(n-1)*n;return(f);}main(){ int

n,y;printf("Input

a

integer

number:");scanf("%d",&n);y=fac(n);printf("%d!=%15d",n,y);}例

Hanoi問題voidmove(char getone,

char

putone){

printf("%c--->%c\n",getone,putone);

}void

hanoi(int

n,char

one,char

two,charthree){

if(n==1)

move(one,three);else{

hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}main(){ int

m;printf("Input

thenumber

ofdisks:");scanf("%d",&m);printf("The

steps

to

moving

%3d

disks:\n",m);hanoi(m,'A','B','C');}D:\fengyi\bkc\power\power.cABC§6.7

數組作為函數參數遞n=1m=1k=2n=2

n=3m=1

m=1k=2

k=2組i]b傳[=#include

<stdio.h>main(){

inta[10],b[10],i,n=0,m=0,k=0;printf("Enter

array

a:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("Enter

array

b:\n");for(i=0;i<10;i++)scanf("%d",&b[i]);for(i=0;i<10;i++){

if(large(a[i],b[i])==1)

n=n+1;elseif(large(a[i],b[i])==0)

m=m+1;elsek=k+1;}/*

Output

*/}int

large(int

x,int

y){ int

flag;if(x>y)

flag=1;else

if(x<y)

flag=-1;elseflag=0;return(flag);}數組名作函數參數地址傳遞在主調函數與被調函數分別定義數組,且類型應一致形參數組大小(

數組第一維)可不指定形參數組名是地址變量例求學生的平均成績#include

<stdio.h>float

average(int

stu[10],

int

n);voidmain(){

int

score[10],

i;float

av;printf("Input

10

scores:\n");for(i=0;

i<10;

i++

)scanf("%d",

&score[i]);av=average(score,10);printf("Average is:%.2f",av);}實參用數組名形參用數組定義,

int

stu[

]float average(int

stu[10],

int

n){int

i;float

av,total=0;for(i=0;

i<n;

i++

)total

+=stu[i];av=total/n;return

av;}012..9score122356….….88stu例數組元素與數組名作函數參數比較12調用前aa[0]a[1]12調用aa[0]a[1]1x2y2x1y交換12a返回#include

<stdio.h>void

swap2(int

x,inty){ int

z;z=x;

x=y;

y=z;}main(){ int

a[2]={1,2};swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值傳遞12a調用前12ax調用21交換21a

ax返回#include

<stdio.h>void

swap2(int

x[]){ int

z;z=x[0];

x[0]=x[1];x[1]=z;}main(){ inta[2]={1,2};swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址傳遞例數組元素與數組名作函數參數比較例 數組排序----簡單選擇排序void

sort(int

array[],int

n){ inti,j,k,t;for(i=0;i<n-1;i++)k=j;{

k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])if(k!=i){

t=array[i];array[i]=array[k];array[k]=t;}}}main(){

inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}0123456789akjjj

kj

kjjjjj9685732499927137688arrayi=0例 數組排序----簡單選擇排序void

sort(int

array[],int

n){ inti,j,k,t;for(i=0;i<n-1;i++)k=j;{

k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])if(k!=i){

t=array[i];array[i]=array[k];array[k]=t;}}}main(){

inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}0123456789akj

kj

kjjjjjjkk9135732499927687688arrayi=10123456789a9132732495768768899arrayi=8例 數組排序----簡單選擇排序void

sort(int

array[],int

n){ inti,j,k,t;for(i=0;i<n-1;i++)k=j;{

k=i;for(j=i+1;j<n;j++)if(array[j]<array[k])if(k!=i){

t=array[i];array[i]=array[k];array[k]=t;}}}main(){

inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}例 求二維數組中最大元素值ij1215max=13

5

74

6

87

34

12jij3

5

74

6

87

34

12int

max_value(int

array[3][4]){ inti,j,k,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];return(max);1

3

}215

17max=74

main(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};printf("max

value

is%d\n",max_value(a));}形參數組第一

數可省略,第二維必須相同

int

array[][4]例

求二維數組中各行元

和get_sum_row(int x[][3],

int result[]

,int

row,

int

col){ int

i,j;for(i=0;i<row;i++){

result[i]=0;for(j=0;j<col;j++)result[i]+=x[i][j];}}main(){ int

a[2][3]={3,6,9,1,4,7};intsum_row[2],row=2,col=3,i;get_sum_row(a,sum_row,row,col);for(i=0;i<row;i++)printf("The

sum

of

row[%d]=%d\n",i+1,sum_row[i]);}369147axresultsum_row1812§6.8

變量的屬性概述變量是對程序中數據的空間的抽象內存main(){

int

a;a=10;printf(“%d”,a);}10…….20002001程序中使用變量名對內存操作數據類型:變量所持有的數據的性質(操作屬性)屬性器類型:寄存器、靜態(tài) 區(qū)、動態(tài)

區(qū)生存期:變量在某一時刻存在-------靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內有效-------局部變量與全局變量變量的auto類型-----自動型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:

[類型]

數據類型 變量表;§6.8

變量的屬性概述變量是對程序中數據的變量的屬性空間的抽象static

float如:

int

sum;auto

int

a,b,c;register

int

i;x,y;在,有型局部變量與全局變量局部變量---

變量定義:在函數內定義,只說明:main中定義的變量只不同函數中同名變量形參屬于局部變量可定義在復合語句中局部變量可用

類(默認為auto)運行結果:5 4

3

2

1m

例復合語句中變量u例例不同不函同數函中數同中名同變名量變量main(){

{int

a,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}

}s

sub(){

{int

a,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}

}運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4全局變量---外部變量定義:在函數外定義,可為本文件所有函數共用有效范圍:從定義變量的位置開始到本源文件結束,及有降低程序清晰性,容易出錯次數:位置:只能1次所有函數之外分配內存:分配內存,可初始化可說明多次函數內或函數外不分配內存,不可初始化>>>>>extern說明的其它源文件外部變量說明:

extern

數據類型

變量表;外部變量定義與外部變量說明不同若外部變量與局部變量同名,則外部變量被外部變定量可義用

類型:缺省

或說明staticfloat

max,min;float

average(float

array[],

int

n){ int

i;

float

sum=array[0];max=min=array[0];for(i=1;i<n;i++){

if(array[i]>max)

max=array[i];elseif(array[i]<min)

min=array[i];sum+=array[i];}return(sum/n);}main(){ int

i; floatave,score[10];/*Input

*/

ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}maxmin作用域c1,c2的作用范圍p,q的作用范圍int

p=1,q=5;extern

char

c1,c2;float

f1(int

a){

int

b,c;extern

char

c1,c2;…….}int

f3(){…..}char

c1,c2;char

f2(int

x,int

y){ int

i,j;……}main(){

int

m,n;…….}c1,c2的作用范圍擴展后的作用范圍擴展后c1,c2例外部變量定義與說明intmax(int x,int

y){ int

z;z=x>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;intmax(){ int

z;z=a>b?a:b;return(z);}main(){

printf("max=%d",max());}int

a=13,b=-8;/*ch7_17.c*/inta=3,b=5;max(int a,int

b){ int

c;c=a>b?a:b;return(c);}main(){

int

a=8;printf("max=%d",max(a,b));}例 外部變量與局部變量運行結果:max=8int

i;main(){

void

prt();for(i=0;i<5;i++)prt();}void

prt(){

for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例 外部變量副作用運行結果:*****動態(tài)變量與靜態(tài)變量方式靜態(tài)動態(tài):程序運行期間分配固定

空間:程序運行期間根據需要動態(tài)分配空間靜態(tài)

區(qū)動態(tài)

區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(auto

register)函數調用現場保護和返回地址等內存用戶區(qū)生存期程序區(qū)靜態(tài)變量:從程序開始執(zhí)行到程序結束動態(tài)變量:從包含該變量定義的函數開始執(zhí)行至函數執(zhí)行結束變量類型局部變量默認為auto型register型變量個數受限,且不能為long,

double, float型局部static變量具有全局

和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴展外部變量作用域局部變量外部變量類別autoregister局部static外部static外部方式動態(tài)靜態(tài)區(qū)動態(tài)區(qū)寄存器靜態(tài)區(qū)生存期函數調用開始至結束程序整個運行期間作用域定義變量的函數或復合語句內本文件其它文件賦初值每次函數調用時編譯時賦初值,只賦一次未賦初值不確定自動賦初值0或空字符例

文件file1.cint

a;main(

){

…….…….f2;…….f1;…….}f1(

){

auto

int

b;………f2;……..}f2(

){

static

int

c;………}

C作用域b作用域mainf2f1mainf1f2maina作用域a生存期:b生存期:c生存期:例

auto

變量的作用域main(){

int

x=1;void

prt(void);{

int

x=3;prt();printf(“2ndx=%d\n”,x);}printf(“1stx=%d\n”,x);}void

prt(void){

int

x=5;printf(“3th

x=%d\n”,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(“%d\n”,x);}例局部靜態(tài)變量值具有可繼承性運行結果:111main(){

void

increment(void);increment();increment();increment();}void

increment(v

溫馨提示

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

評論

0/150

提交評論