模塊化程序設計_第1頁
模塊化程序設計_第2頁
模塊化程序設計_第3頁
模塊化程序設計_第4頁
模塊化程序設計_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章模塊化程序設計3.1模塊化程序設計思想3.2函數(shù)的定義3.3函數(shù)調(diào)用3.4函數(shù)的原型與聲明3.5函數(shù)嵌套與遞歸3.6庫函數(shù)的使用3.7變量的作用域與存儲類型3.8指針與函數(shù)3.9典型例題1/16/20231C語言程序設計函數(shù)是C程序的基本單位,每一個函數(shù)模塊用來實現(xiàn)一個特定的功能。[教學要求]1.理解函數(shù)的功能。2.掌握函數(shù)定義的一般形式。3.掌握函數(shù)的形參與實參的對應關系、參數(shù)傳遞方法及函數(shù)返回值的概念。4.掌握函數(shù)調(diào)用的幾種形式。5.掌握函數(shù)嵌套調(diào)用的一般過程。6.掌握指針的定義、使用以及指針作為函數(shù)的參數(shù)。7.掌握返回指針值的函數(shù)。8.掌握局部變量與全局變量的概念及它們的使用特點。1/16/20232C語言程序設計函數(shù):main(),getchar(),putchar(),printf(),scanf(),exp(),fabs(),sqrt(),gets(),puts(),strcpy(),strcmp(),strcat(),strupr(),strlwr(),strlen()等。3.1模塊化程序設計的思想例:從鍵盤中輸入兩個數(shù),分別求出這兩個數(shù)的最小公倍數(shù)和最大公約數(shù)??紤]:在主函數(shù)中完成數(shù)據(jù)x,y的輸入和結(jié)果的輸出;求解最小公倍數(shù)和求解最大公約數(shù)分別有兩個自定義函數(shù)實現(xiàn)。1/16/20233C語言程序設計intgys(int

x,inty){}intgbs(int

x,inty){}#include<stdio.h>voidmain(){inta,b,m,n;

printf(“input2numbers:\n”);

scanf(“%d,%d”&a,&b);m=gys(a,b);n=gbs(a,b);

printf(“gys=%d,gbs=%d\n”,m,n);}1/16/20234C語言程序設計結(jié)構化程序設計方法:自上向下、逐步分解、分而治之源程序文件1預編譯命令說明部分執(zhí)行部分函數(shù)1函數(shù)n源程序文件i源程序文件nC程序C程序結(jié)構必須有且只能有一個名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用1/16/20235C語言程序設計模塊化程序設計的特點:(1)模塊相對獨立,功能單一。編寫相對簡單,可以獨立編寫調(diào)試。(2)可集體開發(fā),縮短開發(fā)周期。不同的模塊可以由不同的人員開發(fā),最終能夠合成完整的程序。(3)開發(fā)出的模塊,可在不同的應用程序中多次使用,減少重復勞動,提高開發(fā)效率。(4)測試、更新以模塊為單位進行而不會影響其他模塊。

1/16/20236C語言程序設計函數(shù)分類從用戶角度標準函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)(見教材附錄D)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件3.2函數(shù)的定義1/16/20237C語言程序設計1、函數(shù)定義的一般形式:<數(shù)據(jù)類型>函數(shù)名(<參數(shù)表>){<說明語句><執(zhí)行語句>}函數(shù)體當前函數(shù)返回主調(diào)函數(shù)的數(shù)據(jù)類型(即函數(shù)運行結(jié)果的數(shù)據(jù)類型)編寫方法與主函數(shù)的編寫方法一樣1/16/20238C語言程序設計例3.1:計算整數(shù)x的y次方long

