項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)_第1頁(yè)
項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)_第2頁(yè)
項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)_第3頁(yè)
項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)_第4頁(yè)
項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩67頁(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)介

項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)-項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)-項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)-項(xiàng)目要點(diǎn):函數(shù)的概念函數(shù)的定義和調(diào)用函數(shù)調(diào)用時(shí)參數(shù)的傳遞編譯預(yù)處理學(xué)習(xí)目標(biāo):熟知函數(shù)的定義和調(diào)用熟練編寫(xiě)和調(diào)用函數(shù)掌握函數(shù)的嵌套調(diào)用和遞歸調(diào)用掌握宏定義及條件編譯的運(yùn)用項(xiàng)目五用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)工作任務(wù)導(dǎo)入工作任務(wù)

C語(yǔ)言提倡使用“模塊化設(shè)計(jì)思想”?!澳K化設(shè)計(jì)思想”就是將一個(gè)較復(fù)雜的大問(wèn)題分解成一個(gè)個(gè)的子問(wèn)題,把每個(gè)子問(wèn)題都看成是一個(gè)模塊,編寫(xiě)程序的重心就落在如何實(shí)現(xiàn)這些模塊上,這樣就把大問(wèn)題化小,復(fù)雜的問(wèn)題化簡(jiǎn)單了。本項(xiàng)目就是采用“模塊化設(shè)計(jì)思想”,使用函數(shù)來(lái)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)。學(xué)生成績(jī)管理系統(tǒng)錄入學(xué)生成績(jī)輸出學(xué)生成績(jī)查詢學(xué)生成績(jī)計(jì)算總分和平均分退出輸出學(xué)生成績(jī)單

本項(xiàng)目在項(xiàng)目四的基礎(chǔ)上對(duì)功能模塊重新進(jìn)行了設(shè)計(jì),處理班級(jí)多名學(xué)生多門(mén)課程的成績(jī)。功能模塊圖右圖所示。工作任務(wù)導(dǎo)入引導(dǎo)問(wèn)題(1)項(xiàng)目功能較多,如何將相對(duì)獨(dú)立的功能單獨(dú)實(shí)現(xiàn)?(2)如何使用已經(jīng)獨(dú)立實(shí)現(xiàn)的功能塊?(3)保存數(shù)據(jù)的各類(lèi)變量的作用域是什么?本項(xiàng)目由3個(gè)任務(wù)組成。任務(wù)1認(rèn)識(shí)函數(shù),熟悉函數(shù)的定義和調(diào)用;任務(wù)2熟悉函數(shù)的嵌套調(diào)用和遞歸調(diào)用;任務(wù)3用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)。任務(wù)分析:某班有50名學(xué)生,參加3門(mén)課程的期末考試,用函數(shù)實(shí)現(xiàn)以下功能:①統(tǒng)計(jì)1門(mén)課程的總分及平均分。②統(tǒng)計(jì)多門(mén)課程的總分和平均分。③設(shè)計(jì)界面,輸出分隔線。通過(guò)任務(wù)1,熟悉函數(shù)的定義和調(diào)用方法,實(shí)現(xiàn)統(tǒng)計(jì)1門(mén)課程的總分及平均分的功能。任務(wù)1認(rèn)識(shí)函數(shù)

定義3個(gè)函數(shù):函數(shù)1實(shí)現(xiàn)輸出一條線,函數(shù)2實(shí)現(xiàn)求1門(mén)課程總分和平均分的功能,主函數(shù)調(diào)用前兩個(gè)函數(shù)來(lái)完成任務(wù)。解決方法:可參考程序見(jiàn)書(shū)本P.1275.1.1使用函數(shù)實(shí)現(xiàn)學(xué)生1門(mén)課程的成績(jī)管理函數(shù)的定義

函數(shù)可以看作是一個(gè)可以執(zhí)行特定功能的“黑匣子”,當(dāng)我們給定輸入時(shí),它就會(huì)給出正確的輸出,內(nèi)部程序是怎么執(zhí)行的不必知道。只有當(dāng)我們編寫(xiě)一個(gè)函數(shù)時(shí)才需要熟悉內(nèi)部是怎么實(shí)現(xiàn)的。在一個(gè)C語(yǔ)言程序中,除了必須有main()函數(shù)外,還要經(jīng)常使用一些其他函數(shù),這些函數(shù)通常稱為子函數(shù),子函數(shù)由用戶自己命名,一般完成某種特定的子功能。函數(shù)定義的一般形式:函數(shù)類(lèi)型函數(shù)名([形式參數(shù)表]){[函數(shù)體]

}5.1.2函數(shù)的定義和調(diào)用函數(shù)的調(diào)用

