27
複複 int count=8; int* pt=&count; // 複複 pt=&count, // 複複複 *pt=&count (*count)++; printf(“%d”,count); // 複複 9

int count=8; int* pt=&count; // 等於 pt=&count, // 不等於 *pt=&count

  • Upload
    bruno

  • View
    87

  • Download
    1

Embed Size (px)

DESCRIPTION

複習. int count=8; int* pt=&count; // 等於 pt=&count, // 不等於 *pt=&count (*count)++; printf(“%d”,count); // 得到 9. 複習. int i; int count[5]={1,2,3,4,5}; int* pt=count; // 等於 pt=count, // 不等於 *pt=count for(i=0;i

Citation preview

Page 1: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

複習int count=8;int* pt=&count; // 等於 pt=&count, // 不等於 *pt=&count(*count)++;printf(“%d”,count); // 得到 9

Page 2: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

複習int i;int count[5]={1,2,3,4,5};int* pt=count; // 等於 pt=count, // 不等於 *pt=countfor(i=0;i<5;i++){ (*(pt+i))+=1; printf(“%d ”,count[i]);}// 得到 2,3,4,5,6

Page 3: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count
Page 4: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字元一個英文字母、數字或其他的符號

‘ $’ 、‘ !’ 、‘ G’ 、‘ l’ 都是一個字元在記憶體中佔一個位元組是一串文字 ( 字串 ) 的最小基本單位要表示一個字元,用一對單引號’‘把該字元夾起來

char c='a';

Page 5: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字元與整數對應每一個字元在記憶體中,其實可以當作是一個佔用 1

byte 的整數值每一個整數值根據相對應的字元表,有其代表的字元

如果是 3個字元 如果是一個整數‘1’ ‘2’ ‘3’ 12349 50 51 123

1byte1byte 1byte 4bytes

Page 6: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

ASCII 碼符號與數字的對應關係其實字元也是一個數字,因此也可以拿來做加減乘除等四則運算

數字 符號 數字 符號 數字 符號48 0 65 A 97 a49 1 66 B 98 b50 2 67 C 99 c51 3 68 D 100 d52 4 69 E 101 e… … … … … …

Page 7: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字元變數的宣告與設定char i_am_a_char; char i_am_another='K';

// 字元常數用兩個單引號括起來

Page 8: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

印出字元在 printf() 或 scanf() 中,字元使用的代表格式

是 %cprintf("Print a char: %c %c %c", i_am_another,

'B', 49);課堂練習

用一個 for 迴圈印出 48~122 的整數值對應的字元

Page 9: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字元的運算一個字元型態佔用 1 個位元組,數值介於 0 到 255 之間

因此無論是加、減運算或關係比較運算,都可以想作是整數運算下面程式會印出 d

char c='a';c=c+3;printf("%c", c);

下面程式會印出 A 到 Z 及它們的 ASCII 碼值char c;

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

Page 10: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字元的輸出與輸入printf() & scanf()

scanf(“%c”,&ch); //scanf() 後面的參數是位址printf("This charactre is %c.\n",ch);

getchar() & putchar()ch=getchar(); // 一次讀一個字元putchar(ch); // 一次印一個字元putchar('\n'); // 印一個字元「換行」

Page 11: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

注意scanf() 與 getchar() 在以鍵盤輸入的情況下,都需要使用者按下 Enter 鍵之後,才會開始進行讀取的動作所以以 scanf() 函式讀取資料、或是以

getchar() 讀取字元時,都會遺留下換行字元 '\n‘為了不影響下一次讀入字元的動作,記得要處理遺留下來的部分

善用 fflush(stdin)

Page 12: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

getch()不需等待 Enter 鍵,使用者按下什麼,就讀入什麼的函式欲使用 getch() 需 #include <conio.h>

ch = getch(); //getch() 不會 echo 字元到螢幕上while(getch()!='k'); // 這個迴圈在沒輸入 k 之前不會離開

Page 13: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字元處理函式#include <ctype.h>

int isdigit(int c) 檢查 c是不是一個數字字元int isalpha(int c) 檢查 c是不是一個英文字母int isalnum(int c) 檢查 c是不是一個數字或字母int islower(int c) 檢查 c是不是小寫字母int isupper(int c) 檢查 c是不是大寫字母int tolower(int c) 如果 c是大寫字母,則傳回小寫,否則傳原值int toupper(int c) 如果 c是小寫字母,則傳回大寫,否則傳原值

Page 14: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

