ProgI/プログラミング演習I
\ProgI/TAのページ

TA橋本のページ(仮)

このページは,プログラミング演習IのTA橋本のページです.



橋本とは…

アクセス

正直,一から「プログラミング演習I」の内容を授業時間だけでマスターしようというのは少々困難だと思います。
当然、自主学習が必要になると思います(特に後半)
なので、授業時間だけでなくほかの時間にも頑張ってください。
と、言うだけっていうのもひどいので自分がみられる時間にはできるだけ協力いたします。 主に

には対応できるかと思います。
メールくだされば対応します。
当たり前ですが突然の場合には行けない可能性があります。
可能な限り事前にお願いします。
土日も事前に言っておいてくれれば大丈夫ですが…誰も来ないかな?

感想とか、なんとか

9/13(木)

今日は次週の都合により交換させていただきました。
と、言っても交換したはずのレボウィッツさんも来ていましたが…。
金曜日が先週休みだったので今日のTAが演習の二回目で
明日の金曜日に演習の初回をやるという変なことに。
私の都合で木曜クラスの方にはご迷惑おかけしました。

質問してくれた方、ありがとうございます。
基本的には木曜日に顔を出すことは無いと思いますが
何か質問等あれば気軽にメールしてください。
それでは。

9/14(金)

今日は金曜日初の授業でしたね。
先日の自己紹介に引き続き若干スベッた気もしますが。。。

TAとしてはいかがなものかと思いますが
一度だけ、質問に答えず自分で調べてもらうように言わせていただきました。
確かに分からないことに答えるのがTAの仕事ではありますが
あまりにも一般的な内容であるならば答えられません。
自分で調べても(webやテキストを利用して)どうしても分からないようであれば
勿論、説明させていただきますが、
正直、テキストや教科書に一回目を通した程度では分からない言葉があって当然です。

厳しいようですが、要するに
テキストに読めない難しい漢字が出てきたときにどうするのか?
ということに非常に似たことです。
それは、聞かないで自分で調べますよね?
それと同じように自分で分かるように努力すれば分かる程度のものは
自主的に学んでもらうほかありません。
Rubyとかプログラムを習う以前の問題だとおもいます。

そうはいっても程度問題ではあるので

初歩的なことを聞くんじゃない!

って事ではありません。
分からなければどんどん質問してください。
ただ、その質問が教科書をめくれば、webを少し探せば分かるような問題であれば
もしかしたら自分で調べてもらうことがあるかもしれません。

もう一つ、厳しいついでに。
状況によりますが

読んだ。

と、言うのは普通その内容を理解したときに使う言葉です。
別に最初から最後まで目を通したことではありません。
したがって、

読んだけど分からなかった。

というのは成り立ちません。
例えば
「桃太郎を読んだけど結局どういう話か分からなかった」
と、言うのは読んだとは言わないでしょ?
簡単な内容ならば一度目を通しただけで理解できるでしょうが
プログラム習いたての人が
教科書やテキストを一度目を通して理解することは非常に困難です。
中にはテキストにマーカーで線を引いてきた人もいたようです。
とても感心しました。
そこまでやってもはじめは分からないこともあるかもしれません。
それでも理解できなかった部分を聞いてくれる分には
出来る限り理解を助けられるように頑張らせていただきます。

目を通して分からなかったからといって諦めないで
きちんと“読んで”ください。

初回から厳しい事言って次回から質問されないと悲しいですが、
ナンダカンダで答えますし、
自分で調べてもらうとしても、
調べ方が分からないようであればその方法についてもアドバイスいたします。

と、言うわけで次回からもよろしくお願いします。

10/4(木)

これを書いてるのは10月8日です。
作った最初はやる気満々なのに忙しくなってきたりするとナカナカ更新しなくなる
と、言うのは何年も前からのWebコンテンツの特徴であります(私だけ?)

今回は木曜日が金曜授業に振り替えにより金曜クラスの授業が木曜日でした。
どんなことがあったかと言われると…
TAの分際で説教まがいのことをしてしまいました。
理由は前回までのチェック項目の滞納(?)です。
チェック項目の進み方は人それぞれだと思います。
・当日までにやってある人
・チェック項目だけ先にやってしまう人
・単純に早い人(タイピングが早い,経験者など)
こんな人たちは難なくこなせるでしょう。
・当日になって初めてテキストを読んだ人
・前回までのことが良くわからない人
・一つ一つ理解するまで考え込んでしまう人
・タイピングなどのスピードが遅い人
の、ような人は時間的に厳しいかも知れません。

