10年以上C/C++しかやってなかった30代SEがwebを頼りに色々初挑戦してみるブログ

最近の流行り?に則って、ブログ名にすべてを詰め込んだ

カレーで小難しい話をしてみる(その2)

その1はこちら

慣れないC#追って疲れたから息抜き回その2

今回から1カレー作りでプログラミングしてみる。

はじめに

前回作った処理フローはこんな感じ。
ただただ長いから次からは関連個所だけ抜粋。とばす時はこっち

graph TD
材料を用意する-->
鶏肉を一口大に切る-->
人参を一口大に切る-->
玉ねぎを一口大に切る-->
じゃがいもを一口大に切る-->
フライパンに油を入れる-->
フライパンを中火にかける-->
分岐1{フライパンが温まったか}-- まだ -->
分岐1{フライパンが温まったか}-- 温まった -->
鶏肉を入れる-->
分岐2{鶏肉に焼き色が付いたか}-- まだ -->
分岐2{鶏肉に焼き色が付いたか}-- 付いた -->
野菜をフライパンに入れる-->
分岐3{玉ねぎが透明になったか}-- まだ -->
分岐3{玉ねぎが透明になったか}-- 付いた -->
フライパンの火を止める-->
フライパンの中身を鍋に入れる-->
鍋に水を入れる-->
鍋を強火にかける-->
分岐4{20分たったか}-- まだ -->
分岐4{20分たったか}-- 付いた -->
鍋の火を止める-->
鍋にカレールーを入れる-->
ルー混ぜ[鍋を混ぜる]-->
分岐5{カレールーが溶けたか}-- まだ -->
分岐5{カレールーが溶けたか}-- 溶けた -->
鍋を弱火にかける-->
分岐6{10分たったか}-- まだ -->
分岐6{10分たったか}-- 付いた -->
最後の煮込み[鍋を混ぜる]-->
完成[鍋の火を止める]

これをオリジナル言語でプログラミングしてみる

材料を用意する

まず材料をそろえる。

鶏肉
人参
玉ねぎ1
玉ねぎ2
じゃがいも
カレールー
水
サラダ油

玉ねぎが2個あるので区別できるように附番

材料を切る

まずは人参から。
考えやすいように、人参1本のgと一口大にした時のgを以下に決める。

人参1本:150g,一口大1個:10g

まずは重さを覚えないといけないので、変数の概念を導入。

今の人参の重さ = 150;

変数=数学でやったxとかと同じ感じ。
式は同じだけど値は変えたいとか、途中で値を変えられるもの。
行末にしれっと付けてる;は区切りであることを示すための記号。

今の人参の重さ = 150;
一口大の人参の数 = 0;

// 一口大に切る
今の人参の重さ = 今の人参の重さ - 10;
一口大の人参の数 = 一口大の人参の数 + 1;

//は当該行に関しては//以降に書いている内容は全部ただのコメントで特に処理をするわけじゃないよ。って宣言。
その処理でどんなことをやりたいか2。ってのをコメントで残しておく3と後から見返したときに便利。

今の人参の重さ = 今の人参の重さ - 10;みたいな、ある変数の値を増減させたいだけ。って時にいちいち変数名を2回書くのは長くなるし面倒だから、演算子=で定義。
ex)x = x + 1x += 1

これに則って書き直すと

今の人参の重さ = 150;
一口大の人参の数 = 0;

// 一口大に切る
今の人参の重さ -= 10;
一口大の人参の数 += 1;

これだと、まだ1個分しか切れてないので、

今の人参の重さ = 150;
一口大の人参の数 = 0;

// 一口大に切る
今の人参の重さ -= 10;
一口大の人参の数 += 1;
// 一口大に切る
今の人参の重さ -= 10;
一口大の人参の数 += 1;
// 一口大に切る
今の人参の重さ -= 10;
一口大の人参の数 += 1;
// 一口大に切る
今の人参の重さ -= 10;
一口大の人参の数 += 1;

4個分切ったけど、もう長くなりすぎだし、なにより面倒なので、繰り返し(ループ)の概念を導入。

今の人参の重さ = 150;
一口大の人参の数 = 0;

この処理を繰り返す{
  // 一口大に切る
  今の人参の重さ -= 10;
  一口大の人参の数 += 1;
}

しれっと出した{}は処理単位(ブロック)を示すもの。

これだと重さがマイナスになっても切り続けるので条件分岐の概念を導入。

今の人参の重さ = 150;
一口大の人参の数 = 0;

この処理を繰り返す{
  もし( 今の人参の重さ <= 10 )なら{
    // もう切れないから切れ端も加えておしまい
    一口大の人参の数 += 1;
    繰り返しを抜ける;
  }
  // 一口大に切る
  今の人参の重さ -= 10;
  一口大の人参の数 += 1;
}

<=は不等号。と同じ意味。逆は>=

これ、実は一口大の人参の数しか出してないんだ・・・
ということで配列の概念を導入して、切れた人参を定義。

今の人参の重さ = 150;
一口大の人参の数 = 0;

この処理を繰り返す{
  もし( 今の人参の重さ <= 10 )なら{
    // もう切れないから切れ端も加えておしまい
    一口大の人参の数 += 1;
    繰り返しを抜ける;
  }
  // 一口大に切る
  今の人参の重さ -= 10;
  一口大の人参の数 += 1;
}

切れた人参[一口大の人参の数];

[]の中が数。なので切れた人参[一口大の人参の数]切れた人参一口大の人参の数個あるよ。って意味。
それぞれの切れた人参を扱う時は切れた人参[0],切れた人参[1]でそれぞれ1個目の切れた人参,2個目の切れた人参って感じで扱う。

1個目の添え字が0、2個目が1と、0始まりになっているのは、コンピュータの都合4

ただ、これだと、切れた人参の重さどこ行った?って感じなので、人参自体に重さを持たせられるように構造体の概念を導入

人参{
  重さ;
}

構造体=データのまとまり(構造)的なもの。今回は人参って構造に重さを持たせた。 構造体を使って書き直し。

人参.重さ = 150;
一口大の人参の数 = 0;

この処理を繰り返す{
  もし( 人参.重さ <= 10 )なら{
    // もう切れないから切れ端も加えておしまい
    一口大の人参の数 += 1;
    切れ端の重さ = 人参.重さ;
    繰り返しを抜ける;
  }
  // 一口大に切る
  人参.重さ -= 10;
  一口大の人参の数 += 1;
}

切れた人参[一口大の人参の数];
カウンタ = 0;
この処理を繰り返す{
  もし( カウンタ >= 一口大の人参の数 )なら{
    // 全部設定終わったから終了
    繰り返しを抜ける;
  }
  // 一口大の人参の重さを設定
  もし( カウンタ = (一口大の人参の数-1) )なら{ // カウンタは0始まりなので、最後の人参のカウンタ=(一口大の人参の数-1)
    切れた人参[カウンタ].重さ = 切れ端の重さ;
  }
  そうじゃないなら{
    切れた人参[カウンタ].重さ = 10;
  }
}

今日はここまで。

今日のまとめ

だんだん小難しくなってきた。 まだ人参を満足する形で切ることすらできてない。。。

この調子でカレーを完成させることは出来るのか。


  1. 前回の感じから長丁場になりそうな予感

  2. あくまでどんなことをしたいかを書く。何をしてるかってのはコード読めば分かるので、なぜそんなことをしてるのか?の意図を書く。今回のケースだと、10を引く。って書いてもそんなのは見ればわかるので、一口大に切ったのでその分のg(10g)を減らす。とか。ただ細かく書きすぎてもコードが見にくくなっていくので、簡潔にかける場合は簡潔に

  3. 教材の場合は、サンプルコード配って理解させる。って性質の都合上、やっている内容をそのままコメントに書いてるけど、それを正として真似するのはNG

  4. ざっくり、添え字=オフセット(何個分進んだか?)なので、扱いたい位置-1になる