授課: ant 日期: 2011/3/28

32
函函 函函ANT 函函2011/3/28

Upload: gianna

Post on 19-Mar-2016

48 views

Category:

Documents


5 download

DESCRIPTION

函數. 授課: ANT 日期: 2011/3/28. 函數 - argc, argv[] 函數呼叫方式 call_by_value call_by_reference (( 基本指標 )) 數學函數 字元、字串函數 巨集. 自訂函數. 使用函數的目的:可以利用模組化來簡化主程式。 要自訂函數需要注意的地方:函數的宣告、引數的使用、函數的主題以及傳回值。. 宣告方式. void functionName(variable1, variable2 ). 函數的屬性. 函數傳入的值. 函數的名稱. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 授課: ANT 日期: 2011/3/28

函數授課: ANT日期: 2011/3/28

Page 2: 授課: ANT 日期: 2011/3/28

函數 - argc, argv[] 函數呼叫方式 call_by_value call_by_reference (( 基本指標 )) 數學函數 字元、字串函數 巨集

Page 3: 授課: ANT 日期: 2011/3/28

自訂函數 使用函數的目的:可以利用模組化來簡化主程式。 要自訂函數需要注意的地方:函數的宣告、引數的使用、函數的主題以及傳回值。

Page 4: 授課: ANT 日期: 2011/3/28

宣告方式

void functionName(variable1, variable2)函數的屬性 函數的名稱 函數傳入的值

Page 5: 授課: ANT 日期: 2011/3/28

#include<stdio.h>#include<stdlib.h>void line(); void line2(); // 先前宣告有哪些副函式int main(){ line(); printf(“ 我剛呼叫了什麼 \n"); line2(); system("pause"); return 0;}void line(){ printf("---- 分隔線 ----\n");}void line2(){ printf(“\n\n---!!!- 分隔線 -!!!---\n\n");}

Page 6: 授課: ANT 日期: 2011/3/28

