前回に引き続き、問題を出しましょう。
しつこいようですが、日本語で考えた「やりたいこと」をいかにC言語にするかということが、プログラムを始める方には必要なのです。
今、出題している「分岐構造」は仕組みは単純ですが、「応用」の幅は広いですから、たくさんプログラムを作ってみましょう。
もちろん、自分で問題を考えたり、サンプルに追加したり、変更したりすることも重要です。
どんなプログラムを組んでも、今の状況で、パソコンが壊れたりすることはありませんから、色々と試して見ましょう。
では、入力した数値が「負の数値」であれば、「マイナス」と表示するプログラムを作ってみましょう。
人間にとって、正の数値、負の数値、ゼロの区別はすぐに分かります。
でも、コンピュータは分かっていないのです。
負の数値とは、どのような数値か皆さんが分かった上で、コンピュータに教えてあげないといけません。
では、実行結果が以下のようになるよう、作ってみてください。
<実行結果1>
整数を入力してください:-1 マイナス 続行するには何かキーを押してください・・・
<実行結果2>
整数を入力してください:15 続行するには何かキーを押してください・・・
解答例です。
<sample program 009-01>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input < 0) { printf("マイナス\n"); } return 0; } |
<実行結果1>
整数を入力してください:-1 マイナス 続行するには何かキーを押してください・・・
<実行結果2>
整数を入力してください:15 続行するには何かキーを押してください・・・
0(ゼロ)と比較すれば、「負の数値」「正の数値」「ゼロ」は判別可能です。
「負の数値」はゼロより小さい数値ということが分かっていれば簡単です。
では、次に入力した数値の「絶対値」を求めるプログラムを作ってみてください。
「絶対値」とは、その数値が0(ゼロ)からどれだけ離れているかという数値です。
解答例です。
<sample program 009-02>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input < 0) { input = input * -1; } printf("入力したデータの絶対値は%dです。\n", input); return 0; } |
<実行結果>
整数を入力してください:-5 入力したデータの絶対値は5です。 続行するには何かキーを押してください・・・
要は、「負の数値」であれば、「符号」を反転されれば良いのです。
符号を反転するには、−1を乗算することで出来ます。
また、書き方として次のプログラムでも出来ます。
<sample program 009-03>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input < 0) { input = -input; } printf("入力したデータの絶対値は%dです。\n", input); return 0; } |
<実行結果>
整数を入力してください:-5 入力したデータの絶対値は5です。 続行するには何かキーを押してください・・・
マイナス符号を付けることで、「負の数値」が「正の数値」に変わります。
次は、数学のテストが行われたとします。
得点が100点であれば、「満点」と表示するプログラムを作ってください。
「いきなり、簡単になったな」と思う方もいらっしゃるかも知れませんが、重要なことを説明します。
解答例です。
<sample program 009-04>
#include <stdio.h> int main(void) { int suugaku; printf("得点を入力してください:"); scanf("%d", &suugaku); if (suugaku == 100) { printf("満点\n"); } return 0; } |
<実行結果>
得点を入力してください:100 満点 続行するには何かキーを押してください・・・
変数名は「suugaku」としています。特に「mathematics」でなくてもかまいません。
とは言え、なるべく英語の方が良いかも知れません。
「重要なことを説明します」と書きましたが、変数名のことではありません。
もしかしたら、次のようなプログラムを書いていませんか?
<sample program 009-05>
#include <stdio.h> int main(void) { int suugaku; printf("得点を入力してください:"); scanf("%d", &suugaku); if (suugaku = 100) { printf("満点\n"); } return 0; } |
<実行結果1>
得点を入力してください:100 満点 続行するには何かキーを押してください・・・
「どこが違うの?」と思われそうですが、if文の条件に「=」が使われています。
<sample program 009-04>では、「==」を使っています。
「でも、結果は一緒でしょ?」と思うかも知れません。
では、入力データを変えて見ましょう。
<実行結果2>
得点を入力してください:53 満点 続行するには何かキーを押してください・・・
「満点」と出ます。
では、他の数値も入れて見ましょう。
<実行結果3>
得点を入力してください:0 満点 続行するには何かキーを押してください・・・
<実行結果4>
得点を入力してください:-2 満点 続行するには何かキーを押してください・・・
う〜ん、理解に苦しみますね。
どんな数値を入力しても「満点」と表示されます。
なぜでしょう?
コンピュータは「あいまい」な結果を出しません。
これらの現象も「ちゃんとした理由」があるのです。
「=(イコール)」演算子には「代入」の意味しかない、ということは以前書きました。
本来であれば「条件」を書くところに「=」演算子を書いているということがポイントなのです。
C言語(他のプログラム言語でも同じことが言えますが)での、「条件」とはどのような意味を持っているのでしょう。
検証してみます。
<sample program 009-06>
#include <stdio.h> int main(void) { printf("%d\n", 13 > 5); return 0; } |
<実行結果>
1 続行するには何かキーを押してください・・・
「条件」を表示してみました。
こういうことも出来るのです。
「結果」は「1」となっています。(実際に試してくださいね)
もう1つ、
#include <stdio.h> int main(void) { printf("%d\n", 13 < 5); return 0; } |
<実行結果>
0 続行するには何かキーを押してください・・・
「結果」は「0」です。
何を見てほしいかというと、
「条件」が成立している時には、「1」
「条件」が成立していない時には、「0」
になるという点です。
「コンピュータは、人間の言葉を理解できない」ということはコラムにも書きました。
当然、「成立している」とか「成立していない」という言葉も理解できません。
では、どうやって「判断」をしているのでしょうか?
プログラムの世界では、
「0」は「不成立」を表し、
「0以外」は「成立」を表します。
コンピュータでの、「条件が成り立つ(成立)」、「条件が成り立たない(不成立)」の判断は、「条件」の結果が「0」か「0以外」かということです。
<sample program 009-05>で書いたプログラムは、変数「suugaku」に100を代入しています。
「条件」としては、「100」という数値を判断することになりますので、「0以外」の数値ですから「常に成立」となるのです。
このプログラムを実行してみてください。
<sample program 009-08>
#include <stdio.h> int main(void) { if (100) { printf("成り立っています。\n"); } return 0; } |
<実行結果>
成り立っています。 続行するには何かキーを押してください・・・
「条件」は「成立」しています。
では、これはどうでしょう。
<sample program 009-08>
#include <stdio.h> int main(void) { if (0) { printf("成り立っています。\n"); } return 0; } |
<実行結果>
続行するには何かキーを押してください・・・
何も表示されません。
ということは、「不成立」なのです。
このように書くこともできます。
<sample program 009-09>
#include <stdio.h> int main(void) { int data = 5; if (data) { printf("成り立っています。\n"); } return 0; } |
<実行結果>
成り立っています。 続行するには何かキーを押してください・・・
変数名を「条件」に書いただけでも、中身の数値によって「成立」「不成立」が変わります。
これを利用してプログラムを書くことは、良くあることです。
例えば、前回の「奇数を求める」プログラムを例にしてみましょう。
<sample program 009-09>
#include <stdio.h> int main(void) { int input; printf("整数を入力してください:"); scanf("%d", &input); if (input % 2) { printf("入力データは奇数です。\n"); } return 0; } |
<実行結果>
整数を入力してください:15 入力データは奇数です。 続行するには何かキーを押してください・・・
入力データ「15」を「2で割った余り」は「1」です。
「1」ということは「0以外」ですから、「成立」します。
もしも、「偶数」を入力した場合、「2で割った余り」は「0」になりますので、「不成立」になります。
このように、「0(不成立)」か「0以外(成立)」を利用することで、プログラムの幅が広がります。