第4章C語(yǔ)言程序設(shè)計(jì)課件_第1頁(yè)
第4章C語(yǔ)言程序設(shè)計(jì)課件_第2頁(yè)
第4章C語(yǔ)言程序設(shè)計(jì)課件_第3頁(yè)
第4章C語(yǔ)言程序設(shè)計(jì)課件_第4頁(yè)
第4章C語(yǔ)言程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語(yǔ)言程序設(shè)計(jì)請(qǐng)用PowerPoint2003播放第4章函數(shù)本章導(dǎo)讀

學(xué)習(xí)完本章以后,你將能夠:理解模塊化程序設(shè)計(jì)的基本思想,掌握利用函數(shù)實(shí)現(xiàn)程序的模塊化設(shè)計(jì);掌握函數(shù)的定義與調(diào)用方法;了解系統(tǒng)標(biāo)準(zhǔn)函數(shù)的作用,掌握利用系統(tǒng)函數(shù)解決具體問(wèn)題的方法;掌握函數(shù)的嵌套調(diào)用,遞歸調(diào)用;理解變量作用域與存儲(chǔ)方式;掌握編譯預(yù)處理內(nèi)容介紹

C語(yǔ)言是面向過(guò)程的模塊化語(yǔ)言,以函數(shù)(具有某種特定功能相對(duì)獨(dú)立的程序模塊)作為程序的模塊單位,實(shí)現(xiàn)程序模塊化,又稱函數(shù)式的語(yǔ)言。C的源程序是由一個(gè)主函數(shù)和若干個(gè)函數(shù)組成的,函數(shù)的相互調(diào)用構(gòu)成了C程序。在程序設(shè)計(jì)中常將一些常用的功能模塊編寫(xiě)成函數(shù),放在函數(shù)庫(kù)中供公共選用。要善于利用函數(shù),以減少重復(fù)編寫(xiě)程序段的工作量。變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象,必須先定義后使用,每個(gè)變量?jī)H在定義它的語(yǔ)句塊(包含下級(jí)語(yǔ)句快)內(nèi)有效。變量的屬性包括:操作屬性和存儲(chǔ)屬性。教學(xué)目的

要求學(xué)生了解模塊化程序設(shè)計(jì)與函數(shù),重點(diǎn)掌握函數(shù)的定義與調(diào)用;重點(diǎn)掌握參數(shù)的傳遞和函數(shù)的嵌套調(diào)用,掌握遞歸調(diào)用;了解變量的作用域與存儲(chǔ)方式,重點(diǎn)掌握編譯預(yù)處理及綜合應(yīng)用。系統(tǒng)函數(shù)的正確調(diào)用

用戶函數(shù)的定義方法

函數(shù)的類(lèi)型和返回值

形式參數(shù)與實(shí)際參數(shù),參數(shù)值的傳遞

函數(shù)的正確調(diào)用,嵌套調(diào)用,遞歸調(diào)用

局部變量和全局變量

變量的存儲(chǔ)類(lèi)別(自動(dòng),靜態(tài),寄存器,外部),變量的作用域和生存期

宏定義,文件包含和條件編譯教學(xué)重點(diǎn)教學(xué)難點(diǎn)

函數(shù)參數(shù)傳遞與返回值;變量的作用域與存儲(chǔ)類(lèi)型;模塊化原則。關(guān)鍵詞模塊化;函數(shù);函數(shù)定義;函數(shù)調(diào)用;變量作用域;變量存儲(chǔ)方式;編譯預(yù)處理。授課時(shí)量理論學(xué)時(shí):64.1概述

4.2函數(shù)的定義與調(diào)用

4.3函數(shù)的嵌套調(diào)用與遞歸調(diào)用

4.4變量的作用域與存儲(chǔ)類(lèi)型4.5預(yù)處理指令

4.6模塊與鏈接4.7常用系統(tǒng)函數(shù)4.8案例研究4.9函數(shù)抽象與逐步求精4.10本章小結(jié)

