• ベストアンサー

合計表示プログラムについて

こんばんは。 この掲示板には大変お世話になっています。 合計を表示させるプログラムについて質問します。 以下にプログラムを示します。 トータル: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); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

質問者さんのプログラムの意図は、 計算と最終結果の出力を特別な関数に委任して汎用的に使うことにあると思います。 そうだと仮定してお答えします。 もしそうでなければ、この回答は無視してください。 引数にフラグを持たせれば、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);   } } 単に合計を求めるだけなら、関数にするメリットは無いと思いますが もっと複雑な処理をする関数なら役立つかもしれませんね。

bird_2005
質問者

お礼

自分の知らない方法で、とても役に立ちそうです。ありがとうございました。

その他の回答 (4)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

現在のsum関数は、呼び出される毎に、トータルを表示するようになっていますから、引数に表示をする場合の条件とかを渡す必要があると思います。

bird_2005
質問者

お礼

書き込みありがとうございました。

  • bulgaris
  • ベストアンサー率50% (8/16)
回答No.4

1) sum関数はtotalを返すように変更 2) sum関数のtotalを変更しない方法を探る この2点を行い、何が実現できそうかを考えてみて下さい。

bird_2005
質問者

お礼

書き込みありがとうございました。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

処理の流れを正しく把握した上で、フローチャートを書くと、プログラムは ・宣言 ・初期化 ・演算処理 ・結果表示 の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; } 質問者さんの間違いは、処理の流れを正しく把握できていない為に ・演算処理 ・結果表示 を混ぜてしまったのが理由です。 いちいちフローチャートを書けとは言いませんが、頭の中でフローチャートを思い描きながらプログラミングするのがコツです。

bird_2005
質問者

お礼

詳しい説明ありがとうございました。

回答No.1

単純に、if(a==10)とprintfの前に記述すればいいのではないでしょうか?

bird_2005
質問者

お礼

返信ありがとうございます。 今後とも、よろしくお願いします。

