模塊4-函數(shù)及應(yīng)用_第1頁
模塊4-函數(shù)及應(yīng)用_第2頁
模塊4-函數(shù)及應(yīng)用_第3頁
模塊4-函數(shù)及應(yīng)用_第4頁
模塊4-函數(shù)及應(yīng)用_第5頁
已閱讀5頁,還剩218頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語言程序設(shè)計(jì)任務(wù)式教程(微課版)

VisualC++計(jì)算機(jī)工程學(xué)院模塊4函數(shù)及應(yīng)用任務(wù)1函數(shù)定義

任務(wù)2函數(shù)和數(shù)組,變量的屬性任務(wù)3函數(shù)的嵌套調(diào)用與遞歸調(diào)用

計(jì)算機(jī)工程學(xué)院

任務(wù)1函數(shù)定義

學(xué)習(xí)目標(biāo)掌握C語言函數(shù)的分類,函數(shù)定義的形式。了解函數(shù)的返回值,熟練掌握函數(shù)調(diào)用的形式、形參與實(shí)參的關(guān)系。。sqrt(x);printf(“請(qǐng)輸入整數(shù)a,b\n”);引言#include<stdio.h>viodmain(){inta,b;printf(“請(qǐng)輸入整數(shù)a,b\n”);scanf(“%d%d”,&a,&b);printf(“a=%d,b=%d\n”,a,b);}計(jì)算機(jī)工程學(xué)院案例一字符交替顯示

1.問題描述在屏幕上交替顯示“*”、“$”和“#”字符,要求每隔一定時(shí)間顯示一個(gè)字符,連續(xù)顯示500次。

4.1.1案例講解計(jì)算機(jī)工程學(xué)院2.編程分析

(1)編寫一個(gè)時(shí)間延時(shí)函數(shù)delay();(2)利用main()函數(shù)顯示字符,每顯示一個(gè)字符,就調(diào)用一次delay(),使得顯示字符時(shí)有一定的時(shí)間間隔。計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX4_1.CPP*/#include<stdio.h>voiddelay()/*定義延時(shí)函數(shù)*/{floati;i=1;while(i<10000)i=i+0.01;return;}計(jì)算機(jī)工程學(xué)院

voidmain()/*下面一段程序代碼是main()函數(shù)*/{voiddelay();/*函數(shù)聲明*/inti;for(i=1;i<=500;i++){printf("*");delay();/*調(diào)用延時(shí)函數(shù),產(chǎn)生時(shí)間間隔*/printf("$");delay();/*調(diào)用延時(shí)函數(shù),產(chǎn)生時(shí)間間隔*/printf("#");delay();/*調(diào)用延時(shí)函數(shù),產(chǎn)生時(shí)間間隔*/}}計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果如圖4-1所示。

圖4-1案例1運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院5.歸納分析

在C程序設(shè)計(jì)中,通常:

(1)將一個(gè)大程序分成幾個(gè)子程序模塊(自定義函數(shù))(2)將常用功能做成標(biāo)準(zhǔn)模塊(標(biāo)準(zhǔn)函數(shù))放在函數(shù)庫(kù)中供其他程序調(diào)用如果把編程比做制造一臺(tái)機(jī)器,函數(shù)就好比其零部件

(1)可將這些“零部件”單獨(dú)設(shè)計(jì)、調(diào)試、測(cè)試好,用時(shí)拿出來裝配,再總體調(diào)試。計(jì)算機(jī)工程學(xué)院

(2)這些“零部件”可以是自己設(shè)計(jì)制造/別人設(shè)計(jì)制造/現(xiàn)在的標(biāo)準(zhǔn)產(chǎn)品而且,許多“零部件”我們可以只知道需向它提供什么(如控制信號(hào)),它能產(chǎn)生什么(如速度/動(dòng)力),并不需要了解它是如何工作、如何設(shè)計(jì)制造的——所謂“黑盒子”。

控制信號(hào)→零部件→速度/動(dòng)力(輸入?yún)?shù))(函數(shù))(返回結(jié)果)

無參函數(shù)的一般形式類型說明符函數(shù)名()

{計(jì)算機(jī)工程學(xué)院

說明語句部分執(zhí)行語句部分

}類型說明符指明了本函數(shù)的類型,函數(shù)的類型就是函數(shù)返回值的類型。函數(shù)名是由用戶定義的標(biāo)識(shí)符,雖然無參數(shù),但函數(shù)名后面的小括號(hào)不可少。{}

中的內(nèi)容稱為函數(shù)體。說明語句是對(duì)函數(shù)體內(nèi)部所要使用的變量類型或函數(shù)進(jìn)行說明。一般情況下無參函數(shù)如果沒有返回值,函數(shù)類型說明符使用void。

計(jì)算機(jī)工程學(xué)院案例二函數(shù)調(diào)用

1.問題描述編寫輸出n個(gè)連續(xù)的任意字符的函數(shù)p_string(),并調(diào)用該函數(shù)輸出一個(gè)“*”圖案,每行25個(gè)“*”,共5行。

************************* ************************* ************************* ************************* *************************計(jì)算機(jī)工程學(xué)院2.編程分析

p_string()應(yīng)是具有兩個(gè)形參的函數(shù):一個(gè)形參用于表示輸出的字符個(gè)數(shù),為int型;另一個(gè)形參用于表示輸出的是哪個(gè)字符,為char型。由于p_string()函數(shù)沒有返回值要求,因此應(yīng)定義為void型。計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX4_2.CPP*/#include<stdio.h>voidp_string(intn,charch){inti;for(i=1;i<=n;i++)printf("%c",ch);return;}計(jì)算機(jī)工程學(xué)院

voidmain()/*下面是調(diào)用p_string()函數(shù)輸出上述圖案的主函數(shù):*/{voidp_string(int,char);/*函數(shù)聲明*/inti;for(i=1;i<=5;i++){p_string(25,'*');/*函數(shù)調(diào)用*/printf("\n");}}計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果如圖4-2所示。圖4-2案例2運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院5.歸納分析

有參函數(shù)的一般形式:類型說明符函數(shù)名(形式參數(shù)表)

{說明語句部分執(zhí)行語句部分}形式參數(shù)表中給出的參數(shù)稱為形式參數(shù)(簡(jiǎn)稱形參或啞元),各參數(shù)要做類型說明,并且中間用逗號(hào)間隔。在進(jìn)行函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將賦予這些形式參數(shù)實(shí)際的值。注意,主調(diào)函數(shù)的參數(shù)類型必須和形式參數(shù)的類型一致。計(jì)算機(jī)工程學(xué)院案例三參數(shù)值的互換

1.問題描述

完成a,b兩個(gè)值的交換。

2.編寫源程序

/*EX4_3.CPP*/#include<stdio.h>voidswap(inta,intb){計(jì)算機(jī)工程學(xué)院

