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

SIZE(20){プロ演兇TA橋本のページ

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

三学期的には正式なページではないので更新はしませんが
三学期のアクセス情報を載せておきました。参考までに



橋本とは…

  • 氏名
    • 橋本 泰治 [Yasuharu HASHIMOTO]
  • e-mail
    • hashi[atmark]slis.tsukuba.ac.jp
  • 所属
    • 田中研究室 博士前期課程 1年
  • 居所
    • 研究棟 2F 共同研究室 A220 (トイレの隣)
  • 研究分野
    • 音響
    • 信号処理
  • 注意点
    • 主に使用する言語がC言語です.
    • もしかしたらうっかりC言語と勘違いして意味不明なことを言うかもしれません。
    • 許してください

アクセス

正直,一から「プログラミング演習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ではできる処理を「できない」と答えてしまいました。
ちょっと不安だったので調べて訂正しましたがご迷惑をおかけしました。
すみません。

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

10/26(金)

今日はメソッドの回でした。
順調にメソッドをやっている人もいれば
前回のチェックをやってる人もいたようです。
一度遅れると取り戻すのが大変なのは分かりますが
授業時間以外も利用して追いつくように頑張ってください。

メソッドは使えるようになると便利な機能です。
使いこなせるように頑張ってください!
どういうときに便利かは後で下のほうに書くかも…。

後は佐々木さんのプログラムのデモがありましたね。
すごかったです。
ご本人は簡単だとおっしゃっていましたし、
みんなにもできると言われていましたが、
簡単にすごいことをするというのは
プログラムの利点であり、難しいところだと思います。
googleマップとか
英辞郎とか
既存のものを使いやすいように
カスタマイズするようなプログラミングも
身近で、有用なモノですね。
私もjavascriptとかやったことがないので
機会があったら教わりたいです。
使いにくいサイトとかを自分仕様に変えてみたいです。

ちなみに、
来週月曜日(10/29)の18:00から
“どうしてもレポートで分からないところがある”
と、いう人対象にレポートの補助をします。
場所はいつも演習をやっている隣の部屋(小さいほうの部屋)です。
非公式です。
あくまでも、自分でやって分からないところがある人向けです。
前日まで何もやってなくて何をしたらいいかわからない人や、
これまでの演習の内容も理解(もしくは理解しようと)してないようでは
間違っても期限には間に合いませんし、補助のしようがありません。
必ず自分で出来る限りの努力をしてきてください。

11/2(金)

こんにちは、橋本です。
最近学生に
「TAの人」
といわれました。橋本です。
まぁ名前なんて覚えてないですよね。

今回はレポートをやりきったためなのか
全体的にプログラムの理解が深まったように感じました。
メソッドは便利な機能なので活用できるようにしましょう。
普段意識しないで使っている
print
もメソッドです。
引数として与えた文字を表示してくれるメソッドです。
このように私たちは自分で宣言をしないでも
使えるメソッドをもっています。
プログラムを書く前に
自分が求めている機能を持ったメソッドが有るか無いか
一度調べてみると良いかも知れません。

また、長屋さんのプログラムのデモと説明がありました。
とても分かりやすい解説で
メソッドやライブラリに関しても少し伝わったのではないかと思います。
ライブラリは人が作ったメソッドの集合体です。
それを読み込むことでそのメソッドを使えるようになります。
自分でライブラリを作ることも出来ます。
メソッドにする利点はここにあります。
プログラムの中で使うメソッドを
その都度,宣言することはあまり効率的ではありません。
一度作ったメソッドを保存しておき、
別のプログラムでも使えるようにすることで
メソッドは大いに役に立つのです。

11/9(金)

こんばんは、橋本です。
気がつけばプログラミング演習1も残すところ後1回となりました
エディタの使い方から初めて約2ヶ月程…
これまで習ったことや自分で勉強したことでいろんなことが出来ると思います.
演習課題で作ったプログラムそのものはもしかしたら、
自分の実用の範囲とはかけ離れているかも知れません.
次のステップとしては
皆さんが自分の欲しいものプログラムを
演習課題等で習った範囲で作るということが出来ると思います.
そうすることで復習にもなるし,
習ったことだけでは出来ないところを自分で勉強することで
徐々に出来ることが広がって行きます.
普段自分がパソコンで使っているソフトも誰かが作ったものです.
逆に言えば頑張れば誰もがそのうち
普段使っているソフトのようなものを作れるようになります.
それどころか
自分用に作り変えたりすることも出来ます.

何でもそうなのかも知れませんが,
目標を持って取り組むことでとても効率が上がります.
どうせプログラミングをやるのなら
「こんなプログラムがあったらいいのに…」
と、いう目標をもってそれを実現できるように頑張りましょう。

11/16(金)

皆様、大変お疲れ様でした。
と、言ってもまだレポートが残っていますが…。
どうでしょうか?一学期間終わってみて。
始まる前と今では何か変化があったでしょうか?

出来ることなら全員に良い変化があった事を期待しています。

で、しつこいようですが
最後の一言で言ったことを再度詳しく載せます。
あの車の例えの奴です。
結構気に入ってます。うまい例えだと思っています。
時間の関係ではしょったところもあるので完全版で乗せます。
暇なときにでも読んでください。

プログラミングは車の運転のようなものだ。

プログラミングというのは車の運転のようなものだと思います。

ある目的地に向かうとき我々は色々な手段をとることが出来ます。
近場ならば歩きや自転車でも良いでしょう。
遠ければバスとか電車のような交通機関を利用するのも良いでしょう。
しかし、
遠くても、尚且つ自分の目的地にピンポイントでたどり着くには
車というのは非常に便利なものです。

計算をするときで言えば
手書きで求めるのが歩きです。簡単な計算なら手っ取り早いです。
計算機を使うのが自転車です。手書きじゃ面倒でも簡単です。
さて、
計算機で20桁の掛け算が出来るでしょうか。
ちょっと難しいですね。
パソコンを立ち上げてエクセルにでもやってもらうのが良いかも知れません。
これは電車を使うようなものです。
遠くにでも簡単に行くことが出来ます。
ただし、お金が必要です。
そして、駅までしか行くことが出来ません。
そうです。
エクセルなどのソフトを使うと高度な計算も比較的簡単に出来るでしょう。
しかし、それはお金を払わないと使えない上に出来ないものは出来ないのです。
そんなときに自分のやりたい計算結果(目的地)にたどり着くためにはどうしたらいいのでしょうか。
そんなときに役立つのがプログラム(車)です。
既存のソフト(交通機関)が出来ない事もできるのです。

今、多くの人は教習所に通ってる段階です。
プログラミングが出来るようになるために通っています。
自動車教習所にも
車の運転が出来るようになるために通いますね。
運転が出来るようになるための苦労なんてものは大したことないのですよ。
だって、車便利だもの。

みんな乗りたいんですよ。
色んなところに行きたいから。
だから頑張って練習をする。

プログラムも便利だということを認識してください。

みんな使いたくなってください。
色んな事をしたいと思ってください。
そのために頑張って練習をしてください。

使い(乗り)こなせるようになれば
後は自分のやりたいことがいくらでもやれるようになるでしょう。

むしろ問題はその先にあります。
車を運転するときその操作(プログラミング)よりも
どんな場所(目的)に
どのコース(手順)で
どんな車(プログラミング言語)で
行くのか。
以上のような問題に遭遇するでしょう。

手順をよく考えなければ
同じ結果を得るのに何倍も時間や燃料(体力)がかかります。
同じプログラムを書くのに
人によってソースの長さは違いますよね?
効率の良いプログラムを目指したいものです。
また、初めて通る道は
どちらに行ったらいいのかも分かりません。
自分の目的のために
何処を通るのが一番いい道なのか。
それがプログラムを使う上で主な作業になることでしょう。

プログラミング言語を選ばなければ
思いもよらない苦難があるかもしれません。
TAや先生のデモも色々な言語で書かれていました。
それはそれぞれの言語には得意,不得意があるからです。
公道仕様のものもあれば
サーキット仕様やオフロード仕様もあります。
難しいことはありません。全部車は車です。
違いを理解してちょっとなれる必要はありますが
基本の操作(プログラミング)は同じなのです。
まずは今の使っているモノを乗りこなせるようになりましょう。

やっぱり長くなりましたが、
最後まで読んでくれる気さくな人に
私なりの最大の助言をしたいと思います。

「とにかく自分のほしいものを作りましょう。」

これに尽きます。
初めからすごい物を作ろうとすると躓くかも知れません。
初心者マークをつけて遠くに旅行なんかに行ったら…そりゃあ大変ですよ。
それでもたどり着いたときの達成感は変えがたいものとなるでしょう。
決められた教習コースに飽きているのならなおさらです。

いくら遠くても、基本の操作さえ抑えておけばいつかはたどり着けます。
教科書はマニュアルです。よく読みましょう。
ネット上の説明はガイドブックです。
サンプルプログラムは。地図です。
一気に目的地に行こうとするのはやめましょう。
出発地点からとりあえず自分の分かる近場まで頑張りましょう。
次はそこを出発点にまた近場まで行きましょう。
分からなくなったらそこでマニュアルやら地図を見ましょう。
困ったときは隣の友人に聞いたり。
人に聞きましょう。
幸い学校という場所は道に詳しい人たちがたくさんいます。
分からなくなったら聞いてみるのも良いでしょう。

私も自分の知っている道ならお教えできるかもしれません。
分からなくなってふと思い出したときには是非聞いてみてください。

終わり。

TAとしてのスタンス

そもそもTAとは何か?

  • 授業の補佐をする院生等のこと

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

  • コンピュータ・プログラミングの基礎を学習する。
    具体的にはプログラミング言語といくつかの基本的なアルゴリズム、処理の流れを習得するプログラミング演習を行う。
    最終的にはプログラムが自分でかけることを目標にする。(シラバス引用)

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

  • テキスト通りにプログラムを打ち込み結果を提出する。

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

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

  • まず、意味を考える。
  • とにかくやってみる。
  • 再度意味を考える。
  • 色々ためしてみて理解を深める。

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

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

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

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

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

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

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

学習の助け

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

プログラムとは

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

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

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

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

  • 命令

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

  • “こんにちわ”と書け!

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

  • コンピュータには(多くの場合)耳が無い
  • 仮に聞こえたとして(普通は)言ったことが理解できない
  • 仮に理解したとしてそれのやり方がわからない

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

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

  • キーボードをたたくことができる
  • プログラミング言語を理解する
  • アルゴリズムを理解する

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

プログラミング言語

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

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

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

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

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

  • 一つ命令するたびに訳して伝えてくれる、インタプリンタさん
  • 渡された命令文を全部翻訳して渡してくれる、コンパイラさん

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

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

  • ソース

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

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

アルゴリズムとは

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

多くの場合は

  • 四則演算
  • 論理演算
  • 一致,大小の判定
  • 条件分岐
  • 繰り返し
  • ファイルの読み書き
  • 文字の読み書き

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

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

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

  • 高さは3
  • 底辺は2
  • 高さと底辺をかけて2で割りなさい

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

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

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

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

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

まとめると、

  • コンピュータに命令をするための命令書であるソースを書くための言語がプログラミング言語
  • プログラミング言語を用いて作業をさせるための手順であるアルゴリズム

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

お勧めとしては

  • 命令したい作業を明確化し、アルゴリズムを考える。
  • それを元にプログラム言語を用いて記述する。

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

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

文字と数

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

何がいいたいかというと

  • 文字の 0 

  • 数の 0

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

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

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

  • 13

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

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

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

  • 131

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

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

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

  • 14

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

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

  • 「13と1を一緒にしたものを書いて」
  • 「13と1を足したものを書いて」

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

  • この数字は文字なのか?
  • この数字は数なのか?

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

繰り返し

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

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

例えば
「ある値を二倍にしていって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回繰り返すとしたら? これはプログラムに頑張ってもらうほかにない。

メソッド(関数)

以前、
「プログラムは自分の知っていることしかできない」
と、いう話をしたと思う.

つまり、
プログラムで球の体積を計算させたいとき
「半径rの球の体積を求めろ!」
と、言っても理解できないのである。
球の体積を求めるときには
「半径rの三乗と円周率πと(4/3)をかけろ!」
と、毎回やり方を指定しなくてはいけないのである.
一度はいいとしても
何回も球の体積を計算させるようなときには
いい加減やり方を覚えて欲しいものだ.

その方法がメソッドである。
つまり
「球の体積とは半径rの三乗と円周率πと(4/3)をかけたものである」
と教えてやるのである.
これにより
「半径rの球の体積を求めろ!」
と、言うだけですむようになるのである.

再帰

メソッドの有効な利用として再帰呼び出しがある.

例えば渡された値Xを1になるまで割り算を繰り返すメソッドHalfを考える.

Halfは、
渡された値が1以外ならば2で割り,結果を表示してHalfにわたす
渡された値が1ならば表示して終了する.

つまりHalfは値が1になるまで自分を呼び続ける.

例えば値Xとして100を用意したとする.
これをHalfに渡す.

100を与えられたHalfは
与えられた値100は1とは異なるので2で割る.
50になり表示され,更にHalfに渡す.

50を与えられたHalfは
与えられた値50は1とは異なるので2で割る.
25になり表示され,更にHalfに渡す.

25を与えられたHalfは
与えられた値25は1とは異なるので2で割る.
12になり表示され,更にHalfに渡す.

12を与えられたHalfは
与えられた値12は1とは異なるので2で割る.
6になり表示され,更にHalfに渡す.

6を与えられたHalfは
与えられた値6は1とは異なるので2で割る.
3になり表示され,更にHalfに渡す.

3を与えられたHalfは
与えられた値3は1とは異なるので2で割る.
1になり表示され,更にHalfに渡す.

1を与えられたHalfは
与えられた値1は1なので表示され,終了する.

つまり,結果として

50
25
12
6
3
1

という表示が行える.

渡された値が1以外ならば2で割り,結果を表示してHalfにわたす
渡された値が1ならば表示して終了する.

と、いう機能を持たせただけで
ある条件まで繰り返し,作業をようになるのである.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-12-13 (木) 10:20:40 (5355d)