模塊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ù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

計算機工程學院

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

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

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

4.1.1案例講解計算機工程學院2.編程分析

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

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

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

圖4-1案例1運行結(jié)果計算機工程學院5.歸納分析

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

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

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

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

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

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

{計算機工程學院

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

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

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

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

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

************************* ************************* ************************* ************************* *************************計算機工程學院2.編程分析

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

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

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");}}計算機工程學院4.運行結(jié)果如圖4-2所示。圖4-2案例2運行結(jié)果計算機工程學院5.歸納分析

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

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

1.問題描述

完成a,b兩個值的交換。

2.編寫源程序

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

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);}計算機工程學院3.運行結(jié)果如圖4-3所示。圖4-3案例3運行結(jié)果計算機工程學院4.歸納分析本程序中定義了一個函數(shù)swap,該函數(shù)的功能是完成a,b兩個值的交換。在主函數(shù)中輸入x,y值,作為實參,調(diào)用時按次序傳送給swap函數(shù)的形參a,b。在主函數(shù)中用printf語句輸出一次x,y的值,在函數(shù)swap中也用printf

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

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

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

計算機工程學院案例四

加法考試題

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

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

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

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

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

elseprintf("Notcorrect!

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

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

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

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

4.1.2基礎(chǔ)理論

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

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

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

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

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

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

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

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

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

;

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

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

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

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

類型說明符函數(shù)名(<類型><形參>,<類型><形參>…);或為:

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

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

注意:

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

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

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

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

4.1.3技能訓練

計算機工程學院

(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++)計算機工程學院

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);}計算機工程學院EX4_6.CPP用了3個功能相同的程序段分別計算整數(shù)a、b、c的階乘,這使得程序在結(jié)構(gòu)上很松散,不夠緊湊。如果現(xiàn)在有一個專門求x!的函數(shù)rfact(x)可以使用,就能把EX4_5.CPP程序變得很簡潔。

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

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);}計算機工程學院

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

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

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

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

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

(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;}計算機工程學院

voidPrint(intflag,intchance)

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

*/

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

voidmain(){計算機工程學院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));}計算機工程學院

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

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

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

計算機工程學院

(1)編程分析

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

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

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

計算機工程學院

(2)編寫源程序

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

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)計算機工程學院{printf("%d/%d=",a,b);result=a/b;/*注意這里是整數(shù)除法運算,結(jié)果為整型*/ }else{printf("Divisionbyzero!\n"); } break;default:printf("Unknownoperator!\n");break; }scanf("%d",&answer);if(result==answer)return1;elsereturn0;}計算機工程學院

voidPrint(intflag)

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

*/

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

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;計算機工程學院

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

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

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

【練習1】

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

4.1.4拓展與練習

計算機工程學院

(1)編程分析

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

{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個數(shù)中的最大值*/min=rmin2(rmin2(a,b),rmin2(c,d));/*求4個數(shù)中的最小值*/printf("average=%f\n",aver(max,min));}計算機工程學院

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);}計算機工程學院

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

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

(1)編程分析

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

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

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

voidPrint(intflag)

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

*/

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

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

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

(1)編程分析

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

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

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

elsereturn0;

}計算機工程學院

voidPrint(intflag)

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

*/

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

elseprintf("Notcorrect!\n");}計算機工程學院

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;計算機工程學院

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

elseerror++;

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

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

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

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

計算機工程學院

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

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

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

swap(a,b);

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

swap(x,y)計算機工程學院

intx,y;{intm;

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

(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++;┇}計算機工程學院復(fù)習函數(shù)定義---功能,參數(shù),返回值函數(shù)的調(diào)用----形參,實參intfun();intfun(inta,intb);voidmain(){…..

return;}計算機工程學院

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

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

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

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

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

中首先完成數(shù)組sco的輸入,然后以sco作為實參調(diào)用aver函數(shù),函數(shù)返回值送av,最后輸出av值。計算機工程學院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;}計算機工程學院

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);}計算機工程學院4.運行結(jié)果如圖4-14所示。圖4-14案例1運行結(jié)果計算機工程學院5.歸納分析用數(shù)組名作函數(shù)參數(shù)時,則要求形參和相對應(yīng)的實參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。當形參和實參二者不一致時,即會發(fā)生錯誤。前面已經(jīng)討論過,在變量作函數(shù)參數(shù)時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發(fā)生改變后,實參并不變化,兩者的終值是不同的。而當用數(shù)組名作函數(shù)參數(shù)時,計算機工程學院情況則不同。由于實際上形參和實參為同一數(shù)組,因此當形參數(shù)組發(fā)生變化時,實參數(shù)組也隨之變化。當然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實際情況來看,調(diào)用函數(shù)之后實參數(shù)組的值將由于形參數(shù)組值的變化而變化。案例二變量的作用范圍

