2007年4月29日 (第5回)
- にしにしの部屋 奥田さん(学生)
nishi070429okuda.mp3
- 第5回 福野泰介のラジオプログラミング講座
- アントレプレナーサポートセンター開所式の様子 河村理事
4EI学生にJABEE説明会
JABEEカリキュラムに組み込まれる4年生に対する説明として、 学習教育目標などの説明を行った。
産業界でのJABEEの意義、技術士一次試験免除を説明し、 学校内でのより良い教育のための活動なども説明する。 目標とoutcomesの違いなども交えながら、専攻科での修了要件として TOEIC400,学外発表,情報系資格試験,学士取得,etc…なども紹介する。
最後に、35の学習教育目標の細目を、簡単に説明していく。 まじめなネタばかりだと、眠くなるので、A(2)の異なる文化の理解必須の事例として、 Rギア のネタといった内容も雑談的に取り上げた。
抽象化と隠蔽化
C 言語での構造体の使い方の範疇で、オブジェクト指向の導入。
struct Person { char name[20] ; int kokugo ; int sansu ; } ; void input( struct Person*p ) { // 後で別途アロー演算子を説明している。 scanf( "%s %d %d" , (*p).name , &((*p).kokugo) , &((*p).sansu) ) ; } void print( struct Person*p ) { printf( "%s %d %d" , (*p).name , (*p).kokugo , (*p).sansu ) ; } void main() { struct Person saitoh ; struct Person array[ 5 ] ; input( &saitoh ) ; print( &saitoh ) ; for( int i = 0 ; i < 5 ; i++ ) { input( &(array[ i ]) ) ; print( &(array[ i ]) ) ; } }
これにより、もしデータの変更があっても、main 内部は変更が不要となる。 このようなスタイルで、データに処理を適用するようなプログラムであれば、 データ設計者とデータ利用者で明確に分担作業の元でプログラム開発ができるようになる。
このようなスタイルでは、データに対して処理を呼び出すイメージとなる。 これを「抽象化」とよぶ。 このように、 データ構造を「オブジェクト」、 オブジェクトに対する処理を「メソッド」、 具体的なオブジェクトを「インスタンス」と呼ぶ。
このプログラムを C++ に変更
class Person { private: char name[ 20 ] ; int kokugo ; int sansu ; public: void input() { scanf( "%s %d %d" , name , &kokugo , &sansu ) ; } void print() { printf( "%s %d %d" , name , kokugo , sansu ) ; } } ; void main() { Person saitoh ; Person array[ 5 ] ; saitoh.input() ; saitoh.print() ; for( int i = 0 ; i < 5 ; i++ ) { array[ i ].input() ; array[ i ].print() ; } }
このようにインスタンスにメソッドを適用することを C++ では簡単に書ける。
Options +ほげ
緊急連絡システムの動作確認環境を触ろうとしたら、test環境だけが動かない。 一般利用者向けのサービスは、問題無く動いている。何が違うのか、悩んだけど、 ".htaccess"ファイルの "Options +ほげ" と "Options ほげ"の違い。 ぼーっとしていると、違いに気づくのに手間取る….
Options +ほげ httpd.confなどで許可されているOptionに追加する。 Options ほげ 事前のオプションを一旦無効にしたあとで、指定オプションを指定。
ソート処理時間の見積り+再帰呼び出しの処理時間
ソート処理時間の問題として、最大選択法の処理とクイックソートの処理の時間の解説。
最大選択法は、 IMG n /cgi-bin/mimetex.cgi?O(N^2) より IMG n /cgi-bin/mimetex.cgi?T_m(N)=T_aN^2 、クイックソートは、 IMG n /cgi-bin/mimetex.cgi?O(N\log{N}) より、 IMG n /cgi-bin/mimetex.cgi?T_q(N)=T_bN\log{N} となる。
IMG n /cgi-bin/mimetex.cgi?T_m(10)=10\mbox{msec} IMG n /cgi-bin/mimetex.cgi?T_q(10)=20\mbox{msec} ならば、 IMG n /cgi-bin/mimetex.cgi?T_a=1/10\mbox{[msec]} , IMG n /cgi-bin/mimetex.cgi?T_b=2\mbox{[msec]} (ただし、logの底は計算の都合で10とおく) よって、 IMG n /cgi-bin/mimetex.cgi?T_m(N)=T_q(N) となるNを求めると、 IMG n /cgi-bin/mimetex.cgi?T_aN^2=TbN\log{N} を解けばいい。ニュートン法などで解くと N = 29 ぐらいとなる。 よって、N=30以上では、クイックソートの方が効率がよい。
再帰呼出の処理時間
フィボナッチ数列の再帰呼び出しのプログラムを見せ、 再帰呼び出しプログラムの考え方を局所変数などの用語を交えて説明。 再帰を含む関数の処理時間ということで、階乗のプログラムの処理時間の オーダを解説する。
IMG n /cgi-bin/mimetex.cgi?T_{fact}(1)=T_A , IMG n /cgi-bin/mimetex.cgi?T_{fact}(N)=T_B+T_{fact}(N-1) この式を代入しながら繰り返し、一般式をだすと、 IMG n /cgi-bin/mimetex.cgi?T_{fact}(N)=T_A+T_B\times(N-1) となることを示す。
もっと現実っぽいプログラムの見積りということで、
int foo( int x ) { if ( x == 1 ) { return 1 ; } else { int s = 0 , i ; for( i = 0 ; i < x ; i++ ) s = s + i ; return s + foo( x - 1 ) ; } }
のプログラムの一般式を導出する。 IMG n /cgi-bin/mimetex.cgi?T_{foo}(1)=T_A , IMG n /cgi-bin/mimetex.cgi?T_{foo}(N)=T_B+T_CN+T_{foo}(N-1) を代入繰り返しで解いて、一般式を示す。
来週は、再帰による2分探索プログラムによる再帰方程式の作成と導出、 ハノイの塔の処理時間での再帰方程式の作成と導出をやる予定。
遠足・2EI足羽山
登山中…
ちと息が上がってるのであった。情けない…
足羽山動物園にて…
追記:4/25現在、意外と筋肉痛が無かった… 学生主事補仕事での校外巡回の効果か、歳から2日後に筋肉痛がでるのか…どっちだ?
パッケージ管理をsarge→oldstableへの変更
Debian にて、etch が stable 扱いに昇格したので、 このまま"apt-get -u dist-upgrade"すると、 設定ファイルの移行が未確認のまま、大量のパッケージが更新されてしまう。 当面は、apt-line を sarge→oldstable に変更し、sarge を保持するように設定する。
2007年4月22日 (第4回)
- 特別研究中間発表会の様子
- にしにしの部屋 塩谷さん(学生)
nishi070422shioya.mp3
- 部活・同好会活動紹介 メディア同好会、廣瀬さん
構造体とオブジェクト
先週の OOP 概略に続き、(C),C++,Java等の本講義で扱う言語の特徴を解説し、 実際のプログラミングの話しを行う。
電気系学生は、構造体は「使用経験あり」。 機械系学生は、構造体は「未経験」。 構造体の文法の解説をする一方で、 関数呼び出しと値渡し(値渡し,ポインタ渡し,参照渡し)と 局所変数、大域変数の解説を行う。
繰り返し処理の処理時間の一般式と、オーダ記法
先週の処理速度の見積りをもっと厳密に行う事例として、 1重ループの処理時間 の説明、 2重ループ(最大選択ソート)の処理時間を、 となることを、 などを交えながら説明する。
一般式の解説の後、見積りではN→∞において無視できる項目を切捨てる考えを説明し、 オーダ記法の解説を行う。例年どおり、単純にオーダを示し難い事例として、 などをオーダ記法に変換する方法を、 ロピタルの定理 などを交えながら説明する。