1、函數(shù)調(diào)用形式調(diào)用函數(shù)的一般形式如下:函數(shù)名([實(shí)際參數(shù)列表]);

其中,實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)是有確定值的變量或表達(dá)式,若有多個(gè)參數(shù),各參數(shù)間需要用逗號(hào)分開(kāi)。說(shuō)明:(1)在實(shí)參表中,實(shí)參的個(gè)數(shù)及順序必須和形參的個(gè)數(shù)與順序相同,實(shí)參的數(shù)據(jù)類(lèi)型必須和對(duì)應(yīng)的形參數(shù)據(jù)類(lèi)型相同。(2)若為無(wú)參數(shù)調(diào)用,則函數(shù)名后的括號(hào)不省略。(3)函數(shù)間可以互相調(diào)用,但不能調(diào)用main()函數(shù)。5.1.2函數(shù)的定義和調(diào)用2、函數(shù)調(diào)用的方式按函數(shù)在程序中出現(xiàn)的位置分為以下三種調(diào)用方式:(1)函數(shù)語(yǔ)句:把函數(shù)調(diào)用作為一個(gè)語(yǔ)句,即“函數(shù)名([實(shí)參表]);”。如printStar();,執(zhí)行該語(yǔ)句時(shí),調(diào)用函數(shù)printStar(),執(zhí)行其功能。這時(shí)不要求函數(shù)帶返回值,只要求函數(shù)完成一定的操作。(2)函數(shù)表達(dá)式:函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。如ms=sum(a,b)/2.0;,執(zhí)行該語(yǔ)句時(shí),調(diào)用sum函數(shù),并返回運(yùn)算值賦值給ms。(3)函數(shù)參數(shù):函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。如result=max(a,max(b,c));。5.1.2函數(shù)的定義和調(diào)用問(wèn)題5.2無(wú)參函數(shù)的定義和調(diào)用。#include<stdio.h>voidprintStar(){printf("********************\n");}voidprintMessage(){printf("ThisisaCprogram!\n");}main(){printStar();printMessage();printStar();}【說(shuō)明】程序中除了主函數(shù)main()之外,還有兩個(gè)函數(shù),分別是printStar()函數(shù)和printMessage()函數(shù)。printStar和printMessage分別是兩個(gè)函數(shù)的函數(shù)名,并且函數(shù)名后括號(hào)中無(wú)參數(shù)。練一練編寫(xiě)函數(shù)實(shí)現(xiàn)在屏幕上輸出一條線,并在主函數(shù)中調(diào)用輸出兩條線。問(wèn)題5.3有參函數(shù)的定義和調(diào)用。#include<stdio.h> intsum(intx,inty){intz; z=x+y; return(z);}main(){ inta,b;floatavg; printf("Inputtwonumbers:"); scanf("%d%d",&a,&b);avg=sum(a,b)/2.0;printf("Theaverageis%f\n",avg);}【說(shuō)明】

本例實(shí)現(xiàn)了從鍵盤(pán)輸入兩個(gè)整數(shù),在顯示器上輸出這兩個(gè)數(shù)的平均值,其中求兩個(gè)數(shù)的和是通過(guò)一個(gè)有參數(shù)的函數(shù)實(shí)現(xiàn)的。程序運(yùn)行的結(jié)果是:

Inputtwonumbers:2335Theaverageis29.000000問(wèn)題5.4輸入3個(gè)數(shù),輸出其最大值。#include<stdio.h>intmax(intx,inty){intmx;mx=x>y?x:y;returnmx;}main(){inta,b,c,result;printf("Pleaseinput3integernumbers:\n");scanf("%d%d%d",&a,&b,&c);result=max(a,max(b,c));printf("Themaxof%d、%d、%dis%d\n",a,b,c,result);}【說(shuō)明】程序中除了主函數(shù)main()之外,還有用于求兩個(gè)數(shù)最大值的max函數(shù)。計(jì)算3個(gè)數(shù)最大值時(shí),調(diào)用函數(shù)max時(shí)的實(shí)參用“函數(shù)調(diào)用”方式實(shí)現(xiàn),語(yǔ)句result=max(a,max(b,c));即為這種調(diào)用方式。練一練編寫(xiě)一個(gè)求1+2+…+n的函數(shù),并在主函數(shù)中調(diào)用,計(jì)算出1到100的累加和。問(wèn)題5.5編寫(xiě)一個(gè)函數(shù)判斷某年是否是閏年,如果是則返回值為1,如果不是則返回值為0,在主函數(shù)中調(diào)用,判斷輸入的年份是否為閏年。#include"stdio.h"intjudgeLeap(intyear){ if((year%4==0&&year%100!=0)||(year%400==0)) return1; else return0;}voidmain()/*主函數(shù)*/{ intyear; printf("請(qǐng)輸入年份:\n"); scanf("%d",&year); if(judgeLeap(year))printf("%disleapyear!\n",year);elseprintf("%disleapnotyear!\n",year);}

函數(shù)原型

在C程序的源文件中,當(dāng)把被調(diào)用函數(shù)的位置放在主調(diào)函數(shù)的前面時(shí),編譯系統(tǒng)不會(huì)提示錯(cuò)誤;但當(dāng)把被調(diào)函數(shù)放在主調(diào)函數(shù)的下方時(shí),有時(shí)編譯系統(tǒng)就會(huì)提示有錯(cuò)誤,這是因?yàn)樵谥髡{(diào)函數(shù)中調(diào)用某函數(shù)之前應(yīng)對(duì)該被調(diào)函數(shù)進(jìn)行聲明。這及使用變量之前要先進(jìn)行變量聲明是一樣的。在主調(diào)函數(shù)中對(duì)被調(diào)函數(shù)作說(shuō)明也叫“函數(shù)原型”,目的是讓編譯系統(tǒng)對(duì)被調(diào)函數(shù)的合法性進(jìn)行檢查。函數(shù)聲明的一般形式為:

類(lèi)型說(shuō)明符被調(diào)函數(shù)名(類(lèi)型形參,類(lèi)型形參,…);任務(wù)分析

在任務(wù)1的基礎(chǔ)上,通過(guò)任務(wù)2來(lái)熟悉函數(shù)的嵌套調(diào)用,實(shí)現(xiàn)統(tǒng)計(jì)多門(mén)課程的總分和平均分的功能。任務(wù)2嵌套調(diào)用和遞歸調(diào)用本任務(wù)設(shè)計(jì)4個(gè)函數(shù):函數(shù)1實(shí)現(xiàn)輸出一條線,函數(shù)2實(shí)現(xiàn)求多門(mén)課程的總成績(jī),函數(shù)3實(shí)現(xiàn)求某課程的平均分,主函數(shù)負(fù)責(zé)函數(shù)的調(diào)用。解決方法:可參考程序見(jiàn)書(shū)本P.1345.2.1使用函數(shù)實(shí)現(xiàn)學(xué)生多門(mén)課程的成績(jī)管理

所謂嵌套調(diào)用:就是在調(diào)用一個(gè)函數(shù)并在執(zhí)行該函數(shù)中,又調(diào)用另一個(gè)函數(shù)的情況。問(wèn)題5.6編寫(xiě)程序,用于實(shí)現(xiàn)求公式。5.2.2函數(shù)的嵌套調(diào)用#include<stdio.h>main(){longfunC(long,long);longfunN(longn);longm,n,c;printf("Pleaseinputtwonumbers(m、n):");scanf("%ld%ld",&m,&n);c=funC(m,n);printf("C(%ld,%ld)=%ld\n",m,n,c);}longfunC(longm,longn){longfunN(long);longa,b,c,cmn;a=funN(m);b=funN(n);c=funN(m-n);cmn=a/(b*c);return(cmn);}longfunN(longn){longi,result=1;for(i=1;i<=n;i++)result*=i;return(result);}【說(shuō)明】算法分析:求數(shù)的階乘由函數(shù)funN()來(lái)實(shí)現(xiàn),求組合數(shù)Cnm用函數(shù)funC()來(lái)實(shí)現(xiàn)。主函數(shù)main()調(diào)用函數(shù)funC(),而函數(shù)funC調(diào)用函數(shù)funN3次,分別計(jì)算m!、n!、(m-n)!。計(jì)算結(jié)果返回給主函數(shù)進(jìn)行輸出。m和n由鍵盤(pán)輸入。當(dāng)從鍵盤(pán)輸入數(shù)值10和4,程序執(zhí)行結(jié)果如下:

Pleaseinputtwonumbers(m、n):104C(10,4)=210函數(shù)嵌套調(diào)用示意圖練一練用函數(shù)的嵌套調(diào)用實(shí)現(xiàn)求|x|*2+1的值。在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。C語(yǔ)言允許函數(shù)遞歸調(diào)用,函數(shù)遞歸調(diào)用可分為直接遞歸調(diào)用和間接遞歸調(diào)用。函數(shù)的遞歸調(diào)用示意圖如下頁(yè)所示。5.2.3函數(shù)的遞歸調(diào)用函數(shù)遞歸調(diào)用示意圖問(wèn)題5.7用遞歸調(diào)用編寫(xiě)計(jì)算階乘n!的函數(shù)fact()【程序代碼】#include<stdio.h>longfact(intn){longrst;if(n<0)printf("n<0,dataerror!\n");elseif(n==0||n==1)rst=1;elserst=n*fact(n-1);return(rst);}main(){intn;longresult;printf("Pleaseinputanintegernumber(n):");scanf("%d",&n);result=fact(n);printf("%d!=%ld\n",n,result);getch();}【說(shuō)明】根據(jù)階乘的計(jì)算公式:n!=n*(n-1)!,為了計(jì)算n!,需要調(diào)用計(jì)算階乘的函數(shù)fact(n),它又要計(jì)算(n-1)!,此時(shí)又需要再調(diào)用fact(n-1),依次類(lèi)推,于是形成遞歸調(diào)用。這個(gè)調(diào)用過(guò)程一直繼續(xù)到計(jì)算1!為止。下面以求5!為例分析本程序的遞歸調(diào)用和返回的過(guò)程

問(wèn)題5.8用遞歸方法編寫(xiě)一個(gè)程序,求兩個(gè)正整數(shù)的最大公因數(shù)?!境绦虼a】#include<stdio.h>intgcd(intx,inty){if(y<=x&&x%y==0)returny;elseif(y>x)returngcd(y,x);elsereturngcd(y,x%y);}main(){inta,b;printf("Pleaseinputtwointegers:");scanf("%d%d",&a,&b);printf("Thegcdis%d\n",gcd(a,b));}練一練有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲,他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人多少歲,他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人多少歲,他說(shuō)比第2個(gè)人大2歲。問(wèn)第2個(gè)人多少歲,他說(shuō)比第1個(gè)人大2歲。問(wèn)第1個(gè)人多少歲,他說(shuō)是10歲。請(qǐng)用遞歸函數(shù)求出第5個(gè)人多少歲。任務(wù)分析

使用函數(shù),完善學(xué)生成績(jī)管理系統(tǒng)。本任務(wù)中將系統(tǒng)分解成6個(gè)功能模塊,每個(gè)模塊用函數(shù)來(lái)實(shí)現(xiàn)。函數(shù)1實(shí)現(xiàn)多名學(xué)生3門(mén)課程成績(jī)的輸入;函數(shù)2實(shí)現(xiàn)學(xué)生成績(jī)的輸出;函數(shù)3實(shí)現(xiàn)學(xué)生成績(jī)的查詢;函數(shù)4實(shí)現(xiàn)計(jì)算每位學(xué)生的總分和平均分;函數(shù)5實(shí)現(xiàn)按照總分由大到小的順序輸出學(xué)生的成績(jī);主函數(shù)總負(fù)責(zé)調(diào)用這些函數(shù)。要實(shí)現(xiàn)以上功能,必須了解函數(shù)參數(shù)的特點(diǎn)。任務(wù)3用函數(shù)實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)

