星期二, 6月 16, 2009

20090602 C語言上課小記

************************20090602 陳惠堂 **************************
*function
函數(式)

使用function的原因
  • 程式太大
  • 程式模組化

語法
類型名稱 函數名稱 (引數) { 敘述 }

開啟專案的原因是會編輯不只一個程式

每個function 都是獨立的, 所以不會有 function包含function

函數必須要下型別名稱
程式的編譯是由上到下

所以函數要先宣告, 然後實作, 呼叫




Lab:
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"


//因為把 函數放在主程式的下方 所以要先宣告
void repeat();



//進入主程式
int main()
{


//呼叫 repeat
repeat();
printf("*Welcome to Dev C++*\n");
repeat();

system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內
return 0
;
}

//建立一個 function repeat void repeat() { //列印 20個 * for(int i=0;i<20;i++) printf("*"); //執行完 for 換行 printf("\n"); }





Lab:使用專案
開啟一個 C++的專案(console application)
然後準備兩個 原始碼

檔案:2009060201.cpp

// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //因為把 函數放在主程式的下方 所以要先宣告 void repeat(); //進入主程式 int main() { //呼叫 repeat repeat(); printf("*Welcome to Dev C++*\n"); repeat(); system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }


檔案:2009060202-repeat.cpp
// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //建立一個 function repeat void repeat() { //列印 20個 * for(int i=0;i<20;i++) printf("*"); //執行完 for 換行 printf("\n"); }

在專案1(包含兩個 source: 2009060201.cpp 及 2009060202-repeat.cpp)
  • 刪除原來的main.cpp
  • 將上面兩個 原始碼(cpp) 加入到專案(於專案1上面按滑鼠右鍵 --> 將檔案加入專案)
  • 嘗試編譯 --> 成功. 因為專案是會編譯所有的 source code
  • 每一個source code 的include 都是獨立的

以上的 repeat 不夠強,所以作一些修改
修改如下(紅色的部分)

----------------------------檔案:2009060201.cpp-----------------------------------
// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //因為把 函數放在主程式的下方 所以要先宣告 // 因為 改過 repeat 所以要宣告 void repeat(int,char); //進入主程式 int main() { //呼叫 repeat 給傳入值 30 內容為後面帶的字元 repeat(30, '@');
system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }
----------------------------檔案:2009060202-repeat.cpp----------------------------- // include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //建立一個 function repeat // 宣告 整數int 傳入值 n 字元 傳入值 ch void repeat(int n,char ch) { //列印 n個 * 由傳入值決定 for(int i=0;i<n;i++) //列印 ch 的內容 printf("%c",ch); //執行完 for 換行 printf("\n"); }

**為何要 include?
  • 因為要做函數的宣告


另外一種想法: 可以事先儲值

----------------------------檔案:2009060201.cpp-----------------------------------

// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //因為把 函數放在主程式的下方 所以要先宣告 // 因為 改過 repeat 所以要宣告, 可以事先儲值 int=20 或是 char的字元是 *
//如果使用者沒有輸入就會利用 事先的儲值
//只適用於 C++, C and Java 沒有
void repeat(int=20,char='*'); //進入主程式 int main() { //呼叫 repeat 給傳入值 30 內容為後面帶的字元 repeat(); system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }


如果是要讓其他的語言可以使用
或是使用物件導向的寫法可以寫成下列


----------------------------檔案:2009060202-repeat.cpp-----------------------------
// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //因為把 函數放在主程式的下方 所以要先宣告 // 因為 改過 repeat 所以要宣告 //因為 有三個讀立的 function 所以三個都要宣告 //物件導向的寫法 void repeat(); void repeat(int); void repeat(int,char); //進入主程式 int main() { //呼叫 repeat 給傳入值 30 內容為後面帶的字元 repeat(); system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }


----------------------------檔案:2009060201.cpp-----------------------------------
// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //定義三個獨立的function //建立一個 function repeat // 宣告 整數int 傳入值 n 字元 傳入值 ch void repeat() { //列印 n個 * 由傳入值決定 for(int i=0;i<20;i++) //列印 ch 的內容 printf("*"); //執行完 for 換行 printf("\n"); } void repeat(int n) { //列印 n個 * 由傳入值決定 for(int i=0;i<n;i++) //列印 ch 的內容 printf("*"); //執行完 for 換行 printf("\n"); } void repeat(int n,char ch) { //列印 n個 * 由傳入值決定 for(int i=0;i<n;i++) //列印 ch 的內容 printf("%c",ch); //執行完 for 換行 printf("\n"); }

