學習函數 主要學習函數的用法。首先讨論為什麼要使用函數,然後詳細讨論内置函數和自定義函數以及函數的結構,最後讨論函數調用以及函數的傳回值。 函數可以把相對獨立的某個功能抽象出來,使之成為程式中的一個獨立實體。可以在同一個程式或其他程式中多次重複使用 函數機制的優點 Ø 使程式變得更簡短而清晰 Ø 有利于程式維護 Ø 可以提高程式開發的效率 Ø 提高了代碼的重用性 函數的兩種類型:内置函數和自定義函數 内置函數: Ø 由C語言系統提供; Ø 使用者無須定義,也不必在程式中作類型說明; Ø 隻需在程式前包含有該函數定義的頭檔案;
内置函數 | 頭檔案 | 用途 |
double sqrt(double x) | math.h | 計算x的平方根 |
double pow(double x, double y) | 計算x的y次幂 | |
double ceil(double x) | 求不小于x的最小整數,并以double形式顯示 | |
double floor(double x) | 求不大于x的最大整數,并以double形式顯示 | |
int toupper(int x) | ctype.h | 如果x為小寫字母,則傳回對應的大寫字母 |
int tolower(int x) | 如果x為大寫字母,則傳回對應的小寫字母 | |
int rand(void) | stdlib.h | 産生一個随機數 |
void exit(int retval) | 終止程式 |
内置函數sqrt 和pow 示例:
#include < stdio.h >
#include < math.h >
void main()
... {
int x=1;
double squareroot,power;
while(x <= 10)
...{
squareroot=sqrt(x);
power=pow(x,3);
printf(" %d的平方根:%3.2f %d的立方:%5.0f ",
x,squareroot,x,power);
x++;
}
}
輸出: 1的平方根: 1.00 1的立方: 1 2的平方根: 1.41 2的立方: 8 3的平方根: 1.73 3的立方: 27 4的平方根: 2.00 4的立方: 64 5的平方根: 2.24 5的立方: 125 6的平方根: 2.45 6的立方: 216 7的平方根: 2.65 7的立方: 343 8的平方根: 2.83 8的立方: 512 9的平方根: 3.00 9的立方: 729 10的平方根: 3.16 10的立方: 1000 Press any key to continue 内置函數ceil和floor示例
#include < stdio.h >
#include < math.h >
void main()
... {
printf("==============floor()=========");
printf(" floor(99.1) = %f ",floor(99.1));
printf(" floor(-99.1) = %f ",floor(-99.1));
printf(" floor(99.9) = %f ",floor(99.9));
printf(" floor(-99.9) = %f ",floor(-99.9));
printf(" ==============ceil()==========");
printf(" ceil(99.1) = %f ",ceil(99.1));
printf(" ceil(-99.1) = %f ",ceil(-99.1));
printf(" ceil(99.9) = %f ",ceil(99.9));
printf(" ceil(-99.9) = %f ",ceil(-99.9));
}
輸出: ==============floor()========= floor(99.1) = 99.000000 floor(-99.1) = -100.000000 floor(99.9) = 99.000000 floor(-99.9) = -100.000000 ==============ceil()========== ceil(99.1) = 100.000000 ceil(-99.1) = -99.000000 ceil(99.9) = 100.000000 ceil(-99.9) = -99.000000 Press any key to continue toupper和tolower示例
#include < stdio.h >
#include < ctype.h >
void main()
... {
char msg1,msg2,to_upper,to_lower;
printf("請輸入一個小寫字母:");
msg1=getchar();
to_upper=toupper(msg1);
printf("轉換為大寫:%c ",to_upper);
printf("請輸入一個大寫字母:");
fflush(stdin);
msg2=getchar();
to_lower=tolower(msg2);
printf("轉換為小寫:%c ",to_lower);
}
請輸入一個小寫字母:d 轉換為大寫:D 請輸入一個大寫字母:E 轉換為小寫:e Press any key to continue 内置函數rand示例
#include < stdio.h >
#include < stdlib.h >
// #include<time.h>
void main()
... {
int i;
printf("産生 10 個 0 到 99 之間的随機數序列: ");
//srand((unsigned)time(NULL));
for(i=0; i<10; i++)
printf("%d ", rand() % 100);
printf(" ");
}
産生 10 個 0 到 99 之間的随機數序列: 44 73 26 58 37 94 27 42 28 90 Press any key to continue 自定義函數: Ø 使用者在程式中根據需要而編寫的函數; Ø 函數名的命名規則和變量命名一樣。注意盡量能夠表達出正确的意義,如果說一個變量命名重在說明它“是什麼”的話,則一個函數重在說明它要“做什麼”。比如一個函數要實作兩數相加,則可以命名為AddTwoNum,這樣有助于閱讀。 Ø 函數參數。格式為:int AddTwoNum(int a,int b ) 注:兩個或多個參數類型相同時,并不能同進聲明。例如:AddTwoNum(int a, b )//是錯誤的。 Ø 在C語言中,不允許一個函數定義在另一個函數體内。如: Void A() { Void B() //錯誤,函數B定義在函數A體内。 {….. } ….. } 函數原型 函數原型說明在形式上與函數頭部類似,最後加一個分号。原型說明中參數表裡的參數名可以不寫(隻寫參數類型) #include <stdio.h> float count (int, int); void main() { . . . . . . } float co nt(int x,int y) { . . . } 函數調用 Ø 通過在程式中使用函數名稱,可以執行函數中包含的語句,這稱為調用函數 Ø 函數之間允許互相調用,也允許嵌套調用 Ø 函數還可以自己調用自己,稱為遞歸調用 示例:
#include < stdio.h >
void AreaOfRect();
void AreaOfTriangle();
void AreaOfRound();
void main()
... {
int select;
do ...{
printf(" 0、退出 1、長方形 2、三角形 3、圓形 ");
printf("請選擇功能:");
scanf("%d",&select);
if(select == 0) break;
switch(select) ...{
case 1 : AreaOfRect(); break; //長方形
case 2 : AreaOfTriangle(); break; //三角形
case 3 : AreaOfRound(); break; //圓形
default : printf("輸入有誤,請在 0~4 之間選擇。 ");
}
}while(1);
}
void AreaOfRect()
... {
int x,y;
printf("請輸入長方形的長:");
scanf("%d",&x);
printf("請輸入長方形的寬:");
scanf("%d",&y);
printf("面積為:%d ",(x * y));
}
void AreaOfRound()
... {
int r;
printf("請輸入圓形的半徑:");
scanf("%d",&r);
printf("面積為:%d ",3.14*r*r);
}
void AreaOfTriangle()
... {
int x,y;
printf("請輸入三角形的底:");
scanf("%d",&x);
printf("請輸入三角形的高:");
scanf("%d",&y);
printf("面積為:%d ",(x * y)/2);
} 函數傳回值 C 語言中的 return 語句用于向調用函數傳回值,文法如下: return (<表達式>); Ø C語言中的函數至多可以傳回一個值,不能傳回多個值; Ø 傳回值的資料類型必須與函數原型中傳回值的資料類型比對; Ø 當遇到 return 語句時,函數執行将終止。程式控制流将立即傳回調用函數; 示例:
#include < stdio.h >
int get_age();
void main()
... {
int age1, age2, age3;
age1 = get_age();
age2 = get_age();
age3 = get_age();
if ( (age1 > age2) && (age1 > age3))
printf(" 年齡為 %d 的人最大 ", age1);
else if( (age2 > age1) && (age2 > age3))
printf(" 年齡為 %d 的人最大 ", age2);
else if( (age3 > age1) && (age3 > age2))
printf(" 年齡為 %d 的人最大 ", age2);
}
int get_age()
... {
int age;
printf(" 請輸入年齡: ");
scanf("%d",&age);
return age;
}
函數的結構包括:傳回值類型、函數名、參數清單、函數體