11/25 計程實習課
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 PresentationTRANSCRIPT
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) 是一組相同型態的連續變數,它們使用同一個變數名稱,而另外用一個索引值來指定使用第幾個變數,在 C 語言中要宣告一個陣列,可以使用下面的語法:
變數型態 陣列名稱 [ 元素個數 ];
例如: int s[100]; 宣告 s 是一個 int 的陣列,它有 100 個元素,分別
是 s[0] 、 s[1] 、 s[2] 、 ... 、 s[99] ,特別注意的是它的索引值是從 0 開始到 99 , 而非 1 到 100 。
Array 陣列
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]
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)
二維陣列
二 維 陣 列 的 宣 告 方 式 如 下 所 述 : 陣列的名稱 [ 列陣列的大小 ][ 行陣列大小 ] ;
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 陣列的名稱 [ 陣列的大小 ] ; char 陣列的名稱 [ 列陣列的大小 ][ 行陣列大小 ]
;
For example: char array1 [ 10 ] ; char array2 [ 5 ][ 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 表 示 此 字 元 陣 列 的 結 束 , 所 以 我 們 不 需 自 行 加 入 .
字元陣列
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 碼
也就是說,其實字元也是一個數字,因此也可以拿來做加減乘除等四則運算
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 碼值
字串就是一段文字,我們可以用一對雙引號 " 把該段文字夾起來。
在 scanf 及 printf 讀入及印出一個字串則是使用 %s 。
由於 C 語言中並沒有字串的變數型態,而是用字元的陣列來儲存一個字串,例如:
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 的內容複製到 s1strcmp(s1, s2) 比較 s1 、 s2 的內容,如果相等傳回 0strcat(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 。
假設你是情報軍,要快速編碼及解碼美軍的訊息,希望完成一個程式,第一個字元為 + 代表要編碼,第一個字元為 - 代表要解碼,程式執行如下 (紅色為輸入、淺藍色為輸出 ):
+FIREHKTG-UVQRSTOP