本章主要內(nèi)容如下:4.1概述

C語(yǔ)言是面向過(guò)程的模塊化語(yǔ)言,以函數(shù)(具有某種特定功能相對(duì)獨(dú)立的程序模塊)作為程序的模塊單位,實(shí)現(xiàn)程序模塊化,又稱函數(shù)式的語(yǔ)言。C的源程序是由一個(gè)主函數(shù)和若干個(gè)函數(shù)組成的,函數(shù)的相互調(diào)用構(gòu)成了C程序。運(yùn)行時(shí),程序從主函數(shù)main()開(kāi)始執(zhí)行,到

main()的終止行結(jié)束。其它函數(shù)由

main()或別的函數(shù)或自身調(diào)用后組成可執(zhí)行程序。在程序設(shè)計(jì)中常將一些常用的功能模塊編寫(xiě)成函數(shù),放在函數(shù)庫(kù)中供公共選用。要善于利用函數(shù),以減少重復(fù)編寫(xiě)程序段的工作量。main(){inta,b,x;a=2;b=3;x=max(a,b)pritnf("x=%d",x);}intmax(intm1,intm2){intx;if(m1>m2)x=m1;elsex=m2;return(x);}例4.1

1).一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序文件是一個(gè)編譯單位,即以源文件為單位進(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。2).一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成。一個(gè)源文件可以為多個(gè)C程序公用。3).一個(gè)C程序有且只能有一個(gè)名為main的主函數(shù),程序的執(zhí)行從

main函數(shù)開(kāi)始,調(diào)用其它函數(shù)后流程回到

main函數(shù),在

main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。main函數(shù)是系統(tǒng)定義的。

4).所有函數(shù)都是平等的,即在定義函數(shù)時(shí)是互相獨(dú)立的,一個(gè)函數(shù)并不從屬于另一個(gè)函數(shù),即函數(shù)不能嵌套定義,但可以互相調(diào)用(main函數(shù)不能調(diào)用)。

說(shuō)明5).從用戶使用的角度看,函數(shù)有兩種:2

標(biāo)準(zhǔn)函數(shù),即庫(kù)函數(shù)。這是由系統(tǒng)提供的。使用時(shí)應(yīng)注意:函數(shù)功能、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類(lèi)型、函數(shù)返回值意義和類(lèi)型、需要使用的包含文件2

用戶自己定義的函數(shù),以解決用戶的專門(mén)需要。所謂編程實(shí)質(zhì)就是編寫(xiě)自定義功能函數(shù),通過(guò)各函數(shù)的相互調(diào)用實(shí)現(xiàn)算法,甚至可以考慮把相關(guān)的函數(shù)集合到一起,形成自己的函數(shù)庫(kù),并加以相應(yīng)的頭文件,實(shí)現(xiàn)商業(yè)化。6).從函數(shù)的形式看,函數(shù)分兩類(lèi)2

無(wú)參函數(shù)。調(diào)用時(shí),主調(diào)函數(shù)無(wú)數(shù)據(jù)傳送給被調(diào)函數(shù)。2

有參函數(shù)。調(diào)用時(shí),主調(diào)函數(shù)與被調(diào)函數(shù)之間有參數(shù)傳遞。

7).函數(shù)調(diào)用完成后,通過(guò)return語(yǔ)句返回函數(shù)值,若無(wú)該語(yǔ)句將返回不確定值,若函數(shù)類(lèi)型定義為void(空)類(lèi)型,該函數(shù)將沒(méi)有返回值。

4.2函數(shù)的定義與調(diào)用函數(shù)的定義

函數(shù)的調(diào)用、參數(shù)及傳遞方式

函數(shù)的返回值

函數(shù)聲明的作用

main函數(shù)中的參數(shù)

4.2.1