inttemp;temp=a;a=b;b=temp;printf("a=%d,b=%d\n",a,b);}voidmain(){intx,y;

printf("inputx,y:");

scanf("%d,%d",&x,&y);swap(x,y);printf("x=%d,y=%d\n",x,y);}計(jì)算機(jī)工程學(xué)院3.運(yùn)行結(jié)果如圖4-3所示。圖4-3案例3運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院4.歸納分析本程序中定義了一個(gè)函數(shù)swap,該函數(shù)的功能是完成a,b兩個(gè)值的交換。在主函數(shù)中輸入x,y值,作為實(shí)參,調(diào)用時(shí)按次序傳送給swap函數(shù)的形參a,b。在主函數(shù)中用printf語句輸出一次x,y的值,在函數(shù)swap中也用printf

語句輸出了一次a,b的值。從運(yùn)行情況看,輸入8,9到變量x,y中,即函數(shù)調(diào)用時(shí)實(shí)參的值分別為8,9。實(shí)參把值傳給函數(shù)swap的形參a,b,也就是a為8,b為9。執(zhí)行函數(shù)swap過程中,形參a,b的值交換。但主函數(shù)里面x,y的結(jié)果保持不變,這說明實(shí)參的值不隨形參計(jì)算機(jī)工程學(xué)院的變化而變化。這是因?yàn)樾螀⒑蛯?shí)參在內(nèi)存中是不同的單元,形參只有在函數(shù)調(diào)用的時(shí)候才被分配內(nèi)存單元,并接受實(shí)參傳遞過來的結(jié)果,調(diào)用結(jié)束后就被釋放,而實(shí)參則保持原值不變。如圖4-4、4-5所示。

圖4-4參數(shù)傳遞

圖4-5最終結(jié)果

計(jì)算機(jī)工程學(xué)院案例四

加法考試題

1.問題描述通過輸入兩個(gè)加數(shù)給學(xué)生出一道加法運(yùn)算題,如果輸入答案正確,則顯示“Right!”,否則顯示“Notcorrect!Tryagain!”,程序結(jié)束。

計(jì)算機(jī)工程學(xué)院2.編程分析函數(shù)功能:計(jì)算兩整型數(shù)之和,如果與用戶輸入的答案相同,則返回1,否則返回0函數(shù)參數(shù):整型變量a和b,分別代表被加數(shù)和加數(shù)函數(shù)返回值:當(dāng)a加b的結(jié)果與用戶輸入的答案相同時(shí),返回1,否則返回0計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX4_4.CPP*/#include<stdio.h>intAdd(inta,intb){intanswer;printf("%d+%d=",a,b);

scanf("%d",&answer);if(a+b==answer) return1;計(jì)算機(jī)工程學(xué)院

elsereturn0;}voidPrint(intflag)/*函數(shù)功能:打印結(jié)果正確與否的信息函數(shù)參數(shù):整型變量flag,標(biāo)志結(jié)果正確與否函數(shù)返回值:無*/{if(flag)printf("Right!\n");計(jì)算機(jī)工程學(xué)院

elseprintf("Notcorrect!

Tryagain!\n");}voidmain(){inta,b,answer;printf("Inputa,b:");scanf("%d%d",&a,&b);answer=Add(a,b);Print(answer);}計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果如圖4-6所示。圖4-6案例4運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院5.歸納分析參數(shù)是函數(shù)調(diào)用時(shí)進(jìn)行信息傳遞的載體,函數(shù)的參數(shù)分為形參和實(shí)參兩種,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參,從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。計(jì)算機(jī)工程學(xué)院1.函數(shù)調(diào)用的格式

C語言的程序中是通過對(duì)函數(shù)的調(diào)用來執(zhí)行函數(shù)體的,其過程與其它語言的子程序調(diào)用相似。C語言中,函數(shù)調(diào)用的一般形式為:

函數(shù)名(實(shí)際參數(shù)表)

無參函數(shù)調(diào)用時(shí)則無實(shí)際參數(shù)表。實(shí)際參數(shù)表中的實(shí)際參數(shù)(簡(jiǎn)稱為實(shí)參或?qū)嵲┛梢允浅A?、變量或表達(dá)式。各實(shí)參之間用逗號(hào)分隔。

4.1.2基礎(chǔ)理論

計(jì)算機(jī)工程學(xué)院在C語言中,可以用以下幾種方式調(diào)用函數(shù):

(1)函數(shù)表達(dá)式:函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。例如:z=max(x,y)是一個(gè)賦值表達(dá)式,把max的返回值賦予變量z。(2)函數(shù)語句:函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語句。例如:printf(“%d”,a);scanf

(“%d”,&b);都是以函數(shù)語句的方式調(diào)用函數(shù)。計(jì)算機(jī)工程學(xué)院

(3)函數(shù)實(shí)參:函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。計(jì)算機(jī)工程學(xué)院

2.函數(shù)的參數(shù)傳遞

函數(shù)的形參和實(shí)參具有以下特點(diǎn):

(1)形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。(2)實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。計(jì)算機(jī)工程學(xué)院

(3)實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生“類型不匹配”的錯(cuò)誤。(4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。計(jì)算機(jī)工程學(xué)院3.函數(shù)的值通過函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個(gè)確定的值,這就是函數(shù)的返回值,函數(shù)返回值的功能是由return語句實(shí)現(xiàn)的。其使用形式如下:

return表達(dá)式;或return(表達(dá)式);或return

return的作用:退出函數(shù),并帶回函數(shù)值。計(jì)算機(jī)工程學(xué)院

(1)函數(shù)的返回值是通過函數(shù)中的return語句獲得的。return語句將被調(diào)函數(shù)中的一個(gè)確定值帶回主調(diào)函數(shù)中去。一個(gè)函數(shù)中可以有一個(gè)以上的return語句,但最終執(zhí)行的只有一個(gè)return語句。

(2)函數(shù)的數(shù)據(jù)類型即為函數(shù)返回值的類型。(3)如果被調(diào)函數(shù)中沒有return語句,函數(shù)帶回一個(gè)不確定的值。為了明確表示不帶回值,可以用“void”說明無類型(或稱“空類型”)。計(jì)算機(jī)工程學(xué)院

voidswap(inta,intb){…………}函數(shù)一旦被定義為空類型后,就禁止在主調(diào)函數(shù)中使用被調(diào)函數(shù)的函數(shù)值。為了使程序有良好的可讀性并減少出錯(cuò),凡不要求返回值的函數(shù)都應(yīng)定義為空類型。計(jì)算機(jī)工程學(xué)院4.函數(shù)的說明函數(shù)說明是指在主調(diào)用函數(shù)中,調(diào)用其他函數(shù)之前對(duì)該被調(diào)用函數(shù)進(jìn)行說明,就象使用變量之前要先進(jìn)行變量說明一樣。在主調(diào)用函數(shù)中對(duì)被調(diào)用函數(shù)作說明的目的是讓編譯系統(tǒng)對(duì)被調(diào)函數(shù)的合法性做全面說明。對(duì)被調(diào)用函數(shù)的說明的一般形式為:

類型說明符函數(shù)名(<類型><形參>,<類型><形參>…);或?yàn)椋?/p>

類型說明符函數(shù)名(<類型>,<類型>…);計(jì)算機(jī)工程學(xué)院下列情況中可以省去主調(diào)用函數(shù)中對(duì)被調(diào)用函數(shù)的函數(shù)說明:

(1)如果被調(diào)用函數(shù)的返回值是整型或字符型時(shí),可以不對(duì)被調(diào)用函數(shù)作說明,而直接調(diào)用。這時(shí)系統(tǒng)將自動(dòng)對(duì)被調(diào)用函數(shù)返回值按整型處理。(2)如果被調(diào)用函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)用函數(shù)之前,那么在主調(diào)用函數(shù)中也可以不對(duì)被調(diào)用函數(shù)再作說明而直接調(diào)用。(3)如在所有函數(shù)定義之前,在函數(shù)外預(yù)先說明了各個(gè)函數(shù)的類型,則在以后的各主調(diào)用函數(shù)中,可不再對(duì)被調(diào)用函數(shù)作說明。計(jì)算機(jī)工程學(xué)院例如:charmessage(char,char);/*對(duì)函數(shù)做說明*/floatadd(floatb);voidmain(){……}charmessage(char,char)/*定義message函數(shù)*/{……}floatadd(floatb)/*定義add函數(shù)*/{……}計(jì)算機(jī)工程學(xué)院

注意:

(1)C程序執(zhí)行總是從main函數(shù)開始,調(diào)用其它函數(shù)后總是回到main函數(shù),最后在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。(2)一個(gè)C程序由一個(gè)或多個(gè)源(程序)文件組成——可分別編寫、編譯和調(diào)試。(3)一個(gè)源文件由一個(gè)或多個(gè)函數(shù)組成,可為多個(gè)C程序公用。(4)C語言是以源文件為單位而不以函數(shù)為單位進(jìn)行編譯的。

(5)一個(gè)函數(shù)可以調(diào)用其他函數(shù)或其本身,但任何函數(shù)均不可調(diào)用main函數(shù)。計(jì)算機(jī)工程學(xué)院

【實(shí)驗(yàn)4-1】編寫函數(shù)求a!+b!+c!的值。

(1)編程分析用3個(gè)功能相同的循環(huán)程序分別計(jì)算整數(shù)a、b、c的階乘,然后把計(jì)算出的值相加,并輸出結(jié)果。

4.1.3技能訓(xùn)練

計(jì)算機(jī)工程學(xué)院

(2)編寫源程序

/*EX4_6.CPP*/#include<stdio.h>voidmain(){inta,b,c,i;longt,sum;printf("inputa,b,c:");scanf("%d,%d,%d",&a,&b,&c);for(t=1,i=1;i<=a;i++)計(jì)算機(jī)工程學(xué)院

t=t*i;sum=t;for(t=1,i=1;i<=b;i++) t=t*i;sum+=t;for(t=1,i=1;i<=c;i++) t=t*i;sum+=t;printf("SUM=%ld\n",sum);}計(jì)算機(jī)工程學(xué)院EX4_6.CPP用了3個(gè)功能相同的程序段分別計(jì)算整數(shù)a、b、c的階乘,這使得程序在結(jié)構(gòu)上很松散,不夠緊湊。如果現(xiàn)在有一個(gè)專門求x!的函數(shù)rfact(x)可以使用,就能把EX4_5.CPP程序變得很簡(jiǎn)潔。

