ホーム » 2011 » 6月 (ページ 2)

月別アーカイブ: 6月 2011

2011年6月
 1234
567891011
12131415161718
19202122232425
2627282930  

最新の投稿(電子情報)

アーカイブ

カテゴリー

UMLの歴史と意味

プログラミングでの演習もほぼ終わり、オブジェクト指向での設計の話へ。 オブジェクト指向でUMLの書き方は、統一した図法という意味で重要であることを 示しながら、全体の説明を行う。

最初に、UML以前の説明として、フローチャート図やPADの説明を行う。 処理の流れを記載するものとして、使われてきているがデータ構造の設計も重要。

UMLは、ランボーによるOMT(Object Modeling Technique どちらかというとOOA中心?)と、 ヤコブソンによるオブジェクト指向ソフトウェア工学(OOSE)を元に1990年頃に 発生し、ブーチのBooch法(どちらかというとOOD中心?)の考えをまとめて、 UML(Unified Modeling Language)としてでてきた。

OMTでは、OOA(Object Oriented Analyze:分析中心)として(1)問題記述、(2)オブジェクトモデルの記述、(3)状態遷移図の作成、(4)データフロー図の作成といったプロセスが行われる。 これに、OOD(Object Oriented Design:実装目的)でOOA段階の図法に加え、 ユースケース図、シーケンス図などを加えながら設計を行う。 この2つをOOADとまとめる場合も多い。

UMLでよく使われる図を列記すると、以下の物が挙げられる。

  • 構造図
    • クラス図
    • コンポーネント図
    • 配置図
    • オブジェクト図
    • パッケージ図
  • 振る舞い図
    • アクティビティ図
    • ユースケース図
    • ステートチャート図(状態遷移図)
  • 相互作用図
    • シーケンス図
    • コミュニケーション図(コラボレーション図)

リストの考え方の導入

テストを明日からに控え、新しい所に入りたくはないけど、 配列の利点や欠点を理解するためにも、ランダムアクセスやシーケンシャルアクセスの 話を取り混ぜながら、導入説明を行う。

配列の添字でリスト

struct List {
int   data ;
int   next ;
} ;
int top = 2 ;
struct List table[] = {
{ 56 ,  1 } , // 0
{ 78 , -1 } , // 1
{ 12 ,  3 } , // 2
{ 34 ,  0 } , // 3
}
for( int p = top ; p >= 0 ; p = table[ p ].next ) {
printf( "%d" , table[ p ].data ) ;
}

次のアドレスでリスト

struct List {
int  data ;
struct List* next ;
} ;
struct List* top ;
top = (struct List*)malloc( sizeof( struct List ) ) ;
top->data = 12 ;
top->next = (struct List*)malloc( sizeof( struct List ) ) ;
top->next->data = 34 ;
top->next->next = (struct List*)malloc( sizeof( struct List ) ) ;
top->next->next->data = 56 ;
top->next->next->next = NULL ;
struct List* p ;
for( p = top ; p != NULL ; p = p->next )
printf( "%d" , p->data ) ;

ポインタで配列をスキャン&bit演算

例年のテスト問題の範囲を確認して、bit演算の話をしたけど、 先週の授業でのポインタのネタが不完全だったので、 その続きを後半で説明をした。

ポインタで配列をスキャン

ポインタの説明ということで、今週はアドレス渡しによるプログラムを説明。 分かりやすい例ということで、swap()を説明し、動作イメージを解説。

void swap( int* a , int* b ) {
int temp = *a ;
*a = *b ;
*b = temp ;
}
void main() {
int x = 11 , y = 22 , z = 33 ;
swap( &x , &y ) ;
swap( &y , &z ) ;
}

次に、配列をポインタでスキャンするような処理で、 ポインタのインクリメントの説明。
分かりやすい事例として、配列末尾に終了目印(0)がついている内容の加算を考える。

int a[] = { 11 , 22 , 33 , 0 } ;
int sum( int a[] ) { // 配列で書いてみる
int s = 0 ;
for( int i = 0 ; a[i] != 0 ; i++ )
s += a[i] ;
return s ;
}
int sum( int* p ) { // ポインタで書いてみる
int s = 0 ;
for( ; *p != 0 ; p++ )
s += *p ;
return s ;
}
int sum( int* p ) { // もっと短く
int s = 0 ;
while( *p != 0 )
s += *p++ ;
return s ;
}

ビット演算

2進数の理屈が分かっていれば、コンピュータ内部の電子回路的に行われている 掛算もプログラムで記述できる。この時、2進数の数値の処理ということで、 ビット演算が重要。

int mul( int x , int y ) {
int s = 0 ;
while( y != 0 ) {
if ( y & 1 != 0 )
s += x ;
x <<= 1 ;
y >>= 1 ;
}
return s ;
}

2011年6月5日(第219回)

テスト期間中につき、数学科 長水先生、電子情報工学科 西の2名でお送りしました!

  • バララッド大学交換留学報告会の様子
  • ロボコン審査会の様子

ArduinoでGPSデータ取れ…(06/03)

この記事は、twitter の @TohruSaitohに掲載した #fnct タグ付き記事を、まとめたものです。


うーむ、落書きネタにされてる

1106031343_960x640.JPG

newとdelete

そろそろ前期中間試験だけれど、オブジェクト指向の授業は3回のレポートの 実施予定のくせに、すでに2回目の課題も終わりそう。 今年の専攻科の受講生は、4人中3人はEIのOBだし、1名も最初の段階でも 構造体や文字列の話もそれなりに通じるし、1回目の課題でoperator() を 使って課題をしたり十分な理解力。このため授業進度が例年より早まっている。

ということで今日は、前々回の純粋基底クラスによるプログラムの例の中で、 詳しく説明していなかった new , delete について説明をしよう。 C言語の malloc() と free() について説明し、new int[ n ] やら、new Person( … ) といった使い方を紹介する予定。(今日は授業前にメモ作成)

配列の挿入削除問題

先週は、配列の固定長サイズによる問題の対応として、malloc() + free() による 動的メモリの管理手法の演習をしていたので、 その続きとして配列の欠点の挿入削除問題を説明。

配列に単純にデータを入れる処理でも、様々な方法がある。 最も簡単な方法は、配列とサイズを保存しデータを追加したい場合は、 末尾に入れる方法。

int array[ 100 ] ;
int size = 0 ;
void entry( int x ) {
array[ size ] = x ;
size++ ;
}

しかしこの方法では、デタラメな順序でデータが与えられれば、配列内は デタラメな順序となり、中身のデータ検索は「単純検索」をするしかなくなり、 処理時間のオーダは、O(N)となってしまう。

データを素早く見つけたいのであれば、2分探索法をするためにも、 配列が昇順に並んでいなければならない。 そうなると、昇順に並んだデータ列の途中に、与えられた情報を挿入する 必要が出てくる。

理解力を確認するために、昇順配列への追加処理ではどんな処理をするか 聞いてみると、「末尾に追加してクイックソートすればいい…」といった 考えの人が多かった。クイックソートはほぼ昇順に並んでいるといった データは苦手であり、O(N^2)になるから極めて遅いって…

void insert( int index , int x ) {    // 領域が重複している時は
for( i = size ; i > index ; i-- ) // 後ろからコピーが必要かも。
array[ i ] = array[ i - 1 ] ;
array[ index ] = x ;
size++ ;
}

しかし、この処理には、O(N)の処理時間を要する。

この対策として次のデータの場所を保存する方式であれば、 挿入作業はO(1)にできることを説明する。 実際のリスト構造でのプログラムは来週とし、 課題未消化のひとが多いので後半は課題時間とした。

ポインタと型

例年、文字列-数値変換(atoi,itoa)の課題をやっていると、 「型」という視点が弱いことがわかる。 そこで型など基本的な間違ったプログラム例をあげて、 型の違いで動かないという例を様々なパターンで説明する。 またポインタの概念についても説明を行う。

型の間違いの例の前に、関数でも引数の型の話の中で、 #include の説明も兼ねて、プロトタイプ宣言と古いK&R文法を紹介。 動かない例の中では、引数の型間違い,"C"と'C'の違い,未初期化ポインタの使用,配列あふれなどを説明する。

次に、ポインタの説明。 ポインタ+整数での指示場所の移動や、p[i] は *(p+i) と等価であることの説明など。 ポインタをずらしながらのループの説明がまだ。 for(…; p++ )