函數(shù)的定義一般格式合法標(biāo)識(shí)符函數(shù)返回值類(lèi)型缺省int型無(wú)返回值void函數(shù)體函數(shù)類(lèi)型函數(shù)名(形參類(lèi)型說(shuō)明表){

說(shuō)明部分 語(yǔ)句部分}現(xiàn)代風(fēng)格:例有參函數(shù)(現(xiàn)代風(fēng)格)

intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風(fēng)格)

intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)

dummy(){}函數(shù)體為空例無(wú)參函數(shù)

printstar(){printf(“**********\n”);}或

printstar(void){printf(“**********\n”);}函數(shù)類(lèi)型函數(shù)名(形參表)形參類(lèi)型說(shuō)明{

說(shuō)明部分 語(yǔ)句部分}傳統(tǒng)風(fēng)格:例有參函數(shù)(傳統(tǒng)風(fēng)格)

intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}4.2.2

函數(shù)的調(diào)用、參數(shù)及傳遞方式

調(diào)用形式函數(shù)名(實(shí)參表);說(shuō)明:實(shí)參與形參個(gè)數(shù)相等,類(lèi)型一致,按順序一一對(duì)應(yīng)實(shí)參表求值順序,因系統(tǒng)而定(TurboC自右向左)main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例參數(shù)求值順序main(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}運(yùn)行結(jié)果:0運(yùn)行結(jié)果:1調(diào)用方式函數(shù)語(yǔ)句:例printstar();printf(“Hello,World!\n”);函數(shù)表達(dá)式:例m=max(a,b)*2;函數(shù)參數(shù):例printf(“%d”,max(a,b));m=max(a,max(b,c));函數(shù)參數(shù)及其傳遞方式形參與實(shí)參形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個(gè)數(shù)并輸出大者main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實(shí)參說(shuō)明:實(shí)參必須有確定的值形參必須指定類(lèi)型形參與實(shí)參類(lèi)型一致,個(gè)數(shù)相同若形參與實(shí)參類(lèi)型不一致,自動(dòng)按形參類(lèi)型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放函數(shù)參數(shù)及其傳遞方式形參與實(shí)參形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)中的表達(dá)式例計(jì)算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時(shí),為形參分配單元,并將實(shí)參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實(shí)參單元仍保留并維持原值特點(diǎn):形參與實(shí)參占用不同的內(nèi)存單元單向傳遞711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:例交換兩個(gè)數(shù)/*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(inta,intb){inttemp;temp=a;a=b;b=temp;}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp地址傳遞方式:函數(shù)調(diào)用時(shí),將數(shù)據(jù)的存儲(chǔ)地址作為參數(shù)傳遞給形參特點(diǎn):形參與實(shí)參占用同樣的存儲(chǔ)單元“雙向”傳遞實(shí)參和形參必須是地址常量或變量/*ch9_3.c*/swap(p1,p2)int*p1,*p2;{intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,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);}例交換兩個(gè)數(shù)a59b調(diào)前:a59b調(diào)swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:#include<stdio.h>longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);return(c1+c2);}longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預(yù)處理命令函數(shù)類(lèi)型說(shuō)明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實(shí)參4.2.3

函數(shù)的返回值返回語(yǔ)句形式:return(表達(dá)式);

return表達(dá)式;

return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時(shí)把返值帶給調(diào)用函數(shù)說(shuō)明:函數(shù)中可有多個(gè)return語(yǔ)句若無(wú)return語(yǔ)句,遇}時(shí),自動(dòng)返回調(diào)用函數(shù)若函數(shù)類(lèi)型與return語(yǔ)句中表達(dá)式值的類(lèi)型不一致,按前者為準(zhǔn),自動(dòng)轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)例無(wú)返回值函數(shù)

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}例函數(shù)帶回不確定值輸出:10voidprintstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}編譯錯(cuò)誤!例函數(shù)返回值類(lèi)型轉(zhuǎn)換main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}輸入:5.6,7.3輸出:7

注:當(dāng)函數(shù)返回值類(lèi)型與函數(shù)的類(lèi)型不一致的時(shí)候,按函數(shù)的類(lèi)型轉(zhuǎn)換。

