函數 授課:ANT 日期:2009/3/24
自訂函數 使用函數的目的:可以利用模組化來簡化主程式。 要自訂函數需要注意的地方:函數的宣告、引數的使用、函數的主題以及傳回值。 為什麼要使用函數,若當我們的程式需要重複使用到某一個功能時我們只要寫一遍就可以不需要重複的寫 還有可以讓整個程式的可讀性變高
宣告方式 void functionName(variable1, variable2) 函數的屬性 函數傳入的值 函數的名稱
#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");
程式的執行流程圖 int main(){ line(); 第一步 printf(“我剛呼叫了什麼\n"); system("pause"); return 0; } 第一步 第二步 第三步 void line(void){ printf("----分隔線----\n"); return; } 第四步
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"
函數的參數呼叫方式
基本指標 宣告 一變數 為 一指標, 該變數的值為一記憶体的地址,例如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的記憶体地址。
#include<stdio.h> #include<stdlib.h> void call_by_value(int b) { b = 200; } void call_by_reference(int *b) *b = 200; int main() int a = 100; call_by_value(a); printf("call_by_value : %d\n",a); call_by_reference(&a); printf("call_by_reference : %d\n",a); 一開始,設定變數 a 的值為100 接著 往副程式 call_by_value 傳送參數 a 的值到副程式去 副程式 call_by_value 另外用一個記憶體位址 b 來儲存 a 的值 同時改變變數 b 的值,但是沒有做回傳動作,故回到主程式後,主程式列印出變數 a 的值依然會是 100 接續著是往副程式call_by_reference傳送參數 a 的位址到副程式去, 由於副程式在宣告時事先宣告一個指標變數(上一個投影片友介紹了),故其變數內容所存的會是位址, 副程式call_by_reference另外使用一個指標變數,儲存a的記憶體位址, 而副程式 *b 是取 b 所指記憶体位址上的值,也就是 a 的位址上的值 *b = 200 的動作則是將 a 的位址上的值修改為 200 因此做完這些動作後回到了主程式(main) 印出變數 a 的值也就是被改成 200 了。
C程式過程 200 200 Call by value Call by reference a 100 100 a 的記憶體位址 100 a Call_by_value - 我們一開始會有宣告一個A記憶體位置來存100,之後呼叫到副函式 程式會在記憶體另外的位置B 複製A的東西過去。 進入副函式 執行的時候把B位置的值改成200 再回到 主程式 ,這時候A是沒有被改變到的 改變到的是B位置的值 所以A的值還是100。 Call_by_reference - 他是把B這個指標只到A的位址 再去修改掉B只到的位址裡面的值100 - > 200了 所以A才會變成200 b 數值 200 記憶體位址 指標變數b *b = 200 則是將 200
回傳值到主程式 #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 ;
常用到的數學函數 #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以弧度解釋 一般都必須要先載入 math.h
Sin(x)使用範例 #include<stdio.h> #include<stdlib.h> #include<math.h> #define pi 3.141596 int main() { double var1 , var2 ; double result; for(var1 = 0.0 ; var1 < (pi/2) ; var1+=0.05) result = 20*sin(var1); for(var2 = 0 ; var2 < result ; var2+=0.259) printf(" "); } printf("*\n"); return 0 ;
常用的字串函數 #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) 輸出一字串 strcmp 比較字串 就是在比較s1與s2兩個字串是否相同 可以用在猜字遊戲上 strcpy 把後面的字串拷貝給前面
常見的字元函數 tolower(ch) ch轉成小寫 toupper(ch) ch轉成大寫 islower(ch) ch 為小寫? isspace(ch) ch 為空白? isdigit(ch) ch 為數字? isalpnum(ch) ch 為文數字? getchar() 讀入一字元
字串函式使用範例
巨集指令 C前置處理器的#define指令除了定義常數,事實上,#define指令是巨集指令,可以定義新關鍵字或使用參數建立巨集函數。 #include <stdio.h> #define SQUARE(x) x*x //自行宣告的巨集 int main() { printf("Square of 10 is %d\n", SQUARE(10)); return 0 ; }
Lab4 寫一個程式,可以讓user去選擇要計算的東西。分兩種:1. 面積 2. 數學式 3.畫sin圖 計算面積的是矩形(使用巨集指令)。 計算數學式的有階層 (計算在副程式,結果在主程式印出)。 畫圖型的動作(在副程式執行)。 限制- 使用switch來做選擇,計算過程必須在副函式執行。
說明 Switch(choice){ case 1: printf(“radius : ”); scanf(“%d”,input); circle(); break; case 2: … case 3: }
Lab4 PS:矩形-> 長寬,階層->一個N值,sin圖參考前面的投影片
HW04 寫一個會員查詢系統。 作業限制 – 所有功能需(新增、刪除、查詢)要寫在副程式裡。 一開始程式執行會先作會員登入,在判定是否為會員後,如果不是就做會員新增的動作,如果是就進入會員系統。 其中登入者的身份需要分為一般使用者及管理者,管理者登入後會有四種功能。分別為新增會員、刪除會員、查詢會員、離開系統,並可做重新登入的動作。 一般使用者則只有兩種功能即查詢以及離開系統,離開後可做重新登入。 以上動作需要將變更後的會員資料,就是其名字以及相對應的密碼輸出至檔案。 作業限制 – 所有功能需(新增、刪除、查詢)要寫在副程式裡。
資料格式 一開始就有兩個檔案,分 別為root.txt以及user.txt作為 資料比對用。內容請依照右 圖。。 利用兩個檔案做資料比對以 及新增、 刪除。 Root只能改密碼。
模擬結果 可自行增加功能酌量加分,須註解 此為查詢
模擬結果 此為新增與刪除
作業提示 作業繳交需要將root.txt以及user.txt一起放到壓縮檔裡。 可利用以下函式幫助程式撰寫 字串比較 字串轉整數 讀取/輸出一字串 開寫讀檔 作業繳交需要將root.txt以及user.txt一起放到壓縮檔裡。