11/25計程實習課 Speaker: Wen-Ching Lo
在討論陣列是什麼之前,我們先來看一個問題,假設我們要連續輸入 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); }
Array 陣列 陣列(Array)是一組相同型態的連續變數,它們使用同一個變數名稱,而另外用一個索引值來指定使用第幾個變數,在 C 語言中要宣告一個陣列,可以使用下面的語法: 變數型態 陣列名稱[元素個數]; 例如:int s[100]; 宣告 s 是一個 int 的陣列,它有 100 個元素,分別是 s[0]、s[1]、s[2]、...、s[99],特別注意的是它的索引值是從 0 開始到 99, 而非 1 到 100。
Array 陣列 陣列的記憶體觀念 int a[5]={10,20,30,40,50}; a a[0] 0x300 10 0x302 20
Array 陣列 陣列的記憶體觀念 LOAD (300+i*2) ADD #100 STORE (300+i*2) For(i=0 ; i<5 ; i++) a[i] += 100; 110 0x300 120 0x302 130 0x304 140 0x306 150 0x308 a a[0] a[1] a[2] a[3] a[4]
二維陣列 二 維 陣 列 的 宣 告 方 式 如 下 所 述 : 陣列的名稱[ 列陣列的大小 ][ 行陣列大小 ] ; 陣列的名稱[ 列陣列的大小 ][ 行陣列大小 ] ; For example: int array1 [ 10 ][ 20 ] ; float array2 [ 5 ][ 25 ] ; char array3 [ 100 ][ 50 ] ;
二維陣列 宣 告 陣 列 的 位 置 為 程 式 之 最 上 端 二 維 陣 列 的 排 列 結 構 如 下 圖 所 述 . 我 們 舉 例 一 陣 列 名 叫 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]
字元陣列 字 元 陣 列 的 宣 告 方 式 如 下 所 述 : char 陣列的名稱 [ 陣列的大小 ] ; For example: char array1 [ 10 ] ; char array2 [ 5 ][ 25 ] ;
字元陣列 如 果 字 元 陣 列 以 字 元 的 方 式 來 存 取 陣 列 , 則 須 加 結 束 字 元 \0 於 陣 列 的 最 末 端 , 表 示 此 字 元 陣 列 的 結 束 例一 : 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" }; 如 果 字 元 陣 列 以 字 串 的 方 式 來 存 取 陣 列 , 則 C 編 譯 器 會 自 動 在 字 串 最 末 端 加 上 結 束 字 元 \0 表 示 此 字 元 陣 列 的 結 束 , 所 以 我 們 不 需 自 行 加 入 .
字元陣列 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"
在 C 語言中也有一些特殊字元,通常以反斜線 \ 開頭: '\0' 空字元,用於字串的結束 '\n' New Line,換行符號 '\r' Carriage Return,回歸鍵(即 Enter 鍵) '\t' Tab,跳格 '\b' Backspace,倒退鍵 '\a' Bell,嗶一聲 '\\' 反斜線 \ '\'' 單引號 ' '\"' 雙引號 "
ASCII與字元關係 事實上,字元在電腦中是以一個八位元的整數來儲存(即 1 Byte),而這個符號與數字的對應關係我們稱為 ASCII 碼 也就是說,其實字元也是一個數字,因此也可以拿來做加減乘除等四則運算
Example char c='a'; c=c+3; printf("%c", c); 上面的例子會印出字元 d char c; for(c='A'; c<='Z'; c++) printf("%c %d\n", c, c); 上面的程式可以印出 A 到 Z 及它們的 ASCII 碼值
字串 字串就是一段文字,我們可以用一對雙引號 " 把該段文字夾起來。 在 scanf 及 printf 讀入及印出一個字串則是使用 %s。 char s[20], t[20]=“NCCU"; scanf("%s", s); printf("%s", s); 在宣告字串的時候要注意它的長度,以免位數不夠造成程式錯誤。 事實上,每個字串後面都有一個 '\0' 的字元,也就是說“NCCU" 字串,事實上總共用了 5 Bytes,這一點要特別注意。 另外,由於 s 本身就是這個字元陣列的位址,所以在 scanf 裡我們不需要加上 & 符號。
字串 不過,用 scanf 讀取字串時,遇到空白字元便會結束,例如輸入 "Hello! NCCU!",則讀進來的字串只有 "Hello!" 而已。 為了避免這個情況,我們再介紹兩個函數 gets 、puts (也是定義在 stdio.h),gets 的功能是讀入字串,而 puts 則是印出字串: gets(s); puts(s);
字串 另外如果我們要做字串的比對、字串串接、字串長度等功能,沒有運算子可以使用,故必須使用函數來處理。和字串相關的函數都是定義在 string.h 中,常用的字串函數如下: strcpy(s1, s2) 將 s2 的內容複製到 s1 strcmp(s1, s2) 比較 s1、s2 的內容,如果相等傳回 0 strcat(s1, s2) 將 s2 串接到 s1 後面 strstr(s1, s2) 傳回 s2 字串在 s1字串中第一次出現的位置 strlen(s1) 傳回 s1 的長度(不含 '\0' 字元) strrev(s1) 將 s1 字串倒置
練習題(編碼問題) 美軍編碼規則如下:將訊息每個字母往後推兩位再傳出去,例如 A→C、B→D,而後面的 Y→A、Z→B,所有的訊息都是大寫字母。而收到訊息的則是將每個字母往前推兩位,例如 C→A、D→B,而前面的 A→Y、B→Z。 假設你是情報軍,要快速編碼及解碼美軍的訊息,希望完成一個程式,第一個字元為 + 代表要編碼,第一個字元為 - 代表要解碼,程式執行如下(紅色為輸入、淺藍色為輸出): +FIRE HKTG -UVQR STOP