




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1T7變量作用域及有參有返回值的函數2回顧1、C語言的基本單位是什么?2、使用函數有哪些好處?3、自定義函數包含哪幾部分?4、什么是函數的定義?什么是函數的調用?5、函數的調用分哪兩種方式?3本章任務
定義幾個全局變量,用來保存一個客戶的開戶信息,包括用戶名、卡號、密碼和開戶金額,然后分別完成開戶、存款、取款、余額查詢等業務。4本章目標理解變量的作用域理解函數的參數理解函數的返回值5變量的作用域
作用域是某些事物起作用或有效的區域。限于陸地限于海洋限于空中6程序中變量也有不同的使用范圍,稱為變量的作用域。變量的作用域決定變量的可訪問性變量的作用域voiddisplayDiscount(){floatdiscount_amt;.........}局部變量:只在某函數內部有效floatdiscount_amt;voidmain(){......}voiddisplayDiscount(){......}全局變量:從定義時到程序結束有效7變量的作用域#include<stdio.h>voidaddNumbers(){
intnum1,num2,sum;
printf("\n
請輸入兩個數:");
scanf("%d%d",&num1,&num2);
sum=num1+num2;
printf("子函數中sum的值是%d\n",sum);}voidmain(){
intsum=0;//局部變量
addNumbers();
printf("\n
主函數中sum的值是%d\n",sum);}內存sumnum2045num1請輸入兩個數:5645子函數中sum的值是101主函數中sum的值是056sum101示例一8變量的作用域#include<stdio.h>intsum=0;//全局變量voidaddNumbers(){
intnum1,num2;
printf("\n
請輸入兩個數:");
scanf("%d%d",&num1,&num2); sum=num1+num2;
printf("子函數中sum的值是%d\n",sum);}voidmain(){
addNumbers();
printf("\n
主函數中sum的值是%d\n",sum);}內存sumnum2045num1請輸入兩個數:5645子函數中sum的值是101主函數中sum的值是10156101示例二9全局變量全局變量:它是在任何函數外部定義的變量。它的作用域是從定義時刻開始,到程序結束。全局變量需注意以下幾點:1.全局變量定義必須在所有的函數之外。2.全局變量可加強函數模塊之間的數據聯系,但是又使函數要依賴這些變量,因而使得函數的獨立性降低。3.在同一源文件中,允許全局變量和局部變量同名。在局部變量的作用域內,同名的全局變量不起作用。10全局變量int
a,b;/*全局變量*/floatx,y;/*全局變量*/voidf1()/*函數f1*/
{
……
}
intf2()/*函數f2*/
{
……
}main()/*主函數*/
{
……
}此時,全局變量a,b,x,y可以在函數f1、f2、及主函數中使用11使用全局變量的例子#include"stdio.h"inta=0;voidout(){
printf("%d\n",a);}voidmain(){ a=1; out();}聲明全局變量a并初始化為0將a的值輸出,輸出為1將a賦值為1 上面的程序聲明了一個全局的整型用于傳遞數據,通過運行程序可以看出:在函數內和函數外都可以修改全局變量的值。12局部變量局部變量:在函數內定義說明的,其作用范圍僅限于該函數內。局部變量需注意以下幾點:1.主函數中定義的變量也只能在主函數中使用,不能在其它函數中使用。2.允許在不同的函數中使用相同的變量名,它們代表不同的變量,分配不同的存放單元,互不相干,不會發生混淆。3.復合語句中定義的變量,也是復合語句的局部變量。所謂復合語句,就是用{}包含起來的語句塊.13局部變量#include"stdio.h"voidstup(){inta=3,b=4;
printf("函數stup()的局部變量a,b\n%d%d\n",a,b);}voidmain(){inta=1,b=2;{inta=7,b=9;
printf("復合語句中的局部變量a,b\n%d%d\n",a,b);}
printf("函數main()的局部變量a,b\n%d%d\n",a,b);
stup();}函數stup()的局部變量函數
main()的局部變量復合語句中的局部變量示例三14小結1、什么是變量的作用域?2、全局變量和局部變量有什么區別?15函數形參和實參display(intnum,floatfraction){......}voidmain(){......display(10,20.5);}實際參數函數調用形式參數16函數參數及函數的調用形式參數:簡稱形參。形參出現在函數定義中,在整個函數體內的局部變量.實際參數:簡稱實參。出現在函數調用中。是函數調用時,參數的實際值。int
max(int
a,intb){if(a>=b) returna;else returnb;}voidmain(){int
x,y,mux;......mux=max(x,y)......}實參形參函數調用17函數的參數使用案例voidtotal(int
a,intb){
intsum=0;
for(inti=a;i<=b;i++){sum+=i;}
printf(“%d到%d的和是%d\n”,a,b,sum);}voidpow(double
a,intb){doublesum=1.0;
for(inti=0;i<b;i++){sum*=a;}
printf(“%lf的%d次方是%lf\n”,a,b,sum);}voidfun(intn){doubles=1.0;
while(n>1)s*=n--;
printf(“%d的階乘是%lf\n”,n,s);}18函數參數的說明注意以下幾點:1、定義函數時,必須說明形參的類型。形參只能是變量和數組。2、形參是函數局部變量,只在函數內部有效3、實參的傳遞,必須和形參的類型,個數,順序完全一致19使用局部變量的例子#include"stdio.h"voidout(inta){ a++;}voidmain(){ a=1;
out(a);
printf(“a=%d\n”,a);}定義形參變量a,是函數內部的局部變量將a的值傳遞進函數20小結1、什么是形參?什么是實參?2、實參在使用時,必須注意什么?21函數的返回值返回語句:returnxx;/*’xx’為一變量、表達式、常量*/注意:1、如果你聲明的是一有返回值的函數,但沒有使用return語句,將報錯.2、一個函數中可以有多個return語句,但是函數運行過程中遇見第一個return語句就會返回,同時終止該函數的運行!22改寫n!doublefun(intn){doubles=1.0;
while(n>1)s*=n--;returns;}調用:voidmain(){doublesum;sum=fun(5);printf(“5的階乘是%lf\n”,sum);}或者voidmain(){doublesum;
intn=5;sum=fun(n);
printf(“%d的階乘是%lf\n”,n,sum);}或者voidmain(){printf(“5的階乘是%lf\n”,fun(5));}特點:有返回值的函數,一般使用容器將返回值接收!23例
有參有返回值的函數問題描述:編寫函數求給定2個數中的最大值#include"stdio.h"int
getMax(int
a,intb);//函數聲明voidmain(){
int
x,y,max;
printf("請輸入兩個整數:");
scanf("%d%d",&x,&y); max=getMax(x,y);//函數調用
printf("%d和%d中的較大數是:%d\n",x,y,max);}int
getMax(int
a,intb)//函數定義{
if(a>b) { returna; } else { returnb; }}示例四24函數值的類型函數的類型即函數值的類型,在定義時聲明。例:int
max(int
a,intb);函數類型為int型。說明:函數的類型同函數返回值的類型一般是要求保持一致,如果函數返回值類型(即return語句返回的類型)同函數類型不一致,則在函數返回值時對其進行強行轉化,轉化為函數類型;25小結定義幾個全局變量,用來保存一個客戶的開戶信息,包括用戶名、卡號、密碼和開戶金額,然后分別完成開戶、存款、取款、余額查詢等業務。現場編程charname[10];longcardID;longpsw;floatmoney;voidmain(){……}voidopenAccount()//開戶{ printf("\t\t\t本系統現在為你開戶\n");printf("\t\t\t請輸入您的用戶名:");scanf("%s",name);printf("\t\t\t請輸入您的卡號:");scanf("%ld",&cardID);printf("\t\t\t請輸入您的密碼:");scanf("%ld",&psw);printf("\t\t\t請輸入您的開戶金額:");scanf("%f",&money);printf("\t\t\t開戶成功,請妥善保管您的開戶信息\n");}voidsaveMoney()//存款{longID;floatm;
printf("\t\t\t請輸入您的卡號:");
scanf("%ld",&ID);
if(ID==cardID){
printf("\t\t\t請輸入您的存款金額:");
scanf("%f",&m);money=m+money;
printf(“\t\t\t存款成功,您卡上的余額是: %0.2f\n",money);}else{
printf("\t\t\t您的卡號輸入錯誤,無法存款!\n");}}26變量交換
1224xyc1224方式二: x=x+y; y=x-y; x=x-y;27傳值調用與傳址調用
C語言中函數的形式參數的傳遞方式有兩種,一種是傳值,另一種是傳址,對于這兩個概念,最核心的思想是: 第一、
在傳值調用中,函數中傳遞的是實際參數的值即內容,這時形式參數的改變不會影響實參。 第二、在傳址調用中,函數中傳遞的是實際參數的地址,這時函數形式參數的改變會影響實參。其原因是:傳址是形參和實參共用一個地址內存。 下面先看一下傳值調用的例子:28值傳遞傳遞的是實參變量的內容的復制品,而不是實參本身。函數參數的值傳遞voidfunc(inta){ a++;
printf(“func函數中的a=%d\n”,a);}voidmain(){
inta=12;
func(a);
printf(“main函數中的a=%d\n”,a);}結論:只要是基本類型作為函數的參數,都是屬于值傳遞.內存aa121213func函數中的a=13main函數中的a=1229思考定義一個變量交換的函數,如下所示:
voidchange(int
a,intb){
intc=a; a=b; b=c;} voidmain(){
inta=12,b=24;
printf(“交換前:a=%d,b=%d\n”,a,b);
change(a,b);
printf(“交換后:a=%d,b=%d\n”,a,b); }內存12a24b交換前:a=12,b=24交換后:a=12,b=2412a24b30#include<stdio.h>voidincrement(int,int);voidmain(){
intnum1,num2;
printf("\n
請輸入兩個數:");
scanf("%d%d",&num1,&num2);
printf("\n
遞增前的值是%d和%d\n",num1,num2); increment(num1,num2);
printf("\n
遞增后的值是%d和%d\n",num1,num2);}voidincrement(intval1,intval2){ val1++; val2++;
printf("\n
子函數中值%d和%d\n",val1,val2);}例2傳值調用請輸入兩個數
:3456遞增前的值是
34和
56_遞增后的值是
34和56num1num2var13456var2子函數中的值是
35和5735345657num1num234563456FF23FF05調用后修改為35val2FFEAFF45將變量num1的值賦給形參val1將變量num2的值賦給形參val2val1調用后修改為57調用函數被調用函數示例五31函數實參的地址傳遞在學習地址傳遞之前,我們先回顧一下一維數組的定義:
inta[5];其中,數組a有5個元素,它們在內存中是連續存放的。數組名a就是數組的元素在內存中存放的首地址.地址的概念就像門牌號碼.郵遞員送信只認門牌號碼,而不用管這個地址中住的是什么人。32數組作為函數參數(傳址調用)在用數組作實參時,以傳址方式調用函數,也就是說把實參數組的首地址賦給形參實際上形參數組和實參數組為同一數組,共同擁有一段內存空間33使用數組作為函數參數實現變量交換
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論