標籤:全域 工作量 包含 結束 傳遞 第一個 複合 規則 函數
1.函數概述:
- 函數→function→功能,函數就是能完成一定功能的程式段。
- 如果程式規模不大,只需一個主函數和基本的庫函數即可。
- 否則,使用者需要編寫能實現一定功能的子函數。
2.函數的功能:
- 主函數就像一個控制台,子函數就像控制台上的按鈕。
- 每個子函數可以實現功能。
- 子函數可以減少重複編寫程式段的工作量。
- 同一個子函數可以被一個或多個函數多次調用。
3.函數使用說明:
- C程式是由一個或多個函數組成。
- C程式總是從main函數開始執行,而不管將其寫在前面、中間或最後。在調用完其它函數後返回到main函數。
- 子函數相互獨立,可以互相調用,但是子函數不可調用主函數。
4.函數分類:
(1)庫函數(標準函數):是系統提供定義,使用者編程時可直接調用。printf(),scanf()。
(2)使用者定義函數:是使用者自己編寫的用來解決具體問題的函數。cylinder(),max(),PrintStar()。
(1)無參函數:不需要向函數傳遞參數。PrintStar()。
(2)有參函數:需要向函數傳遞必要的參數。cylinder(r,h),max(a,b)
(1)有傳回值函數:函數經過運算,得到一個明確的結果,並需要回送該結果。cylinder(r,h),max(a,b)。
(2)無傳回值函數:函數只是完成一系列操作步驟,不需要回送任何運算結果。PrintStar(),PrintMessage()。
5.函數定義:
1.函數定義的一般形式:
類型標識符 函數名(形式參數說明表)→函數首部
{
函數實現過程; →函數體
}
2.函數定義說明:
(1)類型標識符:
- 函數的類型,與return語句傳回值的類型相同。可以理解為函數最終的結果類型。
- 可以是任何一種有效類型,預設時預設為整型。
- 若函數無傳回值,類型標識符為void。
(2)函數名:
- 它的命名要符合C語言的標識符命名規則:由字母、數字和底線組成,其中第一個字元必須是字母或底線。
- 函數名必須唯一,不能與函數體內變數或形參名相同。
(3)形參表:
- 形式參數(形參):在定義函數時,函數名後面括弧中的變數名。形參是變數,必須指定類型。例如:double cylinder(double r,double h)。
- 形參主要是用於接受主調函數傳遞過來的數值。形參類型必須與傳遞過來的資料類型一致。例如:v=cylinder(radius,height)。
- 形參的命名只要符合變數的命名規則即可,無需和主調函數中的變數名一致。
- 每個形參必須單獨說明類型,形參間用逗號間隔。
- 可以不帶形參:如果函數無需從主調函數處接收資料,可以不帶形參,但是圓括弧不能省略。
6.函數的調用:
- 定義完一個函數後,就可以在程式中調用這個函數。
- 調用標準庫函數時,在程式的最前面用#include命令包含相應的標頭檔。
- 調用自訂函數時,程式中必須有與調用函數相對應的函數定義。
1.函數調用的一般格式:
函數名(實參表)→常量、變數、運算式
- 實際參數(實參):調用函數時函數名後面括弧中的內容。
- 實參列表中可以含有多個參數,每個參數間用逗號隔開。
- 實參表中變數和運算式要有確定的值。
- 實參也可沒有,但括弧不能省略,如PrintStar()。
2.函數調用的一般過程:
- 主函數開始;
- 遇到主函數調用某個子函數時,主函數被暫停執行;
- 子函數執行;
- 執行完後返回主函數;
- 再從主函數暫停位置處繼續執行,直到結束。
3.函數調用的方式:
- 函數語句:即把函數調用作為一個語句。如:
PrintStar();
printf(“***********”);
這時不要求函數帶傳回值,只要求完成一定的操作,通常將函數定義為“void”類型。
- 函數運算式:函數出現在可以寫運算式的地
方,此時需要的是函數的值。如:
c=2*max(a,b);
printf(“%d”,max(a,b));
4.函數參數傳遞說明:
- 實參可以是常量,變數,運算式,但必須有確定的值
- 形參是變數,必須指定類型
- 在參數傳遞過程中,實參把值複製給形參。
- C語言中,參數的傳遞是“值傳遞”,即單向傳遞。資料只能由實參傳送給形參,而不由形參傳回給實參。
- 形參和實參一一對應:數量一致,類型一致,順序一致。
- 形參在函數被調用前不佔記憶體;函數調用時為形參分配記憶體;調用結束,記憶體釋放。
5.函數傳回值:
- 在調用函數時,有時需要將運算結果返回主調函數,此時函數傳回值就需要使用return語句實現。
- return語句形式:
return 運算式;或者
return (運算式);
例如: return result;
return 0;
return(x>y?x:y)
- 若函數無傳回值時,函數類型說明為void,且不能略。 如:void PrintStar()
{printf("******\n");}
return語句只返回一個值。
- return語句具有兩個功能:
①結束函數的運行;
②帶著運算結果(運算式的值)返回主調函數。
如果return語句為:return ;
則表示僅返回到調用函數的調用點,不帶傳回值。
- 在一個函數中,return語句可以出現多次,但每次執行只能有一條return語句被執行。
6.函式宣告:
函數類型 函數名(參數表);
double cylinder (double r, double h);
void pyramid (int n);
- 唯寫函數定義中的第1行(函數首部),並以分號結束。
- 函式宣告:說明函數的類型和參數的情況,以保證程式編譯時間能判斷對該函數的調用是否正確。
- 如果是庫函數,應在檔案開頭引用標頭檔;
- 如果被調用函數定義在調用它的函數後面
應在主調函數中對被調函數作聲明;
在所有函數之前對被調函數作聲明,此時在主調函數中就不必再作聲明了。
- 如果被調函數定義在調用它的函數的前面,在主調函數之前可以不加聲明。
7.變數與函數:
1.局部變數和全域
(1)局部變數
- 在函數內定義的變數(包括形參)
作用範圍:本函數內部
- 定義在複合陳述式內的變數
作用範圍:複合陳述式內部
(2)全域變數
- 在函數以外定義的變數,不從屬於任一函數。
作用範圍:從定義處到源檔案結束(包括各函數)
2.變數生命週期和靜態局部變數
(1)自動變數(auto): 普通的局部變數
int x, y; ?? auto int x, y;
char c1; ?? auto char c1;
- 函數調用時,定義變數,分配儲存單元。
- 函數調用結束,收回儲存單元。
(2)全域變數:從程式執行開始,到程式的結束,儲存單元始終保持。
(3)變數生命週期:變數從定義開始分配儲存單元,到運行結束儲存單元被回收的整個過程。
三、實驗心得體會:
經過這次的實驗作業,我發現自己在函數部分掌握的還是比較好的,思路也很清晰。
實驗6總結