11/25 計程實習課

17
Speaker: Wen-Ching Lo

Upload: myrna

Post on 27-Jan-2016

89 views

Category:

Documents


3 download

DESCRIPTION

11/25 計程實習課. Speaker: Wen-Ching Lo. 在討論陣列是什麼之前,我們先來看一個問題,假設我們要連續輸入 5 個人的成績,然後再印出,這個程式可以寫成:. #include void main() {  int a1, a2, a3, a4, a5;  scanf("%d",&a1);  scanf("%d",&a2);  scanf("%d",&a3);  scanf("%d",&a4); scanf("%d",&a5); printf("%d\n",a5); - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 11/25 計程實習課

Speaker: Wen-Ching Lo

Page 2: 11/25 計程實習課

在討論陣列是什麼之前,我們先來看一個問題,假設我們要連續輸入 5 個人的成績,然後再印出,這個程式可以寫成:#include <stdio.h>void main(){  int a1, a2, a3, a4, a5;  scanf("%d",&a1);  scanf("%d",&a2);

 scanf("%d",&a3);  scanf("%d",&a4);

scanf("%d",&a5);printf("%d\n",a5);

  printf("%d\n",a4);  printf("%d\n",a3);  printf("%d\n",a2);  printf("%d\n",a1);}

Page 3: 11/25 計程實習課

陣列 (Array) 是一組相同型態的連續變數,它們使用同一個變數名稱,而另外用一個索引值來指定使用第幾個變數,在 C 語言中要宣告一個陣列,可以使用下面的語法:

變數型態 陣列名稱 [ 元素個數 ];

例如: int s[100]; 宣告 s 是一個 int 的陣列,它有 100 個元素,分別

是 s[0] 、 s[1] 、 s[2] 、 ... 、 s[99] ,特別注意的是它的索引值是從 0 開始到 99 , 而非 1 到 100 。

Array 陣列

Page 4: 11/25 計程實習課

Array 陣列

陣列的記憶體觀念

int a[5]={10,20,30,40,50};

100x300

200x302

300x304

400x306

500x308

a a[0]

a[1]

a[2]

a[3]

a[4]

Page 5: 11/25 計程實習課

Array 陣列

陣列的記憶體觀念

1100x300

1200x302

1300x304

1400x306

1500x308

a a[0]

a[1]

a[2]

a[3]

a[4]

For(i=0 ; i<5 ; i++) a[i] += 100;

LOAD (300+i*2)ADD #100 STORE (300+i*2)

Page 6: 11/25 計程實習課

二維陣列

二 維 陣 列 的 宣 告 方 式 如 下 所 述 : 陣列的名稱 [ 列陣列的大小 ][ 行陣列大小 ] ; 

For example: int array1 [ 10 ][ 20 ] ; float array2 [ 5 ][ 25 ] ; char array3 [ 100 ][ 50 ] ;

Page 7: 11/25 計程實習課

宣 告 陣 列 的 位 置 為 程 式 之 最 上 端二 維 陣 列 的 排 列 結 構 如 下 圖 所 述 . 我 們 舉 例 一

陣 列 名 叫 A 的 陣 列 , 其 列 陣 列 大 小 有 m 個 , 行 陣 列 大 小 有 n 個 , 即 為 A[m][n] .

行 列 A[0][0] A[0][1] A[0][2] ...... A[0][n-1]

A[1][0] A[1][1] A[1][2] ...... A[1][n-1]

A[2][0] A[2][1] A[2][2] ...... A[2][n-1]

. . . . .

. . . . .

A[m-1][0] A[m-1][1] A[m-1][2] A[m-1][n-1]

二維陣列

Page 8: 11/25 計程實習課

字 元 陣 列 的 宣 告 方 式 如 下 所 述 : char 陣列的名稱 [ 陣列的大小 ] ; char 陣列的名稱 [ 列陣列的大小 ][ 行陣列大小 ]

For example: char array1 [ 10 ] ; char array2 [ 5 ][ 25 ] ;

字元陣列

Page 9: 11/25 計程實習課

例一 : char string[6]={'A','B','C','D','E','\0'}; 

char string1[2][6]={ {'A','B','C','D','E','\0'},{'F','G','H','I','J','\0'} }; 

例二 : char string[5]="ABCDE";  char string1[2][5]={ "ABCDE","FGHIJ" };

如 果 字 元 陣 列 以 字 元 的 方 式 來 存 取 陣 列 , 則 須 加 結 束 字 元 \0 於 陣 列 的 最 末 端 , 表 示 此 字 元 陣 列 的 結 束

