星期日, 6月 28, 2009

Study Area 六月份活動 ~ 與openSUSE 來個夏日約會

與openSUSE來個夏日約會

活動簡報如下




很開心 下雨天還是有朋友來參與活動
下次來講YaST

^^

星期五, 6月 26, 2009

openSUSE Weekly News 繁體中文翻譯小組啟動

活動訊息

openSUSE Weekly News 繁體中文翻譯小組啟動

要參加 openSUSE 每週新聞翻譯小組或閱讀最新一期的 openSUSE 每週新聞,請造訪

openSUSE_Weekly_News

與 openSUSE 來個夏日約會 (06/27)

活動內容與報名網址:

http://registrano.com/events/sataipei200906

星期六, 6月 20, 2009

wget 使用小記

最近由於有新課程要導入
所以就開始抓新的課程資料
但是抓 iso檔案或是相關文件
有時候會耗費很多時間
這個時候就可以使用 wget 來抓相關的檔案

使用的方式
先編輯 一個檔案 存放 要抓的檔案的 URL
例如
#vi lab-URL
http://xxxxxxx檔案所在路徑xxxxxxxxxxx


上面這個檔案在建立的時候
可以利用前面加上 # 字號, 變成不符合規定的 http://路徑
來建立檔案說明


然後利用 wget 的指令抓取檔案(如果要下載的檔案需要使用者驗證)

例如:

#wget --http-user=使用者名稱 --http-password=使用者密碼 -c -i lab-URL

來下載檔案
上面的選項
-c 代表續傳
-i 代表使用檔案當成輸入的來源, 有助於批次處理

這樣下載就方便多了

enjoy it ~~

好用的螢幕畫筆軟體 gromit

在Windows 環境有一個小程式
名稱為 zoomit

可以在螢幕上面寫字
對於教學上非常方便

之前在compiz 上面有看到 annotate 這各plug-in
但是要啟動 compiz 才有所以覺得不方便

在網路上找到 之前 中壢國小 孫組長的文章
有提到 gromit 這個軟體
所以就上
http://software.opensuse.org/search

尋找 gromit 這個軟體
如果是使用 openSUSE 10.3 以後的版本
直接 one-click install就好

不然下載 rpm 來安裝也可以

如果要使用 src.rpm 來重新編譯
要記得 安裝 gtk2-devel 才可以安裝

enjoy it~~

星期四, 6月 18, 2009

20090618 C語言進階 上課小記

*****************************20090618 陳惠堂*********************************************
*struct
  • 一般寫在前面或是Header 內
  • 與Class的差異: 沒有method 的Class

struct 定義字
{
成員 member
};

struct Date
{
int year;
int month;
int day;
};



可以利用 sizeof() 來判斷大小

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


//struct 一般習慣寫在前面 或是 Header 裡面, 這樣才可以被大家利用
struct Date
{
int year;
int month;
int day;
};


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


//定義 a 並填入值
Date a={1992,12,3};
//將其列印出來 利用 a.定義 方式列印出來
printf("Date: %d-%d-%d\n",a.year,a.month,a.day);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}




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


//定義一個 struct
struct Stud
{
char no[4],name[20];
int vb,vc,java,sum;
};

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


//定義四個使用者 相關成績 填入的資料參考上面
Stud n[5]={
{"001","Jason",76,80,72},
{"002","Sampson",70,75,60},
{"003","ines",89,96,85},
{"004","sakana",80,78,82},
{"005","joe",70,60,80},
};
printf("size of n is %d\n",sizeof(n));
printf("size of stud is %d\n\n",sizeof(Stud));
Stud t;
//定義 s 算迴圈數量
int s=sizeof(n)/sizeof(Stud);
//將成績列印出來
for(int i=0; i<s ;i++)
{
n[i].sum = n[i].vb + n[i].vc + n[i].java;
//列出學號 姓名 VB成績
printf("%s\t%s\t%d\t",n[i].no,n[i].name,n[i].vb);
//列出 VC 成績 Java 成績 總合
printf("%d\t%d\t%d\n",n[i].vc,n[i].java,n[i].sum);
}
//使用泡沫排序法 排序
for(int i=0; i<s-1;i++)
{
for(int j=0; j<s-1;j++)
{
if(n[j].sum < n[j+1].sum)
{
t = n[j];
n[j] = n[j+1];
n[j+1] = t;
}
}
}
printf("\nAfter sort...\n\n");
//將其列印出來
for(int i=0; i<s ;i++)
{
//列出學號 姓名 VB成績
printf("%s\t%s\t%d\t",n[i].no,n[i].name,n[i].vb);
//列出 VC 成績 Java 成績 總合
printf("%d\t%d\t%d\n",n[i].vc,n[i].java,n[i].sum);
}