使用函數(shù),完善學(xué)生成績(jī)管理系統(tǒng)。由于學(xué)生的成績(jī)信息存放在二維數(shù)組中,所以采用數(shù)組名作為函數(shù)的參數(shù)。在本系統(tǒng)設(shè)計(jì)5個(gè)函數(shù)。解決方法:可參考程序見(jiàn)書(shū)本P.1395.3.1使用函數(shù)完善學(xué)生成績(jī)管理系統(tǒng)

值調(diào)用

值調(diào)用方法是把實(shí)參的值傳遞給形參,即調(diào)用函數(shù)向被調(diào)用函數(shù)傳遞的參數(shù)是變量本身的值。形參在調(diào)用前和調(diào)用后都是不存在的,只有函數(shù)被調(diào)用時(shí)形參才被分配相應(yīng)的內(nèi)存單元,調(diào)用結(jié)束立即釋放。實(shí)參及形參即使是同名的變量,它們都占用不同的內(nèi)存單元,互不影響,這時(shí)形參值的變化將不影響實(shí)參的值。5.3.2函數(shù)的值調(diào)用和引用調(diào)用問(wèn)題5.9用值調(diào)用函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換?!境绦虼a】#include<stdio.h>voidswap(intx,inty){intt;t=x;x=y;y=t;printf("%d\t%d\n",x,y);}main(){inta,b;printf("Pleaseinputtwointegernumbers(a,b):");scanf("%d%d",&a,&b);swap(a,b);}練一練認(rèn)真分析下列問(wèn)題,如按這些問(wèn)題修改程序,題目5.9的運(yùn)行結(jié)果將會(huì)怎樣?(1)swap()函數(shù)中的輸出語(yǔ)句移到主函數(shù)的swap()后面。(2)在主函數(shù)的swap()后面添加一條語(yǔ)句:

printf(“%d\t,%d\n”,a,b);注意:在C語(yǔ)言中,如果實(shí)參變量對(duì)形式參數(shù)的數(shù)據(jù)傳遞是“傳值”,則是單向傳遞,只能由實(shí)參傳給形參,而不能由形參傳給實(shí)參。引用調(diào)用

引用調(diào)用是在調(diào)用時(shí)把實(shí)參的地址傳遞給形參,使用地址去訪問(wèn)實(shí)參,通常簡(jiǎn)稱“傳址”。此時(shí)主調(diào)函數(shù)向被調(diào)用函數(shù)傳遞的參數(shù)不是變量本身,而是變量的地址,當(dāng)被調(diào)函數(shù)中向相應(yīng)地址的單元寫(xiě)入不同的數(shù)值之后,也就改變了調(diào)用函數(shù)中相應(yīng)變量(參數(shù))的值,從而達(dá)到了返回多個(gè)變量值的目的,這種調(diào)用方式通常用數(shù)組名或指針作為函數(shù)參數(shù)。5.3.2函數(shù)的值調(diào)用和引用調(diào)用簡(jiǎn)單變量作函數(shù)參數(shù)當(dāng)實(shí)參是簡(jiǎn)單變量時(shí),就是簡(jiǎn)單變量作為函數(shù)參數(shù)的情況。前面所舉實(shí)例均采用這種簡(jiǎn)單變量作為函數(shù)參數(shù)的方法。數(shù)組元素作函數(shù)參數(shù)由于實(shí)參可以是表達(dá)式形式,表達(dá)式中可以包含數(shù)組元素,因此數(shù)組元素當(dāng)然可以作為函數(shù)的實(shí)際參數(shù),及用簡(jiǎn)單變量作實(shí)參一樣,是單向傳遞,即“傳值”方式。5.3.3函數(shù)的參數(shù)問(wèn)題5.10編寫(xiě)一個(gè)程序,輸出給定的成績(jī)數(shù)組中不及格(成績(jī)低于60)的人數(shù)。#include<stdio.h>#defineN10intfun(intx){return(x<60?1:0);}main(){inta[N],i,num=0;printf("Pleaseinput%dnumbers:",N);for(i=0;i<N;i++) {scanf("%d",&a[i]);num+=fun(a[i]); }printf("Thenumberofnopassis:%d\n",num);}

【說(shuō)明】分析:設(shè)計(jì)一個(gè)函數(shù)fun(x),當(dāng)x<60時(shí)返回1,否則返回0。在main()函數(shù)中,掃描整個(gè)成績(jī)數(shù)組a,對(duì)每個(gè)數(shù)組元素調(diào)用fun()函數(shù),并累加返回的數(shù)值。數(shù)組名作函數(shù)參數(shù)當(dāng)數(shù)組名作為形參時(shí),其實(shí)參也應(yīng)用數(shù)組名(或指針變量,參見(jiàn)第6章),且實(shí)參數(shù)組必須及形參數(shù)組類(lèi)型一致。當(dāng)函數(shù)參數(shù)是數(shù)組時(shí),此時(shí)傳遞的是數(shù)組的地址(首地址),而不是將整個(gè)數(shù)組元素都傳遞到函數(shù)中去,使得形參數(shù)組與實(shí)參數(shù)組共占同一段內(nèi)存單元,這就是“傳址”方式。5.3.3函數(shù)的參數(shù)問(wèn)題5.11用選擇法對(duì)數(shù)組中5個(gè)整數(shù)按由小到大排序。#include<stdio.h>voidsort(intarr[5]){inti,j,k,t;for(i=0;i<5-1;i++){k=i;for(j=i+1;j<5;j++)if(arr[j]<arr[k])k=j;t=arr[k];arr[k]=arr[i];arr[i]=t;}}main(){inta[5],i;printf("Pleaseinputthearray:\n");for(i=0;i<5;i++)scanf("%d",&a[i]);sort(a);printf("thesortedarray:\n");for(i=0;i<5;i++)printf("%d",a[i]);printf("\n");}說(shuō)明:實(shí)參數(shù)組和形參數(shù)組大小可以一致,也可以不一致。C編譯系統(tǒng)對(duì)形參數(shù)組大小不做語(yǔ)法檢查,只是將實(shí)參數(shù)組的首地址傳遞給形參數(shù)組。另外,形參數(shù)組也可以不指定大小,在定義數(shù)組時(shí)在數(shù)組后面跟一對(duì)空的方括號(hào)。如題目5.11中,sort()函數(shù)可以定義為:voidsort(intarr[])或voidsort(intarr[],intn)不僅一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組名也可作為函數(shù)參數(shù),其參數(shù)傳遞都是“地址傳遞”。對(duì)于利用多維數(shù)組作為函數(shù)參數(shù)來(lái)說(shuō),在被調(diào)用函數(shù)中對(duì)形參數(shù)組定義時(shí)可以指定每一維的大小,也可以省略第一維的大小說(shuō)明,且二者等價(jià),但是不能把第二維以及其他高維的大小說(shuō)明省略。

