Download presentation
Presentation is loading. Please wait.
1
複習 int a[5]; int i; //a[0], a[1], a[2], a[3], a[4]
for(i=0;i<5;i++){ scanf(“%d”,&a[i]); } printf(“%d ”,a[i]);
2
Class 4 函式
3
什麼是函式? 函式就像是一個具有特定功能的小程式 當某些程式敘述經常需要重複撰寫時,就可以將它寫成函式的形式,以節省程式開發的時間
可供其他程式重複使用 可以使程式變得精簡 當某些程式敘述經常需要重複撰寫時,就可以將它寫成函式的形式,以節省程式開發的時間 每當函式被呼叫時,會將其程式區塊內的敘述執行一次,再回到呼叫此函式的地方進行下一個敘述
4
什麼是函式? 使用函式不用去管函式內部如何寫 只要知道函式可以作什麼 使用函式可以讓程式碼更清晰
我們知道 printf 可以作輸出, 可是不用去知道printf是如何寫 使用函式可以讓程式碼更清晰 一直會作的工作最好寫成函式
5
int Rec(int,int); Int Rec(int, int); Int main(){ Int x=3,y=4; Int r;
r=Rec(x,y); printf (“%d”,r); } Int Rec(int num,int num2) { return num*num2;
6
語法 回傳資料型態 函式名稱(資料型態1 參數1,資料型態2 參數2,…) { … 程式敘述區塊; }
7
函式的基本要件 函式的輸入 函式的輸出 函式主體 函式名稱後的參數串,它接收使用者在呼叫函式時傳送給函式使用的資料。
如: printf(“這個句子就是一個參數\n”); 函式的輸出 函式在執行後,可以傳回結果,這個結果稱為回傳值(return value) 回傳資料型態便是指定回傳值的資料型態 在不需要回傳值的函式可以設為void 函式主體 以一對大括號{ }包起來,裡面是函式所要執行的動作
8
注意 函式在任何情況下,都不能被定義在另一個函式之內 請為你的函式取一個能夠代表其功能的名稱
9
函式的呼叫與宣告 呼叫語法 呼叫端 x=kha_abs(-2); 被呼叫端 kha_abs(int num) {…}
函式名稱(參數1的值,參數2的值…); x=kha_abs(-2); //回傳2,由x變數接收 呼叫端 x=kha_abs(-2); 被呼叫端 kha_abs(int num) {…} 函式就像變數一樣,使用之前必須先宣告 編譯器在編譯時才知道有此函式的存在 如: int kha_abs(int num); 或 int kha_abs(int);
10
函式宣告之目的 宣告函式名稱為一個函式 提供編譯器執行呼叫時,引數與參數資料型態與個數的檢驗
num=kha_abs(100,200); //錯誤,多一個引數 提供編譯器在呼叫函式時,做引數與傳回值的資料型態轉換
11
範例練習 請撰寫一個你自己的算絕對值函式,命名為 my_abs,並在主函式main()中呼叫它
12
課堂練習 練習1 練習2 請設計一個函式,接收一個正方形的邊長,函式會回傳這個正方形的面積 主函式須提供使用者輸入的功能 主函式須輸出結果
請設計一個函式,接收一個長方形的長與寬,函式會回傳這個長方形的面積
13
int Rec(int,int); //函式宣告 Int main(){ Int x,y; Int r; //讓使用者輸入x和y
r=Rec(x,y); printf (“面積=%d”,r); } Int Rec(int num,int num2) { return num*num2;
14
變數的作用區域 區域變數 變數宣告在函式中,只能在這個函式中使用 全域變數 變數宣告在任何函式定義外面
15
void function1(void); Int i;//全域變數 Int main(){ int j=30; i=40; function1(); } void function1(){ int j=10; //和main裡的j無關 printf(“%d %d”,j,i); //最後印出
16
記憶體佔用期間 區域變數 全域變數 auto(預設) static 同static變數 變數在被宣告的區塊作用期間佔有記憶體
變數從程式開始執行時便已存在,一直到程式結束為止 初始化只有一次,如無特別指定,便會設為0 全域變數 同static變數
17
可用範圍 區域變數 全域變數 只能在宣告它的區域內使用 從被宣告的地方開始,一直到程式結束都能使用它
函式中如果宣告了一個和全域變數同名的變數,在使用時若沒特別指定,用的會是函式中新宣告的那一個變數(最內層的區域變數) 若是加上兩個“::”號,會指定使用的是全域變數
18
全域變數與區域變數的取用方式
19
C語言內建函式庫 所有支援ANSI標準的C/C++編譯器都會提供一組公用的函式庫(function library)
內建的(build-in)函式 經由函式呼叫,不需宣告或定義它們就可以使用 較常用的數學函式 #include <math.h> pow( )、sqrt( ) 、 rand( ) 、srand()
20
pow( )次方 宣告:double pow(double x,double y); 呼叫:pow(x, y); 說明:回傳x的y次方值
範例練習:計算210的3次方
21
課堂練習 請設計一個程式,讓使用者輸入 a、b ,然後計算出 a 的 b 次方的值 %lf (long f) //印double時用%lf
輸入 5.0 的形式 全部用int呼叫也可以,則輸入為5
22
sqrt( ) 平方根 宣告:double sqrt(double x); 呼叫:sqrt(x);
說明:回傳非負值x的開平方根,x>0 課堂練習1:計算 的 平方根 課堂練習2:請設計一個程式,讓使用者輸入 a、b (a和b 各代表直角三角形的直角上的兩個邊),然後計算出斜邊c的長 畢氏定理:a2+b2=c2
23
rand( ) 取亂數 整數變數=rand(); 搭配使用取餘數符號 % 來做運算 取 0-9 的亂數:a=rand() % 10
24
範例練習 實際寫一個程式來取得 兩個1-100 之間的亂數
25
srand() 上面的程式重複執行數次之後,會發現所得到的亂數是一樣的,why? 用srand() 函式改變一開始的亂數值 以目前的時間傳入
使用 time() 函式,而time()是定義在 time.h中
26
範例練習 改良上面的程式
27
課堂練習 試著產生5個亂數(50~100) 先印出5個亂數中最大的 再印出五個亂數 #include <stdio.h>
#include <stdlib.h> #include <time.h> int main(){ int num[5]; int i,max; srand(time(NULL)); for(i=0i<5;i++){ // 產生5個亂數並存到num陣列 } // 找出num陣列裡最大的數,並印出
28
作業五 寫一個簡易的猜數字遊戲 系統產生一個1-100的亂數,提示使用者輸入一個數字,如果使用者輸入的數字和答案相同,則印出 “Bingo!” 並結束程式,否則繼續讓使用者猜一次,並提示範圍;如果使用者三次都沒猜到,則印出標準答案(HW5.cpp)
29
int ans,sol,n,low=1,up=100,i; srand(time(NULL)); //ans= 1 ~ 100 random一數字 for(i=0;i<3;i++){ //告知使用者目前的範圍 //讓使用者猜一數字scanf(“%d”,&sol); // 如果使用者輸入的數字不在範圍內 i- -; // 否則告知有無猜中,猜中則跳出迴圈 break; //沒猜中,更新up or low } If(sol!=ans){ printf(“沒猜到”); Else{ printf(“猜到了,答案為%d\n”,ans);
Similar presentations