所謂的解碼也就是將編碼 (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 >= 97 && ct <= 122) { for (j = 0;j < 26;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 >= 97 && ct <= 122) { for (j = 0;j < 26;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 進行測試
#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; } /* 《程式語言教學誌》的範例程式 http://pydoing.blogspot.com/ 檔名: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
沒有留言:
張貼留言