C語言程序設(shè)計(jì) 課件 7利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)_第1頁
C語言程序設(shè)計(jì) 課件 7利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)_第2頁
C語言程序設(shè)計(jì) 課件 7利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)_第3頁
C語言程序設(shè)計(jì) 課件 7利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)_第4頁
C語言程序設(shè)計(jì) 課件 7利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C語言程序設(shè)計(jì)項(xiàng)目7利用函數(shù)進(jìn)行項(xiàng)目的整體框架設(shè)計(jì)目標(biāo)TARGET知識(shí)目標(biāo)掌握函數(shù)的定義和調(diào)用方法掌握函數(shù)的參數(shù)傳遞方式理解變量的作用域和生命期,較熟練使用函數(shù)進(jìn)行模塊化程序設(shè)計(jì)目標(biāo)TARGET技能目標(biāo)學(xué)會(huì)正確的使用函數(shù)能夠使用函數(shù)進(jìn)行模塊化程序設(shè)計(jì)學(xué)生管理系統(tǒng)功能模塊設(shè)計(jì)任務(wù)1.1

統(tǒng)計(jì)小組學(xué)生一門課程的總分及平均分任務(wù)1.2求小組若干門課程的總分及平均分任務(wù)1.3輸出排序后小組三門課成績單任務(wù)1.4任務(wù)7.1學(xué)生管理系統(tǒng)功能模塊設(shè)計(jì)

任務(wù)描述學(xué)生成績管理是學(xué)校教學(xué)管理中的一個(gè)非常重要而又十分煩瑣的工作。為了滿足現(xiàn)代化教育和管理的要求,運(yùn)用高效能的計(jì)算機(jī)來對(duì)學(xué)生的成績進(jìn)行管理勢(shì)在必行。從本章開始,著手對(duì)學(xué)生成績管理系統(tǒng)進(jìn)行設(shè)計(jì)與開發(fā),系統(tǒng)的用戶界面如圖0-1所示。依據(jù)開篇例程中的描述,將系統(tǒng)分為4個(gè)階段完成:(1)以模塊化程序設(shè)計(jì)的方法,完成系統(tǒng)的結(jié)構(gòu)設(shè)計(jì)。(2)完成系統(tǒng)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),實(shí)現(xiàn)主要功能函數(shù)。(3)利用指針優(yōu)化各功能模塊。(4)利用文件,完善系統(tǒng)的數(shù)據(jù)存取。任務(wù)分析學(xué)生成績管理系統(tǒng)最主要的功能包括:學(xué)生成績的添加、刪除、查詢、修改、插入、排序及統(tǒng)計(jì),其中學(xué)生成績信息的查詢、刪除、修改、插入等都要依據(jù)輸入的學(xué)號(hào)來實(shí)現(xiàn)。任務(wù)1.1認(rèn)識(shí)C程序

實(shí)現(xiàn)在線測(cè)試系統(tǒng)主頁面的布局和美化某班級(jí)需要一個(gè)學(xué)生成績管理系統(tǒng),該系統(tǒng)應(yīng)具有學(xué)生成績的添加、刪除、查詢、修改、插入和排序等處理功能,提供數(shù)字按鍵菜單操作方式,如圖0-1所示。程序代碼#include"stdio.h"/*編譯預(yù)處理命令*/voidmain(){ printf("學(xué)生成績管理系統(tǒng)\n");

/*在屏幕上輸出學(xué)生成績管理系統(tǒng)*/}/*main()主函數(shù)結(jié)束*/執(zhí)行結(jié)果1函數(shù)的定義、聲明及調(diào)用Part◎函數(shù)的調(diào)用◎?qū)W生管理系統(tǒng)功能模塊設(shè)計(jì)◎函數(shù)的定義及其聲明函數(shù)的定義及其聲明

1.函數(shù)的定義函數(shù)的定義是讓編譯器知道函數(shù)的功能。其一般格式:類型標(biāo)識(shí)符函數(shù)名([形式參數(shù)列表]){聲明部分語句部分}(1)函數(shù)名函數(shù)名是一個(gè)用戶定義的標(biāo)識(shí)符,它的命名規(guī)則同變量完全一樣,為了增加程序的可讀性,一般取有助于記憶的名字并與其功能相關(guān)的名字作為函數(shù)名,但在同一程序中,不能有同名的函數(shù)。(2)函數(shù)體用左、右花括號(hào)括起來的部分稱函數(shù)體,它由聲明部分和語句部分組成。聲明部分,主要用于對(duì)函數(shù)內(nèi)所使用的變量以及對(duì)所調(diào)用的函數(shù)的類型進(jìn)行說明;語句部分則是實(shí)現(xiàn)函數(shù)功能的核心部分,它由C語言的基本語句組成。函數(shù)的定義及其聲明

