C言語でfor文を用いたプログラミングについて

このQ&Aのポイント
  • C言語のプログラミングの課題で商品名、単価、個数を入力し、それらの合計金額を求めるプログラムの作成が求められました。
  • 質問者はfor文を使用してプログラムを作成しましたが、合計金額が正しく表示されない問題があります。
  • 正しいプログラムと、なぜそのプログラムではうまくいかないのかを教えていただきたいとのことです。
回答を見る
  • ベストアンサー

C言語でfor文を用いたプログラミングについてです。

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文の中身に問題があると思うんですが…。どうか正しいプログラムと、なぜこのプログラムではうまくいかないのかを教えていただきたいです。なにぶん初心者なもんで、よろしくお願いします。

  • zyoi
  • お礼率40% (8/20)

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答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 を取るとか。

その他の回答 (4)

  • yama5140
  • ベストアンサー率54% (136/250)
回答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文字限定。

zyoi
質問者

お礼

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

zyoi
質問者

補足

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

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

変数の名前は、意味のあるものを付けましょう。 a, b, cでは、単なる記号です。

zyoi
質問者

お礼

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

noname#75489
noname#75489
回答No.2

allsum は初期化した方がいいです。(VC++とか使って値を見ながらトレースするとよいと思います)

zyoi
質問者

お礼

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

zyoi
質問者

補足

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

  • auty
  • ベストアンサー率58% (284/486)
回答No.1

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

zyoi
質問者

お礼

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

zyoi
質問者

補足

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

関連するQ&A

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • for文

    #include <stdio.h> int main(void) { int i; int sum=0; int num, tmp; printf("整数は何個かな:"); scanf("%d",&num); for(i=0; i<num; i++){ printf("No.%d:",i+1); scanf("%d",&tmp); sum+=tmp; } printf("合計値は:%d\n",sum); printf("平均値は:%.2f\n", (double)sum/num); return(0); } 上の文のforの箇所を for(i=1; i<=num; i++){ printf("No.%d:",i); scanf("%d",&tmp); sum+=tmp;   } としても結果的に同じですよね? どっちでもいいかどうか迷ってます。教えて下さい。

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • C言語 繰り返しの問題

    C言語の初心者です。 キーボードから値を入力して、1から入力された値までの奇数の和を求めて出力するプログラムを作成します。以下のように組んでみましたが、全然うまくいきません。誰か教えていただけませんか? #include<stdio.h> int main(void) { int i,n,sum; sum=0; printf("入力値:",n); scanf("%d",&n); if(n<=0) { printf("\n合計値:0\n"); } else { printf("入力値:\n",n); for(i= 1; i<= n; i=i+2) { if(n%2=1) { sum=sum+i; } } } printf("\n合計値\n",sum); }

  • C言語!プログラム書いたのですがエラーです!

    課題内容 キーボードから数字を入力してその値までの合計を表示する。 さらに入力した値が偶数なら0から入力した値までのすべての偶数の和を 入力した値が奇数なら1から入力した値までのすべての奇数の和を表示するプログラム。 #include<stdio.h> int main(void) { int i, n, sum; sum=0; scanf("%d",&n); printf("入力値:%d\n", n); if(n%2 = 0) { for(i=0;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } else { for(i=1;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } return(0); } これでコンパイルすると10行目に左辺値が必要とでます。 どうすればよいでしょうか? 教えてください。よろしくお願いします。

  • C言語に詳しい方、教えていただけませんか?

    n個の実数をキーボードから入力して総和を求めるプログラムを書いたのですが、結果が+NANとなってしまいます。 また、値をキーボードから入力する際、小数にするとすぐにプログラムが終了してしまいます。例えば、a[0]=1.0とすると、 a[1]=a[2]=a[3]=a[4]=合計は+NANと表示され終了してしまいます。 ちゃんと小数を入力でき、結果も正しく表示されるように間違いを指摘していただけませんか?よろしくお願いします。 (nは5としました) #include <stdio.h> #define n 5 double souwa(double a[n]); int main(void) { int i; double sum, a[n]; for(i=0; i<=n-1; i++){ printf("a[%d] = ",i); scanf("%d",&a[i]); } sum = souwa(a); printf("合計は%f\n",sum); return 0; } double souwa(double a[n]) { int i; double sum = 0.0; for(i=0; i<=n-1; i++){ sum += a[i]; } return sum; }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • プログラミング for文

    プログラミング for文 プログラミングの問題です。 「自然数nを入力し、以下のようなパターンが出力されるようなプログラムをfor文を使って作成せよ。」 (例:n=3のとき) % ./a.out n: 3 * ** *** *__* **_** ****** *__*__* **_**_** ********* (例:n=4のとき) % ./a.out n: 4 * ** *** **** *___* **__** ***_*** ******** *___*___* **__**__** ***_***_*** ************ *___*___*___* **__**__**__** ***_***_***_*** **************** (_で空白を表しましたが、上手く見られないかもしれません…。小さい直角三角形が下に行くにつれ1個ずつ増え、全体的にみると大きい直角三角形が見えるイメージです。) つまり、n=3なら、 * ** *** を単位として、1~3行目にはこれが1つ、4~6行目にはこれが2つ、7~9行目にはこれが3つあります。 一般に、 * ** *** … ********(←n個) を単位とし、n^2-2~n^2行目にこれがn個あるようなパターンです。 私はまず、単位パターンをプログラムしました。 #include <stdio.h> main() { ___int n, i, j; ___printf("n: "); ___scanf("%d", &n); ___for (i=1; i<=n; i++) { ______for (j=1; j<=i; j++) { _________printf("*"); ______} ______printf("\n"); ___} } (_は空白です) しかし、単位パターンを横に2個、3個と並べるプログラムが分かりません。 さらにfor文を使い、3重、4重にするのですか?どなたか教えてください。

  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • C言語

    main() { int a = 5,b=2,e,f,g=3,i; double c,d,h=2.0; c = a/b; printf("c = %f\n",c); d = a/h; printf("d=%f\n",d); e = a++; f = ++b; g+= 4; i= ++a + b; printf(" a = %d\n",a); printf(" b = %d\n"b); printf(" e = %d\n"e); printf(" f = %d\n"f); printf(" g = %d\n"g); printf(" i = %d\n" i); 答え a=7,b=3,c=2.0,d=2.5,e=5,f=3,g=7,i=10 この問題のa,b,iがどうやってこの値になるのかがわかりません解説お願いします。