//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}




fopen(檔案,開啟模式)
  • 開啟模式
    • r read
    • a append
    • w write



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


//定義一個 struct
struct Stud
{
char no[4],name[20];
int vb,vc,java,sum;
};

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


//定義使用者 相關成績 填入的資料參考上面
Stud n={"001","Jason",76,80,72},*p;
p=&n;
//使用指標可以利用兩種方法
//這樣的寫法也可以 方法 1
// (*p).sum = (*p).vb + (*p).vc + (*p).java;
// 使用 箭頭 方法 2
p->sum=p->vb + p->vc + p->java;

printf("%s\t%s\t%d\t",n.no,n.name,n.vb);
printf("%d\t%d\t%d\n\n",n.vc,n.java,n.sum);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}




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

#include "conio.h"

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


FILE *fp;
fp = fopen("C:\\Data.txt","a\");
char ch;
while( (ch=getche() ) != 13)
{
//對象 大小 寫入筆數 寫入檔案
fwrite(&ch,sizeof(ch),1,fp);
}
fclose(fp);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}





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

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


FILE *fp;
fp = fopen("C:\\Data.txt","r");
char ch;
while(1)
{
fread(&ch,sizeof(ch),1,fp);
//當fp 檔案結束
if(feof(fp))
break;
else
printf("%c",ch);
}
fclose(fp);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}

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

星期二, 6月 16, 2009

20090616 C語言進階上課小記

*****************************20090616 陳惠堂*********************************************

指標 pointer
  • 裡面擺放的是位址, 不是擺放值
  • 通常對付 大傢伙
  • int *p;

*new 配置記憶體位址
語法
new 型別
new int;

傳送的方式
  • Call By Value 傳值
    • 只是換值(資料), 不是位址
  • Call By Reference 傳參考
    • 參考的是位址
    • 放在接的地方,(例如 Function 內)
  • Call By Address 傳址
    • 直接給位址



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

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


int x,y;
//宣告 swap, 因為寫在 main的後面 所以要先宣告
void swap(int a, int b);
x=5;
y=7;
printf("Before swap\n");
printf("x=%d\ty=%d\n\n",x,y);
//呼叫 swap 將兩個互相調換
printf("Call swap\n");
swap(x,y);
printf("After swap\n");
printf("x=%d\ty=%d\n",x,y);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


//使用swap function 來互相調換
void swap(int a,int b)
{
int t;
t = a;
a = b;
b = t;
printf("a=%d\tb=%d\n\n",a,b);
}




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

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


int x,y;
//宣告 swap, 因為寫在 main的後面 所以要先宣告
//宣告時使用 &a &b 所以是 Call by Reference 要的是位址
void swap(int &a, int &b);
x=5;
y=7;
printf("Before swap\n");
printf("x=%d\ty=%d\n\n",x,y);
//呼叫 swap 將兩個互相調換
printf("Call swap\n");
swap(x,y);
printf("After swap\n");
printf("x=%d\ty=%d\n",x,y);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


//使用swap function 來互相調換
// 使用 &a &b 使用 Call by Reference
void swap(int &a,int &b)
{
int t;
t = a;
a = b;
b = t;
printf("a=%d\tb=%d\n\n",a,b);
}



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

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


int x,y;
//宣告 swap, 因為寫在 main的後面 所以要先宣告
void swap(int *a, int *b);
x=5;
y=7;
printf("Before swap\n");
printf("x=%d\ty=%d\n\n",x,y);
//呼叫 swap 將兩個互相調換
printf("Call swap\n");
//告知swap 使用 Call By Address 的方式來處理
swap(&x,&y);
printf("After swap\n");
printf("x=%d\ty=%d\n",x,y);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


//使用swap function 來互相調換
//使用 指標來 接Call by Address
void swap(int *a,int *b)
{
int t;
t = *a;
*a = *b;
*b = t;
//會印出 a 還有b 的位址 所以不會是 5 and 7
printf("a=%x\tb=%x\n\n",a,b);
}


陣列名稱
  • 本身就是記憶體的位址
  • 第一個陣列的值


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


//宣告 sum 函數
int sum(int *n);

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


int n[]={1,2,3,4,5};
//列印出結果
printf("Sum=%d\n",sum(n));


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}


// 利用指標的方式 來承接
int sum(int *n)
{
int s=0;
// 利用 for 迴圈將 n陣列的值加總

for(int i=0;i<5;i++)
{
s+=*n++;
}
return s;
}



可以利用 const 宣告為常數(不能修改)



Lab:轉換英文小寫到大寫
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

void upper(char s[]);


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


char str[100];
printf("Enter String:");
gets(str);
upper(str);
printf("Transfer to Upper Case\n");
printf("%s\n",str);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



void upper(char s[])
{
int i=0;
while( s[i] != '\0')
{
//判斷是不是小寫的 a - z
if( s[i] >= 97 && s[i] <= 122)
s[i]-=32;
i++;
}



Lab:轉換英文小寫到大寫 以指標的方式
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

void upper(char *);


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


char str[100];
printf("Enter String:");
gets(str);
upper(str);
printf("Transfer to Upper Case\n");
printf("%s\n",str);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



void upper(char *s)
{
int i=0;
while( *s != '\0')
{
//判斷是不是小寫的 a - z
if( *s >= 97 && *s <= 122)
*s -= 32;
s++;
}

20090611 C語言進階 上課小記

*****************************20090611 陳惠堂*********************************************

多維陣列
  • 為何採用多維陣列不採取一維陣列? 因為索引值比較多,處理上較彈性
  • 多維陣列 就是陣列的陣列. 陣列內還有陣列.
  • 多維陣列的陣列長度只能 第一維陣列長度 省略, 但是其他不行(Java 的處理方式剛好相反)
  • 陣列是透過索引值存取資料

語法
int n[3][4];


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

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


//宣告多維陣列 (二維陣列)
//三個陣列, 每個陣列內有四個值
int n[3][4] = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
//利用 兩個for 將其列印出來
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
printf("%d\t",n[i][j]);
}
printf("\n");
}


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}





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

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


//亂數起始值
srand(time(0));
//p多維陣列 用來訂定 人 (有四個人各拿13張)
int n[SIZE],p[4][13],o=0;
for(int i=0;i<SIZE;i++)
{
n[i] = rand() %52;
//利用 for 迴圈
for(int j=0;j<i;j++)
{
//如果號碼一樣, 處理方式
if(n[i] == n[j])
{
i--;
//如果相等, 中斷程式for(int j=0;j<i;j++)
//不會中斷 for(int i=0;i<49;i++)
break;
}
}
}
//利用 for 洗牌
for(int i=0;i<13;i++)
{
for(int j=0;j<4;j++)
{
// j 代表人, i 代表張數
p[j][i] = n[o++];
}
}
//利用 for 列印出來
for(int i=0;i<4;i++)
{
printf("Player %d:\t",i+1);
for(int j=0;j<13;j++)
{
//第一個是撲克牌的花色 第二個是撲克牌的點數
printf("%c%d\t",p[i][j]/13+3,p[i][j]%13+1);
}
printf("\n\n");
}


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}




*陣列與函數的關係
  • 一般在處理陣列都是使用位址, 因為陣列都很大.
  • 下面的例子 sort(n); n 是陣列的名稱, 所以傳的是位址,故函數處理完是更新位址



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

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


//亂數起始值
srand(time(0));
int n[10];
//宣告sort 因為function是寫在後面, 所以要宣告
void sort(int n[]);
//利用for 填入陣列 n的值
for(int i=0;i<10;i++)
{
n[i] = rand() % 1000;
//列印出未排序前的陣列內容
printf("%d\t",n[i]);
}
//呼叫 sort 來排序
sort(n);
//列印出排序後字串
printf("\n Sort After ...\n");
//列印出排序後的陣列內容
for(int i=0;i<10;i++)
{
printf("%d\t",n[i]);
}


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



//注意 function 是獨立的不可以放在 main 主程式裡面
//交換排序法
void sort(int n[])
{
int t;
for(int a=0;a<9;a++)
{
for(int b=a+1;b<10;b++)
{
if(n[a] > n[b])
{
t = n[a];
n[a] = n[b];
n[b] = t;
}
}
}
}


*字串
  • 本身就是利用字元陣列做出來的
  • 字串跟字元陣列的差別在於
  • \0 代表字串結束符號, 如果使用 " " 代表字串

char name[20]

char name[ ] = "Jason";



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

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


//宣告一個字串 填入 Jason, " " 代表字串
char name[]="Jason";
printf("%s\n",name);
//以字元陣列的方式
char name2[]={'J','a','s','o','n'};
printf("%s\n",name2);
//以字串的方式 \0 代表 字串結束符號 佔一個字元
char name3[]={'J','a','s','o','n','\0'};
printf("%s\n",name3);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



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

//因為要使用 strcpy 來事後給陣列的值
#include "string.h"

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


