第3章 模塊化程序設(shè)計(jì)_第1頁(yè)
第3章 模塊化程序設(shè)計(jì)_第2頁(yè)
第3章 模塊化程序設(shè)計(jì)_第3頁(yè)
第3章 模塊化程序設(shè)計(jì)_第4頁(yè)
第3章 模塊化程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩44頁(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)介

16十月2023濟(jì)南大學(xué)·信息學(xué)院第三章模塊化程序設(shè)計(jì)3.1模塊化程序設(shè)計(jì)思想3.2函數(shù)定義3.3函數(shù)調(diào)用3.4函數(shù)的原型與聲明3.5函數(shù)的嵌套與遞歸3.6庫(kù)函數(shù)3.7變量的作用域與存儲(chǔ)類型3.8指針與函數(shù)16十月2023濟(jì)南大學(xué)·信息學(xué)院:在家里請(qǐng)客吃火鍋:請(qǐng)甲乙丙丁四人。給甲打電話:順路買點(diǎn)菜來(lái),就差蔬菜了。給乙打電話:順路去買點(diǎn)羊肉,就差肉了。給丙打電話:順路買點(diǎn)凍豆腐各種丸啥的,就差這個(gè)了!給丁打電話:順路在樓下超市拎幾瓶啤酒和蘸料上來(lái),就差酒了。放下電話去廚房把電飯鍋里倒上水,然后倒上火鍋底料,等著就行了……16十月2023濟(jì)南大學(xué)·信息學(xué)院另一個(gè)版本:買臺(tái)組裝電腦:請(qǐng)甲乙丙丁等人。給甲打電話:順路買塊“華碩”的主板來(lái),就差主板了。給乙打電話:順路去買個(gè)Intel的CPU,就差CPU了。給丙打電話:順路買個(gè)硬盤來(lái),就差硬盤了!給丁打電話:順路買個(gè)顯示器來(lái),就差顯示器了?!畔码娫挏?zhǔn)備好螺絲刀,然后倒一杯茶,等著就行了……16十月2023濟(jì)南大學(xué)·信息學(xué)院#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);return(0);}一個(gè)完整的函數(shù)一個(gè)完整的函數(shù)函數(shù)首部函數(shù)體16十月2023濟(jì)南大學(xué)·信息學(xué)院例3.1求表達(dá)式的值。其中,K、M、N是正整數(shù)(1≤K、M、N≤12)。分析:分別計(jì)算K、M、N的階乘,再相除。doulbefk,fm,fn;特點(diǎn):重復(fù)執(zhí)行階乘運(yùn)算,只是每次階乘的數(shù)不同。問題:能否減少代碼重復(fù)的次數(shù)?fk=1;for(i=1;i<=K;i++)fk=fk*i;fm=1;for(i=1;i<=M;i++)fm=fm*i;fn=1;for(i=1;i<=N;i++)fn=fn*i;x=fk/(fm+fn);printf("%lf\n",x);16十月2023濟(jì)南大學(xué)·信息學(xué)院定義函數(shù):intfact(intn);

//計(jì)算參數(shù)n的階乘

fact(K):計(jì)算K!

fact(M):計(jì)算M!

fact(N):計(jì)算N!原表達(dá)式即可寫成:

fact(K)/(fact(M)+fact(N))doublefact(intn){doubler=1;inti;for(i=1;i<=n;i++)r=r*i;

return(r);}16十月2023濟(jì)南大學(xué)·信息學(xué)院#include<stdio.h>doublefact(intf){

doubler=1;inti;for(i=1;i<=f;i++)r=r*i;returnr;}intmain(){intk,m,n;doublex;scanf("%d%d%d",&k,&m,&n);x=fact(k)/(fact(m)+fact(n));printf("K!/(M!+N!)=%lf\n",x);return(0);}EG301.C一個(gè)完整的函數(shù)一個(gè)完整的函數(shù)函數(shù)首部函數(shù)體16十月2023濟(jì)南大學(xué)·信息學(xué)院3.1模塊化程序設(shè)計(jì)思想模塊化是指解決一個(gè)復(fù)雜問題時(shí)自頂向下逐層把系統(tǒng)劃分成若干模塊的過程。每個(gè)模塊完成一個(gè)特定的子功能,所有的模塊按某種方法組裝起來(lái),成為一個(gè)整體,完成整個(gè)系統(tǒng)所要求的功能。把整個(gè)程序劃分為若干個(gè)功能單一、相對(duì)獨(dú)立、較易求解的程序模塊,然后分別予以實(shí)現(xiàn),最后再把所有的程序模塊整合起來(lái),這種在程序設(shè)計(jì)中逐步分解、分而治之的策略,被稱為模塊化程序設(shè)計(jì)方法。

C語(yǔ)言中用函數(shù)實(shí)現(xiàn)模塊的功能。16十月2023濟(jì)南大學(xué)·信息學(xué)院3.2函數(shù)定義在C語(yǔ)言中,函數(shù)分為以下兩種:(1)

庫(kù)函數(shù)是由系統(tǒng)提供的,用戶不用定義,只需用#include包含其頭文件,即可直接使用。如:printf()、scanf()、sqrt()等。(2)自定義函數(shù):這種函數(shù)是根據(jù)具體需求按自己的意愿編寫的,以完成相應(yīng)的功能。16十月2023濟(jì)南大學(xué)·信息學(xué)院1、函數(shù)定義的形式:函數(shù)類型函數(shù)名(形式參數(shù)表列){

變量聲明部分語(yǔ)句部分}2、說(shuō)明:①、函數(shù)名:用戶給函數(shù)起的名字,必須符合標(biāo)識(shí)符命名規(guī)則,“見名知義”;注意不能與系統(tǒng)的關(guān)鍵字、庫(kù)函數(shù)等同名,如int、if、printf、sin、sqrt等②、函數(shù)類型:即函數(shù)值(返回值)的類型若返回值為int

或char

類型,可省略不寫;若函數(shù)無(wú)返回值,函數(shù)定義時(shí)應(yīng)寫上voidintmax(intx,inty){

……}intmain(){

……return0;}16十月2023濟(jì)南大學(xué)·信息學(xué)院③、形式參數(shù)表列:說(shuō)明參數(shù)的個(gè)數(shù)和類型

作用:表示從主調(diào)函數(shù)中接收數(shù)據(jù)的個(gè)數(shù)及每個(gè)數(shù)據(jù)的類型書寫格式

:每一個(gè)參數(shù)都要分別寫上數(shù)據(jù)類型和參數(shù)名;參數(shù)之間以逗號(hào)分隔,無(wú)參數(shù)時(shí)一般寫上void

或什么也不寫doublemax(doublea,doubleb,doublec){……}/*從主調(diào)函數(shù)中接收3個(gè)數(shù)據(jù),均為double類型返回結(jié)果為double型數(shù)據(jù)*/形參不能寫成:doublea,b,c×④、變量說(shuō)明:定義函數(shù)中用到的除形參以外的其它變量;即形參不能再次定義(或者說(shuō)不能定義與形參同名的變量)⑤、語(yǔ)句部分:完成函數(shù)功能的語(yǔ)句序列。16十月2023濟(jì)南大學(xué)·信息學(xué)院3、例:①、編寫一個(gè)函數(shù),打印一行信息“Howdoyoudo!”printf("Howdoyoudo!\n");____print(____){}void

intmain(){return0;}print();#include<stdio.h>原則1:數(shù)據(jù)已知或是常量則不需作為參數(shù)傳遞;值事先不確定則需要參數(shù)傳遞!原則2:不要求計(jì)算結(jié)果或沒有計(jì)算出一個(gè)數(shù)值的函數(shù)則不需定義返回值。EG302.C注意:函數(shù)名不能叫printf,不能與系統(tǒng)庫(kù)函數(shù)同名。16十月2023濟(jì)南大學(xué)·信息學(xué)院②、求整數(shù)x的n次冪(n>0,且為整數(shù))______

power(__________){}intx,intndoublefor(i=1;i<=n;i++)p=p*x;inti;doublep=1;return(p);intmain(){return0;}scanf("%d%d",&x,&n);s=power(x,n);printf("%.0lf\n",s);intx,n;doubles;#include<stdio.h>EG303.C主函數(shù)應(yīng)包含哪些內(nèi)容:intmain(){return0;}變量定義輸入數(shù)據(jù)處理--函數(shù)調(diào)用輸出結(jié)果16十月2023濟(jì)南大學(xué)·信息學(xué)院③、將指定的字符打印n次____print(_____________){}charch,intnvoidfor(i=1;i<=n;i++)putchar(ch);inti;printf("\n");intmain(){return0;}scanf("%c",&ch);scanf("%d",&n);print(ch,n);charch;intn;#include<stdio.h>在自定義函數(shù)中:一般不輸入數(shù)據(jù),要處理的數(shù)據(jù)來(lái)自于參數(shù),這樣使得可對(duì)不同的參數(shù)進(jìn)行相同的處理;也不輸出計(jì)算結(jié)果,計(jì)算結(jié)果通過return返回。EG304.C16十月2023濟(jì)南大學(xué)·信息學(xué)院定義函數(shù)時(shí)需要解決的問題:有沒有參數(shù):從主調(diào)函數(shù)中傳遞數(shù)據(jù);參數(shù)的個(gè)數(shù):從主調(diào)函數(shù)中接收幾個(gè)數(shù)據(jù)參數(shù)的類型:int、float、double、char或指針是否有返回值:向主調(diào)函數(shù)返回計(jì)算結(jié)果返回值的類型:編寫函數(shù)的原則:數(shù)據(jù)的輸入輸出均在主調(diào)函數(shù)中進(jìn)行,通過參數(shù)將要計(jì)算的數(shù)據(jù)傳入被調(diào)函數(shù),由被調(diào)函數(shù)進(jìn)行計(jì)算,并通過返回值返回計(jì)算結(jié)果。16十月2023濟(jì)南大學(xué)·信息學(xué)院例、請(qǐng)編寫函數(shù)fun,它的功能是:根據(jù)整形形參m,計(jì)算如下公式的值。當(dāng)m中的值為5,則應(yīng)輸出1.463611。注意:部分源程序已給出。請(qǐng)勿改動(dòng)main函數(shù)和其它已經(jīng)給出的語(yǔ)句,僅在main函數(shù)之前的空白處編寫fun函數(shù)。#include<stdio.h>intmain(){intn=5;printf("Theresultis%lf\n",fun(n));return0;}16十月2023濟(jì)南大學(xué)·信息學(xué)院例、下列程序中,函數(shù)fun的功能是:計(jì)算正整數(shù)num的各位上的數(shù)字之積。注意:部分源程序已給出。請(qǐng)勿改動(dòng)main函數(shù)和其它已經(jīng)給出的語(yǔ)句,僅在main函數(shù)之前的空白處編寫fun函數(shù)。#include<stdio.h>intmain(){intn;printf("Pleaseinputanumber:");scanf("%d",&n);printf("%d\n",fun(n));return0;}16十月2023濟(jì)南大學(xué)·信息學(xué)院3.3函數(shù)調(diào)用3.3.1函數(shù)調(diào)用的形式1、形式:函數(shù)名(實(shí)參表列);2、說(shuō)明①、實(shí)參表列由0到多個(gè)實(shí)參名組成,實(shí)參之間用逗號(hào)分隔②、實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致,順序要一一對(duì)應(yīng)③、調(diào)用無(wú)參函數(shù)的格式為:函數(shù)名();#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);return0;}16十月2023濟(jì)南大學(xué)·信息學(xué)院3、函數(shù)調(diào)用的方式①、函數(shù)調(diào)用語(yǔ)句:–無(wú)返回值函數(shù),或不需要返回值的函數(shù)調(diào)用形式

由函數(shù)調(diào)用加上分號(hào)構(gòu)成,在主調(diào)函數(shù)中可作為一個(gè)獨(dú)立的語(yǔ)句;此時(shí)不要求函數(shù)帶回返回值printf("ThisisaCprogram!\n");②、函數(shù)表達(dá)式:

函數(shù)調(diào)用作為一個(gè)運(yùn)算對(duì)象出現(xiàn)在表達(dá)式中,此時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算c=max(a,b);y=2*pow(x,2.5);③、函數(shù)參數(shù):

函數(shù)調(diào)用作為另一個(gè)函數(shù)的實(shí)參,其值作為一個(gè)實(shí)際參數(shù)傳給被調(diào)函數(shù)的形參;此時(shí)也要求函數(shù)帶回一個(gè)確定值m=max(a,max(b,c));printf("%d\n",max(a,b));16十月2023濟(jì)南大學(xué)·信息學(xué)院3.3.2函數(shù)間的參數(shù)傳遞定義函數(shù)的目的是為了實(shí)現(xiàn)某個(gè)特定功能。當(dāng)函數(shù)被調(diào)用時(shí),一般需要給它傳遞一些數(shù)據(jù),供它直接處理或輔助它實(shí)現(xiàn)具體的功能。把需要參數(shù)的函數(shù)稱為“有參函數(shù)”,不需要參數(shù)的函數(shù)稱為“無(wú)參函數(shù)”。形式參數(shù):定義函數(shù)時(shí)函數(shù)名后面括號(hào)內(nèi)的變量,簡(jiǎn)稱形參實(shí)際參數(shù):調(diào)用函數(shù)時(shí)函數(shù)名后面括號(hào)內(nèi)的變量,簡(jiǎn)稱實(shí)參#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("Max=%d.\n",c);return0;}形參實(shí)參16十月2023濟(jì)南大學(xué)·信息學(xué)院例3.2輸入兩個(gè)整數(shù),計(jì)算其平均值。要求用函數(shù)實(shí)現(xiàn)平均值的計(jì)算。有沒有參數(shù):有參數(shù)的個(gè)數(shù):2參數(shù)的類型:均為int是否有返回值:有返回值的類型:float或doubledoublefun(intx,inty){doubleresult;result=(x+y)/2.0;return(result);}intmain(){inta,b;

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