以上先有印象就好

Lab: 建立 Header
於專案內新增一個檔案
內容為
//因為把 函數放在主程式的下方 所以要先宣告 // 因為 改過 repeat 所以要宣告 //因為 有三個讀立的 function 所以三個都要宣告 void repeat(); void repeat(int); void repeat(int,char);

儲存為 me 的Head file

修改
----------------------------檔案:2009060201.cpp-----------------------------------

// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" #include "me.h" //進入主程式 int main() { //呼叫 repeat 給傳入值 30 內容為後面帶的字元 repeat(30, '@'); system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }


**在include 的時候 < > 與 " " 的差別
  • < > 角括號 只包含系統的路徑變數
  • " " 雙引號 包含系統的路徑變數 + 現行目錄的路徑



**類型名稱 void
  • 沒有傳回值


Lab: 建立兩個 function 來計算 面積還有容積
專案1目前包含 2009060201.cpp 2009060202-repeat.cpp me.h

----------------------------檔案:2009060201.cpp-----------------------------------
// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" #include "me.h" //進入主程式 int main() { //呼叫 repeat 給傳入值 30 內容為後面帶的字元 repeat(30, '*'); //列印出 area 的傳回值, area 傳入 10 當傳入值 printf("area=%f \n\n",area(10)); //列印出 vol的傳回值, vol 傳入 高度 20 還有 半徑10 printf("vol=%f \n",vol(20,10)); //呼叫 repeat 給傳入值 30 內容為後面帶的字元 repeat(30, '*'); system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }



----------------------------檔案:2009060202-repeat.cpp-----------------------------

// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h #include "stdio.h" #include "stdlib.h" //定義三個獨立的function //建立一個 function repeat // 宣告 整數int 傳入值 n 字元 傳入值 ch void repeat() { //列印 n個 * 由傳入值決定 for(int i=0;i<20;i++) //列印 ch 的內容 printf("*"); //執行完 for 換行 printf("\n"); } void repeat(int n) { //列印 n個 * 由傳入值決定 for(int i=0;i<n;i++) //列印 ch 的內容 printf("*"); //執行完 for 換行 printf("\n"); } void repeat(int n,char ch) { //列印 n個 * 由傳入值決定 for(int i=0;i<n;i++) //列印 ch 的內容 printf("%c",ch); //執行完 for 換行 printf("\n"); } //定義一個 function area 為浮點數 radius 為半徑 // area 內有 radius 的傳入值 float area(float radius) { float a; //a 為面積 = 3.14 *radius *radius a=3.14 *radius *radius; return a; } //定義一個 function vol 來算容積 float vol(float height,float radius) { float v; //在function 內呼叫另一個 function area // v 為容積= 面積 * 高度 v=area(radius) *height; return v; }





----------------------------檔案:me.h-----------------------------------------------
//因為把 函數放在主程式的下方 所以要先宣告 // 因為 改過 repeat 所以要宣告 //因為 有三個讀立的 function 所以三個都要宣告 void repeat(); void repeat(int); void repeat(int,char); //宣告 剛定義的 area 算面積用 float area(float); //宣告 剛定義的 vol 算容積用 float vol(float,float);



**變數**
  • 全域性變數
  • 區域性變數
  • 全域性變數或是區域性變數宣告的位置來決定
  • 初學者區域性變數儘量多用, 全域性變數少用



Lab: 全域變數
// include 引入 .h (標頭檔) // header .h 要放在程式的最前面 // 引入 stdio.h 及 stdlib.h
#include "stdio.h" #include "stdlib.h"

//定義一個 整數 a 使用的想法為全域變數
int a; void sub() { a+=5; } //進入主程式 int main() { a=10; printf("a=%d\n",a); //因為 a 為全域變數, 會備 sub() 使用 a=10+5=15 sub(); printf("a=%d\n",a); system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內 return 0; }




***************************************************************

1 則留言:

JANE 提到...

我可以自己建立一個標頭檔嗎?然後在主程式時叫出來用就好

還是你要看看我寫的?