![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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文の中身に問題があると思うんですが…。どうか正しいプログラムと、なぜこのプログラムではうまくいかないのかを教えていただきたいです。なにぶん初心者なもんで、よろしくお願いします。
No.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 を取るとか。
No.4
- 回答日時:
>なぜこのプログラムではうまくいかないのか
不具合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という授業で習っていないものがありますね。授業で習ったものだけでプログラミングをするのが課題のルールなもんで、これでは提出できそうにないです。
それでも知識が増えました。ありがとうございます。
非常に丁寧な説明本当にありがとうございます!!確かにできました!!しかも本当に1つの表として出力されますね。課題では入力過程が表に混在しても構わないといえあれていたのですが。こっちのほうがキレイですね。
でも、このプログラムにはfflushという授業で習っていないものがありますね。授業で習ったものだけでプログラミングをするのが課題のルールなもんで、これでは提出できそうにないです。
それでも知識が増えました。ありがとうございます。
No.3
- 回答日時:
変数の名前は、意味のあるものを付けましょう。
a, b, cでは、単なる記号です。
なるほど。単なる記号だと後でデバッグするときに一目で分からず大変になったりしますね。a→goods、b→price、c→number、と変えてみます。細かい指摘、ありがとうございます。
No.1
- 回答日時:
・ 変数allsum が初期化されていませんね。
int allsum = 0;
この回答への補足
allsumを初期化して再度やってみました。しかし、商品Bの項目をキーボードで入力し、ENTERを押すと、商品Aと商品Bの内容が二つとも出力され、商品Aの内容が2つある状態になり、商品Cの内容を入力することなく、AとBだけの合計金額が出力され、そこでプログラムが終了してしまいました。まだ何か問題があるようです。
補足日時:2008/07/04 16:24allsumを初期化をしていなかったからうまくいかなかったんですね。もう一度それでやってみたいと思います。ありがとうございました!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#if 1 #elseの意味について
-
構文エラー";"が型の前にあり...
-
while文について、c言語...
-
for文の中にswitch文はいれられ...
-
プログラミングで二番目に大き...
-
getcの改行判定
-
配列を関数に渡す方法
-
C言語の二分法のプログラムにつ...
-
10進数からN進数に変換するプロ...
-
C言語プログラムが理解できなくて…
-
階乗のプログラム!!
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
-
CTRL+Dでループを抜けるには
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
マイナスからプラスへ転じた時...
-
C言語での引数の省略方法
-
charからLPTSTRへの変換方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
構文エラー";"が型の前にあり...
-
#if 1 #elseの意味について
-
for文の中にswitch文はいれられ...
-
getcの改行判定
-
C言語階乗の総和を求める
-
配列を使って魔方陣
-
while文について、c言語...
-
プログラミングで二番目に大き...
-
C言語 数字以外を入力させない...
-
c言語のwhile文を使った計算で...
-
C言語プログラムが理解できなくて…
-
C言語で電卓を作成する。
-
配列を関数に渡す方法
-
C言語の二分法のプログラムにつ...
-
c言語for文
-
scanf関数を用いての加減乗除%...
-
階乗のプログラム!!
-
計算結果がlong型以上になる場...
-
c言語プログラミングで1から100...
-
初心者です。for文、if文を使っ...
おすすめ情報