ave=fun(a,b);printf("ave=%.1f\n",ave);return0;}EG305.C16十月2023濟(jì)南大學(xué)·信息學(xué)院說(shuō)明:①、程序在編譯時(shí)不為形參分配存儲(chǔ)空間,只有當(dāng)函數(shù)被調(diào)用時(shí),形參才被分配存儲(chǔ)空間,并在調(diào)用結(jié)束后釋放所占的存儲(chǔ)空間。②、形參只能是變量;而實(shí)參可以是常量、變量、表達(dá)式或具有返回值的函數(shù)調(diào)用,但要求它們有確定的值。調(diào)用時(shí)將實(shí)參的值賦給形參。m=max(3,a+b);/*x=3;y=a+b;*/m=max(a,max(b,c));/*x=a;y=max(b,c);*/③、實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致或賦值兼容。④、C規(guī)定,實(shí)參對(duì)形參的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞。只能由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參。在內(nèi)存中,實(shí)參與形參占有不同的內(nèi)存單元。16十月2023濟(jì)南大學(xué)·信息學(xué)院#include<stdio.h>voidsum(intx,inty,intz){x=10;y=20;z=x+y;printf("x=%d,y=%d,z=%d\n",x,y,z);}intmain(){inta=1,b=2,c=0;sum(a,b,c);printf("a=%d,b=%d,c=%d\n",a,b,c);return0;}x=10,y=20,z=30a=1,b=2,c=0EG306.C16十月2023濟(jì)南大學(xué)·信息學(xué)院3.3.3函數(shù)的返回值intmax(intx,inty){intz;z=x>y?x:y;

return(z);}1、函數(shù)的返回值是通過return語(yǔ)句獲得的。return語(yǔ)句的作用是終止當(dāng)前函數(shù)的執(zhí)行并將一個(gè)確定值帶回主調(diào)函數(shù)中return語(yǔ)句的一般形式是:return(表達(dá)式);或:return

表達(dá)式;2、函數(shù)返回值的類型:在定義函數(shù)時(shí)指定intmax(intx,inty)doublepower(intx,inty)C語(yǔ)言規(guī)定,凡不指定類型的函數(shù),自動(dòng)按整型(int)處理。max(intx,inty)intmax(intx,inty)16十月2023濟(jì)南大學(xué)·信息學(xué)院

函數(shù)值的類型與return語(yǔ)句中表達(dá)式的類型應(yīng)一致;若不一致,則以函數(shù)類型為準(zhǔn)(自動(dòng)轉(zhuǎn)換)。intmax(doublex,doubley){return(x>y?x:y);}3、一個(gè)函數(shù)可以有多個(gè)return語(yǔ)句,但每個(gè)return后的表達(dá)式類型要相同;當(dāng)執(zhí)行到其中任何一個(gè)return語(yǔ)句時(shí)會(huì)立即返回主調(diào)函數(shù)4、對(duì)于有返回值的函數(shù),若return語(yǔ)句后面沒有表達(dá)式,或沒有return語(yǔ)句,此時(shí)帶回一個(gè)不確定的返回值。return;5、為了明確表示“不帶回值”,可以用void定義“無(wú)類型”(或稱“空類型”,即無(wú)返回值)。voidf(){…}16十月2023濟(jì)南大學(xué)·信息學(xué)院例1:定義一個(gè)函數(shù),判斷整數(shù)m是否是素?cái)?shù)。是素?cái)?shù)返回整數(shù)1,不是返回0。isPrime(){

}intmintk=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)break;if(i<=k)elsereturn0;return1;inti,k;intisPrime(intm){inti,k;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)

return0;

return1;}EG307.C16十月2023濟(jì)南大學(xué)·信息學(xué)院例2:定義一個(gè)函數(shù),判斷某一年是否閏年。閏年的條件:能被4整除,但不能被100整除;或能被400整除。year%4==0&&year%100!=0||year%400==0leap(){}intyearintif(year%4==0&&year%100!=0||year%400==0)return1;elsereturn0;intleap(intyear){return(year%4==0&&year%100!=0||year%400==0);}EG308.C16十月2023濟(jì)南大學(xué)·信息學(xué)院說(shuō)明:①、被調(diào)用的函數(shù)必須已經(jīng)存在;②、使用庫(kù)函數(shù)時(shí),應(yīng)在文件開頭用#include命令將有關(guān)頭文件包含進(jìn)來(lái);#include<stdio.h>#include<math.h>#include<string.h>③、若用戶自己定義的函數(shù)在主調(diào)函數(shù)之后,則應(yīng)在主調(diào)函數(shù)之前對(duì)被調(diào)用的函數(shù)作聲明定義:對(duì)函數(shù)功能的確定;包括指定函數(shù)名、函數(shù)類型、形參及類型、函數(shù)體等。--一個(gè)完整的函數(shù)聲明:將函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng)。--由函數(shù)首部加分號(hào)構(gòu)成16十月2023濟(jì)南大學(xué)·信息學(xué)院3.4函數(shù)的原型與聲明在函數(shù)調(diào)用之前應(yīng)當(dāng)對(duì)所調(diào)用的函數(shù)進(jìn)行聲明,指出該函數(shù)的返回值的類型以及形參的個(gè)數(shù)和類型,編譯器據(jù)此對(duì)函數(shù)調(diào)用進(jìn)行語(yǔ)法檢查,保證函數(shù)使用的正確性。1、函數(shù)聲明的格式:函數(shù)類型函數(shù)名(