(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。(3)返回類型返回類型就是函數(shù)返回值的類型。對(duì)有值函數(shù),一般通過函數(shù)調(diào)用得到一確定值,這個(gè)值就是函數(shù)返回值(簡稱函數(shù)值)。如floatfnSum(floata,floatb)將返回一個(gè)float類型的值。此時(shí),在函數(shù)體部分有一返回語句“returnfSum;”。對(duì)無返回值函數(shù),函數(shù)名前應(yīng)加上void類型,在函數(shù)定義的<語句部分>中,可以有一返回語句“return;”,也可以不帶返回語句,該函數(shù)執(zhí)行到最后一個(gè)花括號(hào)時(shí),自動(dòng)返回。(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。函數(shù)的定義及其聲明

(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。2.函數(shù)的聲明函數(shù)聲明是讓編譯器知道函數(shù)的類型、函數(shù)的參數(shù)個(gè)數(shù)、參數(shù)類型及參數(shù)順序等信息。其一般格式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)列表);其中,形式參數(shù)列表可以省略。說明:(1)函數(shù)聲明就是函數(shù)頭部分,并在最后加了一個(gè)分號(hào)“;”。(2)函數(shù)聲明中的參數(shù)列表,可省去參數(shù)名,但參數(shù)類型必須保留。例如,如下兩種形式的函數(shù)聲明等價(jià)。voidfnPower(floatx,intn);voidfnPower(float,int);函數(shù)的定義及其聲明

(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。3.學(xué)生成績管理系統(tǒng)菜單的顯示voidfnShowMenu() //自定義函數(shù)顯示菜單{system("cls"); //清屏函數(shù)printf("\n");printf("\t$************學(xué)生成績管理系統(tǒng)************$\n");printf("\t$0.退出$\n");printf("\t$1.錄入數(shù)據(jù)$\n");printf("\t$2.查詢記錄$\n");printf("\t$3.修改記錄$\n");printf("\t$4.插入記錄$\n");printf("\t$5.刪除記錄$\n");printf("\t$6.成績排序$\n");printf("\t$7.數(shù)據(jù)統(tǒng)計(jì)$\n");printf("\t$8.瀏覽記錄$\n");函數(shù)的調(diào)用

(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。1.函數(shù)調(diào)用的形式定義函數(shù)后,通過調(diào)用函數(shù)來執(zhí)行函數(shù)的功能。調(diào)用函數(shù)的一般形式如下:<函數(shù)名>([<實(shí)參列表>]);其中,實(shí)參列表(簡稱實(shí)參)是有確定值的變量或表達(dá)式,若有多個(gè)參數(shù),各參數(shù)間要用逗號(hào)分開。說明:(1)在實(shí)參表中,實(shí)參的個(gè)數(shù)與順序必須和形參的個(gè)數(shù)與順序相同,實(shí)參的數(shù)據(jù)類型必須和對(duì)應(yīng)的形參數(shù)據(jù)類型相同。(2)如為無參函數(shù)調(diào)用,則沒有實(shí)參列表,但括號(hào)不能省略。(3)函數(shù)間可以互相調(diào)用,但不能調(diào)用main()函數(shù)。函數(shù)的調(diào)用

(1)定義一個(gè)函數(shù)fnPrint(),輸出1行20個(gè)“*”。(2)在main()函數(shù)中先聲明,再調(diào)用函數(shù)fnPrint()。(3)函數(shù)fnPrint()的算法為:使用printf()直接輸出20個(gè)“*”。例7-1無參數(shù)無返回值自定義函數(shù)舉例。在屏幕上輸出兩行20個(gè)“*”,如圖7-3所示。需要自定義函數(shù)實(shí)現(xiàn)輸出1行20個(gè)“*”,在主函數(shù)中調(diào)用兩次,實(shí)現(xiàn)最終的顯示效果。

問題分析

算法設(shè)計(jì)函數(shù)的調(diào)用

程序代碼#include"stdio.h"voidmain(){voidfnPrint();/*函數(shù)聲明*/fnPrint();/*調(diào)用函數(shù)*/printf("\n");fnPrint();}voidfnPrint()/*函數(shù)定義*/{printf("********************");}

程序執(zhí)行的結(jié)果函數(shù)的調(diào)用(1)該程序有兩個(gè)函數(shù)構(gòu)成,一個(gè)是主函數(shù)main(),一個(gè)是用戶自定義函數(shù)fnprint()。(2)voidfnPrint()中,void是函數(shù)的返回值類型,表示沒有返回值。fnprint是函數(shù)名,“()”內(nèi)沒有參數(shù),表示該函數(shù)是無參函數(shù)。(3)函數(shù)名的命名同變量的命名一樣,都必須符合自定義標(biāo)識(shí)符的命名規(guī)則。在同一程序中,不能使用同名的函數(shù)。(4)函數(shù)的使用包括3個(gè)步驟,分別為:函數(shù)的定義、函數(shù)的聲明、函數(shù)的調(diào)用。

說明函數(shù)的調(diào)用

(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。2.函數(shù)調(diào)用的方式根據(jù)函數(shù)在程序中出現(xiàn)的位置,大致有三種調(diào)用方式:(1)函數(shù)語句把函數(shù)調(diào)用作為一條語句。如:在例7-1中,“fnPrint();”,執(zhí)行該語句時(shí),調(diào)用函數(shù)fnPrint(),執(zhí)行其功能。這時(shí)不要求函數(shù)帶返回值,只需要函數(shù)完成一定的操作。(2)函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這時(shí)要求函數(shù)帶回一個(gè)確定的值,用函數(shù)的返回值參加表達(dá)式的運(yùn)算。如:x=3*fnMax(a,b);。(3)函數(shù)參數(shù)函數(shù)調(diào)用做為函數(shù)的實(shí)參,如:result=fnMax(a,fnMax(b,c));。函數(shù)的調(diào)用

(4)形式參數(shù)列表形式參數(shù)列表中的參數(shù)被稱為形式參數(shù),簡稱形參。有形參的函數(shù)稱為有參函數(shù)。沒有參數(shù)的函數(shù)稱為無參函數(shù)。3.函數(shù)調(diào)用時(shí)的數(shù)據(jù)傳遞(1)形式參數(shù)和實(shí)際參數(shù)當(dāng)被調(diào)函數(shù)是有參函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。定義函數(shù)時(shí)的參數(shù)稱為形式參數(shù),簡稱形參。形參在該函數(shù)未被調(diào)用時(shí)是沒有確定的值,只是形式上的參數(shù),也不占內(nèi)存,只有發(fā)生調(diào)用時(shí),形參才被分配內(nèi)存單元,接受實(shí)參傳來的值。調(diào)用函數(shù)時(shí)的參數(shù)稱為實(shí)參,實(shí)參可以是變量、常量或表達(dá)式,是有確定的值,是實(shí)實(shí)在在的參數(shù)。定義函數(shù)時(shí)必須定義形參的類型。函數(shù)的形參與實(shí)參個(gè)數(shù)要求相等,對(duì)應(yīng)類型一致。形參和實(shí)參可以同名,形參是該函數(shù)的局部變量,即使形參和實(shí)參同名,也是兩個(gè)不同的變量,占用不同的內(nèi)存單元。形式參數(shù)用于調(diào)用函數(shù)和被調(diào)函數(shù)之間進(jìn)行數(shù)據(jù)傳遞,在函數(shù)體內(nèi)可對(duì)其操作。因此,它也需要類型說明,這由形式參數(shù)說明部分完成,函數(shù)可不帶參數(shù),也可帶多個(gè)參數(shù),當(dāng)有多個(gè)參數(shù)時(shí),每個(gè)參數(shù)之間用逗號(hào)隔開。(2)實(shí)參與形參之間的值傳遞函數(shù)的參數(shù)主要用于在調(diào)用函數(shù)和被調(diào)用函數(shù)之間進(jìn)行數(shù)據(jù)傳遞。簡單變量或數(shù)組下標(biāo)變量作為函數(shù)參數(shù)都是按“值傳遞”方式處理的,即只能把實(shí)參的值傳遞給形參,而不能將形參的值傳遞給實(shí)參,形參值的改變不影響實(shí)參。函數(shù)的調(diào)用

(1)定義2個(gè)整型變量iNum1、iNum2存儲(chǔ)2個(gè)整數(shù)。(2)用iNum1、iNum2作為實(shí)參調(diào)用函數(shù)交換兩個(gè)數(shù)的值函數(shù)中算法是:設(shè)計(jì)兩個(gè)形參iNum1、iNum2。定義1個(gè)中間變量iTemp。例7-2調(diào)用交換兩個(gè)數(shù)的值的函數(shù)fnSwap(),觀察運(yùn)行結(jié)果。首先需要定義一個(gè)實(shí)現(xiàn)交換兩個(gè)數(shù)的值的函數(shù),在主函數(shù)中調(diào)用。

問題分析

算法設(shè)計(jì)函數(shù)的調(diào)用圖7-4例7-2流程圖

傳統(tǒng)流程圖fnSwap開始定義iNum1、iNum2、iTempi、iTemp=iNum1fnSum結(jié)束iNum1=iNum2iNum2=iTemp開始

調(diào)用fnSwap(iNum1,iNum2)函數(shù)結(jié)束定義iNum1、iNum2iNum1=10;iNum2=20函數(shù)的調(diào)用

程序代碼#include<stdio.h>voidfnSwap(intiNum1,intiNum2);voidmain(){ intiNum1,iNum2;iNum1=10; iNum2=20; printf("函數(shù)調(diào)用前:a=%d,b=%d\n",a,b); fnSwap(iNum1,iNum2); printf("函數(shù)調(diào)用后:a=%d,b=%d\n",a,b);}voidfnSwap(intiNum1,intiNum2) { intiTemp; iTemp=iNum1;iNum1=iNum2;iNum2=iTemp; printf("函數(shù)調(diào)用中:a=%d,b=%d\n",a,b);}函數(shù)的調(diào)用(1)運(yùn)行結(jié)果表明,盡管形參iNum1和iNum2在fnSwap()函數(shù)中交換了,但主函數(shù)main()在調(diào)用fnSwap()函數(shù)的前后,實(shí)參iNum1和iNum2的值沒有變。(2)在調(diào)用函數(shù)中改變形參的值不會(huì)改變實(shí)參的值。值傳遞是把實(shí)參的值拷貝到相對(duì)應(yīng)的形參中,及被調(diào)用函數(shù)得到的是實(shí)參的拷貝,而不是實(shí)參本身。例7-4中調(diào)用fnSwap()函數(shù)時(shí),函數(shù)參數(shù)傳遞的過程如圖7-9所示。

(3)實(shí)參與形參之間的址傳遞數(shù)組名作為函數(shù)參數(shù),在函數(shù)間傳遞數(shù)據(jù)。當(dāng)數(shù)組名作為函數(shù)實(shí)參時(shí),傳給形參的是實(shí)參數(shù)組的首地址。換句話說,采用的不是“值傳送”方式,而是“地址傳送”,即把實(shí)參的地址傳送給形參。此時(shí),形參值的改變,實(shí)參的值也隨之改變。

執(zhí)行結(jié)果

說明復(fù)制復(fù)制1010實(shí)參iNum1形參iNum12020實(shí)參iNum2形參iNum2函數(shù)的調(diào)用

(1)定義1個(gè)float型數(shù)組存儲(chǔ)5個(gè)學(xué)生的成績。(2)定義1個(gè)float型變量存儲(chǔ)平均分。(3)循環(huán)輸入5個(gè)學(xué)生的成績。(4)以數(shù)組名為實(shí)參調(diào)用函數(shù),計(jì)算平均分并將函數(shù)的返回值賦給平均分變量。(5)輸出平均分。函數(shù)中算法是:設(shè)計(jì)一個(gè)數(shù)組接收5個(gè)學(xué)生的成績,定義1個(gè)變量fSum保存25個(gè)學(xué)生的總分,并賦初值為0。構(gòu)造一個(gè)循環(huán)將每個(gè)學(xué)生的成績fSum中。返回fSum/10的值。例7-3數(shù)組名做函數(shù)的形參和實(shí)參。班級(jí)一學(xué)習(xí)小組有5名學(xué)生,現(xiàn)有某個(gè)月的月考成績,計(jì)算小組的平均分。首先需要定義一個(gè)函數(shù)實(shí)現(xiàn)計(jì)算5個(gè)數(shù)的平均值的功能,在主函數(shù)中調(diào)用。

問題分析

算法設(shè)計(jì)函數(shù)的調(diào)用圖7-4例7-2流程圖

傳統(tǒng)流程圖fnAve開始始定義i=0,fSum=0i<5

i++fnAve結(jié)束開始fSum+=fScore[i]返回fSum/10

循環(huán)輸入fScore開始定義fScore[5],fAve,i

輸出fAve結(jié)束fAve=fnAve(fScore)函數(shù)的調(diào)用

程序代碼#include"stdio.h"floatfnAve(floatfScore1[10]);floatfnAve(floatfScore1[10]){floatfSum=0;inti;for(i=0;i<10;i++)fSum=fSum+fScore1[i];returnfSum/10;/*返回平均值*/}voidmain(){inti;floatfScore[10],fAve;for(i=0;i<10;i++)

函數(shù)的調(diào)用(1)數(shù)組名作為函數(shù)的參數(shù),必須在調(diào)用前和被調(diào)用中分別定義數(shù)組,且數(shù)據(jù)類型必須一致。(2)形參數(shù)組可以不指定大小,如果指定形參數(shù)組的大小,實(shí)參數(shù)組的大小必須大于形參數(shù)組。(3)這里使用的是地址傳遞,即將數(shù)組中的第一個(gè)元素的地址(首地址)傳遞給形參,這樣,兩個(gè)數(shù)組共用一段內(nèi)存空間。也就是說,形參數(shù)組各單元的值如果發(fā)生變化也會(huì)使實(shí)參數(shù)組單元的值同時(shí)發(fā)生變化。

程序代碼#include"stdio.h"scanf("%f",&fScore[i]);fAve=fnAve(fScore);/*以數(shù)組名為實(shí)參調(diào)用函數(shù)*/printf("\ntheavgofscoreis%f",fAve);}

執(zhí)行結(jié)果函數(shù)的調(diào)用

說明(1)數(shù)組名作為函數(shù)的參數(shù),必須在調(diào)用前和被調(diào)用中分別定義數(shù)組,且數(shù)據(jù)類型必須一致。(2)形參數(shù)組可以不指定大小,如果指定形參數(shù)組的大小,實(shí)參數(shù)組的大小必須大于形參數(shù)組。(3)這里使用的是地址傳遞,即將數(shù)組中的第一個(gè)元素的地址(首地址)傳遞給形參,這樣,兩個(gè)數(shù)組共用一段內(nèi)存空間。也就是說,形參數(shù)組各單元的值如果發(fā)生變化也會(huì)使實(shí)參數(shù)組單元的值同時(shí)發(fā)生變化。學(xué)生管理系統(tǒng)功能模塊設(shè)計(jì)

按照模塊化程序設(shè)計(jì)方法,將功能模塊用一個(gè)函數(shù)來實(shí)現(xiàn)。目前暫時(shí)由空函數(shù)表示,其功能實(shí)現(xiàn)留待第二階段完成。采用菜單驅(qū)動(dòng)方式進(jìn)行人機(jī)交互、設(shè)計(jì)用戶界面。1.顯示菜單模塊此模塊顯示菜單函數(shù)fnShowMenu()參考7.1.3節(jié)。2.系統(tǒng)功能模塊根據(jù)前面對(duì)系統(tǒng)的分析,系統(tǒng)設(shè)計(jì)可分為8個(gè)主要的功能模塊,因此,可以定義8個(gè)空函數(shù):錄入數(shù)據(jù)函數(shù)fnInputData、數(shù)據(jù)查詢函數(shù)fnSearch、數(shù)據(jù)刪除函數(shù)fnDel、數(shù)據(jù)修改函數(shù)fnMod、數(shù)據(jù)插入函數(shù)fnInsert、數(shù)據(jù)排序函數(shù)fnSort、數(shù)據(jù)統(tǒng)計(jì)函數(shù)fnTotal、數(shù)據(jù)瀏覽函數(shù)fnShow()。3.主函數(shù)main()主函數(shù)是程序的入口,程序從主函數(shù)開始執(zhí)行,通過調(diào)用顯示菜單函數(shù)將菜單顯示在屏幕上,當(dāng)用戶選擇特定功能時(shí),通過調(diào)用相應(yīng)的函數(shù)實(shí)現(xiàn)用戶所選擇的功能。

任務(wù)7.2統(tǒng)計(jì)小組學(xué)生一門課程的總分及平均分

任務(wù)描述一個(gè)班有40位學(xué)生(分成五個(gè)組,但每個(gè)組的人數(shù)不一樣)參加了期終考試(考了三門課,分別是數(shù)學(xué)、語文、英語),請(qǐng)你用菜單的方式:求小組一門課程的總分及平均分。任務(wù)分析主函數(shù)的功能是設(shè)計(jì)一個(gè)菜單,由所選擇的菜單調(diào)用相應(yīng)的函數(shù),但為了界面清晰,所以程序的執(zhí)行過程中多次用一條線劃界。所以問題就歸結(jié)為制作一條線的函數(shù)及求一門課程的總分及平均分。2函數(shù)的分類Part◎空函數(shù)◎無參函數(shù)◎統(tǒng)計(jì)小組一門課程的總分及平均分◎有參函數(shù)無參函數(shù)

函數(shù)名后面的括號(hào)是空的,沒有任何參數(shù)的函數(shù)就是無參函數(shù)。需要注意的是:定義時(shí)無參,意味著調(diào)用時(shí)也無需傳入?yún)?shù)。

如果函數(shù)體代碼邏輯不需要依賴外部傳入的值,必須得定義成無參函數(shù)。定義無參函數(shù)的一般形式為:類型名函數(shù)名(){函數(shù)體}或類型名函數(shù)名(void){函數(shù)體}無參函數(shù)

(1)聲明一個(gè)函數(shù)printStar(),輸出一行“*”。(2)在main()函數(shù)中調(diào)用函數(shù)printStar()。例7-4在屏幕輸出一行*需要自定義函數(shù)實(shí)現(xiàn)輸出1行“*”,在主函數(shù)中進(jìn)行調(diào)用,實(shí)現(xiàn)最終的顯示效果。

問題分析

算法設(shè)計(jì)無參函數(shù)

程序代碼#include<stdio.h>main()/*主函數(shù)*/{voidfnPrint();/*函數(shù)聲明*/printStar();/*函數(shù)調(diào)用*/}voidprintStar()/*函數(shù)定義*/{printf("*****\n");}

程序中除了主函數(shù)main()之外,還有1個(gè)函數(shù)是printStar()函數(shù)。printStar是函數(shù)名,并且函數(shù)名后括號(hào)中無參數(shù)。

說明空函數(shù)

在程序設(shè)計(jì)時(shí)有時(shí)會(huì)用到空函數(shù),它的形式為:類型名函數(shù)名(void){}例如:voiddummy(){}有參函數(shù)

定義有參函數(shù)的一般形式為:類型名函數(shù)名(形式參數(shù)表列){函數(shù)體}有參函數(shù)

(1)聲明一個(gè)函數(shù)fnPrint,輸出n個(gè)“*”。(2)在main()函數(shù)中使用不同的實(shí)參1,3,5調(diào)用函數(shù)fnPrint。(3)函數(shù)fnPrint的算法為:設(shè)置參數(shù)為輸出的“*”的個(gè)數(shù)。構(gòu)造循環(huán),輸出多個(gè)“*”。例7-5有參數(shù)無返回值自定義函數(shù)舉例。在屏幕上輸出三行“*”,第一行1個(gè),以后每增加一行增加2個(gè)“*”需要自定義函數(shù)實(shí)現(xiàn)輸出1行n個(gè)“*”,在主函數(shù)中多次調(diào)用,實(shí)現(xiàn)最終的顯示效果。

問題分析

算法設(shè)計(jì)有參函數(shù)

流程圖開始

調(diào)用fnPrint(1)函數(shù)

調(diào)用fnPrint(3)函數(shù)

調(diào)用fnPrint(5)函數(shù)結(jié)束fnPrint開始開始定義i=0i<n

定義i=0

輸出1個(gè)*

fnPrint結(jié)束開始有參函數(shù)

程序代碼#include"stdio.h"voidmain(){voidfnPrint();/*函數(shù)聲明*/fnPrint(1);/*調(diào)用函數(shù)*/fnPrint(3);/*調(diào)用函數(shù)*/fnPrint(5);/*調(diào)用函數(shù)*/}voidfnPrint(intn)/*函數(shù)定義*/{inti;/*函數(shù)體部分*/for(i=0;i<n;i++)printf("*");printf("\n");}有參函數(shù)(1)程序的執(zhí)行總是從main()開始,在主函數(shù)main()中遇到調(diào)用其他函數(shù)的語句,則轉(zhuǎn)向其他函數(shù)執(zhí)行,執(zhí)行完成后再返回到main()主函數(shù),直到執(zhí)行完main()為止。該程序的執(zhí)行過程即為:從main()開始執(zhí)行,執(zhí)行到fnPrint(1);語句時(shí),轉(zhuǎn)向fnPrint(1)函數(shù),函數(shù)執(zhí)行完則返回main(),繼續(xù)執(zhí)行main()中的語句fnPrint(3);執(zhí)行過程如圖7-6所示。

執(zhí)行結(jié)果

說明……主函數(shù)main()……fnPrint(1)fnPrint(3)fnPrint(5)自定義函數(shù)fnPrintvoidfnPrint(intn){inti;for(i=0;i<n;i++)printf("*");printf("\n");}}①②③④⑤⑥有參函數(shù)

(2)在函數(shù)定義voidfnPrint(intn)中,“intn”是形式參數(shù),簡稱形參,形參在該函數(shù)未被調(diào)用時(shí)沒有確定的值,只是形式上的參數(shù);形參在函數(shù)調(diào)用時(shí)必須有相應(yīng)的實(shí)際參數(shù),即實(shí)參,實(shí)參可以是變量、常量或者表達(dá)式,有確定的值,是實(shí)實(shí)在在的參數(shù)。本例中調(diào)用函數(shù)fnPrint時(shí),所用實(shí)參是1、3、5,而n是形參。(3)實(shí)參在程序執(zhí)行時(shí)分配存儲(chǔ)單元,在程序結(jié)束時(shí)回收分配空間,形參是在定義是不分配存儲(chǔ)單元,只有發(fā)生調(diào)用時(shí),形參才被分配存儲(chǔ)單元,接收實(shí)參傳來的數(shù)據(jù),函數(shù)調(diào)用結(jié)束時(shí)形參釋放存儲(chǔ)單元,回收空間。所以,形參和實(shí)參是不同的變量,在函數(shù)調(diào)用時(shí),實(shí)際上是將實(shí)參的值復(fù)制一份給形參,這種值的傳遞方式被稱為值傳遞,值傳遞是單向的,只能從實(shí)參向形參傳遞。(4)在本例中3次調(diào)用了函數(shù)fnPrint(),可以將程序改寫成循環(huán)結(jié)構(gòu),代碼如下:for(i=1;i<=5;i+=2)fnPrint(i);有參函數(shù)

(1)定義兩個(gè)整型變量iNum1和iNum2保存輸入的數(shù)據(jù)。(2)以iNum1和iNum2為實(shí)參調(diào)用函數(shù),求兩個(gè)數(shù)的和。(3)輸出兩個(gè)數(shù)的和。例7-6有參數(shù)有返回值自定義函數(shù)舉例。編寫一個(gè)函數(shù),從鍵盤輸入兩個(gè)整數(shù),輸出兩數(shù)之和。需要自定義函數(shù)實(shí)現(xiàn)計(jì)算兩數(shù)之和,在主函數(shù)中調(diào)用該函數(shù)。

問題分析

算法設(shè)計(jì)有參函數(shù)

流程圖

輸入iNum1、iNum2開始定義iNum1、iNum2、iNum3

iNum3=fnSum(iNum,iNum2)

輸出iNum1、iNum2,iNum3結(jié)束fnSum開始定義iSumiSum=iNum1+iNum2返回iSumfnSum結(jié)束有參函數(shù)

程序代碼#include"stdio.h"intfnSum(intiNum,intiNum2);intfnSum(intiNum1,intiNum2){intiSum;iSum=iNum1+iNum2;returniSum;/*將iSum的值返回到調(diào)用函數(shù)處*/}voidmain(){intiNum1,iNum2,iNum3;printf("\npleaseinputtwonumber:");scanf("%d%d",&iNum1,&iNum2);iNum3=fnSum(iNum1,iNum2);/*將fnSum()函數(shù)的返回值賦給變量iNum3*/printf("thesumof%dand%dis%d",iNum1,iNum2,iNum3);getch();}有參函數(shù)

說明(1)在函數(shù)中通過return語句將計(jì)算結(jié)果返回到主函數(shù)中,這就是函數(shù)的返回值,返回值可以由變量、常量、表達(dá)式或函數(shù)調(diào)用構(gòu)成。其基本格式為:return(<表達(dá)式>);return語句的執(zhí)行過程是:先計(jì)算表達(dá)式的值,再將計(jì)算結(jié)果返回給主函數(shù)。(2)在函數(shù)調(diào)用過程中,實(shí)參與形參的個(gè)數(shù)、類型和順序要一致,否則會(huì)出現(xiàn)語法錯(cuò)誤或錯(cuò)誤的調(diào)用結(jié)果。(3)在本例中函數(shù)調(diào)用的方式屬于第二種函數(shù)表達(dá)式的調(diào)用方式,即函數(shù)的返回值賦給了變量iNum3。(4)形參和實(shí)參是不同的變量,形參在自定義函數(shù)中定義,只在函數(shù)中起作用。實(shí)參在main()主函數(shù)中定義,只在main()主函數(shù)中起作用。所以,形參和實(shí)參可以同名,如例7-3中的形參和實(shí)參就是同名,即iNum1和iNum2,它們占有不同的內(nèi)存單元,表示不同的變量。(5)此例中有這樣兩條語句:iNum3=fnSum(iNum1,iNum2);printf("thesumof%dand%dis%d",iNum1,iNum2,iNum3);這兩條語句可以寫成一行:printf("thesumof%dand%dis%d",iNum1,iNum2,fnSum(iNum1,iNum2));。統(tǒng)計(jì)小組一門課程的總分及平均分參考代碼如下:#include"stdio.h"voidppp() //空函數(shù){printf("-------------------------------------\n");}floatavg1(intn) //有參函數(shù){intx,i;floats=0;ppp();printf("請(qǐng)輸入本小組的考試成績\n");for(i=1;i<=n;i++){scanf("%d",&x);s+=x;}returns;}統(tǒng)計(jì)小組一門課程的總分及平均分main() //主函數(shù){intk,n,km;floatsum,average;charch;ppp();printf("\t班級(jí)成績統(tǒng)計(jì)\n");ppp();printf("1、統(tǒng)計(jì)小組一門課程的總分及平均分\n",n);printf("2、統(tǒng)計(jì)小組若干門課程的總分及平均分\n");printf("3、輸出小組排序后三門課程的成績單\n");printf("請(qǐng)輸入1~3之間的一個(gè)數(shù):");scanf("%d",&k);ppp();if(k==1){printf("請(qǐng)輸入統(tǒng)計(jì)的小組的人數(shù)n=");統(tǒng)計(jì)小組一門課程的總分及平均分scanf("%d",&n);ppp();sum=avg1(n);average=sum/n;printf("本小組的總分=%.0f\t平均分=%.1f\n",sum,average);ppp();}}執(zhí)行結(jié)果為:任務(wù)7.3求小組若干門課程的總分及平均分

任務(wù)描述一個(gè)班有40位學(xué)生(分成五個(gè)組,但每個(gè)組的人數(shù)不一樣)參加了期終考試(考了三門課,分別是數(shù)學(xué)、語文、英語),請(qǐng)你用菜單的方式:求小組若干門課程的總分及平均分。任務(wù)分析主函數(shù)的功能是設(shè)計(jì)一個(gè)菜單,由所選擇的菜單調(diào)用相應(yīng)的函數(shù),但為了界面清晰,所以在程序的執(zhí)行過程中出現(xiàn):求小組的若干門成績的平均分及總分的函數(shù)又調(diào)用了一條線的函數(shù)ppp()。3函數(shù)的嵌套與遞歸Part◎函數(shù)的遞歸調(diào)用◎函數(shù)的嵌套調(diào)用◎多個(gè)學(xué)生多門課成績的排序◎輸出排序后小組三門課成績單函數(shù)的嵌套調(diào)用

C語言定義的函數(shù)都是互相獨(dú)立的,函數(shù)間不能嵌套定義,即在一個(gè)函數(shù)體內(nèi)不能再定義另一個(gè)函數(shù),但可以嵌套調(diào)用,也就是說在調(diào)用一個(gè)函數(shù)的過程中,該函數(shù)又調(diào)用另一個(gè)函數(shù)。函數(shù)的嵌套調(diào)用

(1)定義2個(gè)整型變量m和n。

(2)以整型變量作實(shí)參調(diào)用函數(shù)。

(3)輸出公約數(shù)和公倍數(shù)。例7-7輸入兩個(gè)數(shù),編寫函數(shù),分別求該兩數(shù)的最大公約數(shù)和最小公倍數(shù),在主函數(shù)中輸入兩個(gè)數(shù),調(diào)用函數(shù),輸出公倍數(shù)和公約數(shù)。首先需要兩個(gè)自定義函數(shù),分別用來求兩數(shù)的最大公約數(shù)和最小公倍數(shù)。在主函數(shù)中輸入兩整數(shù),作為實(shí)參調(diào)用函數(shù)。

問題分析

算法設(shè)計(jì)函數(shù)的嵌套調(diào)用

流程圖函數(shù)的嵌套調(diào)用

程序代碼#include<stdio.h>intfnMax(intn,intm){inti;for(i=n;i>=1;i--)if(m%i==0&&n%i==0)returni;}longfnMin(intn,intm){longi;i=m*n/fnMax(n,m);returni;}voidmain(){函數(shù)的嵌套調(diào)用

程序代碼Num1,iNum2;intiMax;longiMin;printf("\nInputtwonumber:");scanf("%d%d",&iNum1,&iNum2);iMax=fnMax(iNum1,iNum2);iMin=fnMin(iNum1,iNum2);printf("thecommondivisoris%d,thecommonmultipleis%ld",iMax,iMin);}