練一練用函數(shù)實(shí)現(xiàn)數(shù)組元素的逆序。5.4.1變量的作用域形參變量只在被調(diào)用期間才分配內(nèi)存單元,調(diào)用結(jié)束就立即釋放內(nèi)存。這一點(diǎn)表明形參變量只有在函數(shù)內(nèi)部才是有效的,離開(kāi)該函數(shù)就不能再使用了。這種變量有效性的范圍稱變量的作用域。不僅對(duì)于形參變量,C語(yǔ)言中所有的變量都有自己的作用域。變量說(shuō)明的方式不同,其作用域也不同。C語(yǔ)言中的變量,按作用域范圍可分為兩種,即局部變量和全局變量。任務(wù)4任務(wù)拓展一、局部變量局部變量也稱為內(nèi)部變量。局部變量定義在函數(shù)的內(nèi)部。其作用域僅限于函數(shù)內(nèi),離開(kāi)該函數(shù)后,該變量的作用便消失,無(wú)法使用該變量。問(wèn)題5.13分析下面程序的運(yùn)行結(jié)果

voidf(){intk=5;printf("f:k=%d\n",k);}main(){inti,k;k=3;f();for(i=1;i<3;i++) {intk=8+i; printf("main->for:k=%d\n",k); }printf("main:k=%d\n",k);}二、全局變量

全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),它屬于一個(gè)源程序文件。其作用域是從定義變量的位置開(kāi)始到當(dāng)前源文件結(jié)束。inta,b;/*外部變量作用范圍是從這里開(kāi)始到文件結(jié)束*/voidf1()/*函數(shù)f1*/{……}floatx,y;/*外部變量作用范圍是從這里開(kāi)始到文件結(jié)束*/intf2()/*函數(shù)f2*/{……}main()/*主函數(shù)*/{……}

從上例可以看出a,b,x,y都是在函數(shù)外部定義的外部變量,都是全局變量。但x,y定義在函數(shù)f1之后,而在f1內(nèi)又沒(méi)有對(duì)x,y的說(shuō)明,所以它們?cè)趂1內(nèi)無(wú)效。a,b定義在源程序最前面,因此在f1,f2及main內(nèi)不加說(shuō)明也可使用。

5.4.2編譯預(yù)處理

C語(yǔ)言提供的預(yù)處理功能主要有以下3種:宏定義、文件包含和條件編譯。編譯預(yù)處理命令不屬于C語(yǔ)句的范疇。為表示區(qū)別,所有的編譯預(yù)處理命令均以#符號(hào)開(kāi)頭,各占用一個(gè)單獨(dú)的書(shū)寫(xiě)行,末尾不用分號(hào)作結(jié)束符。如果一行書(shū)寫(xiě)不下,可用反斜線(\)和回車(chē)鍵結(jié)束,然后在下一行繼續(xù)書(shū)寫(xiě)。它們可以出現(xiàn)在程序的任何位置,作用域是自出現(xiàn)的地方開(kāi)始到源程序的末尾。一、宏定義

