入力


・数値を外部から入力

 条件分岐の章のサンプルソースとかを思い出してみてください。 例えばドラクエのa作目のサブタイトルを表示するやつとかありましたね。 でもこれaの値をプログラム内でいくらいろんな値を代入したとしてもforで変化させたとしても一定のプログラムに従っている以上各分岐時のaの値は毎回同じですよね。 プログラムを実行するたびに違う結果がでたりせず、毎回同じように動作するということです。 これってあんまり分岐しているようには見えませんよね。 結局実行の流れは一通りなわけですから。

 そこで出てくるのが入力。 実行の流れを変えるのはユーザーです。 実行中ユーザーからの入力によって変数の値を決めるようにすることで毎回いろいろな動作をするプログラムがつくれるのです。 なお、内部から分岐させるには乱数というものを用いて変数の値をランダムで決めるという手もありますがこれは別の機会に。

・scanf

 printfと対にして覚えましょう。 書式も大体一緒です。

scanf("%d",&変数);
実行中この行で入力待ちの状態となり処理が中断されます。 ユーザーがキーボードから数値をうちリターンキーを押すとその数値が変数に代入され以後の処理が行われます。 例えば
printf("1+1=");
scanf("%d",&answer);

if(answer==2)
	printf("おお勇者よ!");
else
	printf("お気の毒ですが冒険の書1は消えました");
注意すべきは変数名の前に&がつくことです。

・&の意味

 scanfのprintfと大きく違うところは変数名の前につく&です。 この&を付け忘れると正しく実行されません。 ではこの&はなんなのでしょうか。 変数は宣言された時にメモリ上に保存場所を確保されることは三章で述べました。 実はこの保存場所を表す「アドレス」が&変数名なのです。 例えばa=5;とやった時メモリの100番地(←適当)に5という値が保存されたとすると、5(変数の中身)を表すのがa(変数名)、100(変数のアドレス)を表すのが&a(&変数名)ということになります。

 ではもう一度なぜscanfは&なのか考えてみましょう。 printfの時変数名(変数の値を表す)を書いたのは変数の値が重要だったからです。 変数の値を表示するのだから当然ですね。 でも入力の場合は変数の値は重要ではありません。 これから値が決まるというのに空かもしれないその前の値が重要なはずがありません。 それより重要な情報が変数のアドレスです。 入力された値をいれる場所を知りたいからです。 というわけでscanfの時は変数名の前に&をつけるのです。

 まあ別にしばらくは「scanfの時はなぜか&がつく。そういうものだ。」でもいいんですけどね。

・問題点(書いておくだけ)

 入力に例外はつきものです。 想定範囲外の値を入力したり、型の違う値を入力したりとユーザーが思い通りの入力をするとは限りません。 なかにはわざと数値入力を求められて文字列とかを入力してくる人もいたりします。 値の範囲やエラーをチェックして(ここでは触れませんが)再入力を求めたりすればよいのですが、一番の解決策はscanfを使わないとかだったりして…。 まあ初心者のうちは気にしないでください。 自分でテストプレイする分には問題ないですし、普通の人は正しく入力してくれますから。

・課題

今までのサンプルソースを参考に入力された数値によって分岐するプログラムを何かつくってみましょう。









・解答例

#include <stdio.h>

int main(void)
{
	int score;

	printf("テストの点を白状するがよい>");
	scanf("%d",score);

	if(score<50) printf("不可じゃあぁぁ!!\n");
	if(score>=50 && score<65) printf("可じゃあ!\n");
	if(score>=65 && score<80) printf("良じゃな!\n");
	if(score>=80) printf("優じゃあぁぁ!!\n");

	return 0;
}