アイディア草稿
今日は、創造工学のネタとするアイディアを自分なりにまとめて、草稿として 提出してもらう。グループになりそうなメンバーがいれば、予定者として記載するように指導。 グループを巡回していると、過去ネタとかぶっていたり、実現性が怪しかったり、 内容としてもうひと工夫が必要だったりと、問題はある状態。 しかし、「実現性」と「もうひと工夫」は、相反するネタであり、指導のさじ加減が微妙。 ネタは下記の通り。
- 服のアバター自動合成
- 携帯ネタ
- 競技部門3人
- 顔認識で自動扉
- 画像付きインターフォン
- GPSの位置比較でコミュニケーション
- ブロックを画像認識して部屋のレイアウト設計?
- RFIDで入出管理
PHP講習会/H8割り込み講習会
今年度の創造工学の活性化のために4年実験の第1テーマを導入教育につかうにあたり、 第1回目に、PHPなどのネットワーク系技術の講習会と、H8などを用いる際に必須の割り込みなどの理解を行うための講習会兼簡単な4EI実験として講義を行った。
PHP講習会
インターネット技術の基礎知識を理解してもらうために、PHPを用いて簡単な講習会を行う。 (斉藤担当)
- 複雑な処理では、複数プロセスの協力も必要であることから、CGIの原理を説明をネタに、 プロセスが協力して処理を行うための問題点として、 SIGNAL,環境変数渡し,共有メモリ,パイプ,スレッドなどの用語も簡単に紹介する。
- HTMLの簡単な説明と、サーバにページを登録し、簡単なHPを設置するまでを説明
- PHPの簡単な例題を解説し、外部から渡される$_GET,$_POSTなどの変数を説明
- 例題として、何らかの簡単な処理プログラムを作ってもらう
- 最後にWeb系プログラムの必須のセキュリティネタとして、入力フォームにタグを埋め込む手法の問題点を1つだけ紹介。
H8割り込み講習会
H8などの組み込み系で何らかのシステムを作る場合には必須となる、割り込みなどの 概念の紹介として、割り込み関数の登録や割り込みが有効になるための設定などの 説明を行う。(担当高久)
組み込み系のC言語のプログラムを理解する際に必須となる、#pragma や、 volatile 宣言などの概念などの説明も行う。 割り込みとしては、時計やPWMによるサーボモータの制御も応用例として多いため、 タイマーA,タイマーWなどを例題として、解説を行う。
変数の取り扱い
今日は、変数の扱いの説明として、変数・関数と引数などを中心に話す。
変数の概念
- 大域変数(global変数)
- 大域変数は、どこからでも触れる変数で、極力使わない….など…
- 局所変数(local変数)
- forループなどのブロック内での変数宣言例など…
//大域変数を使うために起こるトラブル例 int i ; void foo() { for( i = 0 ; i < 2 ; i++ ) printf( "A" ) ; } void main() { // このプログラムは、AAAAと表示されない。 for( i = 0 ; i < 2 ; i++ ) foo() ; }
関数との値の受け渡し
関数と呼び出し側の値の受け渡しということで、値渡し(Call by Value)・ポインタ渡し(Call by Pointer)などの解説。
基本的にC言語では、関数の実引数(real argument)が、仮引数(pseudo argument)に コピーされる値渡しが原則で、関数から複数の値の変化を知りたい場合に、 ポインタと変数のアドレスを使ったポインタ渡しを行うと説明する。
void foo( int *p ) { // ポインタ渡しの例 (*p)++ ; printf( "%d" , (*p) ) ; } void main() { int a = 123 ; foo( &a ) ; foo( &a ) ; }
関数の処理によって値が変化することを副作用と呼び、 副作用は自分の持っているものが想定外に変化するのであれば、 不気味な現象でもあり、極力副作用は小さい方がいい。 だからこそ、変化してほしい値だけをポインタで渡して書き換えてもらう….といった説明を行う。
演算子の前後の()について質問があったので、演算子の優先順位の説明を行う。 ついでだし、右結合・左結合といった話や、趣味の悪い「コンマ演算子」なども 雑学系のネタとして紹介する。
プロトタイプ宣言とプリプロセッサ
この話の中で「なぜ関数実体を読み出し処理より前に書くのか?」との質問がでる。
# 通常私のコーディングは実体を先に書くボトムアップ記述。
基本的にコンパイルは、先頭から命令解析が行われるので、 関数の実体が先にあった方が、関数を呼び出す時に引数や帰り値が何なのか、 分かっていて都合が良いことを説明。 「トップダウン記述」であれば、呼び出し処理を先に書きたいけど、そういうときは プロトタイプ宣言が必要であることを説明する。
これに関連して、プログラム中の#行が、「プリプロセッサ行」であり、 「命令解析前の命令の書き換え処理」が行われると説明し、 "#include <stdio.h>" では、stdio.h というヘッダファイルを読み込み、 そのファイルには、printf(),scanf()のプロトタイプ宣言が書いてあることを説明する。
2009年4月19日 (第108回)
- 英語の囃子 第7回 吉田三先生、電子情報4年丸山さん
eng090419.mp3
電子情報系の資格試験情報をアップ
電子情報工学科にてチャレンジできそうな資格試験を集めてみました。
恒例の
今年はT先生がネタにされました。

新入生歓迎会
皆さん芸達者やのぅ〜♪

ネタ切れ学生さんのための「くじ引き一発芸」では、「中学校の校歌をうたってください」 というのもあった。恥ずかしがっている1年に「上級生の同じ中学卒も歌え!」と はやし立てられて、上級生も参戦。 しかし校歌を忘れてしまっている。
駄目だなぁ…と思っていたけど、自分自身の母校の校歌…. 味真野小学校は思いだせるのだが、武生第四中学校(現万葉中)が出てこない。 なんだっけとダメ元でWeb検索。すると、 武生第四中学校校歌が見つかる。
すっげーっと思ったんだけど、出てきた歌詞にまるっきり記憶がなく、 フレーズも出てこない。 おかしい….途中で校歌って変更になったっけ?(ふつーねーよなぁ…)
ループ処理とオーダ記法
ループ処理の時間
先週の、単純検索の処理時間が、 、 2分探索のループ回数が、
の説明に続き、 その処理時間は、
であることを示す。
もう少し複雑になった事例ということで、2重ループを含む最大選択法による並べ替えは、 最内ループ回数が となることを示し、 最大選択法の処理時間は、
で示されることを説明する。
オーダ記法
前述の処理時間の式では、処理時間に関する定数が沢山でてくる。 また、Nが大きく変化した時の処理時間のおおよその予測の際には、 Nの次数の低い項は無視する場合が多い。
このためプログラムのアルゴリズムの効率(処理時間)を議論するときは、 Nが巨大になった時の最も値の大きい項の変化式の部分だけで、 大まかな処理時間の予測ができる。この式でアルゴリズムを表現したものを オーダ記法(ビッグオー記法)と呼ぶ。
よって、 単純検索は、、 2分探索は、
、 最大選択は、
で示されることを説明する。
処理時間の予測
2分探索法で、データ(N)が100件の時の処理時間が1msecであった場合、 データが1000件の場合どのくらいの処理時間となると予想されるか?
オーダ記法では、 は、
なので、
より、
(ただしlogの底は10とする)。 よって、
授業の最後に、複数の項のNの次数が微妙で増加速度の判断が困難な場合の オーダーを求める手法として、ロピタルの定理を用いた方法なども説明する。
Cでのオブジェクト指向もどき
先週の、機械系・電気系学生向けの構造体の説明の続き。 C言語でのオブジェクト指向もどきの解説。
変数と関数
プログラミングの基礎として、大域変数と局所変数を説明。 特に大域変数は、常に操作できる領域で、誤った操作による破壊の可能性が高く、 関数や局所変数を利用すべき点を力説する。 次に、関数と呼び出し側のデータの受け渡しとして、 値渡し・ポインタ渡し・参照渡しなどを説明する。
これにより、必要最小限の情報だけを関数に開示して、 値を修正してもらうことができる点を説明。
/* 値渡し */ void func( int x ) { x++ ; printf( "%d" , x ) ; } void main() { int a = 123 ; func( a ) ; // 124 を表示 func( a ) ; // 値渡しでaへの副作用がないので再び124を表示。 } /* ポインタ渡し */ void func( int* p ) { (*p)++ ; printf( "%d" , (*p) ) ; } void main() { int a = 123 ; func( &a ) ; // 124を表示。 func( &a ) ; // ポインタの先のaが変化しているので125を表示 } /* 参照渡し */ void func( int& x ) { x++ ; printf( "%d" , x ) ; } void main() { int a = 123 ; func( a ) ; // 124の表示。a への副作用あり func( a ) ; // 125の表示。 }
Cでのオブジェクト指向もどき
C言語の構造体だけでオブジェクト指向の雰囲気を示すことができる点を、 下記のプログラムによって説明する。
これによって、main内部では、データの内容を知らなくても(データ隠ぺい), 関数の中身を知らなくても(手続き隠ぺい)プログラムが書けるようになった点を説明。 さらに、struct 宣言がオブジェクト、データ操作の関数をメソッドと呼び、 その2つを合わせてたものをクラス(class)と呼ぶことを説明する。
// Personオブジェクト struct Person { char name[ 10 ] ; int age ; } ; // Personの初期化メソッド void set( struct Person* p , char s[] , int a ) { strcpy( (*p).name , s ) ; // 最初の説明ではあえて (*p).age = a ; // アロー演算子は使わない } // Personの表示メソッド void print( struct Person* p ) { printf( "%sさんは%d才です。" , p->name , p->age ) ; // ちょっと説明したあとでアロー演算子を使う。 } void main() { struct Person saitoh ; // Personのインスタンス struct Person family[ 4 ] ; set( &saitoh , "とおる" , 44 ) ; print( &saitoh ) ; set( &family[0] , "あゆか" , 7 ) ; set( &family[1] , "みつき" , 9 ) ; print( &family[ 0 ] ) ; print( &family[ 1 ] ) ; }
第3回・歯みがきロボコン打ち合わせ
歯みがきロボコンの3回目に備えて、最初の打ち合わせが行われた。