1.問題描述

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

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

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

intgrade_scores[100];

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

4.2.2基礎(chǔ)理論

計算機工程學院當然,minimum函數(shù)必須聲明,它需要一個數(shù)組類型的參數(shù)值。其定義如下:

intminimum(int

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

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

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

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

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

intfun1(inta)/*函數(shù)fun1*/{intb,c;a,b,c作用域……}intfun2(intx)/*函數(shù)fun2*/{inty,z;x,y,z作用域}voidmain(){m,n作用域intm,n;}計算機工程學院在函數(shù)fun1內(nèi)定義了三個變量,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)于局部變量的作用域還要說明以下幾點:計算機工程學院①主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用。同時,主函數(shù)中也不能使用其它函數(shù)中定義的變量。因為主函數(shù)也是一個函數(shù),它與其它函數(shù)是平行關(guān)系。這一點是與其它語言不同的,應(yīng)予以注意。②形參變量是屬于被調(diào)函數(shù)的局部變量,實參變量是屬于主調(diào)函數(shù)的局部變量。計算機工程學院(2)全局變量

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

計算機工程學院intx,y,z;floatf1(floata,floatb){

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

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

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

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

staticintx,y;

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

autocharc1,c2;/*定義c1,c2為自動字符變量*/

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

externinta,b;

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

計算機工程學院

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

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

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

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

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

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

計算機工程學院

(4)寄存器變量register

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

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

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

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

(3)靜態(tài)局部變量是改變了變量的存儲方式,即改變了變量的生命期。靜態(tài)全局變量是改變了變量的作用域,即限制了變量的使用范圍。(4)同時定義了形參和函數(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);}計算機工程學院

【實驗4.2.1】

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

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

4.2.3技能訓練

計算機工程學院

(2)編寫源程序

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

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

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

【實驗4.2.2】從鍵盤輸入一個班(全班最多不超過30人)學生某門課的成績,當輸入成績?yōu)樨撝禃r,輸入結(jié)束,分別實現(xiàn)下列功能:

(1)統(tǒng)計不及格人數(shù)并打印不及格學生名單;(2)統(tǒng)計成績在全班平均分及平均分之上的學生人數(shù),并打印這些學生的名單;(3)統(tǒng)計各分數(shù)段的學生人數(shù)及所占的百分比。計算機工程學院

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

(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);計算機工程學院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);計算機工程學院

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

/*函數(shù)功能:從鍵盤輸入一個班學生某門課的成績及其學號,當輸入成績?yōu)樨撝禃r,輸入結(jié)束函數(shù)參數(shù):長整型數(shù)組num,存放學生學號實型數(shù)組score,存放學生成績函數(shù)返回值:學生總數(shù)*/計算機工程學院

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

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

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

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

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

floatGetAver(floatscore[],intn)

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

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

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

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

/*函數(shù)功能:統(tǒng)計成績在全班平均分及平均分之上的學生人數(shù)并打印其學生名單函數(shù)參數(shù):長整型數(shù)組num,存放學生學號實型數(shù)組score,存放學生成績,整型變量n,計算機工程學院存放學生總數(shù)函數(shù)返回值:成績在全班平均分及平均分之上的學生人數(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++)計算機工程學院

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

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

/*函數(shù)功能:統(tǒng)計成績在全班平均分及平均分之上的學生人數(shù)并打印其學生名單函數(shù)參數(shù):長整型數(shù)組num,存放學生學號實型數(shù)組score,存放學生成績整型變量n,存計算機工程學院

放學生總數(shù)函數(shù)返回值:成績在全班平均分及平均分之上的學生人數(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++){ if(score[i]>=aver) { printf("%ld------%.0f\n",num[i],score[i]); count++; } }returncount;}

voidGetDetail(floatscore[

溫馨提示

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

評論

0/150

提交評論