派生クラスと継承
前回までの範囲でカプセル化による、プログラムがわかりやすくなるといった事例の 紹介。これ以降の継承などを使えるようになれば「車輪の再発明」と言われるような、 他人が作ったものと同じようなものを、また作らないといけない… ということが減らせるはず。
派生の必要となりそうな事例ということで、基本データにオプショナルな要素が 加わったデータ事例にて、問題点を示す。
派生がないと発生する手間
// C言語でオプショナルな要素の加わった場合。 // 基本型: 名前・身長 // 追加データ:親の情報 struct Person { char name[ 20 ] ; double height ; } ; void print_Person( struct Person* p ) ; // ダメダメな追加データの型 struct Child { char name[ 20 ] ; double height ; struct Person* parent ; // 追加データ } ; // この方法では、同じようなプログラムをまた作ることになる。 void print_Child( struct Child* p ) { また同じ処理を書く羽目になる... } // ちょっとマシな追加データ型 struct Child { struct Person super ; // 基底クラス struct Person* parent ; } ; // 同じ処理を書くよりはマシだけど、 // 基底クラスのメソッド呼出しを何度も書く必要がある。 void print_Child( struct Child* p ) { print_Person( &(p->super) ) ; }
導出を使って
この様に、オプショナルなデータの増えたプログラムで手抜きができるために、 オブジェクト指向言語では、派生(導出)といった方法が使われる。
class Person { private: char name[ 20 ] ; double height ; public: Person( char s[] , double h ) { strcpy( name , s ) ; height = h ; } void print() { printf( "%s %f" , name , height ) ; } } ; class Child : public Person { private: Person* parent ; public: Child( char s[] , double h , Parent* p ) : Person( s , h ) { parent = p ; } } ; void main() { Person saitoh( "斉藤" , 172 ) ; saitoh.print() ; Child mitsuki( "みつき" , 130 , &saitoh ) ; mitsuki.print() ; // 基底クラスの print を継承し、流用してくれる。 Person tomoko( "ともこ" , 148 ) ; Child ayuka( "あゆか" , 122 , &tomoko ) ; Person* family[ 4 ] ; family[0] = &saitoh ; family[1] = &mitsuki ; // ChildがPersonに格下げして代入 family[2] = &tomoko ; family[3] = &ayuka ; // Personに格下げ // 家族全員を表示 for( int i = 0 ; i < 4 ; i++ ) // PersonとChildが混在するけど family[ i ]->print() ; // 正しく表示ができる。 }
問題提起
前述のChildクラスでは、printメソッドは継承を利用していたが、 Child クラス用の処理を書いたとする。すると、格下げの問題が表面化してくる。
class Child : public Person { : void print() { // 子供は、親の名前も表示したかったとする。 Person::print() ; printf( "%s" , parent->name ) ; // "public Person" で派生したから } // できる芸当である。 } ; // 家族全員の表示。 for( int i = 0 ; i < 4 ; i++ ) family[ i ]->print() ; // この結果では、family に代入する時点で、 // Child も Person に格下げされているので、 // mitsuki の親の名前は表示されない。 -----> 仮想関数で解決できる。
自宅サーバに頼りっきり
朝から仕事をしようとブラウザを立ち上げるが、 スタートページの自宅サーバのページが表示されない。 そういえば、朝から電気設備の交換で ちょっとだけ停電と連絡あったっけ。
どこでも仕事ができるようにと、 試作中のプログラムも自宅でネットワーク越しに触っていたから、 試作プログラムも触れない。
# はぁ…
テスト前で過去問を整理
そろそろテスト前週。 ということで、昨年度のテスト過去問題で、未掲示の内容を掲載する。
数値文字変換演習
数値型・文字型などのデータを一通り復習もすんだので、数値・文字列変換の演習。
課題テーマ
- N進数の文字列(char[])を入力し、その数値(int)を求める関数と、
- 数値(int)を入力し、N進数文字列(char[])に変換
する関数を2つ作成し動作を確認しレポートを作成せよ。 ただしN進数文字列については、自分の理解度に応じて以下の中から選ぶこと。
- 8進数文字列<=>数値(int)
- 16進数文字列<=>数値(int)
- N進数文字列<=>数値(int),(Nは0-9,A-Zを使えば最大36進数が表現できるはず)
- 10進実数文字列(例-1.23e-10)<=>実数
2007年5月27日 (第9回)
- ラジオ電波を使った緊急時自動ラジオ起動システムの実験
- 学生連合コーナー
近藤さん(金沢大学からのゲスト)
北陸地区高専バドミントン部交歓
北陸地区バドミントン部の交歓試合にて石川高専にて。
背伸びしないテーマに積極的に
4EI創造工学演習では、何らかのコンテスト応募を目標にものづくりを してもらっているが、昨年度までは「高専プロコン応募」を最初に掲げたため、 テーマ企画書も背伸びがち。 今年は、学生さんみんなの実力に応じてテーマを考えてもらっている。 この結果、プロコン応募件数は少し減らしたものの、福井のソフトコンペ等を 目標としている。
これが合っているのか、今日の学生さんは皆が積極的。 説明時に「???」といった感想が顔を見るだけで伝わってきた人も、 簡単な演習ネタから始めて、色々と試している。
メモリ管理の演習
授業前半にて、構造体のデータで malloc+free を使う方法を説明する。
// 構造体配列へのポインタ struct Person* array ; int size ; array = (struct Person)malloc( size * sizeof( struct Person ) ) ; // 構造体のポインタ配列 struct Person* array[ 100 ] ; array[ i ] = (struct Person*)malloc( sizeof( struct Person ) ) ;
課題テーマ
適当な構造体データ(例:名前と身長,体重とか…)のデータを入力し、 malloc+free 等の動的メモリに格納し、何らかの処理を実行し、 出力するプログラムを作成せよ。
構造体のデータは、自分の理解度に応じて、以下のような方法にて、 「必要に応じてメモリを確保」する方式であること。
- 事前にデータ件数を入力するとして、構造体配列を確保
- 1件入力ごとに、構造体配列1件を確保
- 構造体中の文字列をヒープで格納し、可変長とする
住民票コードと年金どっちが大事?
Winny を通じて、アホな孫受け社員経由で住基情報が流出している。 住基コードの危険性が表面化する事例であろう。
しかし、これとは反対に 年金記録のずさんな管理 も問題となっている。 アメリカでは、社会保障番号SSNが、納税と社会保険のために使われており、これが 銀行の口座開設やら自動車免許取得やら公的なサービスの個人認証に大活躍している。 だから、個人データの紐付けが容易であり、年金の持ち主不明なんてバカげたことは、 起こり難い。
さて、あなたは、 個人情報流出 と あなたの年金 のどっちが大事?
せっかく作ったのに…
私は、こんな日記を公的な立場で晒しているから、電話や住所くらいの個人情報は すでに流れているのといっしょ。 そりゃ住基番号やらクレジットカードの番号洩れは恐いけど、 流通範囲が公的な組織で情報処理の範囲で留めてくれれば、便利な方を優先です。
でも、住基カードも作ったけど、今まで一度も使ったことが無い… FONT COLOR blue 住基番号の記入の経験さえも一度もない。
情報関係の学科にいる以上、 「やらせ」 でもいいから 「住基コード便利だったぞ…」 と言わせてくれ…
生体認証カード
銀行のカードを生体認証のICカードにしてみた けど、これまた over 50万円 の機会はどれほどあるのやら。 ちなみにICカードを作ったついでに、住基カードを確認してみた。 カードの裏には自分だけがわかる暗証番号のヒントが書いてあるのだが、 元ネタが分からず、暗証番号の後半しか思い出せない。どーしよー…