如 果 字 元 陣 列 以 字 串 的 方 式 來 存 取 陣 列 , 則 C 編 譯 器 會 自 動 在 字 串 最 末 端 加 上 結 束 字 元 \0 表 示 此 字 元 陣 列 的 結 束 , 所 以 我 們 不 需 自 行 加 入 .

字元陣列

Page 10: 11/25 計程實習課

Example:#include < stdio.h >void main(void){ char string1[5]={'A','B','C','D','E'}; char string2[6]={'A','B','C','D','E','\0'};char string3[6]="ABCDE\0";char string4[5]="ABCDE";printf("string1 = \"%s\"\n",string1);printf("string2 = \"%s\"\n",string2);printf("string3 = \"%s\"\n",string3);printf("string4 = \"%s\"\n",string4);}

執 行 結 果 :string1="ABCDE?ABCDE“string2 = "ABCDE" string3 = "ABCDE" string4 = "ABCDE"

字元陣列

Page 11: 11/25 計程實習課

在 C 語言中也有一些特殊字元,通常以反斜線 \ 開頭:'\0'     空字元,用於字串的結束'\n'    New Line ,換行符號'\r'    Carriage Return ,回歸鍵 (即 Enter 鍵 )'\t'    Tab ,跳格'\b'    Backspace ,倒退鍵'\a'    Bell ,嗶一聲'\\'     反斜線 \'\''     單引號 ''\"'     雙引號 "

Page 12: 11/25 計程實習課

ASCII 與字元關係事實上,字元在電腦中是以一個八位元的整數來儲存(即 1 Byte) ,而這個符號與數字的對應關係我們稱為 ASCII 碼

也就是說,其實字元也是一個數字,因此也可以拿來做加減乘除等四則運算

Page 13: 11/25 計程實習課

Examplechar c='a'; c=c+3; printf("%c", c);上面的例子會印出字元 dchar c;

 for(c='A'; c<='Z'; c++)printf("%c %d\n", c, c);

上面的程式可以印出 A 到 Z 及它們的 ASCII 碼值

Page 14: 11/25 計程實習課

字串就是一段文字,我們可以用一對雙引號 " 把該段文字夾起來。

在 scanf 及 printf 讀入及印出一個字串則是使用 %s 。

由於 C 語言中並沒有字串的變數型態,而是用字元的陣列來儲存一個字串,例如:

char s[20], t[20]=“NCCU";scanf("%s", s);printf("%s", s);

字串

•在宣告字串的時候要注意它的長度,以免位數不夠造成程式錯誤。

•事實上,每個字串後面都有一個 '\0' 的字元,也就是說“ NCCU" 字串,事實上總共用了 5 Bytes ,這一點要特別注意。

•另外,由於 s 本身就是這個字元陣列的位址,所以在 scanf 裡我們不需要加上 & 符號。

Page 15: 11/25 計程實習課

不過,用 scanf 讀取字串時,遇到空白字元便會結束,例如輸入 "Hello! NCCU!" ,則讀進來的字串只有 "Hello!" 而已。

為了避免這個情況,我們再介紹兩個函數 gets 、 puts (也是定義在 stdio.h) , gets 的功能是讀入字串,而 puts 則是印出字串:gets(s);puts(s);

字串

Page 16: 11/25 計程實習課

另外如果我們要做字串的比對、字串串接、字串長度等功能,沒有運算子可以使用,故必須使用函數來處理。和字串相關的函數都是定義在 string.h 中,常用的字串函數如下:

strcpy(s1, s2)     將 s2 的內容複製到 s1strcmp(s1, s2)     比較 s1 、 s2 的內容,如果相等傳回 0strcat(s1, s2)     將 s2 串接到 s1 後面strstr(s1, s2)     傳回 s2 字串在 s1 字串中第一次出現的位

置strlen(s1)     傳回 s1 的長度 (不含 '\0' 字元 )strrev(s1)     將 s1 字串倒置

字串

Page 17: 11/25 計程實習課

練習題 ( 編碼問題 ) 美軍編碼規則如下:將訊息每個字母往後推兩位再傳出去,

例如 A→C 、 B→D ,而後面的 Y→A 、 Z→B ,所有的訊息都是大寫字母。而收到訊息的則是將每個字母往前推兩位,例如 C→A 、 D→B ,而前面的 A→Y 、 B→Z 。

假設你是情報軍,要快速編碼及解碼美軍的訊息,希望完成一個程式,第一個字元為 + 代表要編碼,第一個字元為 - 代表要解碼,程式執行如下 (紅色為輸入、淺藍色為輸出 ):

+FIREHKTG-UVQRSTOP