執(zhí)行結(jié)果有參函數(shù)

說明(1)程序中main()函數(shù)調(diào)用fnMax()、fnMin()函數(shù)完成求最大公約數(shù)和最小公倍數(shù)的任務(wù),fnMin()函數(shù)調(diào)用fnMax()函數(shù)計(jì)算最小公倍數(shù)。在執(zhí)行fnMin()函數(shù)時(shí)又調(diào)用fnMax()函數(shù),即為函數(shù)的嵌套調(diào)用。(2)無論函數(shù)在何處調(diào)用,調(diào)用結(jié)束后都會(huì)返回到調(diào)用該函數(shù)的地方。本例main()函數(shù)、fnMin()函數(shù)和fnMax()函數(shù)調(diào)用關(guān)系如圖7-16所示。函數(shù)的遞歸調(diào)用

在調(diào)用一個(gè)函數(shù)的過程中又直接地或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。顯然,遞歸調(diào)用是嵌套調(diào)用的特例。C語言提供兩種形式的遞歸調(diào)用:①直接遞歸調(diào)用:指函數(shù)直接調(diào)用函數(shù)本身的形式,其執(zhí)行過程如圖7-17所示。②間接遞歸調(diào)用:指函數(shù)調(diào)用其他函數(shù),其他函數(shù)又調(diào)用原函數(shù)的形式,其執(zhí)行過程如圖所示。函數(shù)的遞歸調(diào)用

1.函數(shù)遞歸調(diào)用的條件

可采用遞歸算法解決的問題有這樣的特點(diǎn):原始的問題可轉(zhuǎn)化為解決方法相同的新問題,而新問題的規(guī)模要比原始問題小,新問題又可轉(zhuǎn)化為規(guī)模更小的問題,直至最終歸結(jié)到最基本的情況——遞歸的終結(jié)條件。利用函數(shù)遞歸調(diào)用解決問題,必須具備如下兩個(gè)條件:(1)原問題求解,能轉(zhuǎn)化為一個(gè)與原問題相似的較小的問題求解。(2)必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。函數(shù)的遞歸調(diào)用

由上面的關(guān)系可知計(jì)算n的階乘問題,可以歸結(jié)為n-1的階乘問題。同理,計(jì)算n-1的階乘問題可以歸結(jié)為n-2的階乘問題……依此類推,最終將歸結(jié)為計(jì)算1的階乘。所以計(jì)算n!的遞歸公式為:例7-8用遞歸調(diào)用的方法,編寫計(jì)算n!的程序。根據(jù)階乘的定義有如下遞推關(guān)系:n!=1*2*3*…*(n-2)*(n-1)*n=[1*2*3*…*(n-2)*(n-1)]*n=(n-1)!*n

