Posts

 実際にプログラムを書いてみよう 〜その1〜 数あてゲーム
  プログラムを勉強しようとしてつまづいた話 〜その5〜 人間語からプログラム語に翻訳する
 プログラムを勉強しようとしてつまづいた話 〜その4〜 道具箱には何が入っているか コンピュータを理解する - 指示されたことしかできないが確実に行う 料理の作り方の例で、人間とコンピュータが違う点はずばり全部説明されたものしかしないことにある ・卵を溶いて、熱したフライパンに入れる この項目をとってみても、「卵」「フライパン」がどこにあるのか、最初に指定しなければいけない コンピュータ・プログラムでは最初に #料理セットを準備する #材料: 卵 2個、ラード 大さじ2、ネギ少々 ・・・ このような但し書きを書かなければ、コンピュータは「卵」はどこですか、「フライパン」がありませんと何度でも訴えてくる そして、「料理セット」のなかに使う道具が入っていて、材料が揃っていることをよく確認しよう 前述のプログラムの中では import random が random 関数を使うための道具箱で import math が math.sqrt 関数を使うためのものです コンピュータは片付けない 運動会の玉入れのプログラムを人間風に考えてみましょう 紅組、白組の選手を入場させる 玉入れのかごを準備する 選手に玉を配る 試合を開始する 一定の時間が経過したら終了を合図する かごにはいった玉を数える 多い方を勝者とする、同点なら2に戻る 選手を退場させる 人間なら、7で2に戻ったときに、常識のある人ならかごから玉を出しますが、コンピュータは指示されない限り、かごから玉を出しません したがって、このまま続けると前回の結果に加えた数字になってしまい 玉が足りなくなったり、色々と不具合が起きる可能性があります したがって、使う前には前回の結果を片付けることを思い出しましょう プログラムの最初の方に、a = 0 などのこれから使う入れ物を 0 に設定している項目があります これは、前回プログラムを使用したときに、a の入れ物に何かが残っていたとしても構わず始めてしまいます プログラムが使う入れ物には、中身を指定してから使うようにしましょう 次回は、料理の作り方からプログラムに翻訳する方法について書きます
Image
 プログラムを勉強しようとしてつまづいた話 〜その3〜 料理の作り方と融合させるときが来た π の値を統計的に求める - コンピュータらしい解き方 数学の歴史上、円周率 π を求めるのに数多くの方法が試され、さいわいにも現代では  tan (π/4) = 1 このようなわかりやすい表記で表せます しかし、コンピュータの登場によってかつては除外されていた方法も可能になりました 上記の赤い正方形の中にランダムで点を打ち、それが円の中にあるかどうかを判定し何回も繰り返すことで統計として円周率の値を求められる この方法がコンピュータなしには実現困難なのは同じ作業を何百、何千、何百万回と高速に繰り返さなければならず、人間が同様の作業をすれば結果を得るのに何日何年もかかってしまう これを料理の作り方のようなプログラムにしてみよう 0から1の間の数値を乱数によりふたつ作る できた数字をxとyに入れる 点 x,y が円の中にあるか判定する 今回の作業の結果を書き込む 結果を表示する これをコンピュータが実行できるような言語で書き換えたのがコンピュータ・プログラムです 例えば python という流行の言語に翻訳すると import random import math a = 0 x = 0 y = 0 for i in range(1000000): x = random.random() y = random.random() d = math.sqrt(x**2+y**2) if d < 1: a += 1 print( 4 * a ) このようになります
 プログラムを勉強しようとしてつまづいた話 〜その2〜 わかりやすい例に置き換えてみた プログラマーになるのにコンピュータは必要か? 要りません! プログラマーとは物事を行うのに順序よく手順を説明できる能力がある人で、料理の作り方や運動会の進行表をみんなに理解できるように書ける人です 実際にそれを読んで同じものが作れれば素晴らしいプログラマーだと言えるでしょう 次のようなものは非常に良くできたプログラムの見本です チャーハンの作り方 フライパンを熱して、ラードをいれる 卵を割り、かき混ぜて熱したフライパンに入れる 卵が固まる前に、ごはんを投入し、卵とよく混ぜる 炒めるのに時間のかかる材料から順番にフライパンに入れ、米の粒がパラパラになるように鍋を振る 味の調節をして皿に盛る この料理の作り方を、コンピュータ・プログラムに翻訳できれば作戦完了です 次回は、簡単なプログラムをこの方法で説明してみます
 プログラムを勉強しようとしてつまづいた話 〜その1〜 大きく脱線するまえがき 昔、忍者になるために行う修行という子供向けの本があり、次のような訓練方法が書いてありました ・木の苗を植え、毎日その上を飛び越えていれば、家の屋根へ軽々とジャンプできるようになる ・沈むより早く足を上げれば、水の上を走れるようになる これらには大きな欠点があり実現不能です ひどいのは2番めの例で物理の法則を無視しています どんなに早く足を動かしても、足の裏が水面を蹴る力が重力加速度に対抗できません 同じような例に「手に羽を装着して早く動かせば空を飛べる」論があります うちわであおげば風を起こすことはできますが、身体を浮遊させるほどの推力を得ることはできません 木の苗を飛び越える例は、一見、努力すればどんなことでも叶えることができるという風に解釈することもできるが、それも数十cmが限度で、ある地点からふかのうになる 仮に屋根より高い木を軽く飛び越えられるなら、忍者になどならずにオリンピックに出たほうがいろいろな意味でいいと思います プログラム入門などのガイド本には残念ながらこのような内容が多いのです 作者がプログラムを理解していない稀有な場合も含め、一般的にプログラムができない人がなぜできないのか理解していないことが多いので、最初だけは簡単な内容で期待が膨らみますが、序盤のある地点で急激に難易度が上がり、またたく間にとんでもない高いハードルが出現して、なにがなんだかさっぱりわからないと投げ出してしまうことが多いような気がします そして、初心者によくある疑問に答えている本は少ない、というか、見たことありません プログラマーに向いていないかも 突然ですが、宇宙戦艦ヤマトの第一回目はこんな話です 「地球は汚染されて人類は生きていけなくなった、そこへイスカンダル星から希望の光が指し、イスカンダルまでくればコスモクリーナーという放射能を除去する装置を差し上げましょうと伝えられる そして、ヤマトの諸君は宇宙戦艦ヤマトを建造することになった」 「イスカンダルに行けば地球は救われる」結構この手のぶっ飛んだ発想が多く 「コンピュータ・プログラムなら、通常ではできないことも可能になる」 こ...