以前、合計を求めるプログラムを説明しましたが、繰り返しと合計を組み合わせたプログラムを考えてみましょう。
まずは、単純なプログラムから書きます。
<sample program 039-01>
#include <stdio.h> int main(void) { int counter; counter = 0; while (counter < 10) { counter = counter + 1; } printf("counter = %d\n", counter); return 0; } |
<実行結果>
counter = 10 続行するには何かキーを押してください・・・
ずっと使っているカウンタのプログラムです。
なぜこれが合計?と思うかもしれません。
でも、よく考えてみてください。
カウンタというのは、「1」を繰り返し合計していますよね。
上のプログラムでは、「1」を10回合計した結果、変数counterは「10」になっています。
ただ、変数がcounterとなっていますので、合計を求めるというイメージが伴っていません。
カウンタはあくまでも数を数えるという意味で使っていますので、合計を求めるとなると別の変数を用意したほうがよさそうです。
変数は、用途に応じて準備するべきであり、極力使いまわしは避け、分かりやすい名前をつける必要があります。
では、合計を求めることをはっきりさせるために、変数sumを追加して書き換えてみます。
※sumとは「合計」の意味です。
<sample program 039-02>
#include <stdio.h> int main(void) { int counter; int sum; counter = 0; sum = 0; while (counter < 10) { sum = sum + 1; counter++; } printf("sum = %d\n", sum); return 0; } |
<実行結果>
sum = 10 続行するには何かキーを押してください・・・
変数counterは繰り返しの制御のため、数を数えるという役割があり、変数sumは繰り返しの中で「1」を合計し続けています。
「数を数える」という役割と「合計する」という役割がはっきりと分かれています。
「数を数える」counterは「1」ずつ増えますので、「counter++」で構いません。
「合計する」sumは、今回は「1」を合計していますので、「sum++」でも構わないのですが、色々な数の合計を求めようとすると「++」では不都合がありますので、「sum = sum + 1」か「sum += 1」にしておきます。
では、いよいよ「色々な数」を合計してみましょう。
<sample program 039-03>
#include <stdio.h> int main(void) { int counter; int sum; counter = 0; sum = 0; while (counter < 10) { sum = sum + counter; counter++; } printf("sum = %d\n", sum); return 0; } |
<実行結果>
sum = 45 続行するには何かキーを押してください・・・
「1」を合計する代わりに、counterの中身を合計してみました。
counterは、0から始まって10未満の間、1ずつ増えていきますので、「合計」を求めると「0〜9までの数値をすべて加算した数」が出てきます。
では、これを「1〜10までの合計を求める」プログラムに改良してみてください。
解答例です。
<sample program 039-04>
#include <stdio.h> int main(void) { int counter; int sum; counter = 1; sum = 0; while (counter < 11) { sum = sum + counter; counter++; } printf("sum = %d\n", sum); return 0; } |
<実行結果>
sum = 55 続行するには何かキーを押してください・・・
これまでに勉強したことを思い出せば大丈夫でしょう。
さて、ここで「合計」のプログラムに必要な部分を説明します。
「繰り返し」のプログラムに必要だった部分は、「初期値」「繰り返し条件」「増分」でした。
合計では、次の2箇所がポイントになります。
sum = 0; |
合計を求める変数に0を入れておくこと。
sum = sum + counter; |
「sum = sum + 合計したい数」または「sum += 合計したい数」
この2点です。
今回は、「合計したい数」を1から10まで変化させて「55」という結果が出ました。
次は、入力した数の合計を考えてみましょう。
「合計したい数」をscanfで入力すればできますが、最初は回数を決めて合計を求めます。
繰り返し回数を5回として、入力した5個の数値の合計を求めるプログラムを作ってください。
<実行結果>
数値を入力してください:4 数値を入力してください:7 数値を入力してください:3 数値を入力してください:1 数値を入力してください:9 合計は24です。
続行するには何かキーを押してください・・・
解答例です。
#include <stdio.h> int main(void) { int counter; int sum; int input; counter = 0; sum = 0; while (counter < 5) { printf("数値を入力してください:"); scanf("%d", &input); sum += input; counter++; } printf("合計は%dです。\n", sum); return 0; } |
変数counterは5回繰り返すという役割のみ担当しています。
変数inputはキーボードから数値を入力しています。
変数sumは入力された数を合計しています。
それぞれ、違った役割を持っていますね。
次はちょっと難しくなりますよ。
繰り返しの回数を決めずに合計を計算してみましょう。
例えば、コンビニやスーパーのレジも合計を計算していますよね。
ただ、お客さんが商品を何個買うかは前もって分かっていません。
1個かもしれないし、10個かもしれない。
まったく分からないので、繰り返し回数を前もって決めることができません。
最終的な金額を表示するためには、専用のボタン等を押して、合計計算が終わったことを示す必要があります。
今回は、ボタンの代わりに「0以下の値」を入力したら合計を止めることにしましょう。
それでは考えてみてください。
<実行結果>
金額を入力してください:1000 金額を入力してください:500 金額を入力してください:200 金額を入力してください:50 金額を入力してください:0 合計金額は1750円です。 続行するには何かキーを押してください・・・
ちょっと難しいかもしれませんので、解答例を書く前に色々と説明をしましょう。
まず、繰り返し回数が分からないので、カウンタは必要ありません。
繰り返しの条件は「入力した数値が0より大きい間繰り返す」です。
これらを元にプログラムを考えてみると、
<sample program 039-06>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; while (input > 0) { printf("金額を入力してください:"); scanf("%d", &input); sum += input; } printf("合計金額は%d円です。\n", sum); return 0; } |
このようになりました。
しかし、実行すると下のようなエラーが表示されます。
どこが問題なのかというと、
int input; while (input > 0) { |
この部分です。
変数inputを宣言していますが、どんな値が入っているか分かりません。
※変数宣言をした時点での変数の中身は「不定」です。
分からないのに「0より大きいかどうか」をチェックしています。
ここで、エラーが発生しているのです。
※Visual Studioはエラーを教えてくれるのですが、教えてくれないコンパイラもあります。
何が入っているか分からない変数は使ってはならないのです。
そこで、応急処置として以下のように変更しました。
<sample program 039-07>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; input = 1; while (input > 0) { printf("金額を入力してください:"); scanf("%d", &input); sum += input; } printf("合計金額は%d円です。\n", sum); return 0; } |
<実行結果>
金額を入力してください:1000 金額を入力してください:500 金額を入力してください:200 金額を入力してください:50 金額を入力してください:0 合計金額は1750円です。 続行するには何かキーを押してください・・・
何が入っているか分からないと使えないので、とりあえず「1」を入れてみました。
「0以下」の数値だと繰り返しに入らずに終わってしまうので「1以上」の数値なら何でも動作します。
しかし、スマートな方法とはいい難いですね・・・
他の方法を考えてみましょう。
金額が入力される前に繰り返しのチェックが入っていることがエラーの原因ですから、金額の入力が終わった後で繰り返しのチェックをすることにすれば良いかもしれません。
後判定のdo〜whileを使って書き換えてみます。
<sample program 039-08>
#include <stdio.h> int main(void) { int sum; int input; sum = 0; do { printf("金額を入力してください:"); scanf("%d", &input); sum += input; } while (input > 0); printf("合計金額は%d円です。\n", sum); return 0; } |
<実行結果>
金額を入力してください:1000 金額を入力してください:500 金額を入力してください:200 金額を入力してください:50 金額を入力してください:0 合計金額は1750円です。 続行するには何かキーを押してください・・・
上手くいきました。
しかし、この方法は万能とは言えません。
何故か、は次回に。