/*EX4_6.CPP*/#include<stdio.h>voidmain(){longrfact(intn);計(jì)算機(jī)工程學(xué)院

inta,b,c,i;printf("inputa,b,c:");scanf("%d,%d,%d",&a,&b,&c);printf("sum=%ld\n",rfact(a)+rfact(b)+rfact(c));}longrfact(intn){longt;inti;for(t=1,i=1;i<=n;i++)t*=i;return(t);}計(jì)算機(jī)工程學(xué)院

(3)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_6.CPP,如圖4-7、4-8所示。圖4-7運(yùn)行結(jié)果圖4-8運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院

【實(shí)驗(yàn)4-2】通過輸入兩個(gè)加數(shù)給學(xué)生出一道加法運(yùn)算題,如果輸入答案正確,則顯示“Right!

”,否則提示重做,顯示“Notcorrect!

Tryagain!”,最多給三次機(jī)會(huì),如果三次仍未做對(duì),則顯示“Notcorrect!Youhavetriedthreetimes!Testover!”,程序結(jié)束。計(jì)算機(jī)工程學(xué)院

(1)編程分析函數(shù)功能:計(jì)算兩整型數(shù)之和,如果與用戶輸入的答案相同,則返回1,否則返回0函數(shù)參數(shù):整型變量a和b,分別代表被加數(shù)和加數(shù)函數(shù)返回值:當(dāng)a加b的結(jié)果與用戶輸入的答案相同時(shí),返回1,否則返回0計(jì)算機(jī)工程學(xué)院

(2)編寫源程序

/*EX4_7.CPP*/#include<stdio.h>intAdd(inta,intb){intanswer;printf("%d+%d=",a,b);scanf("%d",&answer);if(a+b==answer)return1;elsereturn0;}計(jì)算機(jī)工程學(xué)院

voidPrint(intflag,intchance)

/*函數(shù)功能:打印結(jié)果正確與否的信息函數(shù)參數(shù):整型變量flag,標(biāo)志結(jié)果正確與否整型變量chance,表示同一道題已經(jīng)做了幾次還沒有做對(duì)函數(shù)返回值:無

*/

計(jì)算機(jī)工程學(xué)院{if(flag)printf("Right!\n");elseif(chance<3)printf("Notcorrect.Tryagain!\n");elseprintf("Notcorrect.Youhavetriedthreetimes!\nTestover!\n");}

voidmain(){計(jì)算機(jī)工程學(xué)院inta,b,answer,chance;printf("Inputa,b:");scanf("%d,%d",&a,&b);chance=0;do{answer=Add(a,b);chance++;print(answer,chance);}while((answer==0)&&(chance<3));}計(jì)算機(jī)工程學(xué)院

(3)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_7.CPP,如圖4-9所示。圖4-9運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院

(4)如果要求將整數(shù)之間的四則運(yùn)算題改為實(shí)數(shù)之間的四則運(yùn)算題,那么程序該如何修改呢?請(qǐng)修改程序,并上機(jī)測(cè)試程序運(yùn)行結(jié)果。計(jì)算機(jī)工程學(xué)院