問題分析n!=1n=1n*(n-1)n>1fact(n)1當(dāng)n=1n*fact(n-1)當(dāng)n>1函數(shù)的遞歸調(diào)用

程序代碼#include<stdio.h>longfact(intn); /*函數(shù)fact()聲明*/longfact(intn)/*遞歸函數(shù)*/{if(n<=1)return1;/*終止條件*/return(fact(n-1)*n);/*遞歸調(diào)用*/}voidmain(){ intnum; longm;printf("請(qǐng)輸入一個(gè)正整數(shù)(小于12):");scanf("%d",&num); m=fact(num);printf("%d!=%ld\n",num,m);}函數(shù)的遞歸調(diào)用(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況

執(zhí)行結(jié)果

說明第一次調(diào)用函數(shù):fact(4)24最終得到結(jié)果24第二次調(diào)用函數(shù):fact(3)*46*4計(jì)算fact(4)=24第三次調(diào)用函數(shù):fact(2)*32*3計(jì)算fact(3)=6四次調(diào)用函數(shù):fact(1)*21*2計(jì)算fact(2)=2fact(1)=1(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況如圖所示。(2)該程序運(yùn)行時(shí),當(dāng)n取值較大時(shí),比如n=10時(shí),n!的值超出了int和long的取值范圍,因此,此題中的變量建議定義成float類型。函數(shù)的遞歸調(diào)用

2.函數(shù)遞歸調(diào)用的執(zhí)行過程

在函數(shù)執(zhí)行過程中由遞推和回歸兩個(gè)過程組成。(1)“遞推”階段:將原問題不斷地分解為新的子問題,逐步從未知的方向向已知方向推測(cè),最終達(dá)到已知的結(jié)束條件,即遞歸結(jié)束條件,這時(shí)遞推階段結(jié)束,如圖7-14所示左邊部分。(2)“回歸”階段:從已知的條件出發(fā),按照“遞推”的逆過程,逐一求值返回,直到返回到遞推的開始處,結(jié)束回歸階段,完成遞歸調(diào)用。如圖7-14所示右邊部分。函數(shù)的遞歸調(diào)用

例7-9用遞歸函數(shù)求m和n的最大公約數(shù)。求m和n的最大公約數(shù),通常采用輾轉(zhuǎn)相除法,可以假設(shè)n<=m,fnGcd(m,n)是m和n的最大公約數(shù),則有遞推關(guān)系fnGcd(m,n)=fnGcd(n,m%n),用函數(shù)表示為:

問題分析fnGcd(m,n)=m當(dāng)n=0fnGcd(n,m%n)當(dāng)m≥n>0函數(shù)的遞歸調(diào)用

程序代碼#include<stdio.h>intfnGcd(intm,intn){intk;if(n==0)k=m;elsek=fnGcd(n,m%n);returnk;}voidmain(){intm,n,k;printf("請(qǐng)輸入兩個(gè)整數(shù)m,n:");scanf("%d%d",&m,&n);k=fnGcd(m,n);printf("gcd(%d,%d)=%d\n",m,n,k);}函數(shù)的遞歸調(diào)用(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況

執(zhí)行結(jié)果多個(gè)學(xué)生多門課成績的排序參考代碼如下:#include"stdio.h"/*輸出線條函數(shù)*/ppp(){printf("-------------------------------------\n");}/*某個(gè)小組若干門課程的平均分與總分函數(shù)*/voidavgevery(intn,intkm){intx,i,j;floats,avg;for(j=1;j<=km;j++){s=0;printf("請(qǐng)輸入本小組第%d門考試成績\n",j);ppp();for(i=1;i<=n;i++){scanf("%d",&x);s+=x;}avg=s/n;多個(gè)學(xué)生多門課成績的排序printf("第%d課程的總分=%.0f\t平均分=%.1f\n",j,s,avg);ppp();}}/*主函數(shù)*/main(){intk,n,km;floatsum,average;charch;ppp();printf("\t班級(jí)成績統(tǒng)計(jì)\n");ppp();printf("1、統(tǒng)計(jì)小組一門課程的總分及平均分\n",n);printf("2、統(tǒng)計(jì)小組若干門課程的總分及平均分\n");printf("3、輸出小組排序后三門課程的成績單\n");printf("請(qǐng)輸入1~3之間的一個(gè)數(shù):");scanf("%d",&k);多個(gè)學(xué)生多門課成績的排序ppp();if(k==2){printf("請(qǐng)輸入統(tǒng)計(jì)的小組的人數(shù)n=");scanf("%d",&n);ppp();printf("請(qǐng)輸入要統(tǒng)計(jì)的課程門數(shù)km=");scanf("%d",&km);ppp();avgevery(n,km);}執(zhí)行結(jié)果為:任務(wù)7.4輸出排序后小組三門課成績單

任務(wù)描述一個(gè)班有40位學(xué)生參加了期終考試(考了三門課),請(qǐng)輸出學(xué)生排序后的成績單。任務(wù)分析本項(xiàng)目要完成的功能相對(duì)比較多,為了使程序的結(jié)構(gòu)清晰,我們可以將些項(xiàng)目進(jìn)行分解:A:完成三門課成績的輸入;B:計(jì)算每個(gè)同學(xué)的總分與平均分;C:對(duì)三門課的成績進(jìn)行排序;D:輸出函數(shù)E:總負(fù)責(zé),調(diào)用A、B、C、D即可。4數(shù)組名作為函數(shù)參數(shù)Part◎數(shù)組名作為函數(shù)參數(shù)◎數(shù)組元素作為函數(shù)參數(shù)◎輸出排序后小組三門課成績單數(shù)組元素作為函數(shù)參數(shù)

數(shù)組元素可以用作函數(shù)實(shí)參,但不能用作形參。因?yàn)樾螀⑹窃诤瘮?shù)被調(diào)用時(shí)臨時(shí)分配存儲(chǔ)單元的,不可能為一個(gè)數(shù)組元素單獨(dú)分配存儲(chǔ)單元(數(shù)組是一個(gè)整體,在內(nèi)存中占連續(xù)的一段存儲(chǔ)單元)。在用數(shù)組元素作為函數(shù)實(shí)參時(shí),把實(shí)參的值傳給形參,是“值傳遞”方式。數(shù)據(jù)傳遞的方向是從實(shí)參傳到形參,單向傳遞。數(shù)組元素作為函數(shù)參數(shù)

