- ベストアンサー
合計表示プログラムについて
こんばんは。 この掲示板には大変お世話になっています。 合計を表示させるプログラムについて質問します。 以下にプログラムを示します。 トータル:55と表示させたいのですが、以下のプログラムですと、sum関数が呼ばれるたびにトータルが表示されてしまいます。 「トータル55」と表示させるのみにする場合は、どこを訂正すればよろしいでしょうか? 実際はmain内で、 total +=a; を記述したらいいと思うのですが、sum関数を使ってできないでしょうか? よろしくお願いします。 [プログラム] #include<stdio.h> static void sum(int a); int main(){ int a; for(a=0;a<11;a++){ sum(a); } } void sum(int a){ static int total=0; total += a; printf("トータル:%d\n",total); }
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
質問者さんのプログラムの意図は、 計算と最終結果の出力を特別な関数に委任して汎用的に使うことにあると思います。 そうだと仮定してお答えします。 もしそうでなければ、この回答は無視してください。 引数にフラグを持たせれば、sum()関数を汎用的に使えると思います。 ただしプログラムはその分、複雑になりますが... 下記の例では、sum()関数を別々のforループ中で何度でも使えるところがミソです。 int main() { int a, flg; for (a = 0; a < 11; a++) { if (a==0) flg = 0; else if (a==10) flg = 9; else flg = 1; sum(a, flg); } for (a = 50; a < 60; a++) { if (a==50) flg = 0; else if (a==60) flg = 9; else flg = 1; sum(a, flg); } } void sum(int a, int flg) { static int total = 0; /* ここでstaticで定義するのは正解 */ if (flg==0) { total = 0; } total += a; if (flg==9) { printf("トータル:%d\n",total); } } 単に合計を求めるだけなら、関数にするメリットは無いと思いますが もっと複雑な処理をする関数なら役立つかもしれませんね。
その他の回答 (4)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
現在のsum関数は、呼び出される毎に、トータルを表示するようになっていますから、引数に表示をする場合の条件とかを渡す必要があると思います。
お礼
書き込みありがとうございました。
- bulgaris
- ベストアンサー率50% (8/16)
1) sum関数はtotalを返すように変更 2) sum関数のtotalを変更しない方法を探る この2点を行い、何が実現できそうかを考えてみて下さい。
お礼
書き込みありがとうございました。
- chie65536
- ベストアンサー率41% (2512/6032)
処理の流れを正しく把握した上で、フローチャートを書くと、プログラムは ・宣言 ・初期化 ・演算処理 ・結果表示 の4つに細分化できます。 フローチャート通りに記述すると以下のようになります。 #include<stdio.h> /*宣言*/ static void sum(int a); static int total; int main() { int a; /*初期化*/ total=0; /*演算処理*/ for(a=0;a<11;a++){ sum(a); } /*結果表示*/ printf("トータル:%d\n",total); } void sum(int a) { total += a; } 質問者さんの間違いは、処理の流れを正しく把握できていない為に ・演算処理 ・結果表示 を混ぜてしまったのが理由です。 いちいちフローチャートを書けとは言いませんが、頭の中でフローチャートを思い描きながらプログラミングするのがコツです。
お礼
詳しい説明ありがとうございました。
- revolution_2005
- ベストアンサー率37% (55/146)
単純に、if(a==10)とprintfの前に記述すればいいのではないでしょうか?
お礼
返信ありがとうございます。 今後とも、よろしくお願いします。
お礼
自分の知らない方法で、とても役に立ちそうです。ありがとうございました。