宏定義是指用一個(gè)指定的宏名(標(biāo)識(shí)符)來(lái)代表一個(gè)字符串。在對(duì)源文件進(jìn)行預(yù)處理時(shí),用宏定義的字符串來(lái)代替每次出現(xiàn)的宏名。另外,宏名不僅可以代表字符串,還可以接收參數(shù)以擴(kuò)展宏的使用。因此,宏可分為不帶參數(shù)的宏和帶參數(shù)的宏兩種。1、不帶參數(shù)的宏定義是用一個(gè)指定的標(biāo)識(shí)符(即宏名)來(lái)代表一個(gè)字符串,其定義的一般形式為:#define標(biāo)識(shí)符字符串其中,標(biāo)識(shí)符是用戶定義的,遵循C語(yǔ)言標(biāo)識(shí)符的命名規(guī)則,要求它及后面的字符串之間用空格符分隔;字符串不能用雙引號(hào)界定。注意:宏定義不是語(yǔ)句,不能在末尾添加分號(hào)“;”。#defineNUM50#defineTRUE1#defineFALSE0#defineNLprintf(“\n”)#defineLEN100;/*因添加“;”而出錯(cuò),則LEN代表“100;”這個(gè)字符串*/問(wèn)題5.14定義不帶參數(shù)的宏?!境绦虼a】#definePI3.14159/*定義無(wú)參數(shù)宏P(guān)I*/#definePRprintf/*定義無(wú)參數(shù)宏P(guān)R*/main(){floats,r;PR(“PleaseInputRadius:”);/*使用宏*/scanf(“%f”,&r);s=PI*r*r;/*使用宏*/PR(“r=%.2f,s=%.2f\n”,r,s);/*使用宏*/}經(jīng)過(guò)預(yù)編譯處理后的程序變?yōu)椋簃ain(){floats,r;printf(“PleaseInputRadius:”);scanf(“%f”,&r);s=3.14159*r*r;printf(“r=%.2f,s=%.2f\n”,r,s);}【說(shuō)明】在預(yù)編譯處理時(shí)將宏名替換成字符串的過(guò)程稱為宏展開(kāi),或稱宏替換。本題中宏P(guān)R用“printf”字符串代替,PI由“3.14159”字符串代替。說(shuō)明:(1)習(xí)慣上,宏定義名一般用大寫(xiě),以區(qū)別一般關(guān)鍵字和其他變量。(2)宏定義不是C語(yǔ)句,不能在最后加上分號(hào)作為結(jié)束符。如果加了分號(hào),則在預(yù)編譯處理時(shí)連分號(hào)一起進(jìn)行替換。例如:

#definePI3.14159;

s=PI*r*r;經(jīng)過(guò)預(yù)處理展開(kāi)后,語(yǔ)句變?yōu)椋?/p>

s=3.14159;*r*r;顯然是錯(cuò)誤的。(3)宏名的有效范圍是從定義開(kāi)始到本源文件結(jié)束。如果想在源文件結(jié)束前終止宏定義的作用域,可以用#undef命令。例如:

#defineW9.8main(){┇W的有效范圍

}#undefW(4)使用宏名代替一個(gè)字符串,可以減少程序中重復(fù)書(shū)寫(xiě)某些字符串的工作量,也可以提高程序的可讀性和可維護(hù)性,如在問(wèn)題5.1中,如果要提高PI的精確度,將PI定義成3.1415926時(shí),只需將宏定義中PI的值修改一下,程序中其他地方的PI值將自動(dòng)同時(shí)修改。(5)若在字符串中出現(xiàn)及宏名相同的字符串,系統(tǒng)不認(rèn)為是宏名,預(yù)處理時(shí)也不作宏展開(kāi)。例如:

#definePI3.14159…printf(“PI=%f”,PI);/*“PI=%f”中的PI不是宏名*/

輸出結(jié)果是:

PI=3.14159(6)在進(jìn)行宏定義時(shí),可以引用已定義過(guò)的宏名,在宏展開(kāi)時(shí)可以層層替換。例如:

#definePI3.14159#defineR12#defineSPI*R*Rprintf(“S=%.2f”,S);

輸出結(jié)果是:

S=452.392、帶參數(shù)的宏定義帶參數(shù)的宏定義除了進(jìn)行必要的字符串替換外,還可以進(jìn)行參數(shù)的替換。帶參數(shù)的宏定義的一般形式是:

#define標(biāo)識(shí)符(參數(shù)表)字符串其中,參數(shù)表中可以是一個(gè)或多個(gè)參數(shù);字符串應(yīng)有參數(shù)表中的參數(shù)。例如:定義矩形面積的宏S、a和b是邊長(zhǎng):

#defineS(a,b)a*b/*p定義帶參數(shù)的宏*/area=S(3,2);/*參數(shù)a的值為3,b的值為2*/上式展開(kāi)為:

area=3*2;問(wèn)題5.15定義帶參數(shù)的宏?!境绦虼a】#definePI3.14159/*定義無(wú)參數(shù)的宏P(guān)I*/#defineS(r)PI*r*r/*用帶參數(shù)的宏S(r)表示圓的面積公式*/main(){floata,area;a=3.6;area=S(a);printf(“r=%f\narea=%f\n”,a,area);}【說(shuō)明】運(yùn)行結(jié)果:

