YKTのどっちがいいかな?

実世界連動地域貢献型すごろくゲームのアプリ開発状況を書いていきます。

シンカリオンでもわかるプログラミング講座(石)

いよいよMOMO開催前の最後の週末になってしまいました。ここが山場ですね。

あ、皆さんカード忘れずにお願いしますね。かくいう私もまだ作ってないですが。。。

ブログのほうでは前回に引き続き、シンカリオンでもわかるプログラミング講座(石)をお届けいたします。

序破急にする予定がいざ書いてみるとさらに長くなったので,
序石皮急でお届けしようと思います(序石皮クヨ心になったらごめんなさい)。

こうやってひっそりとMOMO開発ブログからプログラミング講座ブログへと移行していく予定です(プリキュアブログは別の人に任せます)。

なお,本記事はPCまたはタブレット端末での閲覧を推奨します。

キーボードがあるとなお良いです。

コーヒーブレイクしながらまったり読んでください(笑)

前回のおさらい

さて、まずは前回のおさらいです。

まず、プログラムは人間が手でやるには面倒くさいアウトプットを得るために書くべきだというお話をしました。

そして、プログラムは従順なコンピュータちゃんによって上から順に実行されていきます。

プログラムの途中で値をセーブしておきたくなったら、変数と呼ばれる箱=(イコール記号)を使って入れるんでしたね。

変数の名前は任意につけることができますが、数字から始まったりプログラム的に意味のあるものは使えません。

そして、前回一番難しかったところかと思いますが、変数を用意するときはそれがどんな箱なのかを特定するためにを教えてあげる必要があります。
例えば整数を保存する変数はint型でしたね。
しかし、最近のプログラム言語の中は、コンピュータちゃんが勝手に型を予想してくれる動的型付け言語という素晴らしいものがあるという話でした。

今回のお題

今回は動的型付け言語のひとつであるpythonという言語を使って実際にプログラミングを体験していただこうと思います。
やはり実際に体験しないと感覚がつかめませんからね。

さて、プログラミングを始めようという人にとって最大の難関は、プログラミングができる環境を構築することで、大半がここで挫折するといわれます。

特にwindowsc言語のようなコンパイル言語を始めるのは結構大変でした(windows10からは標準でlinuxが使えるようになりましたのでだいぶハードルは下がりましたが)。

でも、本当にいい時代になりました。なんと今はweb上でプログラミングが経験できちゃいます!!!

そしてブログにも埋め込めちゃいます(はてなアプリ(android)からだとうまく読み込めないみたいです。ブラウザで開いて下さい。)

試しに実行を押してみてください。

出力欄に"どっちがいいかな?"って表示されましたよね?

これであなたもプログラマーデビューしちゃいました!(いわゆるHello worldでは?というツッコミは厳禁です。)

こんな感じで今回は世界一親切なブログで,inovativeさんの負債額を計算するプログラムを作るのがゴールです(追記:うそです。"皮"でやります)。

Warming Up!

堅苦しいことは置いといてまずはよく使う機能を動かしまくってみましょう。

追記: Warming upだけで今回は終わります(笑)
が、とても長いので一日でやりきろうとしないほうがいいかもしれません。

その前にTips

その前に,コードと向き合うときの心構えを伝授しときます。

決して全体をぼんやりと見ないようにしてください。さもないと吐き気がします。

コンピュータちゃんの気持ちになって,上から一行一行ゆっくりと目を通してください。

そうすれば決して難しいことが書いているわけではないことがわかると思います。

また,参考までにプログラミング言語の王道であるc言語で実装してみた場合を付してあります。

pythonいかに柔軟でユーザーフレンドリーな言語かわかることでしょう。

c言語は見ていると具合が悪くなると思うのでサラッと読み飛ばしてください
型宣言してるなということと生理的に受け付けないなということだけ感じ取れればOKです。

print