どうしたらいいかという明確な答えを示すことはできませんが、
少なくても
・当日までにテキストを読んでくる
・前回までのことを復習してくる
・どうしても分からなかったら聞く
・プログラムを打ち込んでくる
と、いうようにすることでかなり改善されると思います。
これまでは、
こういうことをしてこなくても大丈夫だった人も
後半になり、課題が難しく,多くなってくると同じ状況になるかもしれません。
そのときには以上のようなことを心がけてチェック項目がたまらないように
頑張ってください。

また、授業時間中にチェック項目が終わらないのは仕方ありません。
十分に準備をしてきてもエラーに躓いてしまったなどによって
時間内に課題をこなすことが困難なこともあるでしょう。
だからと言ってそのチェック項目を次回まで持ち越さないようにしてください。
次回にはその回のチェック項目があります。
持ち越したチェック項目をしているとその回のチェック項目が持ち越され
悪循環になってしまいます。
大変だとは思いますが放課後などを利用して
次回までにはチェック項目を済ませてくるようにしてください。
そのときにどうしても分からない場合にはメール等で連絡いただければ対応します。

10/12(金)

今回からテキストに書いてあることを写すだけではできないような課題も増えて,ナカナカ思うように進まなかった人もいるかもしれません.
しかし,自分が理解していなかった点を知るためのいい機会だと思って,分からなかったところは以前のテキストなどを参考にして復習しておくといいでしょう.
チェック項目についても今日中に出せなかった人も多いと思いますが,次回までに頑張ってきてください.やってみてもわからない場合はご連絡ください.

中には友達と協力して自力でエラーや分からないところを解決する姿も多く見られて、とてもいい傾向だと思います.
そのようにして自分で考えて理解できるようになったことは必ず力になると思います.
自分だけや友人間でもよく分からないことがあれば理解の助けになれればと思いますので,分からないときは声をかけてください.

10/19(金)

今日は皆さんの貴重な演習時間をいただいてデモプログラムの紹介をさせていただきました。思いのほかリアクションをしてくれたのでちょっとうれしかったりして。
やっぱり、アミダみたいな簡単なものでもゲームとか3Dのようなマルティメディアっぽいのはみんな興味があるのでしょうか?
音を流せなかったのが残念ですが。。。
結構大きな事を言いましたが、プログラムのレベルとしては皆さんが習っているようなことを理解していれば組めなくは無い程度のものです。
後は馴れと知識です。
それは少し時間をかければ埋められると思うので、
興味ある方は言ってくれればお教えします。(C言語だけど…。)

それに関連するかもしれませんが、
元々C言語ばっかりやってるせいで(言い訳)、
若干Rubyに関して勉強不足感が否めません。
今日もRubyではできる処理を「できない」と答えてしまいました。
ちょっと不安だったので調べて訂正しましたがご迷惑をおかけしました。
すみません。

今度からはそんなことが無いように勉強して行きます。

TAとしてのスタンス

そもそもTAとは何か?

授業は「プログラミング演習I」であるから“授業の補佐”をする前に
「プログラミング演習I」の授業の本質を考える必要がある.

以上が「プログラミング演習I」の授業概要である。 分からない言葉もあると思うがおいおい分かっていくだろう。 この目標を授業の履修者が達成するためには

だけでは勿論達成されない。
それは、ただ英語の本の文字を写した文章を提出して、
英語を理解したつもりになるのに近い。
やらないよりはましかも知れないが、
それでは意味も分からず,当然自分の手で文章を作ることなど出来ようも無い。
そもそも、それだけで済むならばTAどころか先生も要らなくなってしまう。
大変だ。

では、どうしたら良いのか?

と、いうのが自然な流れかと思う。
TAなどの力が必要となるのは主に「再度意味を考える」時だ。
ここまできてどうしてもわからないときはTAに聞こう。

それまでには聞いてはいけないのか?と、聞かれればそんなことは無いが
そこまでにできるだけ自分の力で頑張って欲しいとは思う。
「自分の力」というとずっと席に座って唸っているヒトがいるがそれは違う。
自分の力でテキストをよく読み、書籍やwebを利用して調べ、手を動かす。 それが大切だ。
幸い、プログラミングの学習では調べる、試すという作業には困らない。
授業のテキストはあるし、参考書もある、web上にも多くの情報がある。
試すには、プログラムを打ち込んで、実行するだけだ。

何もしないうちからわからないのは当たり前!
色々と調べて,試してみたけどそれでもわからなければ堂々と聞いて欲しい。

そうはいっても、
もう何が分からないのかも分からない!!
なんてことも勿論ある。
それはもう仕方ない!とりあえず聞きいてください。