4.2.4

函數(shù)聲明的作用

對(duì)被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫(kù)函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類(lèi)型說(shuō)明函數(shù)說(shuō)明一般形式:函數(shù)類(lèi)型函數(shù)名(形參類(lèi)型[形參名],…..);

或函數(shù)類(lèi)型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類(lèi)型、參數(shù)個(gè)數(shù)及類(lèi)型,以便檢驗(yàn)函數(shù)定義與函數(shù)說(shuō)明不同函數(shù)說(shuō)明位置:程序的數(shù)據(jù)說(shuō)明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說(shuō)明若函數(shù)返值是char或int型,系統(tǒng)自動(dòng)按int型處理被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前有些系統(tǒng)(如BorlandC++)要求函數(shù)說(shuō)明指出函數(shù)返值類(lèi)型和形參類(lèi)型,并且對(duì)void和int型函數(shù)也要進(jìn)行函數(shù)說(shuō)明例函數(shù)說(shuō)明舉例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說(shuō)明(VisualC++不行)/*ch4_10.c*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){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ù)說(shuō)明/*ch4_10.c*/main(){floatadd(float,float);/*functiondeclaration*/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();4.2.5

main函數(shù)中的參數(shù)

main函數(shù)是由系統(tǒng)調(diào)用的,一般是void類(lèi)型的無(wú)參函數(shù),但在某種特定情形下可以帶參數(shù),用指針數(shù)組作main函數(shù)的形參,其實(shí)參是和命令一起給出的,也就是在DOS提示符下,輸入本程序的可執(zhí)行文件名和需要傳給main函數(shù)的參數(shù),命令行的一般形式為:可執(zhí)行文件名

參數(shù)1參數(shù)2……

參數(shù)n帶參數(shù)的main函數(shù)的原型是:

main(intargc,char*argv[]);

其中argc為命令行參數(shù)(包括可執(zhí)行文件名)的數(shù)目n+1;指針數(shù)組argv中的各元素分別指向命令行中的各參數(shù)(包括可執(zhí)行文件名),即字符串的首地址。

例4.11:若以下面程序編譯后生成可執(zhí)行程序

city.exe,在DOS提示符下按下述形式執(zhí)行程序:

citychangshazhuzhouxiangtan寫(xiě)出程序運(yùn)行結(jié)果。#include<stdio.h>main(intargc,char*argv[]){while(--argc>0)printf(“%s\n”,argv[argc]);}運(yùn)行結(jié)果:xiangtanzhuzhouchangsha4.3

函數(shù)的嵌套與遞歸調(diào)用嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b例求三個(gè)數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);printf("Max-Min=%d\n",d);}Ch7_202.cintdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,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ù)例用弦截法求方程的根xyf(x)0x1x2xf(x1)f(x2)求f(x1)與f(x2)連線與x軸的交點(diǎn)x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號(hào)y=f(x),y1=f(x1)y與y1同號(hào)真假x1=xy1=yx2=x直到

|y|<root=x輸出

rootroot函數(shù)運(yùn)行情況:Inputx1,x2:2,6Arootofequationis5.0000main()調(diào)用函數(shù)root輸出根x結(jié)束root函數(shù)xpoint函數(shù)調(diào)用函數(shù)xpoint調(diào)用函數(shù)ff函數(shù)#include<math.h>floatf(floatx){floaty;y=((x-19)*x+95)*x-77;return(y);}floatxpoint(floatx1,floatx2){floatx;x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(x);}