プログラムにおけるアウトプットの基本です。計算結果などをテキストとして書き出したいときに使います。

pythonのprint文は本当に自由です。数字でも文字列でも気にせず括弧の中にぶち込めばOKです。

実行を押せばいろいろ出力されると思います。何をしているかはコード内のコメントを読んでください。

コードを書き換えていろいろ試してみましょう。("多分"を"絶対"に変えてみる等。)

何をやっても壊れません。安心していじってください。

(c言語)

#include <stdio.h>
int main()
{
    int i = 10;
    char* inovative_no_yomaigoto = "次は当たる気がする";
    char* muri = "(多分無理)";
    printf("%d\n",100);
    printf("YKT!\n");
    printf("%d\n",i);
    printf("%s\n",inovative_no_yomaigoto);
    printf("%s %s\n",inovative_no_yomaigoto,muri);
    return 0;
}

四則演算

  • 足し算 +
  • 引き算 -
  • 掛け算 *
  • 割り算 /
  • 複合代入演算子 +=, -=, *=, /=

がわかればとりあえずいいでしょう。

複合代入演算子(初めて名前知りました)は,今変数に入っている値に追加で演算を行うときに使います。

husaigaku = husaigaku + 10000

husaigaku += 10000

とシンプルに書けるということです。

(c言語)

#include <stdio.h>
int main()
{
    int a,b,c,e,f,g,h,i;
    double d;
    a = 1 + 2;
    b = 10 - 3;
    c = a * b;
    d = (double)c / 5.0;
    e = c / 5;
    f = c % 5;
    printf("%d %d %d %lf %d %d\n",a,b,c,d,e,f);
    g = 2;
    h = 2;
    i = 2;
    g = g + 5;
    h += 5;
    i *= 2;
    printf("%d %d %d\n",g,h,i);
    return 0;
}

リスト(配列)

関連するデータをひとまとめにしておきたいときには、リストというものを使います。

ほかの言語では配列(array)と言ったりします。1

たとえばplayerという名前のlistがあるとすると、その5番目の要素には

player[4]

のようにアクセスすることができます。なぜ5番目なのに4なのかというと、1つ目の要素の背番号(index)が0から始まるからです。

これもいじってみるのが早いでしょう。

ぜひいじり倒して体得してください。

(c言語)

この辺はc言語では再現できないので割愛します。

条件式(論理演算)

名前は難しいですが、与えられた条件が真か偽か(True or False)判定するだけの話です。

例えばinovative_no_shushiという変数が、仮に、本当の本当に仮に、この変数はフィクションです、実際の人物・団体・事件とは一切関係ありませんと断ったうえでプラスだったとしましょう。

その場合

inovative_no_shushi > 0

という条件式に対して、pythonは"True"という値を返します。見ての通りの数学の大なり記号と同じ意味です。

反対に、

inovative_no_shushi <= 0

には"False"を返します。これは小なりイコールです。

では、"代入"の意味で=を使ってしまっているので、"等号"はどう表すかというと、

inovative_no_shushi == 0

で表します。

この"True"や"False"が活きてくるのは次のセクションですので、まずは思った通りにTrue or Falseが返ってくるか、いじってみましょう。(いまいちピンとこない人は先に次のセクションに移りましょう。)

(c言語)

等号・不等号の表し方はpythonと一緒です。
not, and, orはそれぞれ、!, &&, ||の記号で表します。
cに限らず多くの言語では!,&&,||が採用されていますが、
pythonではより英語的に書けるようになっていますね。

if文

いよいよプログラミングっぽくなってきましたね。このif文を覚えるとプログラミングの幅が広がります。

if文とは文字通り、「もし~ならば・・・をする」という処理を実現します。

この"~ならば"の部分に用いるのが前のセクションの条件式です。

これに関してはまずpython以外の話からさせてください。

c言語(をはじめ多くの言語では)if文を以下のような感じで実装します。

if(条件式){
    処理
}

これは()の中に書かれた条件式がTrueならば、{}内に書かれた処理を行うという意味です。

収支がプラスなときだけをほめてあげるようにするには、

if(inovative_no_shushi > 0){
    printf("よくやった!");
}

とすればいいわけです。簡単でしょ?

さて、ではここで収支がマイナスのとき、金額に応じて激しく応援するプログラムを考えてみましょう。

if(inovative_no_shushi < 0){
    printf("頑張れ頑張れ");
    if(inovetive_no_shushi < -10000){
        printf("できるできる絶対できる");
        if(inovative_no_shushi < -20000){
            printf("頑張れもっとやれるって");
            if(inovative_no_shushi < -30000){
                printf("やれる気持ちの問題だ頑張れ頑張れそこだ!");
                if(inovative_no_shushi < -40000){
                    printf("そこで諦めるな絶対に頑張れ");
                    if(inovative_no_shushi < -50000){
                        printf("積極的にポジティブに頑張る頑張る");
                    }
                }
            }
        }
    }
    printf("北京だって頑張ってるんだから!");
}

落ち着いてよく見てください。

もし収支が-5000円だったら、

頑張れ頑張れ北京だって頑張ってるんだから!

と控えめに、
-34000円ならば、

頑張れ頑張れできるできる絶対できる頑張れもっとやれるってやれる気持ちの問題だ頑張れ頑張れそこだ!北京だって頑張ってるんだから!

とやや激しめに、
そして-50000円を下回った時、フルバージョンで𠮟咤激励してくれるコードです。

収支がどんな条件でもマイナスであれば最後は必ず"北京だって頑張ってるんだから!"で終わりますね。

では、こちらはどうでしょうか?

if(inovative_no_shushi < 0){
printf("頑張れ頑張れ");
if(inovetive_no_shushi < -10000){
printf("できるできる絶対できる");
if(inovative_no_shushi < -20000){
printf("頑張れもっとやれるって");
if(inovative_no_shushi < -30000){
printf("やれる気持ちの問題だ頑張れ頑張れそこだ!");
if(inovative_no_shushi < -40000){
printf("そこで諦めるな絶対に頑張れ");
if(inovative_no_shushi < -50000){
printf("積極的にポジティブに頑張る頑張る");}}}}}
printf("北京だって頑張ってるんだから!");}

特に、"北京だって頑張ってるんだから!"はどういう条件で出力されるのでしょうか。

パッと見、-50000円以下の時だけ出力されるように見えますが、実はこれ、先ほどと全く同じコードです。

前者のほうはif文の効果の及ぶ範囲が綺麗にインデントされていることにより、とても理解がしやすかったと思います。

ですが、後者もプログラミング上は正しいので、こんな書き方もできてしまうのです。

開発は大抵チームで行うものですから、誰が見ても見やすいようにインデントを入れるのはプログラマーとしての最低限のマナーです。ですが、悲しいかなモラルブレイカーはどこにだっているのです。

また、モラルブレイカー以外にも宗教上の対立があります。すなわちインデントは半角スペース2個派 vs. 4個派の争いです。これはきのこ vs. たけのこと同じで決して終わることのない争いなのです。。。

そんな2人が開発を共にすることになれば、部分ごとにインデントの高さが違う可読性の低いコードが出来上がってしまうわけです。

美しい言語、python

なぜ、後者のような汚いコードが許されてしまうかというと、多くの言語はif文の及ぶ範囲を{}でくくっていればどう書いてもいいというルールにしているからなのです。

pythonの開発者は考えました。どうすればみんながモラルを守ってくれるだろうか・・・と。

そしてひらめいたのです!そうだ!善意ではなく義務にしてしまえばいいんだと!(妄想)

長らく脱線しましたがpythonの話に戻ります。

pythonではif文を以下のように書きます。

if 条件式:
    処理1
    処理2
処理3

あれあれ、{}がないですね。どこまでがifの処理なのでしょうか?

薄々感づかれているかと思いますが、pythonではifの及ぶ範囲を{}ではなくインデントの高さで表現します。

つまり文法レベルでインデントを付けることを強要してしまったのです!

上の例でいうと処理1,2までがif文の範囲で、処理3はifの範囲外になります。

ついでに修造もpythonで書いてみましょう。

if inovative_no_shushi < 0:
    print("頑張れ頑張れ")
    if inovetive_no_shushi < -10000:
        print("できるできる絶対できる")
        if inovative_no_shushi < -20000:
            print("頑張れもっとやれるって")
            if inovative_no_shushi < -30000:
                print("やれる気持ちの問題だ頑張れ頑張れそこだ!")
                if inovative_no_shushi < -40000:
                    print("そこで諦めるな絶対に頑張れ")
                    if inovative_no_shushi < -50000:
                        print("積極的にポジティブに頑張る頑張る")
    print("北京だって頑張ってるんだから!")

pythonでは、誰が書いてもこうなります。インデントを文法にしてしまうというほかに類を見ない特徴からpython美しい言語といわれています(多分)。

ちなみにインデントに使うスペースの個数は、同一プログラム内で統一されていれば何個でも問題ありません。2個派と4個派が共同開発する場合は、開発を始める前に殴り合いをして決める必要があります。

皆さんは4個にしましょうね!!!

このセクション長くなりすぎたので手短に。

if文の完全形態は以下のようになります。

if 条件式1:
    処理1
elif 条件式2:
    処理2
elif 条件式3:
    処理3
else:
    処理4

これは、

条件式1がTrueなら処理1
条件式1がFalseで条件式2がTrueなら処理2
条件式1,2がFalseで条件式3がTrueなら処理3
全部Falseなら処理4

を行うといった感じになります。elifは何個あっても構いませんし、elif,elseはもちろんなくても大丈夫です。

for文

if文に並び大事な機能です。

for文は英語でいうところのfor each ~にあたる処理です。

pythonではfor文はリスト2と組み合わせて次のように書きます。

for 好きな変数名 in リスト:
    処理

このように書くとリストの要素をひとつ取り出しては変数に代入し、forの適用範囲内の処理(もちろんここでもインデントで範囲指定します)を実行するという操作をリストの一番最後の要素まで繰り返します。

実際触ってみてもらったほうが早いと思いますので、いろいろいじくってみてください。

(c言語)

cのfor文は
int i;
for(i=0;i<10;i++){}
のように整数の値を増やしていく機能しかありません。

文字列操作

文字列の扱いも簡単なものだけ紹介します。

特に文字列がリストのように扱えるところは今後使うので覚えておいてください。

(c言語)

c言語は文字列の扱いが大の苦手です。
かわいそうなのでそっとしておきます。

動的言語の破壊力

最後は半分お話みたいなものですが、 pythonが変数の型を自動認識しているからこそできる芸当を実感していただければと思います。

(c言語)

同一名の変数の型を途中で変えるなんて芸当は当然できません。

おわりに

Warming Upだけでだいぶ長くなってしまいました。

前回教科書を書くつもりかと突っ込まれましたが、すぐに実行できる環境まで提供しているあたり、どこぞの教科書よりも数百倍親切仕様になってしまいました(笑)

次こそinovativeさんの負債額カリキュレーターをつくって現実をたたきつけたいと思います。

クラッキングの答え合わせ?なにそれ?おいしいの?(inovativeさんからコードももらったのでクヨ心のどこかでやります。)

・・・あの、ほんとちょっと頑張ったので、興味を持って少しでもいじってもらえればうれしいです。ほんとに。


  1. pythonにも配列は配列であるので、厳密にはlist=arrayではないです。

  2. 厳密にはリストだけでなくイテレータやarrayと呼ばれるものなどでもいいです。