いちばん失敗した人決定戦

C言語のプログラミングの課題で以下のような表をfor文を用いて作るというものが出ました。

商品名 単価(円)個数(円) 計

 A  50   20   ***
 B  90   30   ***
 C  30   80   ***
       合計金額   ***

A,B,C及びそれぞれの単価、個数の値はキーボードからの入力で、***は演算によりその結果を出力するようにします。つまり、商品名(1文字)と単価、そしてその個数をキーボードから入力すると、単価と個数をかけた値と、それら全ての合計が出力されるようなプログラムを作るということです。
私は以下のようなプログラムを作りました

#include<stdio.h>
int main(void)
{
int a,b,c,sum,allsum,i;
printf("商品名 単価 個数 計\n");
for(i=1;i<=3;i++)
{
a=getchar();
scanf("%d %d",&b,&c);
 sum=b*c;
allsum +=sum;
putchar(a);
printf(" %d %d %d \n",b,c,sum);
}
printf("合計金額 %d\n",allsum);
return 0;
}

しかしこれでは合計金額がちゃんと表示されなかったりしてうまくいきません。おそらくfor文の中身に問題があると思うんですが…。どうか正しいプログラムと、なぜこのプログラムではうまくいかないのかを教えていただきたいです。なにぶん初心者なもんで、よろしくお願いします。

A 回答 (5件)

>でも、このプログラムには fflush という授業で習っていないものがありますね。



★質問文にある getchar(); で \n を捨てよう。

#include <stdio.h>

int main( void )
{
 int iGoods[3], iPrice[3], iNumber[3], iSum[3], iAllSum = 0, i;

 for( i = 0; i < 3; i++ ){ // Cの配列は [0] から

  scanf( "%c %d %d", &iGoods[i], &iPrice[i], &iNumber[i] );

  getchar(); // \n (Enter) 読み捨て

  iSum[i] = iPrice[i] * iNumber[i];

  iAllSum += iSum[i];
 }
 printf( "商品名--単価--個数----計\n" ); // 投稿上の都合で・・

 for( i = 0; i < 3; i++ ){

  printf( "%-6c%6d%6d%6d\n", iGoods[i], iPrice[i], iNumber[i], iSum[i] );
 }
 printf( "合計金額%16d\n", iAllSum );

 return( 0 );
}
★万が一「提出」とする場合、見る人が見ると「加齢臭」のキツ~イ、ソースと判りますので若作りに改変して下さい(笑)。

  int 変数名の頭の i を取るとか。
    • good
    • 0

>なぜこのプログラムではうまくいかないのか



 不具合1
 ・加算前の allsum は、宣言しただけでは値は不定で、No.1, 2 さんの言われる初期化が必要です。

 不具合2
 ・a, b, c を入力即出力では、入力過程が「表」に混在してしまいます。

 不具合3
 ・入力ストリームのクリアが必要(質問者様のを実行して気づきました)
-------------------------------------
《改良》

 ・入力時に「配列」に格納し、A,B,Cの全てを入力後、出力。
 ・入力ストリームのクリア。
 ・出力書式の調整。

    http://www.k-cube.co.jp/wakaba/server/format.html

《入力の仕方》

 例)A 50 20(Enter) ← 全て半角。これを3行入力。
--------------------------------------
#include <stdio.h>

int main( void )
{
 int a[3], b[3], c[3], sum[3], allsum = 0, i;

 for( i = 0; i < 3; i++ ){ // Cの配列は [0] から

  scanf( "%c %d %d", &a[i], &b[i], &c[i] );

  fflush( stdin );

  sum[i] = b[i] * c[i];

  allsum += sum[i];
 }
 printf( "商品名--単価--個数----計\n" ); // 投稿上の都合で・・

 for( i = 0; i < 3; i++ ){

  printf( "%-6c%6d%6d%6d\n", a[i], b[i], c[i], sum[i] );
 }
 printf( "合計金額%16d\n", allsum );

 return( 0 );
}
注:インデントに全角空白を用いています。タブに一括変換して下さい。
  「商品名」は、半角1文字限定。

この回答への補足

非常に丁寧な説明本当にありがとうございます!!確かにできました!!しかも本当に1つの表として出力されますね。課題では入力過程が表に混在しても構わないといえあれていたのですが。こっちのほうがキレイですね。
でも、このプログラムにはfflushという授業で習っていないものがありますね。授業で習ったものだけでプログラミングをするのが課題のルールなもんで、これでは提出できそうにないです。
それでも知識が増えました。ありがとうございます。

補足日時:2008/07/04 16:05
    • good
    • 0
この回答へのお礼

非常に丁寧な説明本当にありがとうございます!!確かにできました!!しかも本当に1つの表として出力されますね。課題では入力過程が表に混在しても構わないといえあれていたのですが。こっちのほうがキレイですね。
でも、このプログラムにはfflushという授業で習っていないものがありますね。授業で習ったものだけでプログラミングをするのが課題のルールなもんで、これでは提出できそうにないです。
それでも知識が増えました。ありがとうございます。

お礼日時:2008/07/04 16:43

変数の名前は、意味のあるものを付けましょう。


a, b, cでは、単なる記号です。
    • good
    • 0
この回答へのお礼

なるほど。単なる記号だと後でデバッグするときに一目で分からず大変になったりしますね。a→goods、b→price、c→number、と変えてみます。細かい指摘、ありがとうございます。

お礼日時:2008/07/04 15:07

allsum は初期化した方がいいです。

(VC++とか使って値を見ながらトレースするとよいと思います)

この回答への補足

allsumを初期化して再度やってみました。しかし、No.1さんのところに書いてあるように、うまくいきませんでした。まだ何かもんだいがあるようです。

補足日時:2008/07/04 16:33
    • good
    • 0
この回答へのお礼

回答ありがとうございます。もう一度プログラミングし直してみたいと思います!

お礼日時:2008/07/04 15:03

・ 変数allsum が初期化されていませんね。



int allsum = 0;

この回答への補足

allsumを初期化して再度やってみました。しかし、商品Bの項目をキーボードで入力し、ENTERを押すと、商品Aと商品Bの内容が二つとも出力され、商品Aの内容が2つある状態になり、商品Cの内容を入力することなく、AとBだけの合計金額が出力され、そこでプログラムが終了してしまいました。まだ何か問題があるようです。

補足日時:2008/07/04 16:24
    • good
    • 0
この回答へのお礼

allsumを初期化をしていなかったからうまくいかなかったんですね。もう一度それでやってみたいと思います。ありがとうございました!!

お礼日時:2008/07/04 15:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!