今日の目標
Day2では、Nimで値を扱うための基本である変数、定数、型の感覚を身につけることが目標である。
まず、int、float、bool、string がそれぞれ何を表す型なのかを理解し、数字として計算したい値と、文字として表示したい値を区別できるようになることを目指す。
次に、数値をそのまま文字列とつなげることはできないため、$ を使って文字列化して表示する書き方を覚える。
そして最後に、税込み計算のような身近な題材を通して、整数と小数の違い、型変換が必要になる場面、変換を忘れたときにどのようなエラーや不自然な結果が出るのかを体験し、計算と表示を安全に書けるようになることを目指す。
今日の内容
2ー1 ~変数と定数、そして型は「値の入れ物の設計図」である~
プログラムでは、途中で変わる値と変わらない値を区別して扱う必要がある。
そのために使うのが変数と定数である。変数は、あとで中身を変えることがある値を入れる場所であり、Nimでは var を使う。
定数は、最初から変わらない前提の値であり、Nimでは const を使う。
たとえば商品の価格や計算結果は変数として扱いやすく、消費税率のようにその場では固定値として扱うものは定数として書くと意図がはっきりする。
ここで重要になるのが型である。
型は、その値がどの種類のデータなのかを表す情報である。
int は整数、float は小数、bool は真偽値、string は文字列を表す。
型があるおかげで、コンピュータはその値に何ができるかを判断できる。
たとえば 10 + 20 は数値の足し算であるが、"10" & "20" は文字列の連結であり、結果は "1020" になる。
この違いを曖昧にしないために型が必要である。
よくあるミスは、「見た目が数字なら数値として扱える」と思い込むことである。
"100" は数字のように見えても文字列である。文字列はそのままでは数値の計算に使えない。
また、ファイル名にも注意が必要である。Nimのソースファイル名は英小文字、数字、アンダースコアのみを使い、先頭数字やハイフンは避けるべきである。
したがって今日のファイル名は day2.nim にする。
2ー2 ~数値と文字列は別物であり、表示には $ が役立つ~
プログラムを書き始めた初心者が最初につまずきやすいのは、「計算する値」と「表示する文字」を同じように扱ってしまうことである。
たとえば年齢を表す 20 は数値であり、計算に使える。一方で "20歳" は文字列であり、そのままでは足し算に使えない。
表示のためには文字列が必要だが、計算のためには数値が必要である。この区別ができると、プログラムの見通しがかなりよくなる。
Nimでは、文字列どうしをつなぐときに & を使う。
そして数値や真偽値を文字列として表示したいときに便利なのが $ である。
たとえば price が整数なら、"価格は " & $price & " 円です" のように書ける。
$price は「数値の price を表示用の文字列に変える」という意味になる。
これを使わずに "価格は " & price と書くと、文字列と整数を直接つなげようとして型エラーになる。
よくあるミスは、+ で文字列をつなごうとすることと、$ を忘れることである。
Nimで文字列連結は + ではなく & である。また、echo price のように単独で表示する場合は $ がなくても表示できるが、文字列の途中に埋め込むときは $ が必要になることが多い。
この違いは早い段階で意識しておくべきである。
2ー3 ~税込み計算では「整数のままか、小数を使うか」を意識する~
税込み計算は、型の違いを体感するのにちょうどよい題材である。
たとえば税抜き価格が 100 円で、税率が 0.1 なら、税込み価格は 100 * (1.0 + 0.1) のように計算できる。
このとき税率は小数なので、float を使う場面が出てくる。
整数だけで計算しようとすると、割り算や小数を含む計算で思った通りにならないことがある。
なぜ型変換が必要かというと、整数と小数では扱い方が異なるからである。
たとえば price が int のとき、price * 1.1 のような式では小数が混ざるため、結果は float として扱うのが自然である。
Nimでは必要に応じて float(price) のように明示的に変換する。
逆に、小数を整数として表示したいときは int(total) のように変換できるが、このとき小数点以下は切り捨てられるので注意が必要である。
よくあるミスは、100 / 3 のような式の結果の型を意識しないことと、int と float を混ぜたまま無理に処理しようとすることである。
また、bool も型の一つであり、true と false を表す。
たとえば「税込み価格が1000円以上か」を bool で表せる。
bool は数字ではないので、数値計算には使わないが、条件の判定にとても重要である。
今日の段階では、「型が違えば使い方も違う」と理解できれば十分である。
コード例
今日のコードの題材は、「商品の価格、税率、在庫の有無を表示しながら、税込み価格を計算する」である。
まずはそのまま動かし、変数、定数、型、$ による文字列化、型変換を一度に確認する。
var itemName: string = "りんご"
var price: int = 120
const taxRate: float = 0.1
var inStock: bool = true
let total: float = float(price) * (1.0 + taxRate)
echo "商品名: " & itemName
echo "税抜き価格: " & $price & "円"
echo "在庫あり: " & $inStock
echo "税込み価格: " & $total & "円"
このコードの読み方を確認する。
まず var itemName: string = "りんご" は、「itemName という名前の変数を作り、文字列を入れる」と読めばよい。
次に const taxRate: float = 0.1 は、「変わらない税率を小数で持つ定数を作る」という意味である。
そして let total: float = float(price) * (1.0 + taxRate) では、整数の price を float(price) で小数に変換し、税率を使って税込み価格を計算している。
最後の echo では、文字列の途中に数値や真偽値を入れるため、$price、$inStock、$total のように文字列化している点が重要である。
課題1
このドリルでは、商品の名前と価格を表示する簡単なプログラムを完成させる。
目的は、string と int の違い、そして数値を表示用の文字列に変えるために $ が必要であることを確認することである。
出力は大文字小文字、記号、スペースまで一致している必要がある。
var itemName: string = "ノート"
var price: int = 250
echo "商品名: " & ____
echo "価格: " & ____ & "円"
期待する出力は次の通りである。
商品名: ノート
価格: 250円
ヒントを順に出す。最初の空欄には文字列の変数名がそのまま入る。
次の空欄には整数の変数をそのまま入れるのではなく、表示のために文字列化する必要がある。
さらに言えば、文字列化には $ を使う。
課題2
このドリルでは、税抜き価格だけを表示しているコードを改造して、税込み価格も表示するようにする。
目的は、int と float を混ぜるときに型変換が必要になることを体験することである。
var price: int = 500
echo "税抜き価格: " & $price & "円"
これを改造して、次の出力になるようにする。
税抜き価格: 500円
税込み価格: 550.0円
ヒントとして、税率は 0.1 のような小数で持つと扱いやすい。税込み価格は price をそのまま使うのではなく、float(price) のように変換してから計算すると安全である。
また、表示時には計算結果も文字列化する必要がある。
課題3
このミニ課題では、「入力→処理→出力」の流れを意識して、商品1個の税抜き価格と個数から合計金額を計算し、その税込み合計を表示するプログラムを作る。
今回はキーボード入力はまだ使わず、コード内で値を与える形にする。
入力として unitPrice と count を用意し、処理として税抜き合計と税込み合計を計算し、出力としてわかりやすい文章で表示する。
var unitPrice: int = 300
var count: int = 2
const taxRate: float = 0.1
# ここに税抜き合計を入れる
let subtotal: int = 0
# ここに税込み合計を入れる
let total: float = 0.0
echo "単価: " & $unitPrice & "円"
echo "個数: " & $count
echo "税抜き合計: " & $subtotal & "円"
echo "税込み合計: " & $total & "円"
期待する出力は次の通りである。
単価: 300円
個数: 2
税抜き合計: 600円
税込み合計: 660.0円
よくあるエラー例も確認しておく。
たとえば echo "個数: " & count と書くと、文字列と整数を直接つなげているため型エラーになる。原因は、count を文字列化していないことである。
この場合は echo "個数: " & $count に直せばよい。
また、let total: float = subtotal * (1.0 + taxRate) でエラーになる場合は、subtotal が int なので、float(subtotal) * (1.0 + taxRate) のように明示的に変換するとよい。
今日のまとめ
今日は、値を入れておくための変数と、変わらない値として置く定数を使い分けながら、int、float、bool、string という基本の型に触れた。
特に大事なのは、数字に見えるものでも文字列なら計算には使えず、表示のために数値を文章の中へ入れるときには $ を使って文字列化する必要があるという点である。
また、税込み計算では整数と小数が混ざるため、float(price) のような型変換が必要になることも確認した。
ここで型の違いを曖昧にしない習慣をつけておくと、今後のエラーがかなり減る。
さらに、Nimでは文字列連結に & を使うこと、ファイル名は day2.nim のように英小文字、数字、アンダースコアのみで付けることも実務的には重要である。
明日は、入力を受け取って自分で値を変えられるプログラムに進む。