floatroot(floatx1,floatx2){floatx,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.000001);return(x);}main(){floatx1,x2,f1,f2,x;do{printf(“inputx1,x2:\n”);scanf(“%f,%f”,&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf(“rootis%8.4f”,x);}遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說(shuō)明C編譯系統(tǒng)對(duì)遞歸函數(shù)的自調(diào)用次數(shù)沒(méi)有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過(guò)多,可能引起堆棧溢出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);}例求n的階乘/*ch4_14.c*/#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);}例Hanoi問(wèn)題voidmove(chargetone,charputone){printf("%c--->%c\n",getone,putone);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three);}}main(){intm;printf("Inputthenumberofdisks:");scanf("%d",&m);printf("Thestepstomoving%3ddisks:\n",m);hanoi(m,'A','B','C');}ABC運(yùn)行情況如下:Inputthenumberofdisks:3Inputthenumberofdisks:A--->CA--->BC--->BA--->CB--->AB--->CA--->C4.4

變量的作用域與存儲(chǔ)類(lèi)型

4.4.1

變量的作用域

變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象,必須先定義后使用,定義后其作用范圍是受約束的,變量的有效使用范圍就是作用域,其規(guī)則是:每個(gè)變量?jī)H在定義它的語(yǔ)句塊(包含下級(jí)語(yǔ)句快)內(nèi)有效。說(shuō)明:main函數(shù)中定義的變量只在main函數(shù)中有效;不同函數(shù)中同名變量,屬于不同的變量,占不同內(nèi)存單元;形參屬于局部變量;可定義在復(fù)合語(yǔ)句中有效的變量,上級(jí)語(yǔ)句塊定義的變量對(duì)下級(jí)語(yǔ)句塊有效(除非下級(jí)語(yǔ)句塊定義了同名變量將屏蔽上級(jí)語(yǔ)句塊定義的變量)

4.4.2全局變量局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說(shuō)明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語(yǔ)句中有效的變量局部變量可用存儲(chǔ)類(lèi)型:autoregisterstatic(默認(rèn)為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函數(shù)中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}例復(fù)合語(yǔ)句中變量#defineN5main(){inti;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]);}運(yùn)行結(jié)果:54321例復(fù)合語(yǔ)句中變量#defineN5main(){inti;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]);}例不同函數(shù)中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}運(yùn)行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4全局變量---外部變量定義:在函數(shù)外定義,可為本文件所有函數(shù)共用有效范圍:從定義變量的位置開(kāi)始到本源文件結(jié)束,及有extern說(shuō)明的其它源文件

應(yīng)盡量少使用全局變量,因?yàn)椋喝肿兞吭诔绦蛉繄?zhí)行過(guò)程中占用存儲(chǔ)單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯(cuò)

定義

說(shuō)明次數(shù):只能1次可說(shuō)明多次位置:所有函數(shù)之外函數(shù)內(nèi)或函數(shù)外分配內(nèi)存:分配內(nèi)存,可初始化不分配內(nèi)存,不可初始化>>>>外部變量說(shuō)明:

extern數(shù)據(jù)類(lèi)型變量表;外部變量定義與外部變量說(shuō)明不同若外部變量與局部變量同名,則外部變量被屏蔽外部變量可用存儲(chǔ)類(lèi)型:缺省或

staticfloatmax,min;floataverage(floatarray[],intn){inti;floatsum=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(){inti;floatave,score[10];/*Input*/ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxminintp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍externcharc1,c2;externcharc1,c2;c1,c2的作用范圍擴(kuò)展后c1,c2的作用范圍擴(kuò)展后例外部變量定義與說(shuō)明intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;運(yùn)行結(jié)果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}例外部變量與局部變量運(yùn)行結(jié)果:max=8inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例外部變量副作用運(yùn)行結(jié)果:*****變量的屬性數(shù)據(jù)類(lèi)型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲(chǔ)屬性存儲(chǔ)器類(lèi)型:寄存器、靜態(tài)存儲(chǔ)區(qū)、動(dòng)態(tài)存儲(chǔ)區(qū)生存期:變量在某一時(shí)刻存在-------靜態(tài)變量與動(dòng)態(tài)變量作用域:變量在某區(qū)域內(nèi)有效-------局部變量與全局變量變量的存儲(chǔ)類(lèi)型auto-----自動(dòng)型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲(chǔ)類(lèi)型]數(shù)據(jù)類(lèi)型變量表;4.4.3