例7-10輸入十個(gè)數(shù),要求輸出其中值最大的元素和該數(shù)是第幾個(gè)數(shù)??梢远x一個(gè)數(shù)組a,長度為10,用來存放10個(gè)數(shù)。設(shè)計(jì)一個(gè)函數(shù)max,用來求兩個(gè)數(shù)中的大者。在主函數(shù)中定義一個(gè)變量m,m的初值為a[0],每次調(diào)用max函數(shù)后的返回值存放在m中。用“打擂臺(tái)”算法,依次將數(shù)組元素a[1]-a[9]與m比較,最后得到的m值就是10個(gè)數(shù)中的最大者。

問題分析數(shù)組元素作為函數(shù)參數(shù)

程序代碼#include<stdio.h>intmain(){ intmax(intx,inty); //函數(shù)聲明 inta[10],m,n,i; printf("enter10integerenumber:"); for(i=0;i<10;i++) //輸入10個(gè)數(shù)給a[0]~a[10] scanf("%d",&a[i]); printf("\n"); for(i=1,m=a[0],n=0;i<10;i++){ if(max(m,a[i])>m){ //若max函數(shù)返回的值大于m m=max(m,a[i]); //max函數(shù)返回的值取代m原值 n=i; 數(shù)組元素作為函數(shù)參數(shù)在n中 } } printf("Thelargestnumberis%d\nitisthe%dthnumber.\n",m,n+1); return0;}intmax(intx,inty){ //定義max函數(shù) return(x>y?x:y); //返回x和y中的大者}