程式的執行流程圖int main(){ line(); printf(“ 我剛呼叫了什麼 \n"); line(); system("pause"); return 0;}

void line(void){ printf("---- 分隔線 ----\n"); return;}

第一步第二步

第三步

第四步

Page 7: 授課: ANT 日期: 2011/3/28

argc, argv 解析用法 argc 是指命令行輸入參數的個數 argv 存儲了所有的命令行參數#include<stdio.h>int main(int argc, char* argv[]){ printf(" 剛剛輸入了 %d 個指令 \n",argc); printf(" 剛剛輸入的指令為 : \n%s\n",argv[0]); return 0 ;}

如果在命令行運行一程式,運行命令為: hello.exe hello world那麼, argc 的值是 3, argv[0]是 "hello.exe", argv[1]是 "hello", argv[2]是 "world"

Page 8: 授課: ANT 日期: 2011/3/28
Page 9: 授課: ANT 日期: 2011/3/28

argc, argv 小應用 Q : 想要設計一個小程式,程式目的為”輸入一段文字到一個檔案裡”

命令列格式

Demo

Page 10: 授課: ANT 日期: 2011/3/28

下面為 Argc.c 的程式碼

Page 11: 授課: ANT 日期: 2011/3/28

函數的參數呼叫方式傳遞方式 說明

傳值呼叫(Call by Value) 將變數的值傳入函式,函式另外需要配置記

憶體儲存參數值,所以並不會變更呼叫變數

的值

傳址呼叫(Call by Reference) 將變數實際儲存的記憶體位置傳入,所以在

函數變更參數值,也會同時變動原呼叫的變

數值

Page 12: 授課: ANT 日期: 2011/3/28

基本指標 宣告 一變數 為 一指標, 該變數的值為一記憶体的地址,例如 int *ip;

ip 為 一變數,如果 ip 的值為 1000 ,那麼我們可以說 ip 指向記憶体其地址為 1000 。 "&" 是可當做取址運算子,用來表示 ( 或取得 ) 一變數的記憶体地址,例如 :

int *ip; int x; scanf("%d", &x); ip = &x;

&x 即變數 x 的記憶体地址,於 scanf("%d ", &x); 中,我們欲以輸入方式改變 x 的值,或以 x 存輸入值。 ip = &x; 即指標變數 ip 指向變數 x ,或 ip 的值為 x 的記憶体地址。

Page 13: 授課: ANT 日期: 2011/3/28
Page 14: 授課: ANT 日期: 2011/3/28

#include<stdio.h>#include<stdlib.h>void call_by_value(int b){ b = 200;}

void call_by_reference(int *b) //b 是一個指標{ *b = 200; //* 有”指向”的意思}int main(){ int a = 100; call_by_value(a); printf("call_by_value : %d\n",a); call_by_reference(&a); //將 a 的位址傳給 call_by_reference printf("call_by_reference : %d\n",a);}

Page 15: 授課: ANT 日期: 2011/3/28

C 程式過程

100

數值

a

b 200

Call by value

100

記憶體位址

a

指標變數b

Call by reference

100 a 的記憶體位址

Page 16: 授課: ANT 日期: 2011/3/28

回傳值到主程式#include<stdio.h>#include<stdlib.h>int divide(int a , int b ){ return(a/b);}int main(){ int var1 , var2 , result; printf(" 輸入被除數 : "); scanf("%d",&var1); printf(" 輸入除數 : "); scanf("%d",&var2); result = divide(var1 , var2); printf(" 相除結果是 %d \n",result); return 0 ;}

Page 17: 授課: ANT 日期: 2011/3/28

常用到的數學函數 #include <math.h> double pow(double x, double y) x 的 y 次方 double sqrt(double x) 求 x 的平方根 double fabs(double x) 求實數 x 的絕對值 int abs(int x) 求整數 x 的絕對值 int rand() 產生一個亂數 sin(x) x 以弧度解釋 cos(x) x 以弧度解釋 tan(x) x 以弧度解釋

Page 18: 授課: ANT 日期: 2011/3/28

Function Description Example

sqrt( x ) square root of x sqrt( 900.0 ) is 30.0

sqrt( 9.0 ) is 3.0 exp( x ) exponential function ex exp( 1.0 ) is 2.718282

exp( 2.0 ) is 7.389056

log( x ) natural logarithm of x (base e) log( 2.718282 ) is 1.0

log( 7.389056 ) is 2.0 log10( x ) logarithm of x (base 10) log10( 1.0 ) is 0.0

log10( 10.0 ) is 1.0 log10( 100.0 ) is 2.0

fabs( x ) absolute value of x fabs( 5.0 ) is 5.0

fabs( 0.0 ) is 0.0 fabs( -5.0 ) is 5.0

ceil( x ) rounds x to the smallest integer

not less than x ceil( 9.2 ) is 10.0 ceil( -9.8 ) is -9.0

Page 19: 授課: ANT 日期: 2011/3/28

Function Description Example

floor( x ) rounds x to the largest integer not greater than x

floor( 9.2 ) is 9.0

floor( -9.8 ) is -10.0 pow( x, y ) x raised to power y (xy) pow( 2, 7 ) is 128.0

pow( 9, .5 ) is 3.0 fmod( x, y ) remainder of x/y as a floating-

point number fmod( 13.657, 2.333 ) is 1.992

sin( x ) trigonometric sine of x

(x in radians) sin( 0.0 ) is 0.0

cos( x ) trigonometric cosine of x

(x in radians) cos( 0.0 ) is 1.0

tan( x ) trigonometric tangent of x

(x in radians) tan( 0.0 ) is 0.0

Page 20: 授課: ANT 日期: 2011/3/28

Sin(x) 使用範例

Page 21: 授課: ANT 日期: 2011/3/28

常用的字串函數 #include <string.h> int strcmp(char *s1,*s2) 字串比較 char *strcpy(char *dest, char *src) 字串拷貝 int strlen(char *s1) 字串長度 int atoi(char *s) 字串轉整數 gets(char *s) 讀取一字串 puts(char *s) 輸出一字串

Page 22: 授課: ANT 日期: 2011/3/28

常見的字元函數 tolower(ch) ch 轉成小寫 toupper(ch) ch 轉成大寫 islower(ch) ch 為小寫 ? isspace(ch) ch 為空白? isdigit(ch) ch 為數字? isalpnum(ch) ch 為文數字? getchar() 讀入一字元

Page 23: 授課: ANT 日期: 2011/3/28

字串函式使用範例

Page 24: 授課: ANT 日期: 2011/3/28

巨集指令 C 前置處理器的 #define 指令除了定義常數,事實上, #define 指令是巨集指令,可以定義新關鍵字或使用參數建立巨集函數。 #define 巨集指令的格式,如下所示:

#define 名稱 替換的內容#include <stdio.h>#define SQUARE(x) x*x // 自行宣告的巨集int main(){ printf("Square of 10 is %d\n", SQUARE(10)); return 0 ;}

Page 25: 授課: ANT 日期: 2011/3/28

Lab5 寫一個程式,可以讓 user 去選擇要計算的東西。分三種: 1. 面積 2. 數學式 3. 畫

sin 圖 計算面積的是矩形 ( 使用巨集指令 ) 。 計算數學式的有階層 ( 計算在副程式,結果在主程式印出 ) 。 畫圖型的動作 ( 在副程式執行 ) 。 限制 - 使用 switch 來做選擇,計算過程必須在副函式執行。

Page 26: 授課: ANT 日期: 2011/3/28

說明Switch(choice){

case 1:printf(“radius : ”);scanf(“%d”,input);circle();break;

case 2:…

case 3:…

}

Page 27: 授課: ANT 日期: 2011/3/28

Lab5

PS :矩形 -> 長寬,階層 -> 一個 N 值, sin 圖參考前面的投影片

Page 28: 授課: ANT 日期: 2011/3/28

HW05 寫一個會員查詢系統。 一開始程式執行會先作會員登入,在判定是否為會員後,如果不是就做會員新增的動作,如果是就進入會員系統。 其中登入者的身份需要分為、查詢會員、離開系統,並可做重新登入的動作。一般使用者及管理者,管理者登入後會有四種功能。分別為新增會員、刪除會員 一般使用者則只有兩種功能即查詢以及離開系統,離開後可做重新登入。 以上動作需要將變更後的會員資料,就是其名字以及相對應的密碼輸出至檔案。 作業限制 – 所有功能需 ( 新增、刪除、查詢 ) 要寫在副程式裡。

Page 29: 授課: ANT 日期: 2011/3/28

資料格式 一開始就有兩個檔案,分

別為 root.txt 以及 user.txt 作為資料比對用。內容請依照右圖。。

利用兩個檔案做資料比對以及新增、 刪除。

Root 只能改密碼。

Page 30: 授課: ANT 日期: 2011/3/28

模擬結果 可自行增加功能酌量加分,須註解 此為查詢

Page 31: 授課: ANT 日期: 2011/3/28

模擬結果 此為新增與刪除

Page 32: 授課: ANT 日期: 2011/3/28

作業提示 可利用以下函式幫助程式撰寫

字串比較字串轉整數讀取 / 輸出一字串開寫讀檔

作業繳交需要將 root.txt 以及 user.txt 一起放到壓縮檔裡。