C言語入門ブログ

C言語を、本当に初歩から学んで、その内容を書いていきます。

C言語における入力について

これまでは、プログラムのコードの中で自分で数値を入力し、計算をして、その結果を出力しました。
しかしこれでは、1つのプログラムの動作は毎回同じですね。例えば、『何か数字を入れると、それを2倍してくれるプログラム』のような、一般性の高いものは書けません。
今回は、そのようなプログラムを書けるようになるために必要な、入力について説明します。
また、これからは入力に対応したプログラムを書くため、『プログラムのコード』だけでなく、『入力の形式』も間違わないようにしないといけません。
例えばこれからの練習で出力が変になった場合(めっちゃ桁の多い負の数になったりした場合)は、コードが間違えてるという理由以外に、入力の形式がコードに合っていないことが理由であることがあります。

整数1つを入力する方法

入力は、次のように書きます。

scanf("%d",&変数の名前);

めっちゃ分かりにくいですね。
C言語はかなりメジャーなプログラミング言語なのですが、この辺が分かりにくいことが弱点だと思います。
実際に使う例を見て、理解を深めましょう。

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	scanf("%d", &a);   //aに、入力された数字を代入する
        printf("%d",a);   //出力して確かめる
	return 0;
}

これを、ideoneで、入力のところに好きな数字を入れて実行してみて下さい。
ideone上で、入力を与える方法が分からない場合は、以下の記事を参考にして下さい。

このブログでの勉強法について2(ideoneの使い方など) - C言語の勉強用ブログ

このコードでは、入力した数字と同じ数字が、そのまま出力されるハズです。

ちなみに、よくあるミスとして、
・""を忘れる
・変数名の前に付ける『&』を忘れる

というのがあります。注意しましょう。

さて、実際に使えることが分かったところで、上の文の意味を説明します。厳密ではありませんが、なるべくイメージが湧くように説明したいと思います。

%d

というのは、基本的に『整数が入るべき場所』という意味です。
scanfというのは、入力(ideoneで言うところのinput)の内容を、まず()の中の1つ目のものと一致させます。
今回は、scanfの後の()の中にある1つ目のものは

"%d"

ですね。これと入力(例えば、入力が5だったとしましょう)を一致させようとすると、
『%d=5』
となります。
そしてその値が、()の中の2つ目で書かれている変数に代入されます。
上ではscanfの後の()の中にある2つ目のものは

&a

ですので、変数aの中に5が入る、という流れになります。
なんか面倒臭いように見えますが、僕の直感的な理解は以上のようになっています。
この記事の後半では、この理解の仕方を使って、複数の数字を入力する方法も説明します。


さて、実践の話に戻ります。
入力の書き方が分かったので、少し一般的なプログラムが書けるようになりました。
例えば、次のコードは、『入力された数字より1大きい数字を出力するプログラム』になります。

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	scanf("%d", &a);   //aに、入力された数字を代入する
	a++;              //aに1を足す
	printf("%d",a);   //出力して確かめる
	return 0;
}

ideone上で、inputのところに好きな数字を1つ書いて実行してみて下さい。また、数字を色々変えてみて、ちゃんと動作することを確かめてください。例えば、入力を1とすると出力は2になりますね。

これはかなり簡単なプログラムですが、これが全ての基本の形となります。
以降のプログラムは基本的に、
1.何か数字を入力してもらう
2.計算する
3.入力に応じた出力をする
という形のものにしようと思います。

それではさっそく、1つ目の練習問題です。

☆練習問題1.上のプログラムの一部を変更して、『入力された数字を2倍にして出力するプログラム』を書いて下さい。また、ideone上で入力する数字を変えながら実行し、ちゃんと動作することを確かめてください(必ず、何個かの数字で試してみること!)。


さて、せっかくなので、次に『数字を複数入力する方法』について説明します。
上で説明した、一致がどうのこうのみたいな理解があると分かりやすいと思います。

複数の整数を入力する方法

ここで、printfに%dが入っていた場合の動作を思い出して下さい。

int a = 2;
int b = 3;
printf("%d %d",a,b);

と書くと、

2 3

と出力されますね。
分からない方はこちらの記事を読んでみて下さい↓。
変数について - C言語の勉強用ブログ


ここで書いてあるように、printf関数は、
()の中の1つ目の""の中身を表示する。ただし、""の中に%dが出てきた場合は、%dを,(カンマ)で区切られた変数の中身と順に置き換えていってから、表示する。
という関数でした。
上の例の

int a = 2;
int b = 3;
printf("%d %d",a,b);

で説明すると、
1.printfは、"%d %d"と表示しようとする。
2.出力内容に『%d』が入っているので、それを,(カンマ)で区切られた後ろの変数の中身で置き換える
3.1つ目の%dをaの中身(ここでは2)に、2つ目の%dをbの中身(ここでは3)に置き換える。よって"%d %d"は"2 3"になる
4."2 3"を出力する
という流れになります。

これの逆のことが、入力でも行われます。
つまり、

scanf("%d %d",&a, &b);

と書き、入力に

2 3

と、2と3をスペース区切りで書いたとします。
そうすると、
1.scanf関数は、""の中身と、入力(つまり、"2 3")を一致させようとする。
2."%d %d"と"2 3"を一致させるには、1つ目の%dを2に、2つ目の%dを3に置き換えればよい。
3.そして1つ目の%dの値を、,(カンマ)区切りの変数の1つ目へ、2つ目の%dの値を、,(カンマ)区切りの変数の2つ目へ代入する。つまり、aに2を、bに3を代入する
という順に実行が行われます(という僕のイメージです。実際にこう動作しているかは分かりません)。

ピンとこなかった場合はとりあえず、
入力したい数字の数だけ%dを書く、そのあと、%dと同じ数だけの変数名を、&付きで書く
とだけ覚えておけばいいと思います。また、普通1回では覚えられないので、何回も戻って確かめましょう。そういうものです。

説明ばかりではつまらないので、次のコードをideoneで実行して確かめてみましょう。

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	int b;   //変数bを作ることを宣言
	scanf("%d %d", &a, &b);
	/*入力がスペース区切りの2つの整数であるとき、
	その1つ目の整数がaに、2つ目の整数がbに代入される*/
	printf("a is %d, b is %d",a,b);  //出力して確かめる
	return 0;
}

ただし、入力は例えば

2 5

という風に、半角スペースで区切って2つの数字を入力して下さい。間に全角スペースを挟んだ場合は、上手くいきません。

これで、2つの数字を入力できるようになりました。
例えば次のコードは、『数字を2つ入力されたら、その和を返すプログラム』になります。

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	int b;   //変数bを作ることを宣言
	int c;   //変数cを作ることを宣言
	/* cは、和を入れるために用意した変数です */

	scanf("%d %d", &a, &b);
	/* 入力の1つ目をaに、2つ目をbに代入する */
	c = a + b;  //cに、a+b(aとbの和)を代入する
	printf("%d",c);   //cを出力する
	return 0;
}

入力を

7 11

とすると、出力は『18』になりますね。他にも、色々入力を変えてみて、試してみて下さい。
ただし、数字を2つ入力すること、その間はスペースで区切ることを忘れないようにして下さい。

それではここで、2つ目の練習問題です。

☆練習問題2.上のコードを一部変更して、入力された2つの数字の積(かけ算のことです)を出力するプログラムを書いて下さい。(例えば、4と6が入力されたら、4×6で24が出力されます)。また、ideone上で、入力を色々変えて、動作が正しいか確認して下さい。

また、同じように、入力が3つや4つのものも書けます。
例えば、

scanf("%d %d %d", &a, &b, &c);

と書き、入力が

3 7 6

だった場合、aに3、bに7、cに6が代入されます。
これを使うと、次のようなコードが書けます。次のコードは、『3つ数字を入力されたら、その3数の和を返すプログラム』です。

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	int b;   //変数bを作ることを宣言
	int c;   //変数cを作ることを宣言
	int d;   //変数cを作ることを宣言
	/* dは、3数の和を入れるために用意した変数です */

	scanf("%d %d %d", &a, &b, &c);
	/* 入力の1つ目をaに、2つ目をbに、3つ目をcに代入する */
	d = a + b + c;  //dに、a+b+cを代入する
	printf("%d",d);   //dを出力する
	return 0;
}

これで入力を、例えば

7 9 8

とすると、出力は『24』になります。他にも入力を変えて試してみて下さい。ただし、スペース区切りで数字を3つ入力するようにして下さい。

さて、ここで最後の練習問題です。

☆練習問題3.数字を4つ入力して、その4数の和を出力するプログラムを書いて下さい。これまでの問題に比べて難易度は高いです。例えば入力が

2 3 12 6

なら、出力は『23』になるハズです。

今回はここで終わりです。
今回の説明内容は、かなり難しい内容なので、分かりにくいかも知れません。
そういった場合は、是非コメント等で質問や意見を頂けると嬉しいです。

以上です。
次の記事から、さらに複雑なコードを学んでいきます。

練習問題の解答例

練習問題1.

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	scanf("%d", &a);   //aに、入力された数字を代入する
	a *= 2;            //aに2をかける
	/* もちろん、a = a * 2;と書いても構いません! */
	printf("%d",a);   //出力して確かめる
	return 0;
}

練習問題2.

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	int b;   //変数bを作ることを宣言
	int c;   //変数cを作ることを宣言
	/* cは、積を入れるために用意した変数です */

	scanf("%d %d", &a, &b);
	/* 入力の1つ目をaに、2つ目をbに代入する */
	c = a * b;  //cに、a×b(aとbの積)を代入する
	printf("%d",c);   //cを出力する
	return 0;
}

練習問題3.

#include<stdio.h>
int main()
{
	int a;   //変数aを作ることを宣言
	int b;   //変数bを作ることを宣言
	int c;   //変数cを作ることを宣言
	int d;   //変数dを作ることを宣言
	int e;   //変数eを作ることを宣言
	/* eは、4数の和を入れるために用意した変数 */

	scanf("%d %d %d %d", &a, &b, &c, &d);
	/* 入力の1つ目をaに、2つ目をbに、3つ目をcに、4つ目をdに代入する */
	e = a + b + c + d;  //eに、a+b+c+dを代入する
	printf("%d",e);   //eを出力する
	return 0;
}