関連するQ&A

  • C言語 プログラム問題

     すいません、C言語初心者です。以下のプログラムがわからないので、よければ教えてください。 #include<stdio.h> int f(int a); int g(int *a); main(){ int i, j, na =10; int a[12] = {1,2,3,4,5,6,7,8,9,10,11,12}; printf("a = "); for (i=0; i<na; i++); printf("%d ",a[i]); j = f(a[2]); j = f(a[3]); j = g(a+4); j = g(a+5); printf("\na = "); for (i=0;i<na;i++) printf("%d ",a[i]); printf("\nj = %d\n",j); } int f(int a) { static int total=0; total = total + a; a = a+50r; return total; } int g(int *a) { static int total=0; total = total+(*a); (*a) = (*a) +50; return total; } <結果> a = 1 2 3 4 5 6 7 8 9 10 a = 1 2 3 4 55 66 7 8 9 10 j = 11    まず、結果がなぜ下の段に55 56があるのか、そして関数f,gの機能、最後にj=11の意味です。j=5+6 =11とは聞きましたがどこから出ているのかがわかりません。  よろしくお願いします。

  • 関数の引数と実引数の取り扱いについて

    C言語初心者です. 関数の引数と実引数の取り扱いについて,教えていただきたいことがあります. 例えば,2変数の和を求める関数を考えると,以下のようになると思います. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; } このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました. #include <stdio.h> double sum(double x, double y); int main(void) { double a, b, wa; a=2.0; b=3.0; wa=sum(a,b); return 0; } double sum(double x, double y) { double total; total=x+y; return total; }

  • 配列の和を求めるプログラム

    キーから入力したデータを配列に入力した後、その和を求めるプログラムを作成したいのですが、プログラミング初心者の私にはさっぱりわかりません。 和を求めたいのに平均値が出てきてしまいます。 どこが間違っているのか教えてください。 #include <stdio.h> float data[5]; float total(int max); void main(void) { int cnt = 0; float d; printf("please input a data: "); scanf("%f", &d); while((cnt < 5) && (d > 0.0)) { data[cnt] = d; cnt++; printf("please input a data: "); scanf("%f", &d); } printf("total data: %5.2f\n", total(cnt)); } float total(int max) { int i; float total = 0.0; for(i = 0; i < max; i++) { total += data[i]; } return total / max; }

  • このプログラムにアドバイスをください

    問題が  ・100個の要素を持った一次元配列をmain()関数内で宣言 ・一次元配列と要素数を引数として持つ関数seisei() ・関数seisei()は乱数を使い渡された配列を0~99の整数で初期化する。 ・一次元配列、要素数そして変数のポインタを引数としてもつ関数goukei() ・関数goukei()は渡された配列に格納された数値の合計を計算し、渡された変数のポインタにその合計値を代入する。 と問題があり、下記のようにプログラムを作ったんですが、どうしてもコンパイルできません。どなたかご指摘よろしくお願いします。 #include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",&sum); return 0; } void seisei(int *a[i], int n) { srand(time(NULL)); for(i = 0; i <= n; i++){ *a[i] = rand() % 100; } } void goukei(int *a[i],int n,int *sum) { *sum = 0; for(i = 0; i <= n; i++){ *sum += *a[i]; } }

  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • コンパイルができません。

    #include <stdio.h> main(){ int a = 1; int sum = 0; while( a<16) { sum = sum + a;   a++;  } printf("%d\n",sum); } 1から15まで足した結果を表示するプログラムですが、うまくいきません。教えてください。

  • ピラミッド表示プログラム。

    ピラミッドを表示させるプログラムを考えています。 例えば3段の場合   *  *** ***** っというような表示です。 #include <stdio.h> void spira(int n); main() { int a; printf("段数は:"); scanf("%d",&a); spira(a); } void spira(int n) { int i,j=1,a,b,k; for(a=n;a>0;a--){ for(b=a-1;b<=n;b--){ printf(" "); } k=(j-1)*2+1; for(i=1;i<=k;i++){ printf("*"); } j++; printf("\n"); } } このように考えてみたのですが、無限ループになって表示できません。 どこが悪いでしょうか? 無限ループの原因はどうやったら解消されるでしょうか?

  • 簡単なプログラムについて

    2. 1から100までの自然数で、3でも5でも割り切れない全ての数と、それらの総和を表示 するプログラムの全文を答えること。以下は5つ目までの自然数とその数までの総和の対 を表示する実行例。(8点) $ ./problem2 1 1 2 3 4 7 7 14 8 22 #include<stdio.h> int main(void){ int i = 0, sum = 0; for(i=1; i<=100; ++i){ if(i%3!=0 && i%5!=0){ sum += i; printf("%d %d\n",i,sum); } } return 0; } 最初のi=0の初期化は必要ですか? 自分はint i,sum=0;としていて i=0とはしていませんでした。 iに=0は必要なのか教えてください

  • 関数とポインタについて

    #include <stdio.h> void test(int *p); int main() { int i; test(&i); printf("%d",i); return 0; } void test( int *p) { static int k; k = 10; p = &k; } このようなプログラムを作って、void test()のkの値をmain関数で受け取りたいのですが、どのようにすればよいのかわかりません。 どなたか教えていただけませんか?

  • c言語のプログラムで

    c言語で 2つの整数を読み込んで小さいほうの数以上で大きいほうの数以下の整数をすべて加えた値を表示するプログラム で最後の表示の仕方がわかりません。 実行結果は 整数1:37 整数2:28 28以上37以下の全整数は325です。と表示されるはずです。 この表示の3行目の28と37の表示がどうやればよいのかわかりません。 #include <stdio.h> int main(void) { int a, b; int sum=0; printf("整数1:"); scanf("%d",&a); printf("整数2:"); scanf("%d",&b); if(a>b) do{ sum=sum+b; b=b+1; }while(b<=a); else do{ sum=sum+a; a=a+1; }while(a<=b); printf("%d以上%d以下の全整数の和は%dです。",a,b,sum); return(0); } 全整数の表示はできます。 do文の中でa=cとかにしてやってみましたが、うまくいきませんでした。 お願いします。