執(zhí)行結(jié)果數(shù)組元素作為函數(shù)參數(shù)(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況

說明

從鍵盤輸入10個(gè)數(shù)給a[0]-a[9]。變量m用來存放當(dāng)前已比較過的各數(shù)中的最大者。開始時(shí)設(shè)m的值為a[0],然后將m與a[1]比,如果a[1]大于m,就以a[1]的值(此時(shí)也就是max(m,a[1])的值)取代m的原值。下一次以m的新值與a[2]比較,max(m,a[2])的值是a[0],a[1],a[2]中最大者,其余類推。經(jīng)過9輪循環(huán)的比較,m最后的值就是10個(gè)數(shù)的最大數(shù)。

請(qǐng)注意分析怎樣得到最大數(shù)是10個(gè)數(shù)中第幾個(gè)數(shù)。當(dāng)每次出現(xiàn)以max(m,a[i)的值取代m的原值時(shí),就把i的值保存在變量n中。n最后的值就是最大數(shù)的序號(hào)(注意序號(hào)從0開始),如果要輸出“最大數(shù)是10個(gè)數(shù)中第幾個(gè)數(shù)”,應(yīng)為n+1。例如n=6時(shí)表示數(shù)組元素a[6]是最大數(shù),由于序號(hào)從0開始,因此它是10數(shù)中第7個(gè)數(shù),故應(yīng)輸出的是n+1。數(shù)組元素作為函數(shù)參數(shù)數(shù)組名作為函數(shù)參數(shù)

除了可以用數(shù)組作為函數(shù)參數(shù)外,還可以用數(shù)組名作為函數(shù)參數(shù)(包括實(shí)參和形參)。需要注意的是,用數(shù)組元素作為實(shí)參時(shí),向形參變量傳遞的是數(shù)組元素的值,而用數(shù)組名作函數(shù)實(shí)參時(shí),向形參(數(shù)組名或指針變量)傳遞的是數(shù)組首元素的地址。數(shù)組名作為函數(shù)參數(shù)

例7-11有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績,求平均成績。用一個(gè)函數(shù)average來求平均成績,不用數(shù)組元素作為函數(shù)實(shí)參,而是用數(shù)組名作為函數(shù)實(shí)參,形參也用數(shù)組名,在average函數(shù)中引用各數(shù)組元素,求平均成績并返回main函數(shù)。

問題分析

(1)使用for循環(huán),循環(huán)輸入10個(gè)學(xué)生成績了。(2)調(diào)用average函數(shù)計(jì)算平均成績。(3)輸出平均成績。函數(shù)中算法是:設(shè)計(jì)一個(gè)數(shù)組接收10個(gè)學(xué)生的成績,定義1個(gè)變量Sum保存10個(gè)學(xué)生的總分,定義1個(gè)局部變量aver存儲(chǔ)平均值,并賦初值為0。構(gòu)造一個(gè)循環(huán)將每個(gè)學(xué)生的成績累計(jì)求和存入Sum中。將Sum/10的值存入aver。返回aver的值

算法設(shè)計(jì)數(shù)組名作為函數(shù)參數(shù)

程序代碼#include<stdio.h>voidmain(){floataverage(floatarray[10]); //函數(shù)聲明floatscore[10],aver; //在主函數(shù)中定義“實(shí)參”inti;printf("請(qǐng)輸入10學(xué)生的成績:\n");for(i=0;i<10;i++){scanf("%f",&score[i]);}printf("\n");aver=average(score);printf("平均成績?yōu)椋?5.2f\n",aver);

數(shù)組名作為函數(shù)參數(shù)}floataverage(floatarray[10]) //定義函數(shù),并在函數(shù)內(nèi)定義“形參”{inti;floataver,sum=array[0];for(i=1;i<10;i++){sum=sum+array[i];}aver=sum/10;return(aver);}

執(zhí)行結(jié)果數(shù)組名作為函數(shù)參數(shù)(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況

說明

(1)用數(shù)組名作函數(shù)參數(shù),應(yīng)該在主調(diào)函數(shù)和被調(diào)用函數(shù)分別定義數(shù)組,例中array是形參數(shù)組名score是實(shí)參數(shù)組名,分別在其所在函數(shù)中定義,不能只在一方定義。(2)實(shí)參數(shù)組與形參數(shù)組類型應(yīng)一致(今都為float型),如不一致,結(jié)果將出錯(cuò)。(3)在定義average函數(shù)時(shí),聲明形參數(shù)組的大小為10,但在實(shí)際上,指定其大小是不起任何作用的,因?yàn)镃語言編譯系統(tǒng)并不檢查形參數(shù)組大小,只是將實(shí)參數(shù)組的首元素的地址傳給形參數(shù)組名。形參數(shù)組名獲得了實(shí)參數(shù)組的首元素的地址,前已說明,數(shù)組名代表數(shù)組的首元素的地址,因此,可以認(rèn)為,形參數(shù)組首元素(array[0])和實(shí)參數(shù)組首元素(score[O])具有同一地址,它們共占同一存儲(chǔ)單元,score[n]和array[n]指的是同一單元。score[n]和array[na具有相同的值。(4)形參數(shù)組可以不指定大小,在定義數(shù)組時(shí)在數(shù)組名后面跟一個(gè)空的方括號(hào),如:floataverage(floatarray[]),定義average函數(shù),形參數(shù)組不指定大小。輸出排序后小組三門課成績單(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況參考代碼如下:(假設(shè)本小組只有5個(gè)同學(xué)):#include"stdio.h"#include"string.h"#defineN5/*輸出線條函數(shù)*/ppp(){printf("--------------------------------------------------\n");}/*輸入函數(shù)A*/voidinput(intscore[N][3],charname[N][10]){inti,j;for(i=0;i<N;i++){printf("第%d個(gè)同學(xué)的姓名及三門課的成績:",i+1);scanf("%s",name[i]);for(j=0;j<3;j++)scanf("%d",&score[i][j]);}}輸出排序后小組三門課成績單(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況/*計(jì)算每個(gè)同學(xué)的總分與平均分B*/voidsumavg(intscore[N][3],floatsum[],floatavg[]){inti,j;for(i=0;i<N;i++){for(j=0;j<3;j++)sum[i]=sum[i]+score[i][j];avg[i]=sum[i]/3.0;}}/*排序函數(shù)C*/voidpx(intscore[][3],floatsum[],floatavg[],charname[][10]){inti,j;floatt;charnn[10];for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(sum[j]<sum[j+1]){t=sum[j];sum[j]=sum[j+1];sum[j+1]=t;t=avg[j];avg[j]=avg[j+1];avg[j+1]=t;//這個(gè)同學(xué)的所有數(shù)據(jù)都要交換輸出排序后小組三門課成績單(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況/*計(jì)算每個(gè)同學(xué)的總分與平均分B*/voidsumavg(intscore[N][3],floatsum[],floatavg[]){inti,j;for(i=0;i<N;i++){for(j=0;j<3;j++)sum[i]=sum[i]+score[i][j];avg[i]=sum[i]/3.0;}}/*排序函數(shù)C*/voidpx(intscore[][3],floatsum[],floatavg[],charname[][10]){inti,j;floatt;charnn[10];for(i=0;i<N-1;i++)for(j=0;j<N-1-i;j++)if(sum[j]<sum[j+1]){t=sum[j];sum[j]=sum[j+1];sum[j+1]=t;t=avg[j];avg[j]=avg[j+1];avg[j+1]=t;//這個(gè)同學(xué)的所有數(shù)據(jù)都要交換輸出排序后小組三門課成績單(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況t=score[j][0];score[j][0]=score[j+1][0];score[j+1][0]=t;t=score[j][1];score[j][1]=score[j+1][1];score[j+1][1]=t;t=score[j][2];score[j][2]=score[j+1][2];score[j+1][2]=t;strcpy(nn,name[j]);strcpy(name[j],name[j+1]);strcpy(name[j+1],nn);}}/*輸出函數(shù)D*/voidprint(intscore[][3],floatsumr[],floatavgr[],charname[][10]){inti,j;ppp();printf("輸出排序后五個(gè)同學(xué)三門課的成績:\n");ppp();printf("序號(hào)\t姓名\t課1\t課2\t課3\t總分\t平均分\n");for(i=0;i<N;i++){printf("%d:\t",i+1);printf("%s\t",name[i]);for(j=0;j<3;j++)printf("%d\t",score[i][j]);printf("%.0f\t%.1f\t",sumr[i],avgr[i]);printf("\n");

輸出排序后小組三門課成績單(1)這是一個(gè)遞歸調(diào)用的函數(shù)。四次調(diào)用和返回的情況}ppp();}/*主函數(shù)*/main(){inti,j;intscore[N][3],t;charname[N][10],nn[10];floatsumr[N]={0},avgr[N];//每個(gè)同學(xué)的總分及平均分input(score,name);//調(diào)用輸入記錄函數(shù)sumavg(score,sumr,avgr);//調(diào)用計(jì)算總分與平均分的函數(shù)px(score,sumr,avgr,name);print(score,sumr,avgr,name);//調(diào)用輸出函數(shù)}執(zhí)行結(jié)果為:

拓展案例案例7-1計(jì)算三角形的面積。問題描述用調(diào)用函數(shù)的方法,計(jì)算三角形的面積。算法設(shè)計(jì)(1)定義4個(gè)float型變量x、y、z、s分別存儲(chǔ)三邊長和三角形的面積。(2)輸入x、y、z的值。(3)以x、y、z為實(shí)參調(diào)用函數(shù)area()。(4)輸出三邊長及面積。求面積area()的算法:定義2個(gè)float型變量h、s。h為三邊之和的一半計(jì)算面積s的值拓展案例

程序代碼#include"stdio.h"#include"math.h"floatarea(floata,floatb,floatc);floatarea(floata,floatb,floatc){ floath,s;h=(a+b+c)/2;s=sqrt(h*(h-a)*(h-b)*(h-c));return(s);}voidmain(){floatx,y,z,s;printf("請(qǐng)輸入三角形的三邊長:");scanf("%f,%f,%f",&x,&y,&z);拓展案例

程序代碼s=area(x,y,z);printf("三角形的三邊長分別為:%5.2f,%5.2f,%5.2f,面積為:%5.2f\n",x,y,z,s);}

執(zhí)行結(jié)果拓展案例案例7-2百錢百雞問題。問題描述中國古代數(shù)學(xué)家張丘建在《算經(jīng)》中提出了著名的“百錢百雞”問題:雞公一,值錢五,雞母一,值錢三,小雞,三只值錢一,百錢買百雞,問公、母小雞各幾只?。即100元買100只雞,其中公雞5元1只,母雞3元1只,小雞1元3只,要求每種雞至少有1只,試編寫程序統(tǒng)計(jì)并輸出所有購買方案。提示:每種雞的購買數(shù)是不確定的,只能從1開始進(jìn)行判斷拓展案例

算法設(shè)計(jì)主函數(shù)調(diào)用自定義函數(shù)com()。函數(shù)com()算法如下:定義3個(gè)整型變量x、y、z分別存儲(chǔ)公雞、母雞、小雞的數(shù)量。確定各種雞的范圍。使用for語句對(duì)三種雞的數(shù)量進(jìn)行窮舉判斷。拓展案例

程序代碼#include"stdio.h"voidcom();voidcom(){intx,y,z;for(x=1;x<20;x++)for(y=1;y<33;y++)for(z=3;z<98;z+=3)if(5*x+3*y+z/3==100&&x+y+z==100)printf("公雞、母雞和小雞的數(shù)量分別為:%d,%d,%d\n",x,y,z);}voidmain(){printf("有如下幾種購買方式:\n");com();}拓展案例

執(zhí)行結(jié)果拓展案例案例7-3

水仙花數(shù)問題描述使用函數(shù)調(diào)用的方法輸出所有的水仙花數(shù)。拓展案例

算法設(shè)計(jì)(1)定義循環(huán)控制變量i。(2)用循環(huán)控制在100~999之間依次調(diào)用函數(shù)isDaff(i),循環(huán)控制變量i即為實(shí)參,其值為真時(shí)輸出i。函數(shù)isDaff(i)的算法:定義3個(gè)整型變量x、y、z分別存儲(chǔ)個(gè)位、十位、百位上的數(shù)字。分別計(jì)算變量x、y、z的值。判斷x3+y3+z3的值是否與實(shí)參i傳遞的值相等,若相等,返回1;否則,返回0。拓展案例

程序代碼#include"stdio.h"intisDaff(intiNum);voidmain(){inti;for(i=100;i<1000;i++){ if(isDaff(i)) { printf("%d\t",i); }}}intisDaff(intiNum){

拓展案例

程序代碼intx,y,z;x=iNum%10; y=(iNum/10)%10; z=(iNum/100)%10; if(x*x*x+y*y*y+z*z*z==iNum) { return1; } else { return0; }

執(zhí)行結(jié)果拓展案例案例7-4

使用函數(shù)解決下面的問題。問題描述使用數(shù)組保存5名學(xué)生的成績,學(xué)生成績從鍵盤上輸入。編寫一個(gè)函數(shù),為成績大于等于90分的學(xué)生加

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論