課堂練習用一個 for 迴圈印出 1~256 的整數值對應的字元,以及其對應的 4 個值:

isalpha() 、 isdigit() 、 islower() 、 isupper()

Page 15: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字串在程式語言中,一個英文單字、一個句子,都可以當成一個字串紀錄 size 超過一個字母的東西在 C 語言中,一個一維的字元陣列可以當成一個字串

char student_name[30]; // 表示學生名字最多30 個字元

Page 16: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

結尾字元字串最後一定要有一個 NULL(‘\0’ 、數值為 0) 字元許多與字串處理相關的函式 ( 如 printf()) 都必須靠這個字元判斷字串的結尾在哪裡

Page 17: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字串初始值設定char my_name[8] = "haKao";

// 後三個字元都是 NULLchar my_name[8] = {'h','a','K','a','o'}; // 同上char my_name[] = "haKao";

// 是一個六個字元的陣列 , my_name[5] 為 '\0'char my_name[8] = {'h','a','K','a','o','\0'}; //同上字元 ( 字串 ) 指標

char *name_ptr = my_name;

Page 18: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字串的輸入與輸出在 scanf 及 printf 讀入及印出一個字串是使用 %s

char s[20];scanf("%s", s);printf("%s", s);

由於 s 本身就是這個字元陣列的位址,所以在 scanf裡我們不需要加上 & 符號在使用 scanf() 讀取字串時,遇到空白字元便會結束

假如輸入“ Hello! Ann!" ,則讀進來的字串只有 "Hello!" 而已

Page 19: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

gets 、 putsgets :讀入字串 puts :印出字串

gets(my_name);// 讀到換行字元為止,並把 '\n' 取代成為 NULL

puts(my_name);// 把 my_name 印出來,最後加上 '\n'

上面要注意的是,如果是使用 gets ,會連換行一起讀進來,也就是字串後面會多一個 '\n' 字元

Page 20: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

課堂練習宣告一個 20 字元大小的字串後,讀入一個字串(使

用 gets() ),將所有字元轉成大寫印出來(使用toupper() )

Page 21: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字串相關函式要做字串的比對、字串串接、字串長度等功能,沒有運算子可以使用,故必須使用函式來處理和字串相關的函式都是定義在 string.h 中

strcpy(s1,s2) 將 s2的內容複製到 s1,並傳回 s1strcmp(s1,s2) 比較 s1 、 s2的內容,如果相等傳回 0,前者大傳回正值,否則負值strcat(s1,s2) 將 s2串接到 s1後面,並傳回 s1strstr(s1,s2) 傳回 s2字串在 s1字串中第一次出現的位置strlen(s1) 傳回 s1的長度 (不含 '\0'字元 )strrev(s1) 將 s1字串倒置

Page 22: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

範例練習在第二次世界大戰中,德軍的通訊編碼被美國破解,以致於機密被美國竊聽而慘敗德軍的編碼規則 ( 假 ) 如下:將訊息每個字母往後推兩位再傳出去,例如 A→C 、 B→D ,而後面的 Y→A 、 Z→B ,所有的訊息都是大寫字母而收到訊息的則是將每個字母往前推兩位,例如

C→A 、 D→B ,而前面的 A→Y 、 B→Z假設你是美軍的情報軍,要快速編碼及解碼德軍的訊息,希望完成一個程式,第一個字元為 + 代表要編碼,第一個字元為 - 代表要解碼如:輸入 +FIRE 後會輸出 HKTG;輸入 -UVQR 後會輸

出 STOP

Page 23: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count
Page 24: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

課堂練習修改範例練習

編碼:往前推三位 A->X, D->A

解碼:往後推三位 X->A, A->D

Bonus 大小寫

Page 25: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字串陣列字串陣列可以看作是一個二維的陣列:

char names[4][11]; // 可以放 4 個 10 個字的字串printf("%c\n", names[0][0]); // 印第一個字串的第一個字元printf("%s\n", names[1]); // 印第二個字串的內容printf("%s\n", &names[1][1]);

// 第 2 個字串的第 2 個字元當作字串印出

Page 26: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

字串陣列初始化char names[4]

[11]={"Michael","John","Maggie","McGyver"};char names[]

[11]={"Michael","John","Maggie","McGyver"};M i c h a e l \0

J o h n \0

M a g g i e \0

M c G y v e r \0

Page 27: int count=8; int* pt=&count; // 等於  pt=&count,                           // 不等於 *pt=&count

作業七參考 hw7.doc www.csie.ntu.edu.tw/~r93041/C