//宣告一個字串 填入 Jason, " " 代表字串
char name[20];
//字串2 複製給字串1
strcpy(name,"jason");
printf("%s\n",name);


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



*strcmp 字串比對

strcmp(字串1,字串2)
  • 1 --> 字串1 > 字串2
  • 0 --> 字串1 = 字串2
  • -1 --> 字串1 < 字串2


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


//要使用 strcmp 所以呼叫 string.h
#include "string.h"
//要使用 getch 所以呼叫 conio.h
#include "conio.h"

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


char pass[100],ch;
int a=0;
printf("Enter your Password:");
//輸入Enter 鍵結束, 取得使用者的輸入值
while((ch=getch()) != 13)
{
printf("*");
pass[a++] = ch;
}
//多空一行
printf("\n");
//寫上字串結束代碼
pass[a]='\0';
//比對密碼
if(strcmp(pass,"12345") == 0)
printf("密碼正確....\n");
else
printf("密碼不正確..\n");


//執行系統內的 pause指令 暫停 宣告被寫在 stdlib.h 內

system("pause");

return 0;
}



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

20090609 C語言進階上課小記

*****************************20090609 陳惠堂*********************************************
陣列 Array
  • 同一個時間點輸入大量的資料
  • 只有一種型別, 不可以混合
  • array index 陣列索引值 n[0] 代表 n 的第一個元素, 第一個元素起始值為0
  • 陣列長度陣列索引值 必須是正值
  • 如果會給初值, 一般來說 不會指定陣列長度
  • 陣列名稱是位址, 也是常數. 不可以寫在 = 的左邊
  • 當有相同類型的資料, 要同時大量輸入的時候, 使用陣列來處理
  • 使用陣列的需求1 排序
語法
型別 陣列名稱[長度]
Lab: 輸入數字判斷大小
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

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


int n,max,max_t,min,min_t;
for(int i=1;i<=10;i++)
{
printf("No.%d:",i);
scanf("%d",&n);

//先給第一次的初始值
if(i==1)
{
max = min = n;
//記錄是第幾次輸入進去的
max_t=min_t=1;
}

//更新最大值
if(n>max)
{
max=n;
//記錄是第幾次輸入進去的
max_t=i;
}
//更新最小值
if(n<min)
{
min=n;
min_t=i;
}

}
printf("max=%d\t Times=%d\n",max,max_t);
printf("min=%d\t Times=%d\n",min,min_t);

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

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

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


//宣告陣列 n 長度為 10
int n[10]={1,2,3,4,5,6,7,8,9,10};

//利用 for 來列出 陣列的值
for(int i=0;i<10;i++)
printf("array n is %d\n",n[i]);

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

Lab: 利用 for 讓使用者填入陣列資料
// include 引入 .h (標頭檔)
// header .h 要放在程式的最前面
// 引入 stdio.h 及 stdlib.h
#include "stdio.h"
#include "stdlib.h"

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


int n[10];

//利用 for 迴圈 填入 陣列資料
for(int i=0;i<10;i++)
{
// i+1 不會影響 i 只是讓 user 看的
printf("NO.%d:",i+1);
//讓使用者輸入 陣列的值
scanf("%d",&n[i]);
}

//利用for 列印出來
for(int i=0;i<10;i++)
{
printf("array value is %d\n",n[i]);
}

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

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

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


//亂數起始值
srand(time(0));

int n[10],temp;

for(int i=0;i<10;i++)
{
//將rand 值除以 50 取餘數 加上 150
n[i] = rand() %50 + 150;
printf("Height=%d\n",n[i]);
}


//再利用 for 來跑9次 做所有的排序
//稱為 Bobble Sort 泡沫排序
for(int y=0;y<9;y++)
{
//利用 for 來比大小 做置換 swap 將第1個抓到定點
for(int x=0;x<9;x++)
{
if(n[x] < n[x+1])
{
temp = n[x];
n[x] = n[x+1];
n[x+1] = temp;
}
}
}

for(int i=0;i<10;i++)
{
printf("after sort = %d\n",n[i]);
}

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

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

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


//亂數起始值
srand(time(0));
int n[6];

for(int i=0;i<6;i++)
{
n[i] = rand() %49 + 1;

//利用 for 迴圈
for(int j=0;j<i;j++)
{
//如果號碼一樣, 處理方式
if(n[i] == n[j])
{
i--;
//如果相等, 中斷程式for(int j=0;j<i;j++)
//不會中斷 for(int i=0;i<49;i++)
break;
}
}



}


//利用 for 列印出來
for(int i=0;i<6;i++)
{
printf("lottery number is: %d\n",n[i]);
}

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

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

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
;
}