読者です 読者をやめる 読者になる 読者になる

プログラミング初心者に「プログラムとは何か」をなんとなく説明するブログ

第2章「人生は選択の連続である」

どんなすごいプログラムも、突き詰めていけば3つの処理の繰り返しである。数学的にも証明されている。(ASCII.jpデジタル用語辞典より)

とはかの有名なシェイクスピアの談。

ここでは、プログラムを書く上で重要な3つの処理のうち、主に選択を解説しまうす。

まずはじめに「3つの処理」とは何か。

  • 逐次
    • 上から順に処理していく
  • 選択
    • 条件によって処理内容を変える
  • 反復
    • ある条件を満たす間、処理を繰り返す

以上の3処理のことを表します。

まぁ、正直よく分からないと思うので説明していきます。

朝、起きてから外出するまでの手順を思い出してみてください。 (人によって違うだろうところは空気よんでください)

  1. 目を開ける
  2. 会社に行くべきか?
    • 行くべきなので3へ
  3. 起き上がる
  4. お腹は減っている?
    • 減っていないので朝食は食べずに5へ
  5. 歯を磨くべき?
    • 磨くべきなので6へ
  6. 歯磨き粉はある?
    • あれば歯を磨いて7へ、なければ口をゆすいで7へ
  7. 洋服ダンスを開ける
  8. 一番端にある服を見る
    • 着たければ着て9へ、気に入らなければその横の服を見る(8を繰り返す)
  9. 家を出る

だいたいこんな感じでしょうか??

人間は常に何かを考えて行動しています。その行動は基本ゴールに向かって順に、途中で条件分岐や繰り返しを挟みながら進みます。 プログラムの世界でも同様の処理が行なわれているわけです。むしろプログラムは書かれたことしかやらないので、人間より厳格です。 プログラムは常に ①上から順に処理をする②条件分岐をする③繰り返す この三つの処理で成り立っていると言っても過言ではありません。

逐次とは

繰り返しになってしまいますが、プログラムは原則上から下に処理が流れていきます。横や斜めに進むことはありません(多分ない)。水が高いところから流れるがごとく、上から下に向かって順々に書かれた内容に沿って忠実に処理を実行していきます。 この考え方は基礎的ながら重要なので覚えておきましょう

選択とは

ある条件にあっているかあっていないか、それによって処理の内容を分けることです。 例えば、あなたが家を出て最寄駅に到着した時、定期券を持っているか確認しました。

[もし]

[定期券を持っている] → 会社に向かう

[持っていない] → 家に戻る

これをプログラムの世界で表現しようとするとこうなります。

if 定期券を持っている {
    家に戻る
} else {
    会社に向かう
}

これがいわゆるプログラミング、ことSwiftでのif文です。

選択の制御構文の一つであるif文はその名の通り、「もし〇〇だったら△△する、それ以外は××する」というように条件によって処理を変えたい時に使用します。

言語によって細かい違いはありますが、プログラムにおけるif文の基本的な書き方はこうです。

if 条件1 {
    条件1に一致した場合に実行するプログラム
} else if 条件2 {
    条件1に一致せず、条件2に一致した場合に実行するプログラム
} else {
    全ての条件に一致しなかった場合に実行するプログラム
}

先ほどの例を書き直してみるとこんな感じでしょうか。一部よく分からないところがあると思いますが、今はまだ理解しないで大丈夫です。

swift
var commuterPass: Bool

if commuterPass {
    you.goToOffice()
} else {
    you.goBackToHome()
}

commuterPass(定期券)を持っていれば、goToOfficeメソッドを実行して会社に向かい、持っていなければgoBackToHomeメソッドを実行して家に戻ります。 メソッドとか普通に使っちゃってますが、次の次くらいで説明します。今はそういう処理をするんだ、くらいでおk。

では、内容がガラッとかわりますが、変数の内容によって処理を変えるサンプルコードを書いてみます。 数学の点数が100点の時はPerfect!, 100点未満80以上の場合、Great!, 80点未満50点以上の場合、OK!, それ以下の場合、Study!と表示するプログラムです。

変数mathPointを変更すれば、その値によって処理結果が変わります。サンプルでは80点なのでGreat!と表示されますが、 65点や30点など値を変えてあげれば結果が変わります。 このようにして条件分岐をしながらプログラムは進んでいくわけですね。

if文の基本的な内容は以上です。

ここまでお読みいただきありがとうございました。

 補足

ソースコードの中でしれっと「==」とか「&&」とか使っていますが、これはそれぞれ以下のような意味があります。大体は数学と同じです。 * == - 左辺と右辺の値が同じ * >= 左辺の方が右辺より大きい * && - 「○○かつ△△」 つまり「100 > mathPoint && mathPoint >= 80」は「mathPointが100点未満かつ80点以上」を表します。

「||」なんてものもありますが、これは&&と反対で「または」を表します。高校あたりでやったド・モルガンの法則あたりの話です。 やっときゃよかった数学。

第1章 「変数?いえ、知らない子ですね」

「変数を制するものはプログラミングを制す。古事記にもそう書かれている」

プログラミングを始める上で変数の理解は避けて通れません。これは変数とはなんぞや、を振り返ります。もう知ってるわ!って人は読まなくてもよいです。さっさと自習してください。

変数とは何か

プログラミングにおいて、変数(へんすう、variable)とは、プログラムのソースコードにおいて、扱われるデータを一定期間記憶し必要なときに利用できるようにするために、データに固有の名前を与えたものである。一人一人の人間が異なる名前によって区別されるように、一つ一つの変数も名前によって区別される。これにより、複数のデータを容易に識別することができる。変数を区別するための名前を特に識別子という。また一般に、変数が表しているデータをその変数の値(あたい)という。(Wikipediaより)

これだけ読んでもなんのこっちゃだと思うので、とりあえず以下のソースコードを見てみてください。ちなみに今後のテキストで書くコードは全てSwiftです。

もうちょい説明しますね。

プログラムが主に行う操作は主に3つあります。

  • 宣言
  • 代入
  • 参照(この章では説明しません。ワイがはっきり教えられる自信がないので今後も説明するか分かりません)

宣言とは、ソースコードの1行目、2行目、5行目にあたります。

var a: Intという一文は「Int型の箱にaという名前をつけてプログラムの世界で使えるようにする」という意味があると思ってください。

同様にvar b: Intも「Int型の箱にbという名前をつけて使えるようにする」です。

ちなみに「型」とはSwiftで扱うデータの種類を表します。プログラミング言語によって少しずつ異なっていますが、Swiftにおいて代表的なものは以下です。

  • String型:文字列専用の箱
    • var name: String
  • Int型:符号付整数専用の箱
    • var a: Int
  • Double型:浮動小数点専用の箱
    • var c: Double
  • Bool(Boolean)型:真(YES)か偽(NO)か
    • var tensai: Bool
  • Array型(ここでは説明しません)
  • Dictinary型(ここでは説明しません)

改めて、「var a: Int」とは「aという名前の段ボール箱を用意するよ!その中には符号付の整数を入れるよ!」とパソコンに対して宣言するということになりんす。

代入はその名の通り、段ボール箱にものを入れる作業になります。

では a = 3 と書くとどういう意味になるでしょうか??

「aという段ボール箱に3というInt型の数値を入れる」ということ。まぁそんな感じです。b = 2も同様ですね。

数学の世界で「=」は左辺と右辺が等しいことを表す記号ですが、プログラミングの世界では左辺の変数に右辺のものを代入する、ということを表すということを覚えておいてください。数学のイコールとは明確に意味が違います。これが代入です。

では、5行目では何をやっているのか。宣言と代入を一緒に行っています。

「resultという箱を用意したよ!中にaとbを足したものを入れる(代入する)よ!」ということ。

変数が数値型の場合、変数は四則演算が可能です。そのため、resultの箱の中身は5になります。

最後、「var name: String = "nakajima"」の意味はわかるでしょうか??

Int型の時と同様に「nameという箱にnakajimaという文字を入れるよ!」ということになります。

ただし、文字列型は数値型と四則演算はできないので、

result = name + a とかやるとエラーで怒られます。

では、変数を使って簡単に底辺:10、高さ:4の三角形の面積を求めるプログラムを書いてみます。変数名がクソかっこ悪いのは仕様です。

var teihen: Int = 10
var takasa: Int = 4
var menseki = (teihen * takasa) / 2

xcodeのplaygroundでこのコードを書くと20と表示されるはずです。

プログラミングではこんな感じで宣言、代入、(参照)を繰り返しながらプログラムに実行してほしいことを書いていくことになります。

var と letの違い

変数の宣言の方法は2つ

var a: Int = 3
let b: Int = 3

var か letかの違いですね。

varとletは変数が「可変」か「不変」かの違いです。

var(可変)で宣言すれば、一度段ボール箱に値を入れた場合でも、新たに値を入れて上書きすることができます。

var a: Int = 3
a = 5

このソースコードでは3を代入した後、5を代入しているので、現在のaの中身は5になります。

かわって、let(不変)は読んで字の如く値が変化しません。というか変化させられません。一度入れたら段ボール箱が捨てられるまで中身が変わらないということです。

let b: Int = 3
b = 5

こういうコードを書こうとすると2行目でxcodeちゃんに怒られます。

xcode「不変の箱に入れたら変更できないの!全くグズなんだから!」

そういうことです。

letはどういうときに使えばいいのか、それは原則変化がない値を宣言するときに使用すればよいのです。当たり前っちゃあ当たり前なんですが。

例えば円周率。ワイは3.14で習ったのでこれで固定します。円周率が他人によって3140に書き換わってしまったら大問題です。可変で宣言したワイが怒られます。なのでletで宣言してあげれば誰かが違う値を代入しようとしてもxcodeちゃんが怒ってくれます。素敵ですね。 後はほとんど変化がない値でもよく使います。例えば消費税はletで宣言して法改正に合わせて値を変える、みたいな運用です。

以上を踏まえてa, bを使って2つの円の面積を求めてみます。

let pai = 3.14
var hankei = 10
var menseki = hankei * hankei * pai

hankei = 1
menseki = hankei * hankei * pai

一度宣言したhankei, mensekiという変数を再利用しています。

実はこのソースコードでは今までと少し変わった書き方をしましたが、気づいた方はいますかね??

先ほどの例ではデータ型の宣言をしていません。

let pai: Double = 3.14
let pai = 3.14

この二つのコードはどちらも同じ意味になります。xcodeちゃんは頭が良いので、右辺を見てどのデータ型なのか自動で判別してくれます。なので「: Double」の部分が省略できるのです。素敵。まぁでも慣れないうちはデータ型を指定してあげましょう。

こういう概念的なものってやっぱり漫画にすると分かりやすかったりするんですよね。

ということで、 manga.crocro.com

このページも参考にしてみてください。題材はjavaですが基本は同じです。

本日はここまで。お疲れさまでした。

最後に

「変数とは箱である」という説明はプログラミング初心者向けに説明するときによく用いられる表現なのですが、厳密には正しくありません。正しくないわけでもないんですが、正確に表現しているわけじゃないんですね。説明しろと言われてもだいぶ困っちゃいますが、、、

「変数は箱じゃない」vs 「変数は箱でええやろ」論争も今も巻き起こってます。僕自身は初学者に対しては「変数は箱」派でいいと思っています。ただ、そのうち「変数って箱じゃなくね・・・?」と思い始める日がくるはず。そうなったらクソザコからだいぶレベルアップしてきた証拠になると思っております。

短くまとめるつもりがだいぶ長くなってしまった・・・

ここまでお読みいただきありがとうございました。

ブログを始めるンゴ

こんにちはこんばんは茄子天狗です。

この度、ブログを始めることにしました。

ブログと言っても主な目的は自分の備忘録になりそうですが。

今後はプログラミングについてやiPhoneアプリ開発なんかにフォーカスした内容を投下していく予定です。

以後お見知り置きを。

かしこかしこ。