【實(shí)驗(yàn)4-3】通過計(jì)算機(jī)隨機(jī)產(chǎn)生10道四則運(yùn)算題,兩個(gè)操作數(shù)為1~10之間的隨機(jī)數(shù),運(yùn)算類型為隨機(jī)產(chǎn)生的加、減、乘、整除中的任意一種,如果輸入答案正確,則顯示“Right!”,否則顯示“Notcorrect!”,不給機(jī)會(huì)重做,10道題做完后,按每題10分統(tǒng)計(jì)總得分,然后打印出總分和做錯(cuò)題數(shù)。

計(jì)算機(jī)工程學(xué)院

(1)編程分析

函數(shù)功能:對(duì)兩數(shù)進(jìn)行加、減、乘、除四則運(yùn)算,如果用戶輸入的答案與結(jié)果相同,則返回1,否則返回0

函數(shù)參數(shù):整型變量a和b,分別代表參加四則運(yùn)算的兩個(gè)操作數(shù)整型變量op,代表運(yùn)算類型,當(dāng)op值為1,2,3,4時(shí),分別執(zhí)行加、減、乘、整除運(yùn)算

函數(shù)返回值:當(dāng)用戶輸入的答案與結(jié)果相同時(shí),返回1,否則返回0

計(jì)算機(jī)工程學(xué)院

(2)編寫源程序

/*EX4_8.CPP*/#include<stdio.h>#include<stdlib.h>#include<time.h>intCompute(inta,intb,intop)/*計(jì)算器功能*/{intanswer,result;switch(op){ case1:printf("%d+%d=",a,b);計(jì)算機(jī)工程學(xué)院

result=a+b; break;case2:printf("%d-%d=",a,b);result=a-b; break;case3:printf("%d*%d=",a,b); result=a*b;break;case4:if(b!=0)計(jì)算機(jī)工程學(xué)院{printf("%d/%d=",a,b);result=a/b;/*注意這里是整數(shù)除法運(yùn)算,結(jié)果為整型*/ }else{printf("Divisionbyzero!\n"); } break;default:printf("Unknownoperator!\n");break; }scanf("%d",&answer);if(result==answer)return1;elsereturn0;}計(jì)算機(jī)工程學(xué)院

voidPrint(intflag)

/*函數(shù)功能:打印結(jié)果正確與否的信息函數(shù)參數(shù):整型變量flag,標(biāo)志結(jié)果正確與否函數(shù)返回值:無

*/

{if(flag)printf("Rright!\n");elseprintf("Notcorrect!\n");}計(jì)算機(jī)工程學(xué)院

void

main(){inta,b,answer,error,score,i,op;srand(time(NULL));error=0;score=0;for(i=0;i<10;i++){ a=rand()%10+1;b=rand()%10+1;op=rand()%4+1;計(jì)算機(jī)工程學(xué)院

answer=Compute(a,b,op);print(answer);if(answer==1)score=score+10;elseerror++; }printf("score=%d,errornumbers=%d\n",score,error);}計(jì)算機(jī)工程學(xué)院

(3)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_8.CPP,如圖4-10所示。圖4-10運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院

(4)如果要求將整數(shù)之間的四則運(yùn)算題改為實(shí)數(shù)之間的四則運(yùn)算題,那么程序該如何修改呢?請(qǐng)修改程序,并上機(jī)測(cè)試程序運(yùn)行結(jié)果。計(jì)算機(jī)工程學(xué)院

【練習(xí)1】

編寫程序求4個(gè)數(shù)中最大數(shù)和最小數(shù)的平均值。

4.1.4拓展與練習(xí)

計(jì)算機(jī)工程學(xué)院

(1)編程分析

/*EX4_9.CPP*/#include<stdio.h>floatrmin2(floatx,floaty);/*求兩個(gè)數(shù)中最小數(shù)的函數(shù)聲明*/floatrmax2(floatx,floaty);/*求兩個(gè)數(shù)中最大數(shù)的函數(shù)聲明*/floataver(floatx,floaty);/*求兩個(gè)數(shù)的平均值的函數(shù)聲明*/voidmain()計(jì)算機(jī)工程學(xué)院

{floata,b,c,d,max,min;printf("inputa,b,c,d:");scanf("%f,%f,%f,%f",&a,&b,&c,&d);max=rmax2(rmax2(a,b),rmax2(c,d));/*求4個(gè)數(shù)中的最大值*/min=rmin2(rmin2(a,b),rmin2(c,d));/*求4個(gè)數(shù)中的最小值*/printf("average=%f\n",aver(max,min));}計(jì)算機(jī)工程學(xué)院

floatrmin2(floatx,floaty)/*求最小數(shù)函數(shù)*/{return(x<y?x:y);}floatrmax2(floatx,floaty)/*求最大數(shù)函數(shù)*/{return(x>y?x:y);}floataver(floatx,floaty)/*求平均值函數(shù)*/{return((x+y)/2.0);}計(jì)算機(jī)工程學(xué)院

(2)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_9.CPP,如圖4-11所示。圖4-11運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院

【練習(xí)2】通過輸入兩個(gè)加數(shù)給學(xué)生出一道加法運(yùn)算題,如果輸入答案正確,則顯示“Right!”,否則顯示“Notcorrect!Tryagain!”,直到做對(duì)為止。計(jì)算機(jī)工程學(xué)院

(1)編程分析

/*EX4_10.CPP*/#include<stdio.h>intAdd(inta,intb)

/*函數(shù)功能:計(jì)算兩整型數(shù)之和,如果與用戶輸入的答案相同,則返回1,否則返回0函數(shù)參數(shù):整型變量a和b,分別代表被加數(shù)和加數(shù)函數(shù)返回值:當(dāng)a加b的結(jié)果與用戶輸入的答案相同時(shí),返回1,否則返回0*/計(jì)算機(jī)工程學(xué)院

{intanswer;printf("%d+%d=",a,b);scanf("%d",&answer);if(a+b==answer)return1;elsereturn0;}計(jì)算機(jī)工程學(xué)院

voidPrint(intflag)

/*函數(shù)功能:打印結(jié)果正確與否的信息函數(shù)參數(shù):整型變量flag,標(biāo)志結(jié)果正確與否函數(shù)返回值:無

*/

{if(flag)printf("Rright!\n");elseprintf("Notcorrect.Tryagain!\n");}計(jì)算機(jī)工程學(xué)院voidmain(){ inta,b,answer; printf("Inputa,b:"); scanf("%d,%d",&a,&b); do { answer=Add(a,b); print(answer); }while(answer==0);}計(jì)算機(jī)工程學(xué)院

(2)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_10.CPP,如圖4-12所示。圖4-12運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院

