創造工学のアイデアネタ(カード織り)
何気なく、Webを見ていたら、大人の科学で面白い商品が紹介されていた。 んで、その紹介ビデオを見ていたら、昔、NHKのものづくり系の番組で 紹介されていて、実際自分でも試したことがある手軽な織物(カード織り)が、 これまた大人の科学で紹介されている。
女の子のチームでこういう織物のシミュレータ、織物レクチャ環境つくらないかな…
創造工学演習予備実験・通信関係の実験
今年度のプログラミングコンテストは、サイコロを使ったデータ伝送なので、 通信に関係する基礎実験を行うこととする。
通信では、データ伝送時にノイズの発生などで、相手側にデータが正しく 届くとは限らない。今回のプロコンでも、サイコロのコードに変換する作業は 人間が行うことから、違う情報となって送られる可能性が高い。
- send-recv.cxx(漢字コードはShift-JIS)
このことから、今回の実験は、与えられた1行データを 自分なりの間違いチェック情報を付けて送信し、受信時で元に戻して復号するための プログラムを作る。ただし、通常のWindowsのパソコンで実験ができるように、 実際の通信を行う訳ではなく、以下の様に仮想的に関数で変換しながら行う。
- プログラムは与えられたファイルから1行づつデータを読む。
- この1行データは、encode(out[],in[]) によって呼び出される。 あなたは、入力したデータが後のdecode()で戻せるように、 チェックのための情報を付加し、out[] に格納する。
- この作られたデータは、本来なら通信路に送り出されるが、 簡単な実験なので、実験用の関数でノイズを加えられる。
ノイズの処理では、一定の確率で文字が欠落したり重複する。 さらに、一定の確率で文字の各ビットが反転する。 - このノイズが加えられたデータを受信したとして、 あなたは、付加されたチェック情報をみて、正しく送られたか確認しながら、 もとに戻す、decode(in[]) の処理を記載する。 ノイズが加えられ、元に戻せずもう一度データが欲しい場合は、 decode()の返り値として1を返すこと。 同じデータに対し、改めて異なるノイズが加えられたうえで、 もう一度decode()が呼び出される。
上に示した、send-recv.cxx には、必要な処理が記載されているので、 この中の encode( out[],in[] ) と、decode( in[] ) の中身を作成せよ。
レポートに記載する内容
- send-recv.cxx の 関数 encode() , decode() のプログラムリスト
- と、その説明(チェック方法および間違いが発生したらどうなるかの説明)。
- その実験結果。ノイズは乱数を元にしているため、複数回実験を行い、 正しく伝送されているか検証すること。
- 実際にサイコロで情報を伝達するとして、文字をどのようにサイコロで 表現可能か『手法の一案』を示し、さらに人間が並べる作業でミスがあったら、 どういった現象が発生する可能性があるか、発生しうる様々な状況を考察せよ。
レポートでは、実際に簡単な英単語を変換した例と、サイコロを間違えた例を示し、 ミスをチェックできることを確認せよ。
オーダ記法と再帰方程式
前回の授業で、単純サーチ、2分探索法、最大選択ソートの 処理時間の一般式を示した。今回は、これをアルゴリズム の比較という視点で、オーダ記法の説明を行う。
オーダ記法
オーダ記法とは、データ件数Nが巨大であった場合に、 処理時間がどういった式に依存するのかをビッグオー に合わせて、O(N),O(log N),O(N^2)などと記載する方法。 Nが巨大になった時の最大項について、Nの式以外の 定数項を省いた式となる。
複雑な一般式のオーダ記法として、最大項を判断するために、 lim を用いて、ロピタルの定理などを使う方法を説明する。
再帰方程式
次に、再帰処理の処理速度分析について説明する。
// 階乗 int fact( int x ) { if ( x <= 1 ) return 1 ; else return x * fact( x - 1 ) ; } // 変な再帰 int foo( int x ) { if ( x <= 1 ) { return 1 ; } else { int s = 0 ; for( int i = 1 ; i <= x ; i++ ) s += i ; return s + foo( x - 1 ) ; } } // フィボナッチ数列 int fib( int x ) { if ( x <= 2 ) return 1 ; else return fib( x - 1 ) + fib( x - 2 ) ; }
このプログラムの処理時間を分析するための再帰方程式を示す。 最初の2つについては、代入を繰り返すことで、一般式を示すことは容易である。
最後に、再帰方程式の応用として、ハノイの塔の再帰方程式を示す。 次回までに、この再帰方程式を解く方法について予習しておくように伝える。
変数のスコープと寿命
先週のC言語の制御構文の話に続き、変数のスコープと寿命について 説明を行う。
大域変数の問題
最初に、局所変数などの利点を分ってもらうために、 以下のコードの誤解について説明する。
// for文の繰り返しが動かない例。 // 2回の繰り返しを2回で4回表示にはならない int i ; void foo() { for( i = 0 ; i < 2 ; i++ ) printf("A") ; } void main() { for( i = 0 ; i < 2 ; i++ ) foo() ; }
大域変数を多用すると、違う意味で同じ変数を使う 危険性があり、プログラムが動かなくなる。 こういう時には、関数内で局所変数を使い、 同じ名前で違う入れ物の変数を活用する。
局所変数は、通常そのブロックに入る時に、 変数の入れ物が作られ、 そのブロックを抜ける時に、変数が消えてなくなる。 このような、変数が作られる/消えるタイミングを寿命という。
また、局所変数は、そのブロック内でのみ有効であり、 その変数が使える範囲・見える範囲をスコープと呼ぶ。
自動変数と静的変数
以下のような例で、変数の使い方の違いを3種類示す。
int x = 123 ; // 静的大域変数 // 寿命は、プログラム起動から停止まで // スコープは、プログラム全体。 void foo() { int x = 234 ; // 動的局所変数 // 寿命は、関数に入って抜けるまで // スコープは、foo() の内部のみ } void bar() { static int x = 345 ; // 静的局所変数 // 寿命は、プログラム起動から停止まで // スコープは、bar() の内部のみ }
関数の仮引数と実引数
関数呼び出しでは、実引数の内容が、仮引数にコピーされるだけ。 以下のコードでは、「foo() の x++」は、仮引数のxが変化するだけ。 mainのxの値が変化することはない。
int foo( int x , int y ) { // x , y は、仮引数 x++ ; return x + y ; // 返り値の方は、関数の前に書く。 } void main() { int x = 123 ; printf( "%d" , foo( x , 10 ) ) ; printf( "%d" , foo( x , 20 ) ) ; }
大域変数を使うと、関数を呼び出しても、値の変化が発生するかもしれない。 関数を呼び出した影響が、他の部分に及ぶことは、''副作用''と呼ばれる。
新入生ガイダンスでインターネット・携帯の使い方
高専の新入学生へのガイダンスで 「インターネット・携帯の利用上の注意」の説明をしてきました。 10分押しで始まった中、30分予定なのに45分しゃべってしまった。 F主事、I先生、ごめんなさい…(x_x;;
でも、インターネットを使い始めた人への注意点を、 網羅的にトピックを話せたと思う。
- ウィルス対策やワンクリック詐欺対策
- 著作権と肖像権とダウンロード違法化・リッピング違法化
- SNSのマナーと個人情報開示やの怖さ
- 学校内での携帯電話利用のマナーと、インターネット/携帯の依存症
大きな声で、居眠り学生も少なく話せたから、 時間押しを反省しつつも、うまくいったことにしておこう。m(_ _)m
英語でICT活用の協調学習の講演
英語教育のJALT福井支部の講演会に、 発表者の澤崎先生のお誘いもあり、 「英語教育におけるICTを活用した協調学習による授業デザイン」 の講演を聞いてきました。
最初、英語教育の方ばかりで英語の講演が始まるかと、 英語苦手人種はビビりましたが、楽しく拝聴できました。
澤崎先生が、F-leccs の活動の一環で、仁愛大学1年で実践している 英語の授業などのお話でした。 最初、SECIモデルの考え方では、協調学習の利点として、 授業の中で以下のループで暗黙知と形式知と変化していく。
共同化→表出化 ↑ ↓ 内面化→連結化
澤崎先生の英語の授業では、 一般教養の英語の授業では、必修だけどモチベーションが低いため、 エッセイライティングとディスカッションを取り入れて講義を行った。 授業参加者は、予習としてトピックを読んで理解し、 自分の意見を(MoodleなどのICTを利用して)記載してもらう。 授業当日は、ランダムにグループ化しリーダを決め、 討議結果をまとめさせ英語で発表を行う。
採点は、トピックへの自分の意見のライティングで行い、 100〜200単語程度でまとめてもらい、Moodleで事前に 添削を行っておく。授業での討議発表は、採点対象とはしない。 しかし、討議のまとめ方は自然にエッセイライティングに 活かされていく。
現在、福井高専でも、大学的な自宅での予習復習を必要とする 学修単位の明確化が行われており、シラバスに予習復習の記載を 行うことになった。澤崎先生の取組みでは、うまく予習が取り入れられており、 Moodleでの事前添削は大変だろうと思うけど、素晴らしいと感じた。
さて、これを、自分の授業に取り入れようと思ったら、何をしようか? 「わざと出来の悪いプログラムを示して、コードをどう改善するか 考えておいてもらい、それを授業で討議する…」 うーむ、「討議する時間あったら、面白いコード書こうぜ!!」 と叫びたい一方で、「悪いコードの問題点を考える/見つける」 のも大切だしな。さて、どちらを優先した授業がいいんだろ…
2013年4月14日(第316回)
誠市、ご縁市開催中でした!
- まるよし Train Pops ~ 国語と遊ぼう! 第2便
- 体育祭の応援合戦について
- 新年度の授業について
ゲスト:福井高専OB 五十嵐様(ミキサーとしてご協力いただきました!ありがとうございました)
担当:松島(2C)、山野(2C)、西(教員)
オブジェクト指向のガイダンス
オブジェクト指向の最初の授業ということで、 シラバス全体の説明と、 オブジェクト指向の歴史、 EIの学生さん以外のための構造体の説明を行う。
オブジェクト指向の歴史
プログラミング言語の歴史のなかで、 最初に作られた科学技術計算用のFORTRANは、当初手続きの順序の記載で、 処理手順の記載に goto 文が多用され、分かり難いものであった。 一方で、商用計算用のCOBOLは、 銀行系などのプログラムを記述するため、 複数のデータを組み合わせる構造体(微妙に違う所もあるが…)が使えた。 FORTRANの手続きの分かり難さは、 後で開発されたALGOL,PL/Iなどの言語では、処理の構造化によって 読みやすさが改善された。 こういった、処理の構造化やデータの構造化は、 構造化プログラミング(structured programming)として広く利用されていった。
プログラミング言語の発達の中で、構造化プログラミング機能を持った "C言語"なども開発される一方で、シミュレーションプログラムの世界では、 "Simula"などの言語が開発されて、その中でデータに対して命令を実行させる という記述は、擬人化したイメージから分かりやすいものとして受け入れられた。 この考え方が、オブジェクト指向プログラミング(Object Oriented Programming) として定着し、Smalltalk などの言語が開発された。 特に、Smalltalk では、GUI のプログラミングにオブジェクト指向が有効である と認知されるようになり、オブジェクト指向が広く普及する元となった。
そして、"C言語"に、オブジェクト指向を取り入れたら便利になるだろう…ということで、 "C++"が開発される。(BCPL→B言語→C言語→(D言語はまだ早い)→C++) また、これをインターネット利用に特化して、Java 言語が開発された。 この後、"C++"の影響を受け、Microsoft で開発された "C#"、 Apple社のGUIで使われる"Objective-C"、 最近では、B,C,Dの流れを受け、"D言語"も存在する。