第2章01 レベルから体力を計算する@イチからゲーム作りで覚えるC言語

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章02 変数を使ってレベルから体力などを計算する
NEXT : 2章02 変数を使ってレベルから体力などを計算する
1章06 新しいプロジェクトを追加する : PREV

この記事でやること

この章から基本的なC言語の内容について知識を深めていきましょう!
今回はプロジェクト「0020_keisan」で簡単な計算をして、結果を表示するプログラムを作ってみましょう。

この記事はゆる~くC言語でゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

計算するプログラムを書いてみる

まずは変数を使わずに、計算結果を表示するプログラムを書いてみましょう。
ここではプログラムは別のプロジェクト「0020_keisan」を作成しています。必要に応じて作ってみてください。

#include <stdio.h>
int main( void )
{
 printf("村人A:あなたのレベルは「%d」なんですか!\n", 5);
 printf("村人A:レベル「%d」ともなれば、\n", 5);
 printf(" 凡人とはやっぱりちがいますよね。\n");
 printf("村人A:なんかオーラというか、そういうの。\n");
 printf("村人A:レベル「%d」だと体力も「%d」もあるんですね。\n", 5, 5 * 100 );
}

実行するとしたのような結果が出てくると思います。

計算して結果を表示する

計算して結果を表示する

※今回の村人はこんな感じの老人をイメージして書いてました。↓

ほめる村人(老人)

関数はいままですでにお話したものだけで、新しいものは登場していませんね。前の記事までと同様、main()関数の中身(記号「{」から記号「}」までの間)は5個のprintf関数を呼ぶ命令だけで作られています。
といいつつ重要ですので、 printf 関数を読んでいるコマンド一行を復習として細かくみてみましょう。

printf関数の呼び出し1行の詳細を確認

printf関数の呼び出し1行の詳細を確認

ただ、printf関数を使うときの引数(ひきすう)の数が1個ではなく、2個のもの、3個ものがあること。
「%d」という特殊な役割をする2文字の組み合わせが何個か入っていること、などの違いがあります。

ソースコードの中身解説

一行ごとに確認していきましょう。

printf 関数で変換指定子の利用例

まず最初の printf 関数から見ていきましょう。

  printf("村人A:あなたのレベルは「%d」なんですか!\n", 5);

この関数で「村人A:あなたのレベルは「5」なんですか!」+改行
の文字表示が行われています。%d が数字の 5 に置き換わっていることがわかるかと思います。
この %d という2文字は変換指定子と呼ばれていて、2個目以降の引数に書いた整数の値(データ)を文字として変換して表示してくれる機能があります。

printf で数字などを埋め込んで表示する(変換指定子)

printf 関数は「printf(引数1個目, 引数2個目, 引数3個目, …)」といった複数の引数を渡すことができる関数です。
前回までは引数1個目に文字列のみを書いていました。
引数1個目に文字列を書き、その文字列の一部に変換指定子(「%d」みたいな特殊な文字)を書くと、最初に登場する %d は引数1個目の内容に変換、2回目に登録する %d は引数2個目の内容に変換、3回目に登場する %d は引数3個目の内容に変換、4回目(以下略)
という機能を持っています。
こういったデータを文字に変換してくれる機能をもたせた文字列の部分書式指定文字列と呼びます。
例として引数を3つ使った printf 関数の変換を図にてしてみて整理してみます。

printf 関数でフォーマット指定子を利用

参考例:printf 関数で変換指定子を利用

  • 1つ目の引数に”レベルは%d、体力は%d”という文字列が入っています。
  • 2つ目の引数に数字の 10 が指定されています。
  • 3つ目の引数に数字の 100 が指定されています。

この状態で実行すると、「レベルは10、体力は100」と表示されます。

一つ目の引数で書いている文字列の中で、左から登場する順番で引数2番目、3番目…と、変換する値を決めています。ですので、最初の「%d」は、引数2番目の「10」に変換され、次の「%d」は引数3番目の「200」に変換されて表示されています。

その他の printf 関数で変換指定子の利用例

続きのKeisan.c のソースコードを確認していきましょう。

 printf("村人A:レベル「%d」ともなれば、\n", 5);
 printf(" 凡人とはやっぱりちがいますよね。\n");
 printf("村人A:なんかオーラというか、そういうの。\n");
 printf("村人A:レベル「%d」だと体力も「%d」もあるんですね。\n", 5, 5 * 100 );

5行目のprintf関数も4行目のprintf関数と同じく、引数を2つ設定しており、文字列の中の「%d」2個目の引数のレベルの値「5」表示しています。

6行目と7行目のprintf関数は引数は一つだけで、単純に文字列を表示しているのみでシンプルですね。

8行目は引数を3つ設定しており、3つめの引数に新しい記号「*」(アスタリスク)が出てきています。これは掛け算を意味しています。
数値の計算については、次の記事で例つきでもうすこし書きますが、とりあえずこの3つ目の引数の「5 * 100」がまず計算されます。
式の結果、 5 × 100 = 500 となり、500 を引数に書いているのと同じことになります。
つまり、8行目は下に書いたのと同じような命令となります。

  printf("村人A:レベル「%d」だと体力も「%d」もあるんですね。\n", 5, 500 );

上のコードだと、普通の引数を3つ指定した printf 関数の使用となりますね!
最初の「%d」に2個目の引数の数値「5」が 入って、「%d」に3個目の引数の数値「500」が入った文字列が表示されます。

printf の文字列に書く「%d」に対応する、入力される2個目以降の引数がちゃんと書いていないと予期せぬ結果が得られる可能性があります
例:printf(“1個目=%d、2個目=%d、3個目=%d“, 100, 200 );
この例だと、「%d」が3個書いてあるのに、引数が足りていません。
実行するとビルドは成功し、プログラムが実行され
「1個目=100、2個目=200、3個目=3215445
という結果がでました。このように3個目の引数が設定されていないため、想定しない結果が返ってくることになり、注意しないとわかりづらいバグの原因となります。

あとがき

次回は変数の使い方と、計算のやりかた第二段をお話ししたいと思います。
今回はここまで。おつかれさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章02 変数を使ってレベルから体力などを計算する
NEXT : 2章02 変数を使ってレベルから体力などを計算する
1章06 新しいプロジェクトを追加する : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日更新内容
2018.6.21アイキャッチ更新