【練習(xí)3】連續(xù)做10道題,通過計(jì)算機(jī)隨機(jī)產(chǎn)生兩個(gè)1~10之間的加數(shù)給學(xué)生出一道加法運(yùn)算題,如果輸入答案正確,則顯示“Right!”,否則顯示“Notcorrect!”,不給機(jī)會(huì)重做,10道題做完后,按每題10分統(tǒng)計(jì)總得分,然后打印出總分和做錯(cuò)的題數(shù)。計(jì)算機(jī)工程學(xué)院

(1)編程分析

/*EX4_11.CPP*/#include<stdio.h>#include<stdlib.h>#include<time.h>intAdd(inta,intb)

/*函數(shù)功能:計(jì)算兩整型數(shù)之和,如果與用戶輸入的答案相同,則返回1,否則返回0函數(shù)參數(shù):整型變量a和b,分別代表被加數(shù)和加數(shù)函數(shù)返回值:當(dāng)a加b的結(jié)果與用戶輸入的答案相同時(shí),返回1,否則返回0*/計(jì)算機(jī)工程學(xué)院

{intanswer;printf("%d+%d=",a,b);scanf("%d",&answer);if(a+b==answer)return1;

elsereturn0;

}計(jì)算機(jī)工程學(xué)院

voidPrint(intflag)

/*函數(shù)功能:打印結(jié)果正確與否的信息函數(shù)參數(shù):整型變量flag,標(biāo)志結(jié)果正確與否函數(shù)返回值:無

*/

{if(flag)printf("Rright!\n");

elseprintf("Notcorrect!\n");}計(jì)算機(jī)工程學(xué)院

void

main(){inta,b,answer,error,score,i;srand(time(NULL));error=0;score=0;

for(i=0;i<10;i++)

{

a=rand()%10+1;

b=rand()%10+1;計(jì)算機(jī)工程學(xué)院

answer=Add(a,b);print(answer);if(answer==1)score=score+10;

elseerror++;

}printf("score=%d,errornumbers=%d\n",score,error);}計(jì)算機(jī)工程學(xué)院

(2)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_11.CPP,如圖4-13所示。圖4-13運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院1.編程規(guī)范

(1)一個(gè)函數(shù)可以調(diào)用其他函數(shù)或其本身,但任何函數(shù)均不可調(diào)用main函數(shù)。(2)參數(shù)的書寫要完整,不要貪圖省事只寫參數(shù)的類型而省略參數(shù)名字。(3)參數(shù)命名要恰當(dāng),順序要合理。

4.1.5編程規(guī)范與常見錯(cuò)誤

計(jì)算機(jī)工程學(xué)院

(4)避免函數(shù)有太多的參數(shù),參數(shù)個(gè)數(shù)盡量控制在5個(gè)以內(nèi)。如果參數(shù)太多,在使用時(shí)容易將參數(shù)類型或順序搞錯(cuò)。(5)盡量不要使用類型和數(shù)目不確定的參數(shù)。計(jì)算機(jī)工程學(xué)院2.常見錯(cuò)誤

(1)誤解形參值的變化會(huì)影響實(shí)參的值。例如:

voidmain(){inta=1,b=3;

swap(a,b);

printf(″a=%d,b=%d\n″,a,b);}

swap(x,y)計(jì)算機(jī)工程學(xué)院

intx,y;{intm;

m=x;x=y;y=m;}原意想通過調(diào)用swap函數(shù)使a與b的值對(duì)換,然而,從輸出結(jié)果可知a和b的值并未進(jìn)行交換。計(jì)算機(jī)工程學(xué)院

(2)所調(diào)用的函數(shù)在調(diào)用前未定義。

voidmain(){floata=1.0,b=2.0,c;

c=fun(a,b);┇}

floatfun(x,y)floatx,y;{x++;y++;┇}計(jì)算機(jī)工程學(xué)院復(fù)習(xí)函數(shù)定義---功能,參數(shù),返回值函數(shù)的調(diào)用----形參,實(shí)參intfun();intfun(inta,intb);voidmain(){…..

return;}計(jì)算機(jī)工程學(xué)院

任務(wù)2函數(shù)和數(shù)組,變量的屬性

學(xué)習(xí)目標(biāo)掌握函數(shù)和數(shù)組的概念及其應(yīng)用,領(lǐng)會(huì)變量的作用域和生存期。計(jì)算機(jī)工程學(xué)院案例一課程平均成績(jī)

1.問題描述數(shù)組a中存放了五個(gè)學(xué)生計(jì)算機(jī)語言C課程的成績(jī),求此課程平均成績(jī)。

編程要求:采用函數(shù)調(diào)用方式實(shí)現(xiàn)。

4.2.1案例講解計(jì)算機(jī)工程學(xué)院2.編程分析先定義了一個(gè)實(shí)型函數(shù)aver,有一個(gè)形參為實(shí)型數(shù)組a,長(zhǎng)度為5。在函數(shù)aver中,把各元素值相加求出平均值,返回給主函數(shù)。主函數(shù)main

中首先完成數(shù)組sco的輸入,然后以sco作為實(shí)參調(diào)用aver函數(shù),函數(shù)返回值送av,最后輸出av值。計(jì)算機(jī)工程學(xué)院3.編寫源程序

/*EX4_12.CPP*/

floataver(floata[5]){inti;floatav,s=a[0];for(i=1;i<5;i++)s=s+a[i];av=s/5;returnav;}計(jì)算機(jī)工程學(xué)院

voidmain(){floatsco[5],av;inti;printf("\ninput5scores:\n");for(i=0;i<5;i++)scanf("%f",&sco[i]);av=aver(sco);printf("averagescoreis%5.2f",av);}計(jì)算機(jī)工程學(xué)院4.運(yùn)行結(jié)果如圖4-14所示。圖4-14案例1運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院5.歸納分析用數(shù)組名作函數(shù)參數(shù)時(shí),則要求形參和相對(duì)應(yīng)的實(shí)參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。當(dāng)形參和實(shí)參二者不一致時(shí),即會(huì)發(fā)生錯(cuò)誤。前面已經(jīng)討論過,在變量作函數(shù)參數(shù)時(shí),所進(jìn)行的值傳送是單向的。即只能從實(shí)參傳向形參,不能從形參傳回實(shí)參。形參的初值和實(shí)參相同,而形參的值發(fā)生改變后,實(shí)參并不變化,兩者的終值是不同的。而當(dāng)用數(shù)組名作函數(shù)參數(shù)時(shí),計(jì)算機(jī)工程學(xué)院情況則不同。由于實(shí)際上形參和實(shí)參為同一數(shù)組,因此當(dāng)形參數(shù)組發(fā)生變化時(shí),實(shí)參數(shù)組也隨之變化。當(dāng)然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實(shí)際情況來看,調(diào)用函數(shù)之后實(shí)參數(shù)組的值將由于形參數(shù)組值的變化而變化。案例二變量的作用范圍

1.問題描述

全局變量和局部變量的作用域。

計(jì)算機(jī)工程學(xué)院2.編寫源程序

/*EX4_13.CPP*/inta=3,b=5;

voidsub(intx){inta;a=x;}voidmain(){intb=8;sub(b);printf("a=%d,b=%d",a,b);}局部變量b的作用域全局變量a,b的作用域局部變量a,x的作用域計(jì)算機(jī)工程學(xué)院3.運(yùn)行結(jié)果如圖4-15所示。圖4-15案例2運(yùn)行結(jié)果計(jì)算機(jī)工程學(xué)院4.歸納分析 本程序定義了全局變量a,b,在函數(shù)sub和主函數(shù)main中又重新定義了局部變量a,b;全局變量的作用范圍雖然是從定義的位置開始到程序結(jié)束,但是遇到同名的局部變量以后,它們就不起作用了,同時(shí),局部變量的變化對(duì)全局變量也沒有影響。所以程序的輸出結(jié)果應(yīng)該是3,8。計(jì)算機(jī)工程學(xué)院1.函數(shù)和數(shù)組

如果要把整個(gè)數(shù)組傳遞給函數(shù),就需要在調(diào)用函數(shù)時(shí)列出數(shù)組的名字而不帶任何下標(biāo)。假定已經(jīng)說明grade_scores是一個(gè)包含100個(gè)元素的數(shù)組,那么表達(dá)式:

intgrade_scores[100];

minimum(grade_scores);會(huì)把包括在數(shù)組grade_scores中的全部一百個(gè)元素值送到叫做minimum的函數(shù)中。

4.2.2基礎(chǔ)理論

計(jì)算機(jī)工程學(xué)院當(dāng)然,minimum函數(shù)必須聲明,它需要一個(gè)數(shù)組類型的參數(shù)值。其定義如下:

intminimum(int

values[100]){......};上面的說明把minimum定義為返回int型值的,并且要求一個(gè)含100元素的數(shù)組作為參數(shù)的函數(shù)。如果在minimum內(nèi)部引用values[4],實(shí)際上引用的就是grade_scores[4]的值。那么,數(shù)組values和grade_scores引用同一塊內(nèi)存區(qū)。

計(jì)算機(jī)工程學(xué)院傳遞數(shù)值參數(shù)的實(shí)質(zhì):

在一般的函數(shù)參數(shù)傳遞過程中,實(shí)參復(fù)制一個(gè)副本給形參。形參的值在函數(shù)內(nèi)部可以改變,當(dāng)函數(shù)返回時(shí),形參副本被撤消,實(shí)參本身不受任何影響。這一過程稱為傳值。

計(jì)算機(jī)工程學(xué)院2.變量的作用域所謂變量的作用域,就是變量的作用范圍,也可以說是變量的有效性范圍。C語言中的變量,按作用域范圍可分為兩種:局部變量和全局變量。

(1)局部變量局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說明的。其作用域僅限于函數(shù)內(nèi),離開該函數(shù)后再使用這種變量是非法的。計(jì)算機(jī)工程學(xué)院例如:

intfun1(inta)/*函數(shù)fun1*/{intb,c;a,b,c作用域……}intfun2(intx)/*函數(shù)fun2*/{inty,z;x,y,z作用域}voidmain(){m,n作用域intm,n;}計(jì)算機(jī)工程學(xué)院在函數(shù)fun1內(nèi)定義了三個(gè)變量,a為形參,b,c為一般變量。在fun1的范圍內(nèi)a,b,c有效,或者說a,b,c變量的作用域限于fun1內(nèi)。同理,x,y,z的作用域限于fun2內(nèi)。m,n的作用域限于main函數(shù)內(nèi)。關(guān)于局部變量的作用域還要說明以下幾點(diǎn):計(jì)算機(jī)工程學(xué)院①主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),它與其它函數(shù)是平行關(guān)系。這一點(diǎn)是與其它語言不同的,應(yīng)予以注意。②形參變量是屬于被調(diào)函數(shù)的局部變量,實(shí)參變量是屬于主調(diào)函數(shù)的局部變量。計(jì)算機(jī)工程學(xué)院(2)全局變量

所謂“全局變量”是指在函數(shù)之外定義的變量。全局變量的定義位置可以在所有函數(shù)之前,也可以在各個(gè)函數(shù)之間。當(dāng)然從理論上講,也可以在所有函數(shù)之后(但實(shí)際應(yīng)用中很少用)。一般情況下,全局變量的作用范圍是:從定義全局變量的位置起到本源程序結(jié)束止。例如:

計(jì)算機(jī)工程學(xué)院intx,y,z;floatf1(floata,floatb){

…/*x,y,z均是全局變量*/}charch1,ch2; intf2(intm){/*ch1,ch2均是全局變量*/…}doublet,p; voidmain(){/*t,p均是全局變量*/

… }計(jì)算機(jī)工程學(xué)院說明: ①在f1函數(shù)中,可以使用全局變量x,y,z;在f2函數(shù)中,可以使用全局變量x,y,z和ch1,ch2;在main函數(shù)中,可以使用所有定義的全局變量,即x,y,z,ch1,ch2,t,p。 ②全局變量可以和局部變量同名,當(dāng)局部變量有效時(shí),同名的全局變量不起作用。 ③因?yàn)槿肿兞康亩x位置都在函數(shù)之外(且作用域范圍較廣,不局限于一個(gè)函數(shù)內(nèi)),所以全局變量又可稱為外部變量。計(jì)算機(jī)工程學(xué)院 ④使用全局變量可以增加各個(gè)函數(shù)之間數(shù)據(jù)傳輸?shù)那?,即在某個(gè)函數(shù)中改變一全局變量的值,就可能影響到其它函數(shù)的執(zhí)行結(jié)果。但它會(huì)使函數(shù)的通用性降低,使程序的模塊化、結(jié)構(gòu)化變差,所以應(yīng)慎用、少用全局變量。計(jì)算機(jī)工程學(xué)院3.變量的生命期所謂變量的生命期,就是指變量占用內(nèi)存空間的時(shí)間,也可以稱為是變量的存儲(chǔ)方式。按照生命期,C語言中的變量可以以“靜態(tài)”和“動(dòng)態(tài)”兩種方式建立。

靜態(tài)存儲(chǔ)通常是在變量定義時(shí)就分配固定的存儲(chǔ)單元,并一直保持不變,直至整個(gè)程序結(jié)束。動(dòng)態(tài)存儲(chǔ)是在程序執(zhí)行過程中,使用它的時(shí)候才分配存儲(chǔ)單元,使用完畢就立即釋放。計(jì)算機(jī)工程學(xué)院生命期和作用域是從不同的角度來描述變量的特性,一個(gè)變量的屬性不能僅從其作用域來判斷,還應(yīng)有明確的存儲(chǔ)類型說明。在C語言中,對(duì)變量的存儲(chǔ)類型說明有四種:auto(自動(dòng)變量)、register(寄存器變量)、extern(外部變量)、static(靜態(tài)變量)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ),外部變量和靜態(tài)變量屬于靜態(tài)存儲(chǔ)。在了解了變量生命期的性質(zhì)以后,變量的說明就可以完整的表達(dá)為:

計(jì)算機(jī)工程學(xué)院存儲(chǔ)類型說明符數(shù)據(jù)類型說明符<變量名>,<變量名>…;例如:

staticintx,y;

/*定義x,y為靜態(tài)整型變量*/

autocharc1,c2;/*定義c1,c2為自動(dòng)字符變量*/

staticfloatnum[3]={1,2,3};/*定義num為靜態(tài)實(shí)型數(shù)組*/

externinta,b;

/*定義a,b為外部整型變量*/

計(jì)算機(jī)工程學(xué)院

(1)自動(dòng)變量auto以前在定義變量的時(shí)候,都沒有涉及到生命期的使用,這是因?yàn)椋谜Z言中規(guī)定,函數(shù)內(nèi)凡未加存儲(chǔ)類型說明的變量均視為自動(dòng)變量,即auto可以省略。如:intx,y,z;等價(jià)于:autointx,y,z;

(2)外部變量extern外部變量就是全局變量,是對(duì)同一類變量的不同表述的提法。全局變量是從它的作用域的角度提出的,外部變量從它的存儲(chǔ)方式提出的,表示了它的生命期。計(jì)算機(jī)工程學(xué)院說明:①如果在定義全局變量的位置之前就想使用該變量,那么就要用extern對(duì)該變量作“外部變量”說明。②如果一個(gè)源程序由若干個(gè)源文件組成,在一個(gè)源文件中想使用在其它源文件中已經(jīng)定義的外部變量,則需用extern對(duì)該變量作“外部變量”說明。計(jì)算機(jī)工程學(xué)院

(3)靜態(tài)變量static

靜態(tài)變量有兩種:靜態(tài)局部變量和靜態(tài)全局變量。靜態(tài)局部變量在定義局部變量的時(shí)候加上static說明符就構(gòu)成靜態(tài)局部變量。如:

staticintx,y;staticfloatarr[6]={1,2,3,4,5,6};

①靜態(tài)局部變量在程序開始執(zhí)行的時(shí)候就始終存在著,也就是說它的生命期為整個(gè)源程序。計(jì)算機(jī)工程學(xué)院②靜態(tài)局部變量的生命期雖然為整個(gè)源程序,但是其作用域仍與自動(dòng)變量相同,即只能在定義該變量的函數(shù)內(nèi)使用該變量。退出該函數(shù)后,盡管該變量還繼續(xù)存在,但不能被其他函數(shù)使用。③靜態(tài)局部變量的初始化是在編譯時(shí)進(jìn)行的。在定義時(shí)用常量或者是常量表達(dá)式進(jìn)行賦值。未賦初值的,編譯時(shí),則由系統(tǒng)自動(dòng)賦以0值。④在函數(shù)被多次調(diào)用的過程中,靜態(tài)局部變量的值具有可繼承性。

計(jì)算機(jī)工程學(xué)院

(4)寄存器變量register

我們經(jīng)常把頻繁使用的變量定義為register,把它放到CPU的一個(gè)寄存器中。這種變量使用時(shí)不需要訪問內(nèi)存,而直接從寄存器中讀寫。由于對(duì)寄存器的讀寫速度遠(yuǎn)高于對(duì)內(nèi)存的讀寫速度,因此這樣做可以提高程序的執(zhí)行效率。

說明:①在TurboC,MSC等微機(jī)上使用的C語言中,實(shí)際上是把寄存器變量當(dāng)成自動(dòng)變量處理的。寄存器變量和自動(dòng)變量具有相同的性質(zhì),都屬于動(dòng)計(jì)算機(jī)工程學(xué)院態(tài)存儲(chǔ)方式。②只有局部自動(dòng)變量和形式參數(shù)可以定義為寄存器變量,需要采用靜態(tài)存儲(chǔ)方式的變量不能定義為寄存器變量。③由于CPU

中寄存器的數(shù)目有限,因此不能隨意定義寄存器變量的個(gè)數(shù)。計(jì)算機(jī)工程學(xué)院注意:

(1)全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量理所當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無不同。(2)全局變量和靜態(tài)全局變量的區(qū)別在于非靜態(tài)全局變量的作用域是整個(gè)源程序,即在組成源程序的多個(gè)源文件中都有效。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,而同一源程序的其它源文件中不能使用它。計(jì)算機(jī)工程學(xué)院

(3)靜態(tài)局部變量是改變了變量的存儲(chǔ)方式,即改變了變量的生命期。靜態(tài)全局變量是改變了變量的作用域,即限制了變量的使用范圍。(4)同時(shí)定義了形參和函數(shù)中的局部變量。intmax(x,y)intx,y,z;{z=x>y?x:y;return(z);}形參應(yīng)該在函數(shù)體外定義,而局部變量應(yīng)該在函數(shù)體內(nèi)定義。應(yīng)改為:intmax(x,y)intx,y;{intz;z=x>y?x:y;return(z);}計(jì)算機(jī)工程學(xué)院

【實(shí)驗(yàn)4.2.1】

靜態(tài)局部變量。

(1)編程分析在函數(shù)f中定義一個(gè)靜態(tài)局部變量j,在主函數(shù)中5次調(diào)用函數(shù)f,注意觀察靜態(tài)局部變量j的變化。

4.2.3技能訓(xùn)練

計(jì)算機(jī)工程學(xué)院

(2)編寫源程序

/*EX4_14.CPP*/#include"stdio.h"voidmain(){inti;voidf(); /*函數(shù)說明*/for(i=1;i<=5;i++)f();} /*函數(shù)調(diào)用*/

voidf() /*函數(shù)定義*/計(jì)算機(jī)工程學(xué)院{staticintj=0;++j;printf("%d\n",j);}計(jì)算機(jī)工程學(xué)院

(3)在VC++集成環(huán)境中輸入上述程序,文件存成EX4_14.CPP。結(jié)果如圖4-16所示。圖4-16運(yùn)行結(jié)果由于j為靜態(tài)變量,能在每次調(diào)用后保留其值并在下一次調(diào)用時(shí)繼續(xù)使用,所以輸出值成為累加的結(jié)果。計(jì)算機(jī)工程學(xué)院

【實(shí)驗(yàn)4.2.2】從鍵盤輸入一個(gè)班(全班最多不超過30人)學(xué)生某門課的成績(jī),當(dāng)輸入成績(jī)?yōu)樨?fù)值時(shí),輸入結(jié)束,分別實(shí)現(xiàn)下列功能:

(1)統(tǒng)計(jì)不及格人數(shù)并打印不及格學(xué)生名單;(2)統(tǒng)計(jì)成績(jī)?cè)谌嗥骄旨捌骄种系膶W(xué)生人數(shù),并打印這些學(xué)生的名單;(3)統(tǒng)計(jì)各分?jǐn)?shù)段的學(xué)生人數(shù)及所占的百分比。計(jì)算機(jī)工程學(xué)院

(1)編程分析①用num[i]存放第i+1個(gè)學(xué)生的學(xué)號(hào),用score[i]存放第i+1個(gè)學(xué)生的成績(jī)。設(shè)置計(jì)數(shù)器count,當(dāng)score[i]<60分時(shí),計(jì)數(shù)器count計(jì)數(shù)一次,并打印num[i]和score[i]。②先計(jì)算全班平均分aver,當(dāng)?shù)趇個(gè)學(xué)生的成績(jī)score[i]>=aver時(shí),打印num[i]和score[i]。計(jì)算機(jī)工程學(xué)院③將成績(jī)分為六個(gè)分?jǐn)?shù)段,60分以下為第0段,60~69為第1段,70~79為第2段,80~89為第3段,90~99為第4段,100分為第5段,因此,成績(jī)與分?jǐn)?shù)段的對(duì)應(yīng)關(guān)系為:各分?jǐn)?shù)段的學(xué)生人數(shù)保存在數(shù)組stu中,用stu[i]存放第i段的學(xué)生人數(shù)。對(duì)于每個(gè)學(xué)生的成績(jī),先計(jì)算出該成績(jī)所對(duì)應(yīng)的分?jǐn)?shù)段,然后將相應(yīng)的分?jǐn)?shù)段的人數(shù)加1,即stu[i]++。計(jì)算機(jī)工程學(xué)院

(2)編程源程序

/*EX4_15.CPP*/#include<stdio.h>#defineARR_SIZE30int ReadScore(longnum[],floatscore[]);int GetFail(longnum[],floatscore[],intn);floatGetAver(floatscore[],intn);int GetAboveAver(longnum[],floatscore[],intn);voidGetDetail(floatscore[],intn);計(jì)算機(jī)工程學(xué)院voidmain(){intn,fail,aboveAver;floatscore[ARR_SIZE];longnum[ARR_SIZE];printf("Pleaseenternumandscoreuntilscore<0:\n");n=ReadScore(num,score);printf("Totalstudents:%d\n",n);fail=GetFail(num,score,n);printf("Failstudents=%d\n",fail);計(jì)算機(jī)工程學(xué)院

aboveAver=GetAboveAver(num,score,n);printf("Aboveaverstudents=%d\n",aboveAver);GetDetail(score,n);}intReadScore(longnum[],floatscore[])

/*函數(shù)功能:從鍵盤輸入一個(gè)班學(xué)生某門課的成績(jī)及其學(xué)號(hào),當(dāng)輸入成績(jī)?yōu)樨?fù)值時(shí),輸入結(jié)束函數(shù)參數(shù):長(zhǎng)整型數(shù)組num,存放學(xué)生學(xué)號(hào)實(shí)型數(shù)組score,存放學(xué)生成績(jī)函數(shù)返回值:學(xué)生總數(shù)*/計(jì)算機(jī)工程學(xué)院

{inti=0;scanf("%ld%f",&num[i],&score[i]);while(score[i]>=0){ i++;scanf("%ld%f",&num[i],&score[i]); }returni;}計(jì)算機(jī)工程學(xué)院

intGetFail(longnum[],floatscore[],intn)

/*函數(shù)功能:統(tǒng)計(jì)不及格人數(shù)并打印不及格名單函數(shù)參數(shù):長(zhǎng)整型數(shù)組num,存放學(xué)生學(xué)號(hào)實(shí)型數(shù)組score,存放學(xué)生成績(jī),整型變量n,存放學(xué)生總數(shù)函數(shù)返回值:不及格人數(shù)*/

{inti,count;printf("Fail:\nnumber--score\n");計(jì)算機(jī)工程學(xué)院

count=0;for(i=0;i<n;i++){if(score[i]<60){printf("%ld------%.0f\n",num[i],score[i]);count++; } }returncount;}計(jì)算機(jī)工程學(xué)院

floatGetAver(floatscore[],intn)

/*函數(shù)功能:計(jì)算全班平均分函數(shù)參數(shù):實(shí)型數(shù)組score,存放學(xué)生成績(jī)整型變量n,存放學(xué)生總數(shù)函數(shù)返回值:平均分*/

{inti;floatsum=0;for(i=0;i<n;i++)計(jì)算機(jī)工程學(xué)院

{sum=sum+score[i]; }returnsum/n;}

intGetAboveAver(longnum[],floatscore[],intn)

/*函數(shù)功能:統(tǒng)計(jì)成績(jī)?cè)谌嗥骄旨捌骄种系膶W(xué)生人數(shù)并打印其學(xué)生名單函數(shù)參數(shù):長(zhǎng)整型數(shù)組num,存放學(xué)生學(xué)號(hào)實(shí)型數(shù)組score,存放學(xué)生成績(jī),整型變量n,計(jì)算機(jī)工程學(xué)院存放學(xué)生總數(shù)函數(shù)返回值:成績(jī)?cè)谌嗥骄旨捌骄种系膶W(xué)生人數(shù)*/

{inti,count;floataver;aver=GetAver(score,n);printf("aver=%f\n",aver);printf("Aboveaver:\nnumber--score\n");count=0;for(i=0;i<n;i++)計(jì)算機(jī)工程學(xué)院

{sum=sum+score[i]; }returnsum/n;}

intGetAboveAver(longnum[],floatscore[],intn)

/*函數(shù)功能:統(tǒng)計(jì)成績(jī)?cè)谌嗥骄旨捌骄种系膶W(xué)生人數(shù)并打印其學(xué)生名單函數(shù)參數(shù):長(zhǎng)整型數(shù)組num,存放學(xué)生學(xué)號(hào)實(shí)型數(shù)組score,存放學(xué)生成績(jī)整型變量n,存計(jì)算機(jī)工程學(xué)院

放學(xué)生總數(shù)函數(shù)返回值:成績(jī)?cè)谌嗥骄旨捌骄种系膶W(xué)生人數(shù)*/

{inti,count;floataver;aver=GetAver(score,n);printf("aver=%f\n",aver);printf("Aboveaver:\nnumber--score\n");count=0;計(jì)算機(jī)工程學(xué)院

for(i=0;i<n;i++){ if(score[i]>=aver) { printf("%ld------%.0f\n",num[i],score[i]); count++; } }returncount;}

voidGetDetail(floatscore[

溫馨提示

  • 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. 人人文庫(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)論