3日目 | Nim100日ドリル
~演算と文字列~

今日の目標

今日は、値をあとから変えない変数と、途中で変えていく変数をきちんと使い分けられるようになることが目標である。
具体的には、letvar の違いを理解し、再代入とは何かを自分の言葉で説明できる状態を目指す。
さらに、回数や点数のように変化する数値を少しずつ増やすコードを書けるようになり、固定してよい情報と変わる情報を分けて考える練習も行う。
文字列と数字を一緒に表示する場面も扱うので、数字をそのまま文字列につなげようとして詰まらないように、型の違いにも先回りして慣れていく。

今日の内容

3ー1 ~let は固定、var は変化である~

なぜこれが重要かというと、プログラムの中には最初に決めたら途中で変わらない情報と、処理の途中で変わっていく情報があるからである。
たとえば、プレイヤー名やゲームのステージ名は途中で変わらないことが多い。一方で、スコアや回数は処理が進むたびに変わる。
ここを区別せず全部同じ書き方にしてしまうと、「本当は変わってはいけない値」をうっかり書き換えてしまいやすくなる。

どう使うかというと、変わらない値には let を使い、変わる値には var を使う。
たとえば let playerName = "Sora" のように書けば、playerName は固定の値になる。
反対に var score = 0 と書けば、あとで score = 10 のように値を変えられる。
最初に「この値は途中で変わるか、変わらないか」を決めて宣言するのが基本である。

たとえば、次のコードを考えてみる。

                    
let languageName = "Nim"
let lessonTitle = "演算と文字列"

echo "今日の言語は" & languageName & "である"
echo "テーマは" & lessonTitle & "である"
                    
                

このコードの読み方を押さえる。1行目の let languageName = "Nim" は、途中で変えない言語名を作っている。
2行目の let lessonTitle = "演算と文字列" も同じで、今日の題名を固定情報として持っている。
3行目と4行目では & を使って説明文と変数の中身をつなぎ、表示用の文章を作っている。

よくあるミスは、変えるつもりの値を let で書いてしまうことと、逆に何でもかんでも var にしてしまうことである。
前者は再代入しようとした瞬間にエラーになる。後者は一見動くが、コードを読む人が「この値は本当に変わるのか」が分かりにくくなる。
Nim では letvar の使い分けがそのままコードの読みやすさにつながる。
迷ったら、まずは「途中で変えない値は let、変える値は var」と考えるとよい。

3ー2 ~再代入とカウンタの増やし方を覚える~

なぜこれが重要かというと、プログラムでは同じ変数に新しい値を入れ直すことが非常に多いからである。
回数を数える、点数を足す、残り時間を減らすといった処理は、ほぼすべて「今の値をもとにして新しい値を入れ直す」ことになる。
この「入れ直す」動作が再代入である。

どう使うかというと、たとえば var count = 0 としておき、次に count = count + 1 と書く。
右側の count + 1 がまず計算され、その結果が左側の count に入る。
これで 0 が 1 になる。同じ意味で count += 1 と短く書くこともできる。
最初のうちは count = count + 1 の形で仕組みを理解し、そのあとで += に慣れるとつまずきにくい。

たとえば、次のコードを考えてみる。

                    
var counter = 0

counter = counter + 1
counter += 1

echo "現在の回数は" & $counter & "回である"
                    
                

このコードの読み方はこうだ。
1行目の var counter = 0 は、あとで増えていく値なので var を使っている。
3行目の counter = counter + 1 は、今の値に1を足して入れ直す再代入である。
4行目の counter += 1 も同じ意味で、短く書いた形である。
最後の echo では、数字の counter$counter にして文字列としてつないでいる。

よくあるミスは、count + 1 だけを書いて満足してしまうことと、そもそも count を作る前に使ってしまうことである。
前者は「計算しただけ」で、変数の中身は変わらない。後者は未宣言識別子のエラーになる。
Nim では使う前に変数を宣言しておく必要がある。
また、let count = 0 としてしまうと、あとで count = count + 1 はできない。
増やしたい値は最初から var にしておく必要がある。

3ー3 ~文字列と数字は別物であり、つなぐときは変換が要る~

ここに内容を書くなぜこれが重要かというと、人に見せる出力では「回数は3回である」のように説明文と数字を一緒に表示したい場面が多いからである。
しかし、コンピュータの中では "回数は" のような文字列と 3 のような整数は別の型として扱われる。
そのため、見た目ではつながりそうでも、そのままでは結合できないことがある。

どう使うかというと、文字列どうしをつなぐときは & を使い、数字を文字列としてつなぎたいときは $ を使って文字列に変換する。
たとえば echo "回数は" & $count & "回である" のように書く。
これで count が 3 なら 回数は3回である と表示できる。
$count の部分が、数字を表示用の文字列に変える役目を持つ。

例えば、次のコードを考えてみる。

                    
let playerName = "Sora"
var score = 10

score += 5

echo playerName & "のスコアは" & $score & "点である"
                    
                

このコードでは、1行目の playerName は固定情報なので let である。
2行目の score は変わる値なので var である。
4行目でスコアを5点増やし、6行目で名前と数字を1つの文章にして表示している。
ここで $score を忘れると、文字列と整数をそのままつなごうとしてエラーになる。

よくあるミスは、echo "回数は" & count のように、数字をそのまま & でつなごうとすることである。
この場合は型が合わずエラーになる。
また、文字列の中に数字を直接書いてしまい、変数の値が変わっても出力が変わらないというミスもよくある。
Nim では echo に複数の値を渡す書き方もあるが、今日は「文字列を組み立てる」感覚をつかむために、&$ を意識して使うとよい。

課題1

自己紹介メッセージを完成させるドリルである。
名前は固定情報なので let のまま使い、挑戦回数は変化する情報として var を使う。
最初は0回から始めて、1回増やした結果を表示すること。出力は文字の大小も含めて完全一致とする。

課題コード

                    
let name = "Nim"
var count = ____

count = count + ____

echo "名前は" & name & "である"
echo "今日の挑戦回数は" & $count & "回である"
                    
                

____ の部分を埋めて完成させる。
変数の宣言と再代入の両方を正しく書くことがポイントである。
また、文字列と数字をつなぐときの型の違いにも注意すること。

期待する出力

                    
名前はNimである
今日の挑戦回数は1回である
                    
                

最初の空欄は、回数の初期値である。まだ挑戦していないので 0 から始めると考えるとよい。次の空欄は、1回分だけ増やしたいので 1 を入れる。もし出力が 今日の挑戦回数は01回である のようになったなら、数字ではなく文字列として扱ってしまっている可能性がある。
回数は数として持ち、表示するときだけ $count にするのが正しい。

課題2

出発コードを改造し、カウンタを合計3回増やしてから表示すること。
増やし方は、少なくとも1回は counter = counter + 1 を使い、残りは counter += 1 を使うこと。
固定情報と変化する情報の違いも崩さないこと。

出発コード

                    
let title = "れんしゅう"
var counter = 0

echo title
echo "現在の回数は" & $counter & "回である"
                    
                

期待する出力

                    
れんしゅう
現在の回数は3回である
                    
                

echo の前で counter を増やす必要がある。
1回も増やさなければ当然 0 のままである。
counter = counter + 1 を1回書き、そのあと counter += 1 を2回書けば合計3回増やせる。
title は途中で変えない文字列なので、ここを var に変える必要はない。

課題3

小さなスコア表示を作る。
入力はキーボードから受け取らず、コードの中に直接書く。
まず、プレイヤー名を Sora、ステージ名を 草原、初期スコアを 100 として用意する。
次に、スコアを30増やし、そのあと20増やす。最後に、プレイヤー名、ステージ名、最終スコアを3行で表示する。
ここでは、プレイヤー名とステージ名は固定情報、スコアは変化する情報として扱うこと。

入力として使う値は、コード内の playerNamestageNamescore である。
処理として行うのは、score を2回増やす再代入である。
出力として必要なのは、3行の表示であり、1行目はプレイヤー名、2行目はステージ名、3行目は最終スコアである。

課題コード

                    
__ playerName = "Sora"
__ stageName = "草原"
__ score = 100

# ここで score を 30 増やす
# ここで score を 20 増やす

echo "プレイヤー:" & playerName
echo "ステージ:" & stageName
echo "最終スコア:" & $score
                    
                

期待する出力

                    
プレイヤー:Sora
ステージ:草原
最終スコア:150
                    
                

今日のまとめ

今日は、変わらない値には let、変わる値には var を使うという基本を整理した。
さらに、変化する値は再代入によって更新でき、count = count + 1count += 1 の形で回数や点数を増やせることを学んだ。
文字列と数字は型が違うため、そのままでは & でつなげず、表示用に $ で変換する必要があることも確認した。
ドリルAでは固定情報と変化する情報を分ける練習をし、ドリルBではカウンタを段階的に増やし、ドリルCでは実際に小さなスコア表示を組み立てた。
ここまでできれば、「値を持つ」「値を変える」「値を文章として見せる」という、今後ずっと使う基礎がかなり固まってきている。

次回は、条件によって動きを変える書き方に進む。





2日目へ

4日目へ

トップへ戻る


お問い合わせ