形參表);doublefun(doublea,intb,floatc){……}可以聲明為以下幾種形式:

doublefun(doublea,intb,floatc);

doublefun(double,int,float);

doublefun(doublex,inty,floatz);16十月2023濟(jì)南大學(xué)·信息學(xué)院2、說(shuō)明:①、函數(shù)聲明的位置:一種是在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)進(jìn)行函數(shù)聲明;另一種是在所有函數(shù)的外部進(jìn)行函數(shù)聲明(推薦)。②、如果被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,可以不必進(jìn)行聲明。--(推薦)#include<stdio.h>intmax(intx,inty);intmain(){……}intmax(intx,inty){……}#include<stdio.h>intmax(intx,inty){……}intmain(){……}16十月2023濟(jì)南大學(xué)·信息學(xué)院3.5函數(shù)的嵌套與遞歸3.5.1函數(shù)的嵌套調(diào)用例:計(jì)算2-n之間所有素?cái)?shù)的和。intmain(){

定義n,s

輸入n(n是整數(shù))

求和---s=Sum(n)

輸出sreturn0;}intSum(intn){for(i=2,s=0;i<=n;i++)if(i是素?cái)?shù))s+=i;returns;}intisPrime(intm){inti,k;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)return0;return1;}16十月2023濟(jì)南大學(xué)·信息學(xué)院組織成一個(gè)完整的C程序:#include<stdio.h>#include<math.h>intisPrime(intm){inti,k;k=sqrt(m);for(i=2;i<=k;i++)if(m%i==0)return0;return1;}intSum(intn){inti,s=0;for(i=2;i<=n;i++)if(isPrime(i)==1)s+=i;returns;}intmain(){

定義n,s

輸入n(n是整數(shù))

求和---s=Sum(n)

輸出sreturn0;}intmain(){intn,s;printf("Inputn(n>1):");scanf("%d",&n);

s=Sum(n);printf("s=%d\n",s);return0;}EG309.C16十月2023濟(jì)南大學(xué)·信息學(xué)院C語(yǔ)言的函數(shù)定義都是互相平行的、獨(dú)立的,即不允許嵌套定義函數(shù)(即在一個(gè)函數(shù)內(nèi)部定義另一個(gè)函數(shù));但是,可以嵌套調(diào)用函數(shù),即程序在調(diào)用一個(gè)函數(shù)的過程中,該被調(diào)函數(shù)又可以調(diào)用其它函數(shù)。intmain(){:

Sum();:}intSum(){:

isPrime();:}main函數(shù)Sum函數(shù)isPrime函數(shù)調(diào)用調(diào)用嵌套調(diào)用16十月2023濟(jì)南大學(xué)·信息學(xué)院函數(shù)在被調(diào)用的過程中,又直接或間接地調(diào)用自身,則稱函數(shù)的遞歸調(diào)用。這種函數(shù)也被稱為遞歸函數(shù)。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。3.5.2函數(shù)的遞歸調(diào)用例3.5用遞歸方法求整數(shù)n的階乘n!。分析:一般來(lái)說(shuō),n!描述成為:

n!=1*2*3*…*(n-1)*n但是,變換一下,就可以將其描述成為:

n!=n*(n-1)*…3*2*1=n*(n-1)!16十月2023濟(jì)南大學(xué)·信息學(xué)院#include<stdio.h>doublefact(intn){if(n==0||n==1)return1;elsereturnn*fact(n-1);}intmain(){intn;doubleresult;printf("Inputn:");scanf("%d",&n);result=fact(n);printf("%d!=%.0f\n",n,result);return0;}fact(5)5*fact(4)4*fact(3)3*fact(2)2*fact(1)12*13*24*65*24120EG310.C16十月2023濟(jì)南大學(xué)·信息學(xué)院3.6庫(kù)函數(shù)庫(kù)函數(shù):即系統(tǒng)已經(jīng)定義好、具有特定功能的函數(shù)。這些函數(shù)可以直接使用,不必重新定義,但使用時(shí)需要用#include命令把相應(yīng)的頭文件包含進(jìn)來(lái)。輸入輸出函數(shù)(頭文件:stdio.h):

printf()scanf()getchar()putchar()數(shù)學(xué)函數(shù)(頭文件:math.h):

