星期二, 6月 16, 2009

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



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

沒有留言: