リスト処理を用いたスタック
前回の課題の演習が終わっていない人も多いので、 前半を講義で、後半は演習課題の続きとした。
配列のスタック
int stack[ 100 ] ; int *sp = stack ; void push( int x ) { *sp = x ; sp++ ; } int pop() { sp-- ; return *sp ; } void main() { push( 1 ) ; push( 2 ) ; push( 3 ) ; printf( "%d" , pop() ) ; // 3 printf( "%d" , pop() ) ; // 2 printf( "%d" , pop() ) ; // 1 }
この様なプログラムでは、最後に入れたデータを最初に取り出せるということで、 "Last In First Out(LIFO)"と呼ぶ。一般的にはスタック。
このようなスタックは、関数の戻り番地や局所変数管理に使われる。 また、上記のプログラムでは、stackの配列が100件分しかないので、 push()が連続100回呼び出されれば、配列をはみ出してしまう。
リストのスタック
前述のとおり、配列の大きさ以上のpush()できないので、 必要に応じてメモリを確保するリスト構造を使ってpush() , pop()を書いてみる。
struct List* sp = NULL ; void push( int x ) { // mallocに慣れてほしいので、わざと補助関数consを使わずに struct List* n ; n = (struct List*)malloc( sizeof( struct List ) ) ; if ( n != NULL ) { n->data = x ; n->next = sp ; sp = n ; } } int pop() { struct List* d = sp ; int ans = sp->data ; sp = sp->next ; free( d ) ; return ans ; }
絶対PATH/相対PATH演習+C言語のファイル
今週は公開授業週間ということで、私のプログラミング応用も見学を受けた。 同じ学科の先生だし妙な緊張もなく、いつもどおり。
# 気合が少し入ったのか声の大きさは20%増しだったかも。
先週の絶対/相対PATHの演習ということで、 最初にコマンドラインでのファイル・ディレクトリ生成・削除を説明し、 配布資料に説明した、ディレクトリ構造をコマンドラインで生成する演習。
cd PATH dir PATH type PATH mkdir PATH rmdir PATH echo DATA > PATH del PATH
C言語のファイル
ファイルに関連する話ということで、 最初にFILE型を説明し、fopen,fclose,fscanf,fprint などを解説。
fopenの説明では、テキストモード・バイナリモードなども交えて解説する。 第一引数のファイル指定では、Windowsのディレクトリ区切り文字に 対する注意点なども交えて解説を行う。
FILE* fp ; if( (fp = fopen( "¥¥Windows¥¥PATH¥¥abc.txt" "rt" )) != NULL ) { int x ; while( fscanf( fp , "%d" , &x ) == 1 ) { printf( "%d" , x ) ; } fclose( fp ) ; }
公開授業週間
今週は公開授業週間という、他の先生の授業を見学することで 自分の授業方法の改善につなげよう….という授業見学を行う週。 私自身も、ベテランの先生と若手の先生の授業を見学させてもらった。 他の方の見学があると、なかなか緊張し、 私自身が教員としての最初の授業で、 手が微妙に震えていたことを思い出す。
UPSがおかしいと思ってたらバッテリ配線が…
昨日、サーバ監視ソフトが異常を知らせてくるので、確認したら UPSがフリーズしてる。給電されていないし、パネルのボタンを押しても無反応。 しかたがないので、落ちたサーバなどを一時的に別コンセントにつないで 起動させ、一度完全放電させて壊れていないか確認してみた。
完全放電させたら、復活してくれて万々歳なんだが、 先月にも同じように給電が止まってサーバが落ちたし、 改めてUPSの機能を確認。 すると、UPSの横に貼られた黄色い目立つシールに、 "STOP/HALT Connect Battery"と書いてあるじゃん。 UPSを買った時には、STOP/HALTの文字だけみて給電を止める時の注意書きと 勝手に誤解していたけど"Connect Battery"とな。 しっかりシールを剥がして確認すると、UPS内部のバッテリーの配線が "安全のために"抜いてある….(x_x; ということは、今まではUPSといっておきながら、単なる大きなコンセント状態。 停電・瞬停であれば、そのまま落ちてあたりまえ。
あまりにも恥ずかしいミス….
UML構造図
前回の授業の締めで説明をしていたUMLについて、 本格的に説明を行う。
UMLは、OOD(オブジェクト指向デザイン)などからOML(オブジェクトモデリング言語)などを経て、UMLへと変化していった。 UMLでは、大きく分けると構造図・振る舞い図に分類され、 それぞれについて、さらに具体的な図の書き方が決められている。
- 構造図
- クラス図とオブジェクト図
- コンポーネント図
- 配置図
- パッケージ図
- 振る舞い図
- ユースケース図
- アクティビティ図
- ステートチャート図(状態遷移図)
- 相互作用図
- シーケンス図
- コミュニケーション図
クラス図とオブジェクト図
クラス図は、クラスの中身と他のクラス間の関係を記述するための図。
1つのクラスは、上段にクラス名・中段に要素・下段にメソッドを記載する。 各要素・メソッドの前には、限定子として("-":private,"+":public,"#":protected)などを 記載する。
コンポジションと集約
クラスと他のクラスの間の関連は直線で表し、多重度やその役割を書き添える。 継承は白抜き△矢印で表現し、そのクラスの基底クラスに向かって矢印を描く。 関連においてオブジェクトの寿命が同じ(クラスの要素に別要素が包含される)場合は、 コンポジション(合成)と呼ばれ、黒塗り◆で矢印を描く。 寿命などが別であり、ポインタで結合されるような関係は集約と呼ばれ、 白抜き◇で矢印を描く。
class Engine { // エンジン } ; class Tire { // タイヤ } ; class Car { Engine engine ; // コンポジション Tire* wheel[ 4 ] ; // 集約 } ;
is-a,has-a
クラス構造で派生で表現できるような関係 例えば、基底クラス:どうぶつ、から派生した哺乳類とか鳥といったクラスを 考えると、"哺乳類はどうぶつである"という言い方が可能であり、これを"is-a"の関係と呼ぶ。 一方、"哺乳類は足を持っている"という言い方ができる場合は、"has-a"の関係と呼ばれ、 "足"というクラスを、集約なりコンポジションで実装することになる。
class Animal { // どうぶつ } ; class Mammalia : Animal { // is-a 関係,派生で実装 // 哺乳類 } ;
2012年6月24日(第274回)
収録でお送りしました。
福井高専生バンド「ライジングレモン」スペシャル!!