ホーム » 2007 (ページ 18)

年別アーカイブ: 2007

2025年5月
 123
45678910
11121314151617
18192021222324
25262728293031

検索・リンク

抽象化と隠蔽化

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足羽山

登山中…

ちと息が上がってるのであった。情けない…

2007-04-24-00.jpg

足羽山動物園にて…

2007-04-24-01.jpg 追記: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→∞において無視できる項目を切捨てる考えを説明し、 オーダ記法の解説を行う。例年どおり、単純にオーダを示し難い事例として、 などをオーダ記法に変換する方法を、 ロピタルの定理 などを交えながら説明する。

新入生歓迎会

電子情報工学科の新入生歓迎会にて 「ぢょしせんぱぃ」と写メをとる権利を得た学生さん。 怖くて選べなかったのか全員と写真をとることに…

2007-04-17-00.jpg

2007年4月15日 (第3回)

  • 学生ラジオレポート
  • 第3回 福野泰介のラジオプログラミング講座

システム

最新の投稿(電子情報)

アーカイブ

カテゴリー