power(int

x,inty){

intn;longp=1;for(n=1;n<=y;n++)p=p*x;

return(p);}函數(shù)類型參數(shù)列表返回值voidmain(){inta,b;longc;

scanf(“%d%d”,&a,&b);

c=power(a,b);

printf(“c=%ld\n”,c);}1/16/20239C語言程序設計定義形式:void函數(shù)名(){

說明語句;語句;}例3.2voidprint1(){

printf(“WelcometoChina!\n”);}main(){

print1();print1();print1();}無返回值函數(shù)的調(diào)用函數(shù)可以無參數(shù)2、無參函數(shù)1/16/202310C語言程序設計3.3函數(shù)調(diào)用

3.3.1函數(shù)調(diào)用的形式函數(shù)語句:例printstar();

printf(“Hello,World!\n”);函數(shù)表達式:例m=max(a,b)*2;函數(shù)參數(shù):例printf(“%d”,max(a,b));m=max(a,max(b,c));1/16/202311C語言程序設計例3.3:用函數(shù)實現(xiàn)兩個數(shù)的數(shù)值交換#include<stdio.h>voidswap(int

a,intb){intt;t=a;a=b;b=t;

printf(“result:x=%dy=%d\n”,a,b);}voidmain(){intx=10,y=5;

printf(“x=%d,y=%d\n”,x,y);swap(x,y);}形式參數(shù)實際參數(shù)3.3.2函數(shù)間的參數(shù)傳遞1/16/202312C語言程序設計形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式說明

實參必須有確定的值,可以是常量、變量、表達式、函數(shù)等;形參必須指定類型;形參與實參類型一致,個數(shù)相同;形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放。1/16/202313C語言程序設計參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內(nèi)存單元單向傳遞,實參的值傳給形參1/16/202314C語言程序設計c=max(a,b);(main函數(shù))

(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例3.4比較兩個數(shù)并輸出大者#include<stdio.h>voidmain(){inta,b,c;

scanf("%d,%d",&a,&b);

c=max(a,b);

printf("Maxis%d",c);}int

max(intx,inty){intz;z=x>y?x:y;return(z);}實參形參1/16/202315C語言程序設計上節(jié)回顧函數(shù)的組成部分?如何確定函數(shù)的數(shù)據(jù)類型?函數(shù)調(diào)用的方法有哪幾種?簡述參數(shù)的“值傳遞方式”?<數(shù)據(jù)類型>函數(shù)名(<參數(shù)表>){<說明語句><執(zhí)行語句>}當前函數(shù)返回主調(diào)函數(shù)的數(shù)據(jù)類型(即函數(shù)運行結(jié)果的數(shù)據(jù)類型)函數(shù)語句:例printstar();

printf(“Hello,World!\n”);函數(shù)表達式:例m=max(a,b)*2;函數(shù)參數(shù):例printf(“%d”,max(a,b));m=max(a,max(b,c));函數(shù)調(diào)用時,為形參分配單元,并將實參的值復制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值1/16/202316C語言程序設計例3.5計算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}voidmain(){floata,product;

printf("Pleaseinputvalueofa:");

scanf("%f",&a);product=cube(a);

printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.7281/16/202317C語言程序設計例3.6從鍵盤中輸入一個年份,判斷該年是否是閏年。#include<stdio.h>voidmain(){intyear,st;

printf(“Inputayear:\n”);

scanf(“%d”,&year);

st=leap(year);

if(st==1)

printf(“\n%disrunnian\n”,year);else

printf(“\n%disnotrunnian\n”,year);}intleap(intyear){intst;if(year%4==0&&year%100!=0||year%400==0)

st=1;elsest=0;

return(st);}函數(shù)調(diào)用自定義函數(shù)實際參數(shù)形式參數(shù)1/16/202318C語言程序設計5、函數(shù)定義的一般形式:<數(shù)據(jù)類型>函數(shù)名(<參數(shù)表>){<說明語句><執(zhí)行語句>}函數(shù)體當前函數(shù)返回主調(diào)函數(shù)的數(shù)據(jù)類型(即函數(shù)運行結(jié)果的數(shù)據(jù)類型)編寫方法與主函數(shù)的編寫方法一樣6、函數(shù)聲明的一般格式函數(shù)類型函數(shù)名(形參類型[形參名],…..)1/16/202319C語言程序設計3.3.3函數(shù)的返回值形式:return(表達式);

return表達式;

return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返值帶給調(diào)用函數(shù)說明:函數(shù)中可有多個return語句,一旦遇到一個return語句,就立即返回到主調(diào)函數(shù)。若無return語句,遇}時,自動返回調(diào)用函數(shù)若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準,自動轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)intmax(int

x,inty){if(x>y)return(x);return(y);}voidmain(){inta,b,c;

scanf(“%d,%d”,&a,&b);c=max(a,b);

printf(“maxis%d”,c);}1/16/202320C語言程序設計例3.7函數(shù)返回值類型轉(zhuǎn)換#include<stdio.h>intmax(floatx,floaty){floatz;z=x>y?x:y;

return(z);}voidmain(){floata,b;

intc;

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

printf("Maxis%d\n",c);}輸入:23.0,66.0輸出:661/16/202321C語言程序設計例3.8:從鍵盤中輸入兩個數(shù),分別求出這兩個數(shù)的最小公倍數(shù)和最大公約數(shù)。intgys(int

x,inty){}intgbs(int

x,inty){}return(x*y/gys(x,y));ints;s=x*y/gys(x,y);return(s);intt,s;if(x>y){t=x;x=y;y=t;}

while((s=y%x)!=0){y=x;x=s;}return(x);

函數(shù)嵌套調(diào)用1/16/202322C語言程序設計一、一般形式:

函數(shù)類型函數(shù)名(形參類型[形參名],…..)

作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗3.4函數(shù)的原型與聲明函數(shù)聲明中,由于編譯系統(tǒng)不檢查參數(shù)名,所以可以只寫形參的數(shù)據(jù)類型,而不寫形參名1/16/202323C語言程序設計二、說明1、函數(shù)定義與函數(shù)聲明不同。2、函數(shù)聲明位置:程序的數(shù)據(jù)說明部分,(1)在主調(diào)函數(shù)中;(2)在所有函數(shù)的外部(推薦使用)。3、下列情況下,可不作函數(shù)聲明(1)若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理(2)被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前有些系統(tǒng)(如BorlandC++)要求函數(shù)聲明指出函數(shù)返值類型和形參類型,并且對void和int

型函數(shù)也要進行函數(shù)聲明1/16/202324C語言程序設計例3.9函數(shù)聲明舉例#include<stdio.h>voidmain(){inta,b;intc;

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

printf("Maxis%d\n",c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)聲明(BorlandC++不行)#include<stdio.h>floatadd(floatx,floaty){floatz;z=x+y;return(z);}voidmain(){floata,b,c;

scanf("%f,%f",&a,&b);c=add(a,b);

printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)聲明#include<stdio.h>voidmain(){floatadd(float,float);/*函數(shù)聲明*/floata,b,c;

scanf("%f,%f",&a,&b);c=add(a,b);

printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}或floatadd(floatx,floaty);函數(shù)聲明在主調(diào)函數(shù)中#include<stdio.h>doubletest1(inta,intb);inttest2(charc,intd);chartest3(doublee,floatf);voidmain(){…/*調(diào)用函數(shù)test1,test2,test3*、}doubletest(inta,intb){…}inttest2(charc,intd){…}chartest3(doublee,floatf){…}函數(shù)的外部聲明1/16/202325C語言程序設計3.5函數(shù)嵌套與遞歸一、函數(shù)的嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b1/16/202326C語言程序設計例3.10求三個數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>

intdif(int

x,int

y,intz);

intmax(int

x,int

y,intz);

intmin(int

x,int

y,intz);voidmain(){inta,b,c,d;

scanf("%d%d%d",&a,&b,&c);

d=dif(a,b,c);

printf("Max-Min=%d\n",d);}intdif(int

x,int

y,intz){returnmax(x,y,z)-min(x,y,z);}intmax(int

x,int

y,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(int

x,int

y,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)1/16/202327C語言程序設計二、拓撲算法——遞歸定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()intf(intx){inty,z;……

z=f(y);…….return(2*z);}intf1(intx){inty,z;……

z=f2(y);…….return(2*z);}intf2(intt){inta,c;……

c=f1(a);…….return(3+c);}1/16/202328C語言程序設計例3.11_1求n的階乘(采用非遞歸算法)#include<stdio.h>intfac(intn){intf,i;f=1;for(i=1;i<=n;i++)f=f*i;return(f);}voidmain(){intn,y;

printf("Inputaintegernumber:");

scanf("%d",&n);

y=fac(n);

printf("%d!=%15d",n,y);}1/16/202329C語言程序設計[分析]一般來說,將n!描述成為:n!=1*2*3….*(n-1)*n但是,只要稍稍變換一下,就可以將其描述成為:n!=n*(n-1)….3*2*1=n*(n-1)!

這樣,一個整數(shù)的階乘就被描述成為一個規(guī)模較小的階乘與一個數(shù)的積。同樣,可以將(n-1)!描述成(n-1)*(n-2)!。依次類推。于是,一個問題就被描述成了一個較小規(guī)模的同樣類型的問題了。

1/16/202330C語言程序設計用遞歸的方法求n!非法n<01n=0,1n*(n-1)!n>0

n!=遞歸的終止條件遞歸方式4!=4*(4-1)!

返回值6返回值2返回值13!=3*(3-1)!2!=2*(2-1)!1!=1主調(diào)函數(shù)返回值24調(diào)用1/16/202331C語言程序設計例3.11_2求n的階乘(采用遞歸算法)#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;

printf("Inputaintegernumber:");

scanf("%d",&n);

y=fac(n);

printf("%d!=%15d",n,y);}1/16/202332C語言程序設計main函數(shù)輸入m③y=fac(m)輸出y⑥調(diào)用facmn③

3!=0,1f=3*fac(3-1)返回f⑥調(diào)用facmn②返回f②返回f①

2!=0,1f=2*fac(2-1)調(diào)用facmn①因1==1f=1結(jié)束遞歸調(diào)用過程:1/16/202333C語言程序設計main()fac(3)fac(2)fac(1)fac(3)*4fac(2)*3fac(1)*2

6

2

1

結(jié)果:241/16/202334C語言程序設計3.6庫函數(shù)的使用(自學)使用庫函數(shù)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件見教材例附錄A1/16/202335C語言程序設計上節(jié)回顧1、函數(shù)嵌套調(diào)用:main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b函數(shù)b(){}函數(shù)a(){函數(shù)b;

}main(){

函數(shù)a;}1/16/202336C語言程序設計#include<stdio.h>intfac(intn){intf;