sqrt()pow()fabs()log10()log()字符串函數(shù)(頭文件:string.h):

strcpy()strcat()strcmp()strlen()各函數(shù)的功能見附錄,使用時(shí)注意參數(shù)個(gè)數(shù)及類型、函數(shù)的返回值。16十月2023濟(jì)南大學(xué)·信息學(xué)院3.7變量的作用域與存儲(chǔ)類型3.7.1變量的作用域作用域:指變量能夠起作用的程序范圍局部變量全局變量從作用域角度16十月2023濟(jì)南大學(xué)·信息學(xué)院作用域與生存期一、作用域:指變量能夠起作用的程序范圍如果一個(gè)變量在某源程序文件或某函數(shù)范圍內(nèi)有效,則稱該文件或函數(shù)為該變量的作用域。局部變量全局變量從作用域角度二、生存期:指變量在內(nèi)存中存在的時(shí)間范圍靜態(tài)變量動(dòng)態(tài)變量從生存期角度變量在整個(gè)程序的運(yùn)行時(shí)間都存在變量只在某個(gè)函數(shù)的執(zhí)行過程中才存在16十月2023濟(jì)南大學(xué)·信息學(xué)院1局部變量#include<stdio.h>intmax(intx,inty){intz;if(x>y)z=x;elsez=y;return(z);}intmain(){inta,b,c;scanf("%d%d",&a,&b);c=max(a,b);printf("max=%d\n",c);return0;}1、局部變量:

指在一個(gè)函數(shù)或復(fù)合語(yǔ)句內(nèi)部(位于一對(duì)花括號(hào)之間)定義的變量;只在本函數(shù)或復(fù)合語(yǔ)句的范圍內(nèi)有效x、y、z的有效范圍a、b、c的有效范圍16十月2023濟(jì)南大學(xué)·信息學(xué)院2、說(shuō)明:①、main函數(shù)中定義的變量是局部變量,只能在main函數(shù)中使用②、不同函數(shù)中可以使用相同名字的變量,它們占用不同的內(nèi)存單元,互相獨(dú)立③、形式參數(shù)也是局部變量④、復(fù)合語(yǔ)句中定義的變量,其作用域只是本復(fù)合語(yǔ)句intmain(){

inta,b;……{

intc;c=a+b;……}……}c在此范圍內(nèi)有效a、b在此范圍內(nèi)有效16十月2023濟(jì)南大學(xué)·信息學(xué)院#include<stdio.h>intmain(){inti,a=0;for(i=1;i<=2;i++){

inta=1;a++;printf("i=%d,a=%d\n",i,a);}printf("i=%d,a=%d\n",i,a);return0;}i=1,a=2i=2,a=2i=3,a=0EG311.C16十月2023濟(jì)南大學(xué)·信息學(xué)院2全局變量1、定義:全局變量:指在所有函數(shù)外部定義的變量,又稱外部變量可以為本文件中其它函數(shù)所共用,其有效范圍為:從定義變量的位置開始到本源文件結(jié)束2、例:16十月2023濟(jì)南大學(xué)·信息學(xué)院#include<stdio.h>intp=1,q=5;floatf1(inta){floatr;…}ints;intf2(intb,intc){intsum;…}floatm,n;intmain(){floatx,y;…}全局變量p和q的有效范圍全局變量s的有效范圍全局變量m和n的有效范圍16十月2023濟(jì)南大學(xué)·信息學(xué)院3、說(shuō)明:①、全局變量增加了函數(shù)間的數(shù)據(jù)聯(lián)系;由于在同一文件中的所有函數(shù)都能使用全局變量,所以可以利用全局變量從函數(shù)中得到一個(gè)以上的返回值全局變量名的第一個(gè)字母常用大寫字母表示②、建議不要過多的使用全局變量全局變量在程序的執(zhí)行過程中一直占用存儲(chǔ)單元它使函數(shù)的通用性降低會(huì)降低程序的清晰性#include<stdio.h>intk;voidshow(){for(k=1;k<=10;k++)putchar('*');putchar('\n');}intmain(){for(k=1;k<=4;k++)show();return0;}EG312.C16十月2023濟(jì)南大學(xué)·信息學(xué)院③、全局變量在定義時(shí)如果沒有初始化,它們則會(huì)被系統(tǒng)自動(dòng)初始化為零,而局部變量在定義時(shí)不會(huì)自動(dòng)初始化。④、若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量不起作用inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;return(c);}intmain(){

inta=8;printf("%d",max(a,b));return0;}形參a、b的作用域全局變量a、b不起作用局部變量a的作用域全局變量b的作用域全局變量a不起作用EG313.C16十月2023濟(jì)南大學(xué)·信息學(xué)院3.7.2變量的存儲(chǔ)類型

變量的存儲(chǔ)類型是指存儲(chǔ)變量值的內(nèi)存類型。它決定變量何時(shí)創(chuàng)建、何時(shí)銷毀以及它的值將保存多久。變量的存儲(chǔ)類型可分為“靜態(tài)存儲(chǔ)”和“動(dòng)態(tài)存儲(chǔ)”兩種。

靜態(tài)存儲(chǔ)變量通常是在變量定義時(shí)就分配存儲(chǔ)單元并一直保持不變,直到整個(gè)程序結(jié)束。全局變量即屬于此類存儲(chǔ)方式。

動(dòng)態(tài)存儲(chǔ)變量是在程序執(zhí)行過程中,使用到它時(shí)才分配存儲(chǔ)單元,使用完畢立即釋放。如形參,函數(shù)被調(diào)用時(shí)才分配內(nèi)存單元,函數(shù)調(diào)用完畢立即釋放。如果一個(gè)函數(shù)被多次調(diào)用,則反復(fù)地分配、釋放形參變量的存儲(chǔ)單元。16十月2023濟(jì)南大學(xué)·信息學(xué)院比較下列兩個(gè)程序的輸出結(jié)果:#include<stdio.h>voidfun(intx){inta=0;a+=2;printf("x=%d,a=%d\n",x,a);}intmain(){inti;for(i=1;i<=3;i++)fun(i);return0;}#include<stdio.h>voidfun(intx){staticinta=0;a+=2;printf("x=%d,a=%d\n",x,a);}intmain(){inti;for(i=1;i<=3;i++)fun(i);return0;}x=1,a=2x=2,a=2x=3,a=2x=1,a=2x=2,a=4x=3,a=6EG314.C16十月2023濟(jì)南大學(xué)·信息學(xué)院局部變量的存儲(chǔ)類別:1、函數(shù)中的局部變量,如不專門聲明或用auto聲明,稱為自動(dòng)變量或動(dòng)態(tài)變量。通常auto被省略。它在函數(shù)被調(diào)用時(shí)分配內(nèi)存單元,調(diào)用完畢即釋放所占用的內(nèi)存單元,若再次被調(diào)用則重新分配內(nèi)存單元。intb,c=3;floatf;autointb,c=3;autofloatf;自動(dòng)變量包括:函數(shù)內(nèi)定義的變量、形參和復(fù)合語(yǔ)句內(nèi)定義的變量。2、局部靜態(tài)變量(static)函數(shù)被調(diào)用時(shí)分配內(nèi)存單元,函數(shù)調(diào)用結(jié)束后不釋放占用內(nèi)存單元,直到程序運(yùn)行結(jié)束才釋放存儲(chǔ)單元,即在整個(gè)程序的運(yùn)行中不釋放存儲(chǔ)單元。staticinti,area;staticinta[10];16十月2023濟(jì)南大學(xué)·信息學(xué)院說(shuō)明:若對(duì)變量賦初值,對(duì)于自動(dòng)變量,每次調(diào)用都要重新分配內(nèi)存單元并賦初值;而對(duì)于靜態(tài)變量,只執(zhí)行一次,再次調(diào)用函數(shù)時(shí)不再賦初值而保留上次函數(shù)調(diào)用結(jié)束時(shí)的值;#include<stdio.h>voidfun(intx){staticinta=0;a+=2;printf("x=%d,a=%d\n",x,a);}intmain(){inti;for(i=1;i<=3;i++)fun(i);return0;}x=1,a=2x=2,a=4x=3,a=6EG314.C適用范圍:①、需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值;②、對(duì)于數(shù)組進(jìn)行初始化,通常定義為靜態(tài)存儲(chǔ)類別。說(shuō)明:對(duì)于動(dòng)態(tài)變量,定義時(shí)若不賦值,值不確定對(duì)于靜態(tài)變量,定義時(shí)若不賦值,系統(tǒng)自動(dòng)賦值為016十月2023濟(jì)南大學(xué)·信息學(xué)院3、寄存器變量(register)一般情況下,變量都是存放在內(nèi)存中的。為了減少?gòu)膬?nèi)存中存取變量值的時(shí)間,C語(yǔ)言允許將局部變量的值放在寄存器中,用關(guān)鍵字register聲明。intfac(intn){

