情報処理Ⅱ 2006年12月22日(金).

Slides:



Advertisements
Similar presentations
情報処理Ⅱ 第8回 2004 年 11 月 30 日(火). 2 本日学ぶこと 関数と変数 目的  関数を自分で定義し,変数の利用方法・範囲を明示的に制 限することで,適切な機能分割(モジュール化,再利用) を図る. してはいけないこと  main 関数のみで 100 行以上のプログラム  グローバル変数を駆使するプログラム.
Advertisements

オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
情報処理Ⅱ 2007年12月17日(月).
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
情報処理Ⅱ 2005年12月9日(金).
情報処理Ⅱ 2005年12月22日(木).
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
情報処理Ⅱ 第13回 2006年1月20日(金).
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
コンパイラ 2012年10月22日
情報処理Ⅱ 第9回 2004年12月7日(火).
情報処理Ⅱ 第13回 2004年01月25日(火).
Q q 情報セキュリティ 第3回:2005年4月28日(金) q q.
Q q 情報セキュリティ 第3回:2005年4月22日(金) q q.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
演習1の解答例の解説 2004年10月21日 海谷 治彦.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
演習1の解答例の解説 2006年11月8日 海谷 治彦.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
情報処理Ⅱ 第14回 2006年1月23日(月).
フロントエンドとバックエンドのインターフェース
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
東京工科大学 コンピュータサイエンス学部 担当 亀田弘之
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
高度プログラミング演習 (09).
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
高度プログラミング演習 (11).
情報処理Ⅱ 2006年11月24日(金).
情報処理Ⅱ 第7回 2004年11月16日(火).
情報処理Ⅱ 2007年12月3日(月) その1.
情報処理Ⅱ 2007年2月2日(金).
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理Ⅱ 小テスト 2005年2月1日(火).
情報処理Ⅱ 第3回 2004年10月19日(火).
情報処理Ⅱ 2006年10月20日(金).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

情報処理Ⅱ 2006年12月22日(金)

本日学ぶこと:プログラミングの例題2つ 暗号化・復号 文字列の書き換え 統合開発環境(Eclipse) 学ぶこと:構造体の利用,写像としての配列,static変数 文字列の書き換え 学ぶこと:関数呼び出しによる文字列操作,ライブラリ関数の活用 統合開発環境(Eclipse) Wagahai Ha Nekodearu tarako Sioieid Ei Wyjgayipr takehiko

IDE Integrated Development Environmentの略, 統合開発環境とも呼ばれる. ハードディスクのIDEは,Integrated Drive Electronicsの略 エディタ,コンパイラ,デバッガなど,プログラミングに必要なツールが一つのインターフェースで統合して扱えるような環境のこと. デバッガとは…プログラムの不具合(バグ)の発見や修正を支援するソフトウェア.Linuxではgdbコマンドが利用可能. IDEの例:Eclipse,Visual C++,Turbo C++ など http://d.hatena.ne.jp/keyword/IDE

Eclipse オープンソースの統合開発環境 もともとIBMが開発したもので,現在は Eclipse Foundationが開発・管理している. プラグインにより機能を付加できる. Javaに限らず様々なプログラミング言語の開発に利用可能 情報処理Ⅲで利用されている. 自宅で使いたい人へ All-in-one Eclipseがおすすめ コンパイラ・デバッガは別途インストールしなければならない eclipse:食,日食,月食 http://www.ooyashima.net/db/prog.htm

暗号化問題 仕様 入力文にあるすべての'A'をα,すべての'B'をβ,…に置き換えて出力する.(単一換字暗号という.) 文字は,char型の任意の値とする.ただし'\0'を除く. どの文字をどの文字に置き換えるかは,プログラムの中で指定する. 簡単な操作で,復号できるようにする.  Wagahai Ha Nekodearu   Sioieid Ei Wyjgayipr 暗号化 復号 シーザー暗号は,単一換字暗号に含まれる. セキュリティの観点としては,単一換字暗号は容易に解読可能な暗号アルゴリズムである.

暗号化問題 (まずい)方針 'A'をα,'B'をβ,…に置き換えるのを switch~caseで行う. プログラムが無駄に長くなる. 柔軟性に欠ける. char encrypt_char(char c) { switch (c) { case 'A': return 'D'; case 'B': return 'E'; ... }

暗号化問題 encrypt_ table … 'D' 'E' 'F' 'G' … +0 +'A' +'C' +1 +'B' +'D' ... 'E' 'B' 'D' 'A' 変換後 変換前 方針 暗号化のための変換表(暗号化表)を, 配列で保持する. char encrypt_table[256]; encrypt_table['A']の値 encrypt_ table … 'D' 'E' 'F' 'G' … +0 +'A' +'C' +1 +'B' +'D' +255

暗号化問題 方針(続き) 暗号化は,写像を用いる. a = 'A'; のとき,b = encrypt_table[a]; でbの値が'I'となるようにするには,あらかじめencrypt_table['A']の値を'I'としておけばよい. 復号のための変換表(復号表)は,逆写像を用いて求める. char decrypt_table[256]; decrypt_table[encrypt_table['A']] = 'A'; gがfの逆写像 であるとは, g(f(x))=x

暗号化問題 方針(続き) 定義する関数 変換表を恒等写像にする. 暗号化表を設定する. 暗号化表を用いて,復号表を設定する. fが恒等写像 であるとは, f(x)=x 方針(続き) 定義する関数 変換表を恒等写像にする. 暗号化表を設定する. 暗号化表を用いて,復号表を設定する. 変換表を用いて,文字列を暗号化もしくは復号する. 暗号化と復号はどう区別する? 暗号化:./encrypt Wakagai Ha Nekodearu 復号: ./encrypt -d Sioieid Ei Wyjgayipr コマンドラインオプション

定義する構造体 typedef struct edtable { char encrypt_table[256]; char decrypt_table[256]; } edtable; 暗号化(encryption)と復号(decryption)の表(table) encrypt_table decrypt_table

定義する関数(1) void reset_table(edtable *table); table encrypt_ table ? 1 変換表を恒等写像にする. table encrypt_ table ? 1 'A' 'B' … 'C' 255 ? … ? ? ? … ? decrypt_ table 1 'A' 'B' … 'C' 255 ? ? … ? ? ? … ?

定義する関数(2) void set_encrypt_table(edtable *table, const char *from, const char *to); 二つの文字列を用いて,暗号化表を設定する. encrypt_ table … 'I' +'A' 'F' +'B' 'C' +'C' … table from to 'A' 'B' 'C' … '\0' 'I' 'F' 'C' … '\0'

定義する関数(3) void set_decrypt_table(edtable *table); table decrypt_ table 暗号化表を用いて,復号表を設定する. table decrypt_ table … 'A' … +0 +'A' +1 +'B' +'I' +255 encrypt_ table … 'I' … +0 +'A' +'C' +1 +'B' +'D' +255

定義する関数(4) char *encrypt(const char *text, const char *table); 変換表を用いて,文字列を暗号化もしくは復号する. 「暗号化」と「復号」の処理を共通化している! 戻り値は,変換された文字列で,static変数result(のポインタ値)となる. text 'W' 'a' 'g' 'a' 'h' 'a' 'i' '\0' table … … result 'S' 'i' 'o' 'i' 'e' 'i' 'd' '\0' static領域(関数が終了しても,破棄されない) 戻り値

暗号化プログラムの補足 関数set_encrypt_tableの仮引数from, toは const char *型である.このとき fromの参照先(const char型の値)を変更しようとしている. 暗号化のように,関数開始時点で長さがわからない文字列を入力にとり,それと同じ長さの暗号文を返すときは,生成する暗号文が配列領域をはみ出さないように配慮する. encrypt.cでは,100文字を越える入力は無視している.

「Wakayama City」が 一つの引数 文字列書き換え問題 仕様 3つの文字列を,コマンドライン引数にとる. 1番目の文字列の中に,2番目の文字列が含まれていれば,それを3番目の文字列に置き換える. 例 ./strrep tarako ra kehi before: tarako after: takehiko ./strrep 'Wakayama City' C Univers before: Wakayama City after: Wakayama University 「Wakayama City」が 一つの引数

文字列書き換え問題 mainで定義する変数 char *str_in = argv[1]; char *str_from = argv[2]; char *str_to = argv[3]; argc >= 4 の確認を忘れずに. char str[256]; argv[1]のみでは,文字列を伸ばすこと(tarako⇒takehiko)ができない.そこで,strに文字列をコピーして,この配列を書き換える. argv[1] 't' 'a' 'r' 'a' 'k' 'o' '\0' str 't' 'a' 'r' 'a' 'k' 'o' '\0' …

文字列書き換えの関数(1) char *strrep(char *str, const char *str_from, const char *str_to); str 't' 'a' 'r' 'a' 'k' 'o' '\0' … str_from 'r' 'a' '\0' 書き換えられる str_to 'k' 'e' 'h' 'i' '\0' 書き換えられない

文字列書き換えの関数(2) 関数内で使用する配列・ポインタ str_from 'r' 'a' '\0' str_to 'k' 'e' 'h' 'i' '\0' str 't' 'a' 'r' 'a' 'k' 'o' '\0' … r str_buf: 一時保存用文字列領域.strの値を一度コピーして,それ以降は書き換えない. p: str_bufの中に部分文字列としてstr_fromが出現するとき,str_buf内の出現位置 q: str_buf内にある,str_fromの後の位置 r: str内にある,部分文字列str_fromの出現位置 str="tarako",str_from="ra",str_to="kehi"のとき,pはstr_buf+2,qはstr_buf+4,rはstr+2 str_buf 't' 'a' 'r' 'a' 'k' 'o' '\0' … p q

文字列書き換えの関数(3) *r = '\0'; str_from 'r' 'a' '\0' str_to 'k' 'e' 'h' 'i' … r まず,*rをヌル文字にして,ここでstrを止める. その結果,strの値はいわば"ta"になる. str_buf 't' 'a' 'r' 'a' 'k' 'o' '\0' … p q

文字列書き換えの関数(4) strcat(r, str_to); str_from 'r' 'a' '\0' str_to 'k' 'e' 'h' 'i' '\0' str 't' 'a' 'k' 'e' 'h' 'i' '\0' … r 次に,文字列str_toを連結する. その結果,strの値はいわば"takehi"になる. ここは strcat(str, str_to); でも strcpy(r, str_to); でもよい. str_buf 't' 'a' 'r' 'a' 'k' 'o' '\0' … p q

文字列書き換えの関数(5) strcat(str, q); str_from 'r' 'a' '\0' str_to 'k' 'e' 'h' 'i' '\0' str 't' 'a' 'k' 'e' 'h' 'i' 'k' 'o' '\0' … r 最後に,文字列q,すなわち置換されなかった部分文字列を連結する. 最終的に,strの値はいわば"takehiko"になる. ここは strcat(r, q); でもよい. str_buf 't' 'a' 'r' 'a' 'k' 'o' '\0' … p q

文字列書き換え関数の注意点 使用しているライブラリ関数 strcpy:文字列をコピーする※ strstr:文字列の中から文字列を見つける strlen:文字列の長さを求める strcat:文字列を連結(concatenate)する※ いずれも,第1引数が処理対象の文字列となる. ※最初の引数は文字配列を指すポインタとし,配列には,文字列をコピー・連結しても大丈夫な領域を持たせておく. rが文字列の先頭のとき,str_toやqが空文字列のときも,関数strrepで問題なく書き換えられる. ./strrep Okayama O Wa ./strrep takehiko kehi ''

今後の予定 第12回:2007年1月19日(金) 第13回:1月26日(金) 第14回:2月2日(金) 授業開始時に第2回レポートを提出すること. 第13回:1月26日(金) 第14回:2月2日(金) 試験:試験期間中に実施する.掲示板を参照のこと. 「Cの書籍1冊」と「自筆ノート1冊」の持ち込みを認める.