星期二, 6月 16, 2009

20090604 C語言進階上課小記

*****************************20090604 陳惠堂********************************************
前端處理
#define
  • 定義一些資料
  • 定義字喜歡用大寫, 但非必定
  • 使用定義的方式 在編譯的時候就會產生效果, 而不是在執行的時候產生效果
  • 方便日後修改程式的時候識別
  • 用來修改常數很好用, 否則以後常數要修改會很麻煩
語法
#define 定義字 資料
#define 定義字 簡單函數
Lab: define
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//定義 PI 為3.14 在編譯的時候就產生效果
#define PI 3.14

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


//所以 以下 的 PI 已經都變成 3.14 了
float r,a,l;

printf("Enter circle radius:");
scanf("%f",&r);

a = PI*r*r;
l = 2*PI*r;
printf("Area=%f\nlength=%f\n",a,l);

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

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

//定義 PI 為3.14 在編譯的時候就產生效果
#define PI 3.14

//宣告 函式 area
float area(float);

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


//所以 以下 的 PI 已經都變成 3.14 了
float r,a,l;

printf("Enter circle radius:");
scanf("%f",&r);

a = area(r);
l = 2*PI*r;
printf("Area=%f\nlength=%f\n",a,l);


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

// area 為 PI * r * r
float area( float r)
{
return PI * r *r;

}
Lab: 利用 define 來定義簡單函數(進化版)
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//定義 PI 為3.14 在編譯的時候就產生效果
#define PI 3.14
#define area(r) PI*r*r
#define len(r) 2*PI*r

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


//所以 以下 的 PI 已經都變成 3.14 了
float r,a,l;

printf("Enter circle radius:");
scanf("%f",&r);

a = area(r);
l = len(r);
printf("Area=%f\nlength=%f\n",a,l);

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

Lab: 利用 define 來定義簡單函數(進化版)
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//定義 PI 為3.14 在編譯的時候就產生效果
#define PI 3.14

//define 函數括號內的 值是用代換的(change),

//所以下面雖然寫的是 radius, 所以帶進來 area的時候

//area(r) 就會變成 area(radius) PI*radius*radius
#define area(r) PI*r*r
#define len(r) 2*PI*r

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


//所以 以下 的 PI 已經都變成 3.14 了
float radius,a,l;

printf("Enter circle radius:");
scanf("%f",&radius);

a = area(radius);
l = len(radius);
printf("Area=%f\nlength=%f\n",a,l);

system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內
return 0
;
}
*三元運算
語法
(條件? 值1:值2)
  • 當符合條件時 傳回 值1
  • 當不符合條件時, 則傳回值2
也可以 以巢狀的方式撰寫
例如
(n1>n2?(n1>n3?n1:n3):(n2>n3?n2:n3))
Lab: 三元運算
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

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


int n1,n2,n;
n1=10;
n2=20;
n=(n1>n2?n1:n2);
printf("n=%d\n",n);

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

Lab: 使用define + 三元運算
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//使用三元運算的定義

#define max(n1,n2) (n1>n2?n1:n2)

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


int n1,n2,n;
n1=10;
n2=20;
n= max(n1,n2);
printf("n=%d\n",n);

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

*Header 裡面除了可以函數宣告, 也可以放define
Lab:
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"
//定義 sum
#define sum(x,y) x+y
//進入主程式
int main()
{


int x,y,c;
x=7;
y=6;

//因為在編譯的時候就會取代
//所以會變成 c = x+y*10
// c = 7 + 6 *10 先乘除後加減 c= 67

c = sum(x,y) *10;
//如果要避免 上述的情形, 建議上面的define 要換成
//define sum(x,y) (x+y) 才可以避免
printf("c=%d\n",c);

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

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

//因為要使用 getch() 所以要#include "conio.h"
#include "conio.h"

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


char ch;
//除了按 ESC 以外都繼續執行 27 為 ESC
while((ch = getch()) != 27)
printf("%c\n",ch);

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

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

//因為要使用 getch() 所以要#include "conio.h"
#include "conio.h"

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


char ch;
//除了按 ESC 以外都繼續執行 27 為 ESC
while((ch = getch()) != 27)
//使用 %d 列出整數 看鍵盤的內碼, 特殊按紐都是2個值

//例如 上下左右 遊標 控制鍵 第一碼都是 -32 F1 ~ F12 第一碼 都是 0
//所以可以利用這個原理判斷 使用者是不是輸入特殊按紐

printf("%d\n",ch);

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

Lab: 顯示內碼, 及特殊按鈕
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//因為要使用 getch() 所以要#include "conio.h"
#include "conio.h"

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

//多一個 ch2
char ch,ch2;
//除了按 ESC 以外都繼續執行 27 為 ESC
while((ch = getch()) != 27)
//使用 %d 列出整數 看鍵盤的內碼, 特殊按紐都是2個值

//例如 上下左右 遊標 控制鍵 第一碼都是 -32 F1 ~ F12 第一碼 都是 0
//所以可以利用這個原理判斷 使用者是不是輸入特殊按紐

{

//利用特殊鍵 都會小於等於 0 來判斷是否為特殊鍵
if (ch <= 0)
{
ch2 = getch();
printf("ch2=%d\t",ch2);
}
printf("%d\n",ch);
}


system("pause"); //執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內
return 0
;
}
*switch
  • 使用等於的方式來比對
語法
switch(運算式)
{
case 值1 :敘述1;
break;
case 值2 :敘述2;
break;
case 值n :敘述n;
break;
default :敘述;
}
Lab:
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

//因為要使用 getch() 所以要#include "conio.h"
#include "conio.h"

#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77

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


char key;
char ch;

//如果沒有按 ESC 就繼續
while ((key=getch()) != 27)
{
//利用特殊鍵 都會小於等於 0 來判斷是否為特殊鍵
if(key <= 0)
{
key=getch();
switch(key)
{

//判斷上下左右的內碼 並定義 ch
case UP :ch=24;
break;
case DOWN :ch=25;
break;
case LEFT :ch=27;
break;
case RIGHT :ch=26;
break;
default : ch = 1;

}

//將傳的的內碼 也就是按的特殊鍵 列印出來
printf("%c\n",ch);
}

}

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


沒有留言: