文章題で身に付くプログラミング思考入門️（2/25）

## 見方や切り口を変えるだけ。プログラミングは日常に潜んでいる
### はじめに

今回は、なぜプログラミング思考力に文章題が有効なのか？について解説します。
結論を言うと、


### 人間の思考や問題解決を手順化したものがプログラミングだからです。

そして手順化とは、言語化です。

『文章題で身に付くプログラミング思考入門️』は、日常や文章問題からプログラミング思考を身に付けていく、簡単で身近で、あなたをちょっと輝かせてくれるシリーズです。

今回は、日常会話をプログラミングで分解していきましょう。

## 前回のまとめ
- エンジニアは、抽象度を操ることでコンピュータとの対話をコントロールします。
- 質問と答えの明確さを揃えましょう。これがプログラミングの本質です。
- 日本語を話す私たちは、曖昧さを明確にできる能力を既に持っているのです。

前回の記事は[こちら](https://qiita.com/yuki-TheWaggle/items/a6845c85a464c3c46ab2)

## 対象者
- プログラミングを学びたい人
- プログラミングに挫折したことのある人
- 論理的思考を鍛えたい人
- 文系の人
- エンジニアの思考を理解したい人

## 概要
さて、気づきましたか？

前回の曖昧な質問を

> ②「吾輩」は *どんな所* で泣いていたでしょうか？


明確な質問に変えたとき、

> ②「吾輩」は、どのような暗さの所で泣いていたでしょうか？
> ②「吾輩」が泣いていたのは、からっとした所でしたか？それともじめじめした所でしたか？

私は２つの質問例を挙げましたね。
もしあなたが別の質問を考えてくれていたなら、その分だけ質問のバリエーションが増えたことになります。

では、なぜ質問にバリエーションが生まれたのでしょうか？

そうです、得るべき答えが明確でなかったからです。
### 答えが明確でなければ、質問も明確になりません。

ここでちょっと、よくある会話のすれ違いについて考えてみましょう。

あなたは私に、**「明日渋谷に行くんだよね」** と話してくれたことにしましょう。
私はあなたに聞きました。**「何で渋谷まで行くの？」**

何を答えますか？
交通手段？渋谷に行く理由？それとも私に聞き返すでしょうか？

大抵の場合、（この場合は私が）欲しい答えは明確です。
でも、私の頭の中にしかありません。
ですからあなたは、私の持っているイメージを特定して、欲しいであろう情報を答える必要がありますね。

そうです。
まず最初に、交通手段なのか、渋谷に行く理由なのか、聞き返すのか、とにかく、**答えるべき情報を特定することから始めたはずです。**

もう少し先まで考えてみましょう。

**「電車で行く」** とあなたが答えたとして、私が渋谷に行く理由を聞きたかったとすれば？
私が **「そうなんだ、電車で行くんだね。渋谷に行く理由は？」** とあなたに聞いてみればいいですね。
そうしたらあなたは、**「買い物に行くんだ」** と答えてくれるかもしれません。

この会話の流れには、プログラミングで言う、`初期値`・`定義`・`変数`・`条件分岐`・`代入`・`返り値` が含まれています。

> 「明日渋谷に行くんだよね」
> 「何で渋谷まで行くの？」
> 「電車で行く」
> 「そうなんだ、電車で行くんだね。渋谷に行く理由は？」
> 「買い物に行くんだ」

つまり、一連の流れを自然に理解できたあなたは実は、`初期値`・`定義`・`変数`・`条件分岐`・`代入`・`返り値` の概念をすでに理解していたということです。
これが明確に意識できれば、基本的なプログラミングコードは大体書けます。
 **普段の何気ない会話こそプログラミングなのです。**

もちろんプログラミングを難しく説明しようと思ったらいくらでもできるし、会話とプログラミングの違いを挙げようと言ったらたくさん挙がるのですが、
簡単にしようと思ったら、会話の見方や切り口を変えるだけ。これくらいなものです。

振り返って、もう少し詳しく説明しましょう。


> 「明日渋谷に行くんだよね」：`初期値`
> 「何で渋谷まで行くの？」：`定義`・`変数`
> 「電車で行く」
> 「そうなんだ、電車で行くんだね。渋谷に行く理由は？」：`条件分岐`
> 「買い物に行くんだ」：`代入`・`返り値`

`初期値`とは、前提を設定することです。
言い換えれば、初めから決まっている情報を明らかにすることです。
私の欲しい答えは、「あなたが渋谷に行く」という前提に基づいています。

`定義`とは、知りたい情報を決めることです。
言い換えれば、どのような情報が欲しいのかを明確にすることです。
私の欲しい答えは、「渋谷に行く理由」ですね。

`変数`とは、答えを受け取る準備をすることです。
言い換えれば、ある特定の情報を受け取るための箱です。
私は、あなたが「渋谷に行く理由」を答えてくれるだろうと想定して、答えを受け取る準備をしています。

`条件分岐`とは、回答によって質問を変えることです。
言い換えれば、得られた情報が当てはまったかどうかによって処理を変えることです。
私はあなたの答えが私の求めるものではなかったことを知り、別の質問をしましたね。
欲しい情報かどうか、という条件について判断して、そうでなかったので別の処理をしたわけです。

`代入`とは、欲しい答えを得ることです。
言い換えれば、欲しいデータを集めて記憶する作業です。
私はあなたが「買い物」に行くことを知り、欲しかったデータを特定できました。

`返り値`とは、答えを受け取ることです。
言い換えれば、結果を知ることです。
私はあなたの「買い物」という情報によって、欲しかった答え、つまり「渋谷に行く理由」がわかったから納得したわけです。

> 初期値：初めから決まっている情報を明らかにする
> 定義：どのような情報が欲しいのかを明確にする
> 変数：ある特定の情報を受け取るための箱
> 条件分岐：得られた情報が当てはまったかどうかによって処理を変える
> 代入：欲しいデータを記憶する
> 返り値：結果を知る

どうでしょうか？雰囲気は掴めたでしょうか？

次はちょっとプログラミングに寄せて、電卓で例えてみましょう。

`初期値（初めから決まっている情報を明らかにする）`：
まずは0であることが前提になりますね。そうでなければ正しい答えが計算できないですから、初めは0と決めなければなりません。

`定義（どのような情報が欲しいのかを明確にする）`：
電卓に入れたい情報は数字ですし、電卓から欲しい情報も数字です。1+2の答えがAになったら困ります。

`変数（ある特定の情報を受け取るための箱）`：
計算したい数字を複数受け取る準備が必要ですね。足し算の答えを出したいなら、足される数と足す数という2つの変数を用意します。

`条件分岐（得られた情報が当てはまったかどうかによって処理を変える）`：
1のボタンが押されれば1が入力され、+のボタンが押されれば足し算され、例えば9桁の電卓で9桁いっぱいの数字がすでに入力されていれば、それ以上は数字のボタンを押しても反映されないようにする必要がありますね。

`代入（欲しいデータを記憶する）`：
電卓が計算に必要な数字を記憶しているから、計算結果を出すことができます。1+2を計算しようとしたとき、2を入力したときには1は画面から消えていますが、計算結果ではきちんと3が出ますね。これは、画面の上ではなく、電卓の頭脳の内部でデータを保存しているからです。逆に言えば、また使うデータは内部に記憶しておく必要があります。

`返り値（結果を知る）`：
電卓なら、＝ボタンを押すことによって答えを知ることができますね。計算した結果、どのような値になったのか。処理が何らかの値を返してくれるから、結果を受け取ることができます。返り値は、戻り値とも言います。

さて、概念は何となく伝わったでしょうか？

ここで覚えておいて欲しいのは専門用語より、

### 実はあなたは日常の会話の中でプログラミングしていて、すでに理解しているということです。

大丈夫です。あとは分解してイメージを繋げていくだけ。

次回は、[分解する力と紐付ける力](https://qiita.com/yuki-TheWaggle/items/39bba9754feaf483d9d9)について解説していきます。
構造化思考と論理的思考、とも言います。


## まとめ
- 答えが明確でなければ、質問も明確になりません。
- 人間の思考や問題解決を手順化したものがプログラミングです。
- 実はあなたは日常の会話の中でプログラミングしています。

## 最後に
ここまで読んでくださってありがとうございます！
ちょっとでも役に立ったら「いいね」をください。続ける励みになります。
「それってこういうこと？」「こうじゃない？」と思ったらコメントで教えてください。
試行錯誤と最適化を繰り返して、プログラミングをもっと身近なものにして、たくさんの人に届けたいと思っています。