




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第三章模塊化程序設計3.1模塊化程序設計思想3.2函數的定義3.3函數調用3.4函數的原型與聲明3.5函數嵌套與遞歸3.6庫函數的使用3.7變量的作用域與存儲類型3.8指針與函數3.9典型例題1/16/20231C語言程序設計函數是C程序的基本單位,每一個函數模塊用來實現一個特定的功能。[教學要求]1.理解函數的功能。2.掌握函數定義的一般形式。3.掌握函數的形參與實參的對應關系、參數傳遞方法及函數返回值的概念。4.掌握函數調用的幾種形式。5.掌握函數嵌套調用的一般過程。6.掌握指針的定義、使用以及指針作為函數的參數。7.掌握返回指針值的函數。8.掌握局部變量與全局變量的概念及它們的使用特點。1/16/20232C語言程序設計函數:main(),getchar(),putchar(),printf(),scanf(),exp(),fabs(),sqrt(),gets(),puts(),strcpy(),strcmp(),strcat(),strupr(),strlwr(),strlen()等。3.1模塊化程序設計的思想例:從鍵盤中輸入兩個數,分別求出這兩個數的最小公倍數和最大公約數。考慮:在主函數中完成數據x,y的輸入和結果的輸出;求解最小公倍數和求解最大公約數分別有兩個自定義函數實現。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語言程序設計結構化程序設計方法:自上向下、逐步分解、分而治之源程序文件1預編譯命令說明部分執行部分函數1函數n源程序文件i源程序文件nC程序C程序結構必須有且只能有一個名為main的主函數C程序的執行總是從main函數開始,在main中結束函數不能嵌套定義,可以嵌套調用1/16/20235C語言程序設計模塊化程序設計的特點:(1)模塊相對獨立,功能單一。編寫相對簡單,可以獨立編寫調試。(2)可集體開發,縮短開發周期。不同的模塊可以由不同的人員開發,最終能夠合成完整的程序。(3)開發出的模塊,可在不同的應用程序中多次使用,減少重復勞動,提高開發效率。(4)測試、更新以模塊為單位進行而不會影響其他模塊。
1/16/20236C語言程序設計函數分類從用戶角度標準函數(庫函數):由系統提供用戶自定義函數從函數形式無參函數有參函數使用庫函數(見教材附錄D)應注意:1、函數功能2、函數參數的數目和順序,及各參數意義和類型3、函數返回值意義和類型4、需要使用的包含文件3.2函數的定義1/16/20237C語言程序設計1、函數定義的一般形式:<數據類型>函數名(<參數表>){<說明語句><執行語句>}函數體當前函數返回主調函數的數據類型(即函數運行結果的數據類型)編寫方法與主函數的編寫方法一樣1/16/20238C語言程序設計例3.1:計算整數x的y次方long
power(int
x,inty){
intn;longp=1;for(n=1;n<=y;n++)p=p*x;
return(p);}函數類型參數列表返回值voidmain(){inta,b;longc;
scanf(“%d%d”,&a,&b);
c=power(a,b);
printf(“c=%ld\n”,c);}1/16/20239C語言程序設計定義形式:void函數名(){
說明語句;語句;}例3.2voidprint1(){
printf(“WelcometoChina!\n”);}main(){
print1();print1();print1();}無返回值函數的調用函數可以無參數2、無參函數1/16/202310C語言程序設計3.3函數調用
3.3.1函數調用的形式函數語句:例printstar();
printf(“Hello,World!\n”);函數表達式:例m=max(a,b)*2;函數參數:例printf(“%d”,max(a,b));m=max(a,max(b,c));1/16/202311C語言程序設計例3.3:用函數實現兩個數的數值交換#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);}形式參數實際參數3.3.2函數間的參數傳遞1/16/202312C語言程序設計形參與實參形式參數:定義函數時函數名后面括號中的變量名實際參數:調用函數時函數名后面括號中的表達式說明
實參必須有確定的值,可以是常量、變量、表達式、函數等;形參必須指定類型;形參與實參類型一致,個數相同;形參在函數被調用前不占內存;函數調用時為形參分配內存;調用結束,內存釋放。1/16/202313C語言程序設計參數傳遞方式值傳遞方式方式:函數調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內存單元單向傳遞,實參的值傳給形參1/16/202314C語言程序設計c=max(a,b);(main函數)
(max函數)max(intx,inty){intz;z=x>y?x:y;return(z);}例3.4比較兩個數并輸出大者#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語言程序設計上節回顧函數的組成部分?如何確定函數的數據類型?函數調用的方法有哪幾種?簡述參數的“值傳遞方式”?<數據類型>函數名(<參數表>){<說明語句><執行語句>}當前函數返回主調函數的數據類型(即函數運行結果的數據類型)函數語句:例printstar();
printf(“Hello,World!\n”);函數表達式:例m=max(a,b)*2;函數參數:例printf(“%d”,max(a,b));m=max(a,max(b,c));函數調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值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);}函數調用自定義函數實際參數形式參數1/16/202318C語言程序設計5、函數定義的一般形式:<數據類型>函數名(<參數表>){<說明語句><執行語句>}函數體當前函數返回主調函數的數據類型(即函數運行結果的數據類型)編寫方法與主函數的編寫方法一樣6、函數聲明的一般格式函數類型函數名(形參類型[形參名],…..)1/16/202319C語言程序設計3.3.3函數的返回值形式:return(表達式);
或
return表達式;
或
return;功能:使程序控制從被調用函數返回到調用函數中,同時把返值帶給調用函數說明:函數中可有多個return語句,一旦遇到一個return語句,就立即返回到主調函數。若無return語句,遇}時,自動返回調用函數若函數類型與return語句中表達式值的類型不一致,按前者為準,自動轉換------函數調用轉換void型函數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函數返回值類型轉換#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:從鍵盤中輸入兩個數,分別求出這兩個數的最小公倍數和最大公約數。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);
函數嵌套調用1/16/202322C語言程序設計一、一般形式:
函數類型函數名(形參類型[形參名],…..)
作用:告訴編譯系統函數類型、參數個數及類型,以便檢驗3.4函數的原型與聲明函數聲明中,由于編譯系統不檢查參數名,所以可以只寫形參的數據類型,而不寫形參名1/16/202323C語言程序設計二、說明1、函數定義與函數聲明不同。2、函數聲明位置:程序的數據說明部分,(1)在主調函數中;(2)在所有函數的外部(推薦使用)。3、下列情況下,可不作函數聲明(1)若函數返值是char或int型,系統自動按int型處理(2)被調用函數定義出現在主調函數之前有些系統(如BorlandC++)要求函數聲明指出函數返值類型和形參類型,并且對void和int
型函數也要進行函數聲明1/16/202324C語言程序設計例3.9函數聲明舉例#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型函數可不作函數聲明(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);}被調函數出現在主調函數之前,不必函數聲明#include<stdio.h>voidmain(){floatadd(float,float);/*函數聲明*/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);函數聲明在主調函數中#include<stdio.h>doubletest1(inta,intb);inttest2(charc,intd);chartest3(doublee,floatf);voidmain(){…/*調用函數test1,test2,test3*、}doubletest(inta,intb){…}inttest2(charc,intd){…}chartest3(doublee,floatf){…}函數的外部聲明1/16/202325C語言程序設計3.5函數嵌套與遞歸一、函數的嵌套調用C規定:函數定義不可嵌套,但可以嵌套調用函數main()調用函數a結束a函數b函數調用函數b1/16/202326C語言程序設計例3.10求三個數中最大數和最小數的差值#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()調用函數dif輸出結束dif函數max函數調用函數max調用函數minmin函數1/16/202327C語言程序設計二、拓撲算法——遞歸定義:函數直接或間接的調用自身叫函數的遞歸調用f()調f調f2調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)!
這樣,一個整數的階乘就被描述成為一個規模較小的階乘與一個數的積。同樣,可以將(n-1)!描述成(n-1)*(n-2)!。依次類推。于是,一個問題就被描述成了一個較小規模的同樣類型的問題了。
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主調函數返回值24調用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函數輸入m③y=fac(m)輸出y⑥調用facmn③
因
3!=0,1f=3*fac(3-1)返回f⑥調用facmn②返回f②返回f①
因
2!=0,1f=2*fac(2-1)調用facmn①因1==1f=1結束遞歸調用過程:1/16/202333C語言程序設計main()fac(3)fac(2)fac(1)fac(3)*4fac(2)*3fac(1)*2
6
2
1
結果:241/16/202334C語言程序設計3.6庫函數的使用(自學)使用庫函數應注意:1、函數功能2、函數參數的數目和順序,及各參數意義和類型3、函數返回值意義和類型4、需要使用的包含文件見教材例附錄A1/16/202335C語言程序設計上節回顧1、函數嵌套調用:main()調用函數a結束a函數b函數調用函數b函數b(){}函數a(){函數b;
}main(){
函數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、函數遞歸調用: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變量的作用域
所謂變量的作用域是指該變量有效的區域。按照變量的作用域,將C語言的變量分為局部變量和全局變量。一、局部變量---內部變量
位于一對花括號之間的所有語句稱為一個代碼塊(也稱為復合語句)。定義:出現在代碼塊開始位置的變量。說明:局部變量的作用域僅限于定義它的代碼塊內main中定義的變量只在main中有效不同函數中同名變量,占不同內存單元形參屬于局部變量可定義在復合語句中,且只在該復合語句中有效的變量floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效1/16/202338C語言程序設計運行結果: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不同函數中相同的變量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);}運行結果:4321temp=01/16/202340C語言程序設計定義:任何在所有代碼塊之外定義的變量。有效范圍:從定義變量的位置開始到本源文件結束應盡量少使用全局變量,因為:全局變量在程序全部執行過程中占用存儲單元降低了函數的通用性、可靠性,可移植性降低程序清晰性,容易出錯注意:若全局變量與局部變量同名,則全局變量被屏蔽!二、全局變量---外部變量說明:全局變量的作用是增強函數之間聯系的渠道為便于區分全局與局部變量,將全局變量名的第一個字母大寫1/16/202341C語言程序設計3、局部變量和全局變量main中定義的變量只在main中有效不同函數中同名變量,占不同內存單元形參屬于局部變量可定義在復合語句中,且只在該復合語句中有效的變量定義:在函數內定義,只在本函數內有效定義:在函數外定義,可為本文件所有函數共用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);/*輸入班級人數*/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;運行結果: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全局變量與局部變量重名時運行結果: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全局變量副作用運行結果:?
*****1/16/202346C語言程序設計3.7.2變量的存儲類型變量的存儲類型:存儲變量值的內存類型。變量的存儲類型決定變量何時創建、何時銷毀及它的值將保持多久。分為:靜態存儲和動態存儲兩種類型1、自動變量(auto變量)C語言中使用最廣泛的一種類型。函數內凡是未加類型說明的變量均視為自動變量。1/16/202347C語言程序設計例如:intx,y;等價于:autointx,y;說明:①自動變量的作用域僅限于定義該變量的個體內。②當程序執行到定義自動變量的代碼塊時,該自動變量才被創建,當程序的執行離開該代碼塊時,這些自動變量便自行銷毀,所以自動變量屬于動態存儲方式。③函數的形式參數也是自動變量。1/16/202348C語言程序設計2、寄存器變量(register變量)以前介紹的變量都存放在內存里。當一個變量頻繁讀寫時,要反復訪問內存,從而花費大量的存取時間。C語言提供另一種變量,即寄存器變量。存放在CPU中,使用時不訪問內存,而直接從寄存器中讀寫。1/16/202349C語言程序設計例如:registerint
x,y;說明:①寄存器變量屬于動態存儲方式,只有局部自動變量和形式參數才可以定義為寄存器變量。②由于CPU中寄存器的個數是有限的,所以編譯器可以忽略register關鍵字,當有太多的變量聲明為register時,只有個別的變量會存儲在寄存器中,其余的編譯器會按普通自動變量處理。在變量的定義中,一般并不需要使用register關鍵字。1/16/202350C語言程序設計3、靜態static靜態變量賦初值,只執行一次再次調用函數時保留上次函數調用結束時的值。例如:編寫一個函數實現值自增1。在主函數中循環調用三次該函數,并輸出結果。#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;/*靜態局部變量*/num++;returnnum;}
結果:666結果:6781/16/202351C語言程序設計說明:①靜態局部變量在函數內定義,始終占用內存空間,直到整個源程序退出時才釋放。
②靜態局部變量僅賦一次初值。③靜態局部變量雖然在整個源程序都存在,但是其作用域仍與自動變量相同,即只能在定義該變量的函數內使用該變量。退出該函數后,盡管該變量還繼續存在,但不能使用它。④靜態局部變量若在聲明時未賦初值,則系統自動初始化為0(對數值型變量)或’\0’(對字符變量)。1/16/202352C語言程序設計⑤如果一個文件中的全局變量不允許其他文件的函數引用,則該變量要用static聲明。或者說一個文件中的靜態全局變量不允許其它文件中的函數引用。⑥如果一個函數前用static聲明,則這個函數不能被其他文件中的函數調用,稱為內部函數或靜態函數。staticintsort;main(){……}file1.c1/16/202353C語言程序設計4、外部聲明extern外部變量是在函數的外部定義的全局變量。(1)如果想在定義之前的函數中引用全局變量,則在函數中用關鍵字extern聲明。
#include<stdio.h>voidmain(){externinta,b;
printf(”%d”,max(a,b);}
inta=13,b=-8;a,b的作用域擴展到整個main函數1/16/202354C語言程序設計(2)、如果一個C程序有多個源程序文件組成,則一個文件定義了全局變量,則另一個文件如果要引用它的全局變量,就要用extern作聲明;file1.cfile2.cintsort;main(){……}externintsort;intfunc(){……}1/16/202355C語言程序設計(3)、如果一個函數前用extern聲明,則這個函數可以被其他文件中的函數調用,稱為外部函數。例:/*file1.c*/main(){intc,a=2;
externintfac(intx);……c=fac(a);……}/*file2.c*/externintfac(intx){……}1/16/202356C語言程序設計3.8指針與函數
3.8.1指針作為函數參數值傳遞地址傳遞
指針變量就是存放變量地址的變量。變量的指針就是變量的地址。舉例: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語言程序設計指針變量作為函數的參數:類型名函數名(類型名*形式參數1,類型名*形式參數2,…){
說明部分;語句;
}說明
參數的傳遞是值傳遞,單向的(從實參到形參)。那么如何理解通過指針作為參數可以改變主調函數中變量的值呢?形參得到實參的值即一個地址,函數中可以通過形參引用該地址,從而可以改變該地址對應變量的值。1/16/202358C語言程序設計711x:y:調用前:調用結束: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;}調用:711a:b:711x:y:swap:711x:y:117a:b:temp例3.181/16/202359C語言程序設計例3.18交換兩個數的值#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求三個數中的最大值和平均值用函數實現: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);}主函數的變量:1257子函數的變量:&ave&max7512&ave&maxacbap2p1cbp2p1avemax128.0舉例1/16/202361C語言程序設計上節回顧
(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返回指針值的函數(自學)
一般定義形式為:
類型名*函數名(類型名*形式參數1,*類型名*形式參數2)
例如:int*a(int
x,inty);
a是函數名,調用它以后能得到一個指向整型數據的指針(地址),x、y是函數的形參,為整型。返回指針值的函數:一個函數可以帶回一個整數值、字符值等,也可以帶回指針型的數據,即地址。1/16/202363C語言程序設計例3.12編寫一個函數求某班級學生成績的最高分、最低分和平均分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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025江蘇揚州人才集團下屬企業招聘6人筆試備考題庫參考答案詳解
- 2025江蘇揚州寶應縣“鄉村振興青年人才”招聘67人筆試參考題庫及1套完整答案詳解
- 2025年東莞市公務員考試行測真題及答案詳解1套
- 2025年人教部編本語文四年級下冊第三次月考測試題(附答案)(一)
- 吉林省松原市前郭一中2024-2025學年度6月份質量檢測 (含答案)人教版(2024)七年級下冊
- 遼寧省錦州市某校2024-2025學年高一下學期期中物理試卷
- 陜西省部分學校2024-2025學年高一上學期1月期末考試檢測數學試卷(解析版)
- 元旦快樂與孩子一起講故事
- 房地產項目進度執行與監控
- 語文片段教學課件
- 幼兒園食育環境創設的實踐研究 論文
- 電機學知到章節答案智慧樹2023年東北電力大學
- 氣候變化科學概論試題及答案
- 湖南省郴州市2016年中考數學試卷(解析版)
- 破壁靈芝孢子粉
- 森林計測學(測樹學)智慧樹知到答案章節測試2023年浙江農林大學
- 對外漢語教學法智慧樹知到答案章節測試2023年西北師范大學
- GA 1801.1-2022國家戰略儲備庫反恐怖防范要求第1部分:石油儲備庫
- jgj113-2015建筑玻璃技術規范
- 聲環境影響評價自查表
- GB/T 9755-2014合成樹脂乳液外墻涂料
評論
0/150
提交評論