
所謂的解碼也就是將編碼 (encoding) 過的小寫英文字母回覆成原來的英文小寫字母,由上圖可以看出,我們儲存表格所用的 NSMutableArray ,依索引值 (index) 可推回原來的英文小寫字母,這是說,索引值 0 為 'q' ,所以是將原本的 'a' 變成 'q' ,因此,解碼就是依索引值重新加上 diff 即可。
實際上我們需要用到巢狀迴圈 (nested loop) ,也就是在迴圈 (loop) 中有其他的迴圈,對單一英文句子而言,我們需要一個迴圈判斷每個字元是否為英文小寫字母,若是英文小寫字母,我們就需要另一個迴圈找出對應的索引值。由這樣的概念設計的解碼方法 (method) toDecode: ,如下
- ( NSString *) toDecode : ( NSString *) s { NSString *r = @"" ; int number = [s length ]; char ct; int i, j; for (i = 0 ;i < number;i++) { ct = [s characterAtIndex : i ]; if (ct >= 9 7 && ct <= 1 2 2 ) { for (j = 0 ;j < 2 6 ;j++) { if (ct == [[cArray objectAtIndex : j ] characterAtIndex : 0 ]) { r = [r stringByAppendingString : [oArray objectAtIndex : j ]]; break; } } } else { r = [r stringByAppendingFormat : @"%c" , ct ]; } } return r; } |
巢狀迴圈是迴圈中包含另一個迴圈,由於我們利用縮排的方式編輯程式碼,看起來內層迴圈像是凹陷進去的巢,故稱之為巢狀迴圈。
toDecode: 與 toEncode: 相似,同樣需要一個 NSString 字串 (string) 當參數 (parameter) ,結果也回傳一個 NSString 字串。
解碼轉換由巢狀迴圈的部份來進行
for (i = 0 ;i < number;i++) { ct = [s characterAtIndex : i ]; if (ct >= 9 7 && ct <= 1 2 2 ) { for (j = 0 ;j < 2 6 ;j++) { if (ct == [[cArray objectAtIndex : j ] characterAtIndex : 0 ]) { r = [r stringByAppendingString : [oArray objectAtIndex : j ]]; break; } } } else { r = [r stringByAppendingFormat : @"%c" , ct ]; } } |
外層迴圈會依序取得英文句子的每個字元,然後判斷是否為英文小寫字母,如果該字元是英文小寫字母,就會啟動另一個迴圈找出表格中對應的索引值出來,相反地,如果該字元不是英文小寫字母,控制變數 i 就會自動遞增,然後判斷下一個字元。
注意,這個巢狀迴圈用了兩個 for 、兩個 if ,依順序 for 、 if 、 for 、 if ,這是我們打算讓程式執行的順序,若是沒有依照這樣的順序,程式可能會跑出無法預期的結果。
Encrypt.m 需要加進 toDecode: ,然後我們用下面的 demo.m 進行測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #import <Foundation/Foundation.h> #import "Encrypt.h" int main( int argc, char *argv[]) { NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc ] init ]; Encrypt *e = [[ Encrypt alloc ] initRandomEncrypt ]; NSString *s = @"There is no spoon." ; NSString *r; NSString *o = @"\n\n" ; r = [e toEncode : s ]; o = [o stringByAppendingString : r ]; o = [o stringByAppendingString : @"\n\n" ]; o = [o stringByAppendingString : [e toDecode : r ]]; o = [o stringByAppendingString : @"\n\n" ]; NSLog(o); [pool drain ]; return 0 ; } /* 《程式語言教學誌》的範例程式 檔名:demo.m 功能:示範 Objective-C 程式 作者:張凱慶 時間:西元 2012 年 7 月 */ |
Build and Go ,結果如下

我們先對 "There is no spoon." 進行編碼,然後解碼,結果無誤。接下來我們替 Encrypt 類別 (class) 設計圖形使用者介面 (graphical user interface) ,在此之前,先來認識 Cocoa吧!
中英文術語對照 | |
---|---|
解碼 | decoding |
編碼 | encoding |
索引值 | index |
巢狀迴圈 | nested loop |
迴圈 | loop |
方法 | method |
字串 | string |
參數 | parameter |
類別 | class |
圖形使用者介面 | graphical user interface |
您可以繼續參考
軟體開發
相關目錄
Objective-C 入門指南
Objective-C 教材
首頁
參考資料
Learning Objective-C: A Primer
The Objective-C Programming Language
Cocoa Fundamentals Guide
Coding Guidelines for Cocoa
Advanced Memory Management Programming Guide
Archives and Serializations Programming Guide
沒有留言:
張貼留言