入力用の関数
入力の必要性
前章までの内容で、四則演算を使った計算ならば、どんな複雑な式も計算できます。
しかし、これで満足してしまうのは、あまりにも志(こころざし)が低すぎます。
前章までの方法では、数値は直接プログラムに書き込んでいました。
つまり、数値は、プログラムを実行する時には、すでに決まっていることになります。
つまり、そのプログラムでは、毎回同じ計算しか行えないことになります。
これでは、別の数値で計算したくなった場合、プログラムを作り直さなくてはなりません。
こんなことでは、高級電卓を使っているのとほとんど変わりありません。
プログラミングをしている意味がまったくないと言っても過言ではありません。
この問題を打破する方法は、キーボードから数値を入力することです。
プログラムを実行するたびに数値を入力すれば、より便利になります。
しかし、これで満足してしまうのは、あまりにも志(こころざし)が低すぎます。
前章までの方法では、数値は直接プログラムに書き込んでいました。
つまり、数値は、プログラムを実行する時には、すでに決まっていることになります。
つまり、そのプログラムでは、毎回同じ計算しか行えないことになります。
これでは、別の数値で計算したくなった場合、プログラムを作り直さなくてはなりません。
こんなことでは、高級電卓を使っているのとほとんど変わりありません。
プログラミングをしている意味がまったくないと言っても過言ではありません。
この問題を打破する方法は、キーボードから数値を入力することです。
プログラムを実行するたびに数値を入力すれば、より便利になります。
scanf関数
画面に表示する時にprintf関数を使用したように、
キーボードから入力する時にも、その為の関数を使用します。
そのためにC言語には、scanf(スキャンエフ)関数が用意されています。
scanf関数は、次のようにして使います。
入力変換指定子とは、入力された数字をどのような数値に変換するかを表す文字です。
printf関数で使用した出力変換指定子と、ほぼ同じように使用できます。
変数名には、入力されたデータを記憶しておく変数名を指定します。
scanf関数を使う場合は、変数名の前に & の文字をつける必要があります。
この & には変数の場所を知らせる意味があるのですが、詳しくは15章で説明します。
この関数を実行すると、プログラムは入力待ち状態となります。
プログラムを使う人が、データを打ち込んでリターン(Enter)キーを押すと、
そのデータが指定した変数に代入されます。
なお、scanf関数を使用するには、#include <stdio.h> が必要です。
printf関数を使う時と同じなので、改めて追加する必要はありません。
キーボードから入力する時にも、その為の関数を使用します。
そのためにC言語には、scanf(スキャンエフ)関数が用意されています。
scanf関数は、次のようにして使います。
scanf関数
scanf("入力変換指定子",&変数名);
入力変換指定子とは、入力された数字をどのような数値に変換するかを表す文字です。
printf関数で使用した出力変換指定子と、ほぼ同じように使用できます。
変数名には、入力されたデータを記憶しておく変数名を指定します。
scanf関数を使う場合は、変数名の前に & の文字をつける必要があります。
この & には変数の場所を知らせる意味があるのですが、詳しくは15章で説明します。
この関数を実行すると、プログラムは入力待ち状態となります。
プログラムを使う人が、データを打ち込んでリターン(Enter)キーを押すと、
そのデータが指定した変数に代入されます。
なお、scanf関数を使用するには、#include <stdio.h> が必要です。
printf関数を使う時と同じなので、改めて追加する必要はありません。
数値の入力
これだけのことがわかれば、キーボードからデータを入力できます。
次のプログラムは、scanf関数を使用して入力された数値をそのまま表示する例です。
このプログラムの実行結果の例は、次の通りになります。
弱く表示された文字列は説明用に書き加えた文で、実際には表示されません。
このプログラムを実行すると、入力待ち状態になります。
そこで数値を入力し、リターンキーを押すと、その数値がそのまま表示されます。
当然、100 以外の数値でも構いません。
scanf関数では、整数だけでなく、実数の入力も可能です。
ただし、実数の場合、%lf指定子を使用する必要があります。
printf関数では%f指定子だったので注意してください。
次のプログラムは、scanf関数を使用して入力された実数をそのまま表示する例です。
このプログラムの実行結果の例は、次の通りになります。
弱く表示された文字列は説明用に書き加えた文で、実際には表示されません。
次のプログラムは、scanf関数を使用して入力された数値をそのまま表示する例です。
ソースコード
#include <stdio.h>
int main(void)
{
int data;
scanf("%d", &data); /* 入力部分 */
printf("%d\n", data);
return 0;
}
このプログラムの実行結果の例は、次の通りになります。
弱く表示された文字列は説明用に書き加えた文で、実際には表示されません。
解 2-1
100 入力したデータ
100 表示されたデータ
100 表示されたデータ
このプログラムを実行すると、入力待ち状態になります。
そこで数値を入力し、リターンキーを押すと、その数値がそのまま表示されます。
当然、100 以外の数値でも構いません。
scanf関数では、整数だけでなく、実数の入力も可能です。
ただし、実数の場合、%lf指定子を使用する必要があります。
printf関数では%f指定子だったので注意してください。
次のプログラムは、scanf関数を使用して入力された実数をそのまま表示する例です。
ソースコード
#include <stdio.h>
int main(void)
{
double data;
scanf("%lf", &data); /* 入力部分 */
printf("%f\n", data);
return 0;
}
このプログラムの実行結果の例は、次の通りになります。
弱く表示された文字列は説明用に書き加えた文で、実際には表示されません。
解 2-1
175.128 入力したデータ
175.128000 表示されたデータ
175.128000 表示されたデータ
複数の入力
scanf関数では、1度に1つのデータしか入力出来ないわけではありません。
指定子を複数使うことで、複数の入力を1度に行うことが可能です。
次のプログラムは、scanf関数を使用して2つの数値を入力し表示します。
このプログラムの実行結果の例は、次の通りになります。
ここでは、%d指定子を2つ指定して、1度に2つの数値を入力させています。
入力する時には、2つの数値を、スペース、タブ、改行などで区切って入力します。
ちなみに、このプログラムで、int data1,data2;、としているのは、
複数の変数を同じ型で宣言する場合に便利な書き方です。
int data1; int data2;、と2回に分けて宣言するよりも、
一行にまとめてしまった方が簡単になります。
2つの数値を、別々の型で入力させることも可能です。
たとえば、"%d%lf" と言う指定子を与えてやると、
1つ目は整数、2つ目は実数値で入力できます。
また、区切る記号を指定して入力させることも可能です。
この場合は、2つの指定子の間に、区切る記号を指定します。
次のプログラムは , で区切って2つの数値を入力させます。
このプログラムの実行結果の例は、次の通りになります。
今回は、入力する時には , で区切って入力することになります。
その代わり、スペースなどで区切れなくなるので、注意が必要です。
指定子を複数使うことで、複数の入力を1度に行うことが可能です。
次のプログラムは、scanf関数を使用して2つの数値を入力し表示します。
ソースコード
#include <stdio.h>
int main(void)
{
int data1, data2;
scanf("%d%d", &data1, &data2); /* 入力部分 */
printf("%d , %d\n", data1, data2);
return 0;
}
このプログラムの実行結果の例は、次の通りになります。
解 2-1
100 200 入力したデータ
100 , 200 表示されたデータ
100 , 200 表示されたデータ
ここでは、%d指定子を2つ指定して、1度に2つの数値を入力させています。
入力する時には、2つの数値を、スペース、タブ、改行などで区切って入力します。
ちなみに、このプログラムで、int data1,data2;、としているのは、
複数の変数を同じ型で宣言する場合に便利な書き方です。
int data1; int data2;、と2回に分けて宣言するよりも、
一行にまとめてしまった方が簡単になります。
2つの数値を、別々の型で入力させることも可能です。
たとえば、"%d%lf" と言う指定子を与えてやると、
1つ目は整数、2つ目は実数値で入力できます。
また、区切る記号を指定して入力させることも可能です。
この場合は、2つの指定子の間に、区切る記号を指定します。
次のプログラムは , で区切って2つの数値を入力させます。
ソースコード
#include <stdio.h>
int main(void)
{
int data1, data2;
scanf("%d,%d", &data1, &data2); /* 入力部分 */
printf("%d , %d\n", data1, data2);
return 0;
}
このプログラムの実行結果の例は、次の通りになります。
解 2-1
100,200 入力したデータ
100 , 200 表示されたデータ
100 , 200 表示されたデータ
今回は、入力する時には , で区切って入力することになります。
その代わり、スペースなどで区切れなくなるので、注意が必要です。
簡易シグマプログラム
ここでは、新しい事柄の解説ではなく、実践的なプログラムを作ってみたいと思います。
お題は、簡易シグマ計算といたします。
シグマと言うのは高校の数学で習うことですが、基本的にはそんなに難しくありません。
1+2+3+4+5+・・・・100 などを計算するのがシグマです。
単純にするために、ここでは、最小値から最大値の間の整数の合計値を求めることにします。
プログラムを作る前に、公式について説明しておきます。
合計値は、(min+max)×(max-min+1)÷2 で求められます。
まず、このプログラムでは、2つの整数値の入力が必要なことがわかります。
そして、それを計算して、結果を表示させる必要があります。
当然、これらはすべて、今まで学習してきた知識だけで実現可能です。
2つの数値の入力には当然scanf関数を使用しますが、
scanf関数では、入力前に一切説明が表示されないので、
printf関数を使って、あらかじめ説明を表示することにします。
ここまで考えれば、後はプログラムを打つだけです。
次のプログラムは、最小値から最大値の間の整数の合計値を求めて表示します。
このプログラムの実行結果の例は、次の通りになります。
ここには、良いプログラムのヒントが多く含まれているので、順を追って解説します。
まずは、実行結果に注目してください。
, で区切って と、区切る記号を明確に表示している他、
結果の表示でも、入力された範囲の値を表示するなどして、わかりやすくしています。
プログラムの中では min,max,sum の3つの変数を宣言しています。
それぞれ、最小、最大、合計、の意味を持つ英単語となっており、
何に使われる変数なのがわかりやすくなっています。
変数名はわかりやすい名前で3~8文字程度が適当だと思います。
英語の意味にこだわる必要はありませんので sum の例ならば、
もう1つの合計である total や、
答えという意味になる answer や solve や solution なども考えられますし、
ローマ字で goukei kotae としてしまうのも良い考えだと思います。
何にせよ 意味のない変数名や1文字の変数名、などは避けてください。
もう1つ、プログラムを適切に分割して、コメントをつけていることに注目してください。
このプログラムは、入力、計算、表示、の3段階に分けられ、コメントが付いています。
この内、計算と表示は、ひとまとめにしてしまうことも可能なのですが、
ここでは、分けた方がわかりやすくなるため、あえて分割しています。
この様に、プログラムは、作る人にも使う人にもわかりやすくすることが大切です。
お題は、簡易シグマ計算といたします。
シグマと言うのは高校の数学で習うことですが、基本的にはそんなに難しくありません。
1+2+3+4+5+・・・・100 などを計算するのがシグマです。
単純にするために、ここでは、最小値から最大値の間の整数の合計値を求めることにします。
プログラムを作る前に、公式について説明しておきます。
合計値は、(min+max)×(max-min+1)÷2 で求められます。
まず、このプログラムでは、2つの整数値の入力が必要なことがわかります。
そして、それを計算して、結果を表示させる必要があります。
当然、これらはすべて、今まで学習してきた知識だけで実現可能です。
2つの数値の入力には当然scanf関数を使用しますが、
scanf関数では、入力前に一切説明が表示されないので、
printf関数を使って、あらかじめ説明を表示することにします。
ここまで考えれば、後はプログラムを打つだけです。
次のプログラムは、最小値から最大値の間の整数の合計値を求めて表示します。
ソースコード
#include <stdio.h>
int main(void)
{
int min, max, sum;
/* 入力部分 */
printf("最小値と最大値を , で区切って入力して下さい。:");
scanf("%d , %d", &min, &max);
/* 計算部分 */
sum = (min + max) * (max - min + 1) / 2;
/* 表示部分 */
printf("%d~%d の合計は %d です。\n", min, max, sum);
return 0;
}
このプログラムの実行結果の例は、次の通りになります。
解 2-1
最小値と最大値を , で区切って入力してください。:100,200
100~200 の合計は 15150 です。
100~200 の合計は 15150 です。
ここには、良いプログラムのヒントが多く含まれているので、順を追って解説します。
まずは、実行結果に注目してください。
, で区切って と、区切る記号を明確に表示している他、
結果の表示でも、入力された範囲の値を表示するなどして、わかりやすくしています。
プログラムの中では min,max,sum の3つの変数を宣言しています。
それぞれ、最小、最大、合計、の意味を持つ英単語となっており、
何に使われる変数なのがわかりやすくなっています。
変数名はわかりやすい名前で3~8文字程度が適当だと思います。
英語の意味にこだわる必要はありませんので sum の例ならば、
もう1つの合計である total や、
答えという意味になる answer や solve や solution なども考えられますし、
ローマ字で goukei kotae としてしまうのも良い考えだと思います。
何にせよ 意味のない変数名や1文字の変数名、などは避けてください。
もう1つ、プログラムを適切に分割して、コメントをつけていることに注目してください。
このプログラムは、入力、計算、表示、の3段階に分けられ、コメントが付いています。
この内、計算と表示は、ひとまとめにしてしまうことも可能なのですが、
ここでは、分けた方がわかりやすくなるため、あえて分割しています。
コメントの弊害
多くの入門書にはコメントを付けるよう書いているため、
人によっては極度にコメントを付けてしまうことがあります。
しかし、見ればわかる簡単な部分にコメントは不要です。
また、プログラムを修正したときにコメントがそのままだと、
コメントとプログラムが一致しないため誤解の元となります。
筆者のオススメは、この例のように、大雑把な区切りごとにコメントをつける書き方です。
コメントの付け方には、それぞれに色々な流儀があり、これが正解といったものはありません。
人によっては極度にコメントを付けてしまうことがあります。
しかし、見ればわかる簡単な部分にコメントは不要です。
また、プログラムを修正したときにコメントがそのままだと、
コメントとプログラムが一致しないため誤解の元となります。
筆者のオススメは、この例のように、大雑把な区切りごとにコメントをつける書き方です。
コメントの付け方には、それぞれに色々な流儀があり、これが正解といったものはありません。
この様に、プログラムは、作る人にも使う人にもわかりやすくすることが大切です。
本サイトについて
苦しんで覚えるC言語(苦C)はC言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。