と、言うのが私のスタンスです。
なので、質問されたときもできるだけ自分の力で解決してもらうようにします。
直ぐに質問の答えを提示するようなことはしません。
その質問の答えを自分の力で理解できるように支援します。
なので、「説明はいいから!答えは!?」というヒトには向きません。
むしろ、「答えはいいから!理解したい!」というヒト向きです。
当たり前ですが後者のほうが大変です。
でも、同じ時間を授業に費やすなら後者の態度で臨んだほうが得るものはとても大きいでしょう。

まぁ厳し目に書きましたけど、ナンダカンダで対応します。 質問してくれた方には出来る限りの対応をしようと思うのでよろしくお願いします。

あくまでも私個人のスタンスで他のTAの方や先生方については別だということに注意!

学習の助け

タイトルの通りになればいいと思います。
授業では(おそらく)やらないけど理解しておくといいことなど
主にRubyに限らずプログラミングの一般論について書いていこうと思います。
間違ってたら指摘をお願いします!

プログラムとは

そもそもプログラムとは何か?と、いうのは誰もが思うことだと思う。
そこでプログラムとは何かをざっくりと説明する。

プログラムとは一般に物事の段取りや予定を差す。
根本的には同様である、
我々が扱うプログラムとはコンピュータ(一般的にはパソコン)の行うべき段取りのことである。
(コンピュータだけとは限らないがここではコンピュータとする)

我々がコンピュータを使うときプログラムがなければ,
それはただの箱に過ぎない。
ヒトが乗らない車のようなものだ。
ヒトが乗らないときそれは車としての機能を果たさない主に金属でできた箱である。

これを動かすときに必要となるのがプログラムだと思えばいい。
イメージとしては

に近いかも知れない。
ただし、我々が誰かに命令するように

と、いくら言っても勿論コンピュータはやってくれない。
理由は3つ。

という3つである。
一つ目は意外と簡単に解決することができる。
口頭ではなくコンピュータ上のテキストデータ(文章)として与えればいい。
二つ目を解決するために必要なのが…プログラミング言語である。
二つ目を解決するために必要なのが…アルゴリズムである。

つまり、我々がコンピュータに何かを命令するには

と,いう過程が不可欠である。
まぁ外国から来た部下に命令すると思えば仕方の無いことだ。
彼らの自国の言葉で命令をしなくては仕事が進まない。
アルゴリズムって何か?っていうヒト。
下に書いてあるので読んで欲しい。

プログラミング言語

折角なので
この外国から来た部下を例にして行こう。

早速、残念なお知らせだが、
彼ら(コンピュータ)の自国の言葉=プログラミング言語
と、言うわけではない。
プログラミング言語はあくまでも間に入る翻訳者の共通言語のようなものだ。
逆に言うと、例え相手の出身国が異なっても翻訳者の共通言語が分かればよいことになる。
便利でしょ?

パソコンの世界でもWindowsやLinuxのように出身国が違う方々がいる。
でも、それぞれの言葉を覚える必要はない。
プログラミング言語を覚えればそれぞれにあったように訳してくれるのだ。

まぁとにかくコンピュータに命令して何かして欲しいならプログラミング言語覚えてね!
っていうことだ。

さて、プログラミング言語は兎も角,前述の翻訳者には二つのタイプがいる。

だ。
意識することはほとんど無いと思うがその特徴としては、
インタプリンタさんを通すと会話のようにコンピュータと接することができる。
ただし、いちいち訳しては様子を見るので少し遅い。
コンパイラさんは全部一気に訳して渡してくれるので、
コンピュータは全部の作業を一気に片付けてくれて早い!
ただし、間違えたりすると全文を訳しなおす必要がある。
のように言われている。
Ruby処理系は通常インタプリタのようですね。

さて、コンピュータに命令をする為には
プログラミング言語で書類を書いて翻訳者に渡せばいい
ということは分かりましたか?
このときに書き上げる命令書が

と、呼ばれるものである。
このソース=命令書を発行することで
我々は遂にコンピュータに命令を送ることができるのです。

じゃあ、プログラミング言語を覚えれば
コンピュータは自分の思い通りに動くありがたいものかというと…
半分正解というところだろうか。

アルゴリズムとは

勿論、プログラム言語を覚えて文法を守り、命令を書けばコンピュータは忠実に働いてくれる。
しかし、彼らにできることは自分が知っている作業だけである。
彼らは元々大した作業はできないのである。

多くの場合は

程度の事ができるだけだ。 プログラミングの習得に苦労するヒトの大半はプログラミング言語を覚えれば言いと思っている所がある気がする。

先程の外国から来た部下で言えば、
プログラミング言語を覚えたというのは
言葉が通じるようになったという程度の話である。

いくらプログラミング言語をもって
「高さが3で、底辺が2の三角形の面積を計算しろ!」
と、命令書に書いてもコンピュータはそんな作業はできないのである。
(そもそもできない作業に当たる言葉も無いが…)
では、この作業をさせるためにはどうすればいいか。

というように命令しなければならない。
このように、行う作業の「手順」というべきものがアルゴリズムである。
つまり、コンピュータのできる掛け算や割り算を用いて
三角形の面積を求める手順がこの命令書(プログラム)のアルゴリズムである。

当然、命令する側はこのアルゴリズムを理解し組み立てる必要がある。

実際にはいつもいつも初めから知っている命令で作業させるわけではなく、
よく使う複雑な作業を教える方法や
それらを記述した教科書のようなものを渡してそこに書かれている作業をさせることもできる

プログラミング言語とアルゴリズム(まとめ)

さて、ここまで来てプログラムとは何かが少しはわかっただろうか?

まとめると、

の作業によりプログラミングは行われる。
単純な作業の場合は手順も簡単であまり意識はしないと思うが
複雑な作業になった際にこれらを同時に行うことは難しくなってくる。
習いたての言葉で伝える内容も考えながらでは意図する内容を正確にコンピュータに伝えることは難しいのである。

お勧めとしては

と、いう手順を踏むことである。 アルゴリズムを考えるのは、三角形の面積の例に挙げたように日本語でかまわない。
(なお、アルゴリズム自体はこの先、別の言語を習う際にも変わらない。)

頭の中、ノートの中でコンピュータにさせたい作業の手順を整理して、
それをRubyという言語で書くという意識をもつことが大切である。
これを明確に区別していれば、
言葉(プログラミング言語)が悪いのか、
方法(アルゴリズム)が悪いのかが直ぐに分かり効率的な学習の助けにもなるだろう。

文字と数

プログラムの中で文字と数というのは分けて考えらる。

何がいいたいかというと

というのは異なるものだということである。
これはプログラムに限ったことではなく、
普段の生活の領域においても暗黙のうちに区別されていることである。

「13って書いて」 … (1)

と要求された場合、我々は

という文字列を書く。
さらに

「13と1を一緒にしたものを書いて」 … (2)

と要求された場合、我々は

と言うように書くだろう。
(まぁ中には13の左側とか下側に書くかも知れないが
今回は原稿用紙のようなもの詰めて書くと思って欲しい)
ここでは13という文字列と1という文字列をあわせて書いている。
作業としては(1)と(2)の要求は
偶然13や1という数を表す文字であっただけであって
普通の文字(“あ”とか“い”)と扱いは変わらない。
それに対して、

「13と1を足したものを書いて」 … (3)

と要求された場合事態は急変する。
このとき一般的な答えは

となることだろう。
つまり、(3)での13と1は数になるのである。
よって答えは14となる。

(2)と(3)は日本語で言えば

赤字部分が異なるだけである。
このように、多少の違いでも

ということは問題になる事がある。
プログラミング言語によってどのようにして区別するかはまちまちであるが
とにかく、
今、自分が扱っている数字が文字なのか?それとも数なのか把握する必要がある。

繰り返し

プログラムの真髄は繰り返しにあり。

プログラムを組んでいると何度かは思うであろうことである。
そもそもプログラムとは
「人間がやりたくないことをコンピュータにやらせる」
という目的のためにある。
少し話はそれるが
プログラミングはめんどくさがりのほうが上達すると思う。
なぜなら自分で仕事をしたくないからである。
ナントカしてコンピュータに働いてもらいたいので
プログラムを覚えるのである。
(あくまでも私の考えで一般論ではない。)

例えば
「ある値を二倍にしていって100回目の値を知りたい」
とする。
ある値が

1

であった場合を考えてみよう

1回目:2
2回目:4
3回目:8



まぁ20回目ぐらいまでなら暗算でもいいが
100回目まで直ぐに暗算するのは困難である。

ここでコンピュータに計算させるという要求が生まれる。
実際にプログラムを書くならば

ある値=nという変数を用意し

n=n*2

という作業を100回繰り返せばいい。
実質的にプログラムに要するのは

変数に初期値を入れる。
100回のループをする。
ループの作業内容としてn=n*2を書く

の三行。
結果の表示や初期値の読込みなどを行ったとしても
十行にもならない。
たったこれだけでいいのだ。

実は初期値を1にした場合、結果は2の100乗であるから
計算機でも直ぐに計算できるのだが…。

もっと式が複雑になったらどうだろう?
2倍していくのではなく
3倍して5を足して2乗して5で割る
と、いう計算を100回繰り返すとしたら? これはプログラムに頑張ってもらうほかにない。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS