ホーム » 2013 (ページ 4)
年別アーカイブ: 2013
2013年10月20日(第343回)
- まるよし Train Pops ~ 国語と遊ぼう! 第27便 「弁論大会」
- 食欲の秋のお話
- プロコンのお話
- 文化祭・学園祭のお話
ゲスト:福井高専 横山さん(4EI)
担当:前田勝(4EI)、松島(2C)、山野(2C)
構造体を使った課題(オブジェクト指向っぽく)
3年の授業では、構造体を使った説明もできたので、 構造体を使った課題の時間とした。
課題テーマ
名前と誕生日といった複合データを読み込み、何らかの処理を施す プログラムを構造体を使って記述する。 前回のファイル処理のプログラムを拡張して作成してよい。
ただし、前回授業では、オブジェクト指向の考え方について説明をしたので、 1件分のデータを入力する関数・出力する関数などを使って、 極力オブジェクト指向っぽく記述すること。(必須ではない)
いつも授業で寝ている学生さんだけど、課題中に横を通る度に、 「何か見ていたであろう画面」を消すヤツがいる。 うーん、演習室の教員用端末には、授業中の全端末のデスクトップ画面を閲覧する 機能があるのを今さら知らないのだろうか… ソフトを立ち上げ、その学生のデスクトップを見ると、 「2chまとめサイト」を見てやがる…
個人特定で怒るのもなんなので、 「教員端末は全端末監視ができるけど、2chみてるのがいるけど…」と 全員に警告しておいた。
2分木の課題
前回の2分木へのデータの追加処理の説明を受け、 2分木の課題時間とした。
課題テーマ
名前と誕生日といった複合データを、2分木に保存し、これらのデータに対して 処理を施すプログラムの作成。 ただし、分岐するときのキーとなるデータに対する検索処理は、 ループで記述できるのに対し、非キーに対する検索処理は再帰呼び出しを を必要とすることから、「検索はキーと非キーの2種類で検索ができること」 とした。
オプション課題として、データは単純に整数として、以下のように ASCIIアートやGUIを用いて、視覚的に2分木表示するプログラム作成も可とする。
58 / \ 25 80
演習中は、真面目に課題に取り組んでいたようだが、未完成の人も多いようなので、 来週は前半に次の内容(2分木による演算子の処理)を説明し、後半を演習とする予定。
2013年10月13日(第342回)
- 大学学園祭について
- まるよし Train Pops ~ 国語と遊ぼう! 第26便 「発声」
- 安全とコストのバランスについて
- エコラン参加について
- 五味が答える!~かかってこいや~
担当:前田勝(4EI)、山野(2C)、五味(教員)
※今回放送しました まるよし Train Pops ~ 国語と遊ぼう! 第26便 は収録環境の不具合のためお聞きづらくなっておりました。お聞きの方にご迷惑をおかけしました。
構造体と関数とアロー演算子
前回の授業で、構造体の入れ子などの話をしたので、 構造体のポインタ渡しと、オブジェクト指向について話を行う。 オブジェクト指向については、プログラム記述はテスト範囲とはしないことを伝えておく。
ポインタ渡しによる関数化
構造体の配列に対する処理の例として、入力処理と出力処理を関数化する例を示す。
struct Person { char name[ 10 ] ; int age ; } ; void input( struct Person* p ) { scanf( "%s%d" , (*p).name , &( (*p).age ) ) ; } void output( struct Person* p ) { scanf( "%sさんの年齢は%d歳です\n" , (*p).name , (*p).age ) ; } void main() { struct Person data[ 10 ] ; for( int i = 0 ; i < 10 ; i++ ) { input( &(data[i]) ) ; output( &(data[i]) ) ; } }
ただし、(*p).name といった記載は、面倒なので、 p->nameといった記載が可能。
このプログラムでは、main内部には、Person内部のデータについての 記載がない。このため、Personというデータの内部を知らなくても、 10件分のデータの入力出力が記述できる。 こういった、データ構造や関数内の処理を知らなくても、プログラム記述が できることを隠蔽化と呼ぶ。 特に、関数を用いることで、関数内部の処理手順を知らなくてもよくなり、 これは「手続きの隠蔽化」と呼ばれる。 また、構造体を用いることで、データ構造の内部を知らなくてもよいことは、 「データの隠蔽化」と呼ばれ、この2つの隠蔽化をうまく使えば、 プログラム作成の分業化ができるようになる。
オブジェクト指向
前述の構造体を用いたプログラムは、オブジェクト指向の考え方の 入口となる。このプログラムは、C++であれば。
class Person { private: char name[ 10 ] ; int age ; public: void input() { scanf( "%s%d" , name , &age ) ; } void output() { printf( "%sさんは%d歳です。\n" , name , age ) ; } } ; void main() { Person data[ 10 ] ; for( int i = 0 ; i < 10 ; i++ ) { data[ i ].input() ; data[ i ].output() ; } }
コンピュータの構成とプログラムが動くしくみ
プログラムが、OSによってRAMに呼び出されて動く仕組みや、高級言語の動くしくみを説明する。
コンピュータの構成
コンピュータの基本的構成部品は、CPU,主記憶,補助記憶,周辺装置。 CPUは、メモリから機械語の命令を読み取り(Fetch)、解析(Decode)、メモリ読み出し(Read)、実行(Execute)、メモリ書き込み(Write)を繰り返す。 メモリは、読み出しだけのROMと、読み書きのRAMから構成されるが、 ROMだけでは自由にプログラムを入れ替えて動かすことができない。
コンピュータは電源が入ると、OSを起動するために、ROMに入っている周辺装置を扱い方のBIOSを使い、 OSを起動させるためのプログラム(ブートローダ)を起動する。ブートローダは最終的にOSを起動させ、 ユーザプログラムの起動を待つ。ユーザのプログラム起動要求により、補助記憶装置から プログラムを主記憶に読み出し、実行を行う。
プログラムが動くしくみ
プログラムといっても、コンパイラ方式、インタプリタ方式などがある。 コンパイラは高級言語で書かれたプログラムを、直接実行可能な機械語に変換しておく。 このため、実行時の速度は速い。しかし、プログラムの実行するには、コンパイル・リンクなどの手間が必要となる。また、元々のプログラムがどういった記述なのか解析は困難。 インタプリタ方式は、高級言語のソースを必要に応じて命令の意味を解析し、その都度実行を行う。 このため、プログラムの試作段階で動作を確認しながら開発を行う際には便利である。 しかし、プログラムを実行する際に、高級言語のソースコードが必要となる。 最近では、バイトコードインタプリタ方式と呼ばれる方式もよく利用される。 高級言語の命令を、実行しやすい機械語に近いシンプルな命令にコンパイルし、実行を行う。
一般的なコンパイラ方式では、プログラムを実行するまでに、
- 高級言語のソースを、コンパイルし中間コードを生成。
- 中間コードと、ライブラリ(一般的な関数の処理の中間コードをまとめたもの)を組み合わせて、機械語を生成(リンク処理)
といった手順をとる。
最近のOSは、マルチユーザ・マルチタスクであるため、ライブラリの機械語は同時に動く他のプログラムでも同じように使われている場合が多い。この時、ライブラリの機械語コードがメモリ上に複数あると、 メモリの無駄や、ライブラリの更新の手間が増える。 このため、最近のOSでは、動的リンクライブラリという方式を使い、ライブラリを共有して用いる。