if(n<1)f=-1;elseif(n==1||n==2)f=1;elsef=fac(n-2)+fac(n-1);return(f);}voidmain(){intn,y;

printf("Inputaintegernumber:");

scanf("%d",&n);

y=fac(n);

if(y==-1)printf(“Inputerror!\n”);elseprintf(“%15d",y);}2、函數(shù)遞歸調(diào)用:int

fac(intn){intf,f1=1,f2=1,i;

if(n<1)f=-1;elseif(n==1||n==2)f=1;else

for(i=3;i<=n;i++){f=f1+f2;f1=f2;f2=f;}returnf;}1/16/202337C語言程序設計3.7變量的作用域與存儲類型

3.7.1變量的作用域

所謂變量的作用域是指該變量有效的區(qū)域。按照變量的作用域,將C語言的變量分為局部變量和全局變量。一、局部變量---內(nèi)部變量

位于一對花括號之間的所有語句稱為一個代碼塊(也稱為復合語句)。定義:出現(xiàn)在代碼塊開始位置的變量。說明:局部變量的作用域僅限于定義它的代碼塊內(nèi)main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復合語句中,且只在該復合語句中有效的變量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效1/16/202338C語言程序設計運行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4#include<stdio.h>voidmain(){inta,b;a=3;b=4;

printf("main:a=%d,b=%d\n",a,b);voidsub();

printf("main:a=%d,b=%d\n",a,b);}voidsub(){inta,b;a=6;b=7;

printf("sub:a=%d,b=%d\n",a,b);}例3.12不同函數(shù)中相同的變量1/16/202339C語言程序設計例3.13復合語句中變量#include<stdio.h>#defineN5voidmain(){inti;inttemp=0;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)

{

inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;

}for(i=0;i<N;i++)

printf("%d",a[i]);

printf(“\n%d\n”,temp);}運行結(jié)果:4321temp=01/16/202340C語言程序設計定義:任何在所有代碼塊之外定義的變量。有效范圍:從定義變量的位置開始到本源文件結(jié)束應盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯注意:若全局變量與局部變量同名,則全局變量被屏蔽!二、全局變量---外部變量說明:全局變量的作用是增強函數(shù)之間聯(lián)系的渠道為便于區(qū)分全局與局部變量,將全局變量名的第一個字母大寫1/16/202341C語言程序設計3、局部變量和全局變量main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復合語句中,且只在該復合語句中有效的變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效定義:在函數(shù)外定義,可為本文件所有函數(shù)共用1/16/202342C語言程序設計#include<stdio.h>floatMax=0,Min=100;floataverage(intn){inti;floats,aver1,sum=0;for(i=1;i<n;i++){scanf(“%f”,&s);/*輸入一個學生成績*/if(s>Max)Max=s;elseif(s<Min)Min=s;sum+=s;}return(sum/n);}voidmain(){intn;floataver2;

scanf(“%d”,&n);/*輸入班級人數(shù)*/aver2=average(n);

printf(“Max=%6.2f\nMin=%6.2f\naverage=%6.2f\n",Max,Min,aver2);}作用域MaxMin例3.141/16/202343C語言程序設計例3.15全局變量定義與聲明#include<stdio.h>intmax(intx,inty){intz;z=x>y?x:y;return(z);}voidmain(){

printf("max=%d",max(a,b));}inta=13,b=-8;運行結(jié)果:max=13#include<stdio.h>inta=13,b=-8;intmax(){intz;z=a>b?a:b;return(z);}voidmain(){printf("max=%d",max());}編譯出錯1/16/202344C語言程序設計#include<stdio.h>inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;return(c);}voidmain(){inta=8;

printf("max=%d",max(a,b));}例3.16全局變量與局部變量重名時運行結(jié)果:max=8a,b為全局變量a,b為局部變量a為局部變量局部變量a全局變量b作用范圍行參a、b作用范圍1/16/202345C語言程序設計#include<stdio.h>inti;voidmain(){voidprt();

for(i=0;i<5;i++)

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

printf(“*”);

printf(“\n”);}例3.17全局變量副作用運行結(jié)果:?

*****1/16/202346C語言程序設計3.7.2變量的存儲類型變量的存儲類型:存儲變量值的內(nèi)存類型。變量的存儲類型決定變量何時創(chuàng)建、何時銷毀及它的值將保持多久。分為:靜態(tài)存儲和動態(tài)存儲兩種類型1、自動變量(auto變量)C語言中使用最廣泛的一種類型。函數(shù)內(nèi)凡是未加類型說明的變量均視為自動變量。1/16/202347C語言程序設計例如:intx,y;等價于:autointx,y;說明:①自動變量的作用域僅限于定義該變量的個體內(nèi)。②當程序執(zhí)行到定義自動變量的代碼塊時,該自動變量才被創(chuàng)建,當程序的執(zhí)行離開該代碼塊時,這些自動變量便自行銷毀,所以自動變量屬于動態(tài)存儲方式。③函數(shù)的形式參數(shù)也是自動變量。1/16/202348C語言程序設計2、寄存器變量(register變量)以前介紹的變量都存放在內(nèi)存里。當一個變量頻繁讀寫時,要反復訪問內(nèi)存,從而花費大量的存取時間。C語言提供另一種變量,即寄存器變量。存放在CPU中,使用時不訪問內(nèi)存,而直接從寄存器中讀寫。1/16/202349C語言程序設計例如:registerint

x,y;說明:①寄存器變量屬于動態(tài)存儲方式,只有局部自動變量和形式參數(shù)才可以定義為寄存器變量。②由于CPU中寄存器的個數(shù)是有限的,所以編譯器可以忽略register關鍵字,當有太多的變量聲明為register時,只有個別的變量會存儲在寄存器中,其余的編譯器會按普通自動變量處理。在變量的定義中,一般并不需要使用register關鍵字。1/16/202350C語言程序設計3、靜態(tài)static靜態(tài)變量賦初值,只執(zhí)行一次再次調(diào)用函數(shù)時保留上次函數(shù)調(diào)用結(jié)束時的值。例如:編寫一個函數(shù)實現(xiàn)值自增1。在主函數(shù)中循環(huán)調(diào)用三次該函數(shù),并輸出結(jié)果。#include<stdio.h>intadd();voidmain(){inti,result;for(i=1;i<=3;i++){result=add();printf("%d",result);}}intadd(){autointnum=5;//自動局部變量num++;returnnum;}#include<stdio.h>intadd();voidmain(){inti,result;for(i=1;i<=3;i++){result=add();printf("%d",result);}}intadd(){staticintnum=5;/*靜態(tài)局部變量*/num++;returnnum;}

結(jié)果:666結(jié)果:6781/16/202351C語言程序設計說明:①靜態(tài)局部變量在函數(shù)內(nèi)定義,始終占用內(nèi)存空間,直到整個源程序退出時才釋放。

②靜態(tài)局部變量僅賦一次初值。③靜態(tài)局部變量雖然在整個源程序都存在,但是其作用域仍與自動變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后,盡管該變量還繼續(xù)存在,但不能使用它。④靜態(tài)局部變量若在聲明時未賦初值,則系統(tǒng)自動初始化為0(對數(shù)值型變量)或’\0’(對字符變量)。1/16/202352C語言程序設計⑤如果一個文件中的全局變量不允許其他文件的函數(shù)引用,則該變量要用static聲明。或者說一個文件中的靜態(tài)全局變量不允許其它文件中的函數(shù)引用。⑥如果一個函數(shù)前用static聲明,則這個函數(shù)不能被其他文件中的函數(shù)調(diào)用,稱為內(nèi)部函數(shù)或靜態(tài)函數(shù)。staticintsort;main(){……}file1.c1/16/202353C語言程序設計4、外部聲明extern外部變量是在函數(shù)的外部定義的全局變量。(1)如果想在定義之前的函數(shù)中引用全局變量,則在函數(shù)中用關鍵字extern聲明。

#include<stdio.h>voidmain(){externinta,b;

printf(”%d”,max(a,b);}

inta=13,b=-8;a,b的作用域擴展到整個main函數(shù)1/16/202354C語言程序設計(2)、如果一個C程序有多個源程序文件組成,則一個文件定義了全局變量,則另一個文件如果要引用它的全局變量,就要用extern作聲明;file1.cfile2.cintsort;main(){……}externintsort;intfunc(){……}1/16/202355C語言程序設計(3)、如果一個函數(shù)前用extern聲明,則這個函數(shù)可以被其他文件中的函數(shù)調(diào)用,稱為外部函數(shù)。例:/*file1.c*/main(){intc,a=2;

externintfac(intx);……c=fac(a);……}/*file2.c*/externintfac(intx){……}1/16/202356C語言程序設計3.8指針與函數(shù)

3.8.1指針作為函數(shù)參數(shù)值傳遞地址傳遞

指針變量就是存放變量地址的變量。變量的指針就是變量的地址。舉例:int*p1,*p2,a;float*p3,b;例3.3voidswap(int

a,intb){intt;t=a;a=b;b=t;

printf("result:x=%dy=%d\n",a,b);}voidmain(){intx=10,y=5;

printf("x=%d,y=%d\n",x,y);swap(x,y);}例3.3-1#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,intb){inttemp;temp=a;a=b;b=temp;}輸出:?1/16/202357C語言程序設計指針變量作為函數(shù)的參數(shù):類型名函數(shù)名(類型名*形式參數(shù)1,類型名*形式參數(shù)2,…){

說明部分;語句;

}說明

參數(shù)的傳遞是值傳遞,單向的(從實參到形參)。那么如何理解通過指針作為參數(shù)可以改變主調(diào)函數(shù)中變量的值呢?形參得到實參的值即一個地址,函數(shù)中可以通過形參引用該地址,從而可以改變該地址對應變量的值。1/16/202358C語言程序設計711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:#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,intb){inttemp;temp=a;a=b;b=temp;}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp例3.181/16/202359C語言程序設計例3.18交換兩個數(shù)的值#include<stdio.h>main(){intx=7,y=11;

printf(“Swapped:\n");

swap(x,y);

printf("x=%d,y=%d\n",x,y);}swap(int

a,intb){inttemp;temp=a;a=b;b=temp;}輸出:Swapped:x=7,y=11#include<stdio.h>voidswap(int*px,int*py){inttemp;temp=*px;*px=*py;*py=temp;}main(){intx=7,y=11,*p1,*p2;p1=&x;p2=&y;

printf(“x=%d,y=%d”,x,y);

printf(“Swapped:\n”);

swap(p1,p2);

printf(“x=%d,y=%d”,x,y);}Swapped:x=11,y=71/16/202360C語言程序設計例3.19求三個數(shù)中的最大值和平均值用函數(shù)實現(xiàn):voidmav(int

a,int

b,int

c,int*p1,float*p2){*p1=a;if(*p1<b)*p1=b;if(*p1<c)*p1=c;*p2=(a+b+c)/3.0;Return;}main(){inta,b,c,max,*p1;floatave,*p2;scanf(“%d%d%d”,&a,&b,&c);P1=&max;P2=&ave;mav(a,b,c,p1,p2);

Printf(“max=%d,ave=%f”,max,ave);}主函數(shù)的變量:1257子函數(shù)的變量:&ave&max7512&ave&maxacbap2p1cbp2p1avemax128.0舉例1/16/202361C語言程序設計上節(jié)回顧

(1)指針變量

(2)變量的指針

(3)inta=4,*s;s=&a;則,*s=?(4)值傳遞方式vs

地址傳遞方式就是存放變量地址的變量。就是變量的地址。4#include<stdio.h>voidswap(int

*px,int

*py){inttemp;temp=*px;*px=*py;*py=temp;}main(){intx=7,y=11,*p1,*p2;p1=&x;p2=&y;

printf(“x=%d,y=%d”,x,y);

printf(“Swapped:\n”);

swap(p1,p2);

printf(“x=%d,y=%d”,x,y);}1/16/202362C語言程序設計3.8.2返回指針值的函數(shù)(自學)

一般定義形式為:

類型名*函數(shù)名(類型名*形式參數(shù)1,*類型名*形式參數(shù)2)

例如:int*a(int

x,inty);

a是函數(shù)名,調(diào)用它以后能得到一個指向整型數(shù)據(jù)的指針(地址),x、y是函數(shù)的形參,為整型。返回指針值的函數(shù):一個函數(shù)可以帶回一個整數(shù)值、字符值等,也可以帶回指針型的數(shù)據(jù),即地址。1/16/202363C語言程序設計例3.12編寫一個函數(shù)求某班級學生成績的最高分、最低分和平均分voidfunc(intn,float*aver,float*max,float*min){inti;floats;for(i=1;i<=n;i++){printf(“inputascore:\n”);

scanf(“%f”,&s);if(s>*max)*max=s;if(s<*min)*min=s;*aver+=s;}*aver/=n;}main(){intn;floatx=0;y=100;aver1=0;

printf(“howmanystudents:\n”);

scanf(“%d”,&n);

func(n,&aver

溫馨提示

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

評論

0/150

提交評論