次は、もう少し入力と繰り返しを組み合わせたプログラムを作ってみましょう。
ある正数を入力し、0から入力した「ある正数」までの数値を表示するというプログラムです。
<実行結果1>
最後に表示する数値を入力してください:5 0 1 2 3 4 5 続行するには何かキーを押してください・・・
解答例です。
<sample program 035-01>
#include <stdio.h> int main(void) { int counter; int input; counter = 0; printf("最後に表示する数値を入力してください:\n"); scanf("%d", &input); while (counter <= input) { printf("%d\n", counter); counter++; } return 0; } |
<実行結果>
最後に表示する数値を入力してください:5 0 1 2 3 4 5 続行するには何かキーを押してください・・・
whileの条件を見てください。
( counter <= input ) となっていますね。
counterは0から始まって、入力された「ある正数」を超えるまで1ずつ増えています。
あまり大きな数を入力すると、プログラムが終了するまで非常に時間がかかります。
また、負の数を入力すると何も表示されません。
whileの条件が最初から成り立たないからです。
「変数について」でも書きましたが、int型のサイズは処理系依存です。
私の使っているコンピュータでは、int型は「4byte」と表示されました。
ビットで考えると、1byteは8bitですから、
4byte × 8bit = 32bit
となります。
※「そんなこと覚えてないよ・・・」という方は、「変数について」をもう一度よく読んでください。
32bitで表現できる数値の範囲は、-2147483648〜2147483647です。
※この数値は私も覚えていませんが・・・
上のプログラムでは、負の数を入力しても何も表示されませんが、正数2147483647までは正しく表示してくれます。
では、この数を超えた場合はどうなるのでしょう?
試してみたいところですが、21億まで数えるのを待っていると膨大な時間がかかります。
そこで、もっと小さな変数の型、charやshortを使ってみましょう。
charの表現範囲は、-128〜127までです。
shortの表現範囲は、-32768〜32767です。
今回は、小さい方のcharを使ってみましょう。
<sample program 035-02>
#include <stdio.h> int main(void) { char counter; int input; counter = 0; printf("最後に表示する数値を入力してください:\n"); scanf("%d", &input); while (counter <= input) { printf("%d\n", counter); counter++; } return 0; } |
<実行結果>
最後に表示する数値を入力してください:5 0 1 2 3 4 5 続行するには何かキーを押してください・・・
実行結果を見てください。
5を入力した場合、int型と同じように正しく表示されています。
では、表現範囲を超えた200を入力してみましょう。
実際に動かしてみてください。
止まらなくなりましたか?
なぜでしょう???
数値を確認するため、プログラム実行後に「ctrl+Cキー」を押してみてください。
※ctrlキーを押しながら、アルファベットのCキーを1回押します。
プログラムが停止したら、スクロールバーを動かして、数値を確認してみてください。
おかしなところがあるはずです。
わかりましたか?
0からずっと増えてきて、127のところで変化がありますよね。
127の次の数値を見ると-128になっています。
そこから-127、-126と増えて行き、また0に戻ります。
いつまで経っても200にならないので、終われないのです。
では、なぜ127の次の数値が-127になるのでしょうか。
答えを書く前にshort型でも試してみましょう。
short型は、表現範囲が-32768〜32767ですから40000を入力してみましょうか。
<sample program 035-03>
#include <stdio.h> int main(void) { short counter; int input; counter = 0; printf("最後に表示する数値を入力してください:\n"); scanf("%d", &input); while (counter <= input) { printf("%d\n", counter); counter++; } return 0; } |
同じように、止まりません。
ですが、char型よりも表現範囲が広いので、符合が変わるのがよく見えます。
このように、表現可能な範囲を超えると符号が変わってしまいます。
なぜ、このようなことが起こるのか「変数について2」で書きます。