變量的存儲(chǔ)類(lèi)型概述變量是對(duì)程序中數(shù)據(jù)的存儲(chǔ)空間的抽象如:intsum;autointa,b,c;registerinti;staticfloatx,y;生存期靜態(tài)變量:從程序開(kāi)始執(zhí)行到程序結(jié)束動(dòng)態(tài)變量:從包含該變量定義的函數(shù)開(kāi)始執(zhí)行至函數(shù)執(zhí)行結(jié)束動(dòng)態(tài)變量與靜態(tài)變量存儲(chǔ)方式靜態(tài)存儲(chǔ):程序運(yùn)行期間分配固定存儲(chǔ)空間動(dòng)態(tài)存儲(chǔ):程序運(yùn)行期間根據(jù)需要?jiǎng)討B(tài)分配存儲(chǔ)空間內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)全局變量、局部靜態(tài)變量形參變量局部動(dòng)態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場(chǎng)保護(hù)和返回地址等變量存儲(chǔ)類(lèi)型靜態(tài)動(dòng)態(tài)存儲(chǔ)方式程序整個(gè)運(yùn)行期間函數(shù)調(diào)用開(kāi)始至結(jié)束生存期編譯時(shí)賦初值,只賦一次每次函數(shù)調(diào)用時(shí)賦初值自動(dòng)賦初值0或空字符不確定未賦初值靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)區(qū)存儲(chǔ)區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復(fù)合語(yǔ)句內(nèi)本文件其它文件局部變量默認(rèn)為auto型register型變量個(gè)數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見(jiàn)性局部static變量具有可繼承性extern不是變量定義,可擴(kuò)展外部變量作用域register局部staticauto外部static外部存儲(chǔ)類(lèi)別例文件file1.cinta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例auto變量的作用域main(){intx=1;voidprt(void);{intx=3;prt();printf(“2ndx=%d\n”,x);}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}運(yùn)行結(jié)果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例局部靜態(tài)變量值具有可繼承性運(yùn)行結(jié)果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運(yùn)行結(jié)果:123other(){staticinta=2;staticintb;intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}#include<stdio.h>inti=1;main(){staticinta;registerintb=-10;intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;other();}全局i1main:a0b:-10registermain:c0靜態(tài)存儲(chǔ)區(qū)動(dòng)態(tài)存儲(chǔ)區(qū)other:a2other:b0other:c10843315443other:c10675156-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15例變量的壽命與可見(jiàn)性main(){voidgx(),gy();

externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例用extern擴(kuò)展外部變量作用域運(yùn)行結(jié)果:1:x=0y=02:x=135y=2463:x=135y=246例引用其它文件中的外部變量intglobal;externfloatx;main(){intlocal; . . .}externintglobal;staticintnumber;func2(){ . . .}floatx;staticintnumber;func3(){externintglobal; . . .}file1.cfile2.cfile3.c例引用其它文件中的變量,輸出ab和a的m次方inta;main(){intpower(intn);intb=3,c,d,m;printf("Enterthenumberaanditspower:\n");scanf("%d,%d",&a,&m);c=a*b;printf("%d*%d=%d\n",a,b,c);d=power(m);printf("%d**%d=%d",a,m,d);}externinta;intpower(intn){inti,y=1;for(i=1;i<=n;i++) y*=a;return(y);}4.5編譯預(yù)處理作用:對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C源程序種類(lèi)宏定義#define文件包含#include條件編譯#if--#else--#endif等格式:“#”開(kāi)頭占單獨(dú)書(shū)寫(xiě)行語(yǔ)句尾不加分號(hào)如if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展開(kāi)后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);4.5.1

宏定義不帶參數(shù)宏定義一般形式:#define宏名[宏體]功能:用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)宏展開(kāi):預(yù)編譯時(shí),用宏體替換宏名---不作語(yǔ)法檢查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏體可缺省,表示宏名定義過(guò)或取消宏體定義位置:任意(一般在函數(shù)外面)作用域:從定義命令到文件結(jié)束#undef可終止宏名作用域格式:

#undef宏名例#defineYES1main(){……..}

#undefYES#defineYES0max(){……..}YES原作用域YES新作用域宏定義可嵌套,不能遞歸例#defineMAXMAX+10()引號(hào)中的內(nèi)容與宏名相同也不置換例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展開(kāi):printf(“2*PI=%f\n”,3.14159*2);宏定義中使用必要的括號(hào)()例#defineWIDTH80#defineLENGTH

WIDTH+40var=LENGTH*2;宏展開(kāi):var=80+40*2;()()例#defineWIDTH80#defineLENGTHWIDTH+40var=LENGTH*2;宏展開(kāi):var=80+40*2;帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)宏體例#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)PI*r*r”宏展開(kāi):形參用實(shí)參換,其它字符保留宏體及各形參外一般應(yīng)加括號(hào)()例#defineS(a,b)a*b………..area=S(3,2);宏展開(kāi):area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開(kāi):z=x+y*x+y;一般寫(xiě)成:#definePOWER(x)((x)*(x))宏展開(kāi):z=((x+y)*(x+y));#defineMAX(x,y)(x)>(y)?(x):(y)…….main(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開(kāi):t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}main(){inta,b,c,d,t;…….t=max(a+b,c+d);………}例用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能<>帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理過(guò)程不分配內(nèi)存簡(jiǎn)單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時(shí)間編譯時(shí)程序運(yùn)行時(shí)參數(shù)類(lèi)型無(wú)類(lèi)型問(wèn)題定義實(shí)參,形參類(lèi)型程序長(zhǎng)度變長(zhǎng)不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間<>4.5.2

文件包含功能:一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含進(jìn)來(lái)一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)“包含”后的文件作一個(gè)源文件編譯<>直接按標(biāo)準(zhǔn)目錄搜索“”先在當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄可指定路徑被包含文件內(nèi)容源文件(*.c)頭文件(*.h)宏定義數(shù)據(jù)結(jié)構(gòu)定義函數(shù)說(shuō)明等文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c例文件包含舉例/*powers.h*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))/*ch8_10.c*/#include<stdio.h>#include"d:\fengyi\bkc\powers.h"#defineMAX_POWER10voidmain(){intn;printf("number\texp2\texp3\texp4\n");printf("----\t----\t-----\t------\n");for(n=1;n<=MAX_POWER;n++)printf("%2d\t%3d\t%4d\t%5d\n",n,sqr(n),cube(n),quad(n));}4.5.3條件編譯1.控制條件為常量表達(dá)式的條件編譯,

有以下幾種形式:(1)#if常量表達(dá)式程序段

#endif功能:常量表達(dá)式為非0時(shí),程序段被編譯。否則,程序段不被編譯。(2)#if常量表達(dá)式程序段1#else

程序段2

#endif功能:常量表達(dá)式為非0,程序段1被編譯。否則,編譯程序段2。(3)#if常量表達(dá)式1程序段1

#elif

常量表達(dá)式2程序段2

......#elif

常量表達(dá)式n程序段n

#else

程序段n+1

#endif2.控制條件為定義標(biāo)識(shí)符的條件編譯1)#ifdef標(biāo)識(shí)符程序段

#endif

功能:當(dāng)標(biāo)識(shí)符在該條件編譯結(jié)構(gòu)前已定義過(guò)時(shí),程序段被編譯。否則,程序段不被編譯。(2)#ifdef標(biāo)識(shí)符程序段1#else

程序段2

#endif功能:當(dāng)標(biāo)識(shí)符在該條件編譯結(jié)構(gòu)前已定義過(guò)時(shí),程序段1被編譯。否則,編譯程序段2。(3)#ifndef標(biāo)識(shí)符程序段1#else

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論