r=3.600000area=40.715038對(duì)于帶參數(shù)的宏的說(shuō)明:(1)對(duì)于帶參數(shù)的宏的展開(kāi),只是將語(yǔ)句中的宏名后面括號(hào)中的實(shí)參字符串代替#define命令行中的形參。(2)為了使宏定義更有通用性且不易出錯(cuò),一般將參數(shù)用括號(hào)括起來(lái)。(3)不能把有參數(shù)宏及函數(shù)相混淆。宏只是字符序列的替換,沒(méi)有值的傳送,且宏名、參數(shù)都沒(méi)有數(shù)據(jù)類(lèi)型的概念;函數(shù)要比宏復(fù)雜,有數(shù)據(jù)類(lèi)型、參數(shù)傳遞等概念。問(wèn)題5.16分析下面程序的功能?!境绦虼a】#defineMAX(a,b)((a)>(b))?(a):(b)main(){intx,y,max;printf("Inputtwonumbers:");scanf("%d%d",&x,&y);max=MAX(x,y);printf("max=%d\n",max);}【說(shuō)明】本程序的第1行中定義了帶參數(shù)的宏MAX(a,b),同使用函數(shù)相比,宏代碼更簡(jiǎn)潔。運(yùn)行結(jié)果:Inputtwonumbers:1315Max=15練一練運(yùn)用宏計(jì)算矩形的面積和周長(zhǎng)。運(yùn)用宏計(jì)算球的表面積。二、文件包含

文件包含是指在一個(gè)文件中使用#include預(yù)處理命令將另一個(gè)文件的全部?jī)?nèi)容包含進(jìn)來(lái),而不是直接將源程序重新寫(xiě)入程序中。文件包含命令的一般形式為:#include“文件名”或者:#include<文件名>上述兩種文件包含形式的區(qū)別在于:(1)使用尖括號(hào)(<>):直接到存放C庫(kù)函數(shù)頭文件所在的目錄去查找被包含文件,這稱為標(biāo)準(zhǔn)方式。(2)使用雙引號(hào)(“”):系統(tǒng)首先到當(dāng)前目錄下查找被包含文件,如果沒(méi)找到,再到系統(tǒng)存放C庫(kù)函數(shù)頭文件所在的目錄中查找。一般地說(shuō),如果為調(diào)用庫(kù)函數(shù)而用#include命令來(lái)包含相關(guān)頭文件,則用尖括號(hào),以節(jié)省查找時(shí)間。如果要包含的是用戶自己編寫(xiě)的文件,則用(“”),若文件不在當(dāng)前目錄中,雙引號(hào)內(nèi)可給出文件路徑。前面已多次用到此命令包含庫(kù)函數(shù)的頭文件。例如:

#include<stdio.h>#include<math.h>說(shuō)明:(1)一個(gè)#include命令只能指定一個(gè)被包含文件。如果要包含多個(gè)文件,則需要用多個(gè)#include命令。編譯預(yù)處理時(shí),預(yù)處理程序?qū)⒉檎抑付ǖ谋话募?,并將其?fù)制到#include命令出現(xiàn)的位置上。(2)文件包含可以嵌套,即被包含文件中又包含另一個(gè)文件。例如,在filel.c中包含file2.c,在file2.c中包含file3.c。在filel.c中,這種包含關(guān)系可以表示如下:

#include“file3.c”#include“file2.c”

由于file2.c包含file3.c,所以需要將包含file3.c的預(yù)處理命令放在包含file2.c的預(yù)處理命令前。通過(guò)上面的文件包含,filel.c和file2.c都可以用file3.c中的內(nèi)容。在file2.c中不必再用#include“file3.c”。(3)常用在文件頭部的被包含文件,稱為“頭文件”,以.h作為后綴。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結(jié)構(gòu)類(lèi)型定義等。

問(wèn)題5.17寫(xiě)一個(gè)判斷素?cái)?shù)的函數(shù),在主函數(shù)中輸入一個(gè)整數(shù),輸出該數(shù)是否為素?cái)?shù)的信息。分析:本例中定義prime函數(shù)是有參數(shù)的函數(shù),實(shí)參就是需要判斷的數(shù),將其在調(diào)用prime函數(shù)時(shí)傳遞給變量number,實(shí)現(xiàn)實(shí)參和形參的值傳遞。函數(shù)的返回值作

溫馨提示

  • 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)論