registerinti,f;for(i=1;i<=n;i++)f=f*i;returnf;}說(shuō)明:①、只有局部變量和形參可以定義為寄存器變量;②、不能定義太多的寄存器變量,因?yàn)榧拇嫫鲾?shù)量有限,太多無(wú)效(將自動(dòng)按自動(dòng)變量處理)。16十月2023濟(jì)南大學(xué)·信息學(xué)院全局變量的存儲(chǔ)類別:全局變量是在函數(shù)外部定義的,屬于靜態(tài)變量,在程序的整個(gè)運(yùn)行過程中占用存儲(chǔ)單元,存在于程序的整個(gè)運(yùn)行期間。全局變量有兩種存儲(chǔ)類別:static和extern。如果想在定義之前的函數(shù)中引用全局變量,則在函數(shù)中用關(guān)鍵字“extern”作“外部變量聲明”,在函數(shù)內(nèi)部,從聲明之處起,可以使用它們?!璱ntmain(){

externinta,b;//聲明,此處不能再賦值

printf("%d",max(a,b));return0;}inta=13,b=-8;//定義,此處可以賦值,也可以不賦值若不賦值,系統(tǒng)自動(dòng)賦值為016十月2023濟(jì)南大學(xué)·信息學(xué)院2、如果一個(gè)C程序由多個(gè)源程序文件組成,那么一個(gè)某文件中的函數(shù)能否引用另一個(gè)文件中的全局變量,有兩種情況:①、在一個(gè)文件中要引用另一文件中定義的全局變量,要在引用它的文件中用extern作聲明file1.cintMax;intmain(){……}file2.cexternintMax;intpower(){

Max=12;……}在文件file1.c中定義的變量Max,在文件file2.c中引用,引用前加上extern進(jìn)行聲明。16十月2023濟(jì)南大學(xué)·信息學(xué)院②、如果要全局變量?jī)H限于被本文件中的函數(shù)引用,其它文件不能使用。定義全局變量時(shí)用static進(jìn)行聲明file1.cstaticintMax;intmain(){……}file2.cexternintMax;intpower(){Max=12;……}×加上static,限制了Max的作用域,在file2.c中引用失敗;但不管是否加上static,Max都按靜態(tài)存儲(chǔ)方式存放16十月2023濟(jì)南大學(xué)·信息學(xué)院存儲(chǔ)類別小結(jié)1、數(shù)據(jù)的兩種屬性:數(shù)據(jù)類型存儲(chǔ)類別autofloata;staticintb;registercharc;externintd;(聲明變量是已定義的變量)2、從作用域分:局部變量全局變量自動(dòng)變量靜態(tài)局部變量寄存器變量形參靜態(tài)全局變量非靜態(tài)全局變量16十月2023濟(jì)南大學(xué)·信息學(xué)院3、從生存期分:動(dòng)態(tài)存儲(chǔ)靜態(tài)存儲(chǔ)自動(dòng)變量寄存器變量形參靜態(tài)局部變量靜態(tài)全局變量非靜態(tài)全局變量4、從存放位置分:內(nèi)存的靜態(tài)存儲(chǔ)區(qū):內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū):CPU中的寄存器:靜態(tài)局部變量靜態(tài)全局變量外部變量自動(dòng)變量形參寄存器變量16十月2023濟(jì)南大學(xué)·信息學(xué)院3.7.3函數(shù)的存儲(chǔ)類別一、內(nèi)部函數(shù):如果限制一個(gè)函數(shù)只能被本文件中其它函數(shù)所調(diào)用,稱為內(nèi)部函數(shù)(或靜態(tài)函數(shù))。定義時(shí)在函數(shù)類型前加static。staticintfac(intx){……}二、外部函數(shù):定義時(shí)在函數(shù)類型前加關(guān)鍵字extern。externintfac(intx){……}C語(yǔ)言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則隱含為外部函數(shù)。在需要調(diào)用此函數(shù)的文件中,要用extern聲明所調(diào)用函數(shù)的原型。16十月2023濟(jì)南大學(xué)·信息學(xué)院3.8指針與函數(shù)例:在主函數(shù)中輸入兩個(gè)整數(shù)a和b,編寫函數(shù)交換a、b的值#include<stdio.h>voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}intmain(){inta,b;printf("Inputa,b:");scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);swap(a,b);printf("a=%d,b=%d\n",a,b);return0;}EG315.C16十月2023濟(jì)南大學(xué)·信息學(xué)院用全局變量實(shí)現(xiàn):#include<stdio.h>inta,b;voidswap(){inttemp;temp=a;a=b;b=temp;}intmain(){printf("Inputa,b:");scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);

swap(

);printf("a=%d,b=%d\n",a,b);return0;}問題的提出:從被調(diào)函數(shù)中如果要返回n個(gè)值到主調(diào)函數(shù),除了使用全局變量外還有其他辦法嗎?(不提倡用全局變量)EG316.C16十月2023濟(jì)南大學(xué)·信息學(xué)院3.8.1指針作為函數(shù)參數(shù)1、形參:只需要形參前加上一個(gè)*即可。如:voidswap(int*pa,int*pb)2、說(shuō)明函數(shù)中可以通過形參引用實(shí)參的地址,從而可以改變?cè)摰刂返闹?,即?shí)參變量的值。intmain(

){inta;fun

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論