C言語初心者の質問:割引計算のプログラムが正しく動作しない

このQ&Aのポイント
  • C言語初心者が割引計算のプログラムを作成しましたが、正しく動作しません。
  • プログラムを実行すると、「0, 0, 0, 0」と表示されてしまいます。
  • 解答のサンプルコードと比較しても間違いが見つからず、どこが間違っているのか分かりません。助言をお願いします。
回答を見る
  • ベストアンサー

C言語初心者です。計算がうまく出来ず困っています。

「苦しんで覚えるC言語」というサイトに載っている以下の問題を解きたいのですが、プログラムにエラーは出ないものの正常な結果が出ません。 定価を入力すると、1割引、3割引、5割引、8割引の値段を一覧表示するプログラムを作成せよ。 なお、結果の金額は整数値での表示が望ましいが、実数でもかまわない。 私は以下のようにプログラムを書いたのですが、実行して数値を入力すると、「0 ,0 ,0 ,0」と表示されてしまいます。 #include <stdio.h> int main(void) { int price,one,three,five,eight; scanf("%d",&price); /* 入力部分 */ one = price*0,9; three = price*0,7; five = price*0,5; eight = price*0,2; printf("%d ,%d ,%d ,%d \n",one,three,five,eight); return 0; } サイトでの解答は以下のようになっており、解答の他にも、変数を使用して書いても良いとあります。 #include <stdio.h> int main(void) { int price; printf("定価を入力して下さい : "); scanf("%d",&price); printf("1割引 = %d円\n",(int)(price * 0.9)); printf("3割引 = %d円\n",(int)(price * 0.7)); printf("5割引 = %d円\n",(int)(price * 0.5)); printf("8割引 = %d円\n",(int)(price * 0.2)); return 0; } これより前の内容を復習したり、調べたりもしたのですが、自分ではどこに間違いがあるのか見つけられませんでした。非常に初歩的な内容で恐縮ですが、助言をお願いします。

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

  • ベストアンサー
  • kawais070
  • ベストアンサー率52% (2242/4282)
回答No.1

one = price*0,9; three = price*0,7; five = price*0,5; eight = price*0,2; 0,9 じゃなくて、0.9 「 , 」カンマと「 . 」ピリオドじゃ全然違うからね。

libereso
質問者

お礼

回答の通りに直して無事動きました!焦って入力したせいで間違えてしまったみたいです。こんなミスをしていて本当に恥ずかしいです。これからは気をつけます。

libereso
質問者

補足

迷いましたが、一番最初に解決策の回答を頂きましたので、こちらの回答をベストアンサーに選ばせていただきます。本当にありがとうございました。

その他の回答 (5)

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.6

因みに、式の中の「カンマ」を「カンマ演算子」って呼ぶ。 カンマ演算子は、例えば int i,j,k; for (i = 0 , j = 10 , k = 100;i < 10;i++ , j--, k += 10) { 何かの処理 } みたいに使う。 こういう書き方を許しているので one = price * 9,0; もエラーにならないのだ。

  • chie65535
  • ベストアンサー率43% (8520/19368)
回答No.5

one = price*0,9; three = price*0,7; five = price*0,5; eight = price*0,2; カンマとピリオドが違う。 one = price*0,9; この式は、priceに0を掛けてoneに代入して、その後、9を評価して捨てる。 three = price*0,7; five = price*0,5; eight = price*0,2; も、すべて同様に、priceに0を掛けた結果、つまり「0」を、それぞれの変数に代入する。そして、カンマのあとに続く「7」とか「5」とか「2」とかは、評価された後に捨てられる。 なので、ゼロが4つ表示されて当然。 priceに何が入ってようが、0を掛けたら0になるからな。 C言語は one = 1 , 2 , 3 , 4 , 5 , 6 , two = 7 , 8 , 9; と言う書き方も可能なのだ。 カンマで区切られた式は、それぞれが評価され、副作用があれば、その副作用が実行されるし、代入先がなければ評価だけ行って捨てられるのだ。

libereso
質問者

お礼

2つに渡ってとても詳しい回答をくださり本当にありがとうございます。他に回答が付いてからここまで詳しく解説していただけると思わなかったので驚いています。自分が書いた誤った式で何が起こっていたのか良く分かりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

使っている処理系によっては, 警告レベルを最大にすれば何か出るかもね.

libereso
質問者

お礼

サイトで配布されている「学習用C言語開発環境」を使っていますが、特にそういった設定はないようです。他の環境を使う場合には意識してみます。

  • hashioogi
  • ベストアンサー率25% (102/404)
回答No.3

one = price*0,9; の「,」を「.」に変更する。 その他3か所も同様。 なぜ「,」で翻訳エラーが発生しないのか? また一つ勉強の種ができましたね。

libereso
質問者

お礼

回答の通りに直して無事動きました!焦って入力したせいで間違えてしまったみたいです。こんなミスをしていて本当に恥ずかしいです。何でこんなミスをしているのにエラーが発生せず動くのか、まだ勉強不足なので不思議に感じます。回答頂けなかったら気づけませんでした。本当にありがとうございます。

  • ok-kaneto
  • ベストアンサー率39% (1798/4531)
回答No.2

>one = price*0,9; oneが整数型なので、price*0.9を計算した結果を代入したときに小数点以下を切り捨てます。 小数を保持するためには変数を実数型にしましょう。

libereso
質問者

お礼

答えの単位が円で整数なので、迷ってしまいました。このまま実行すると正確でない値が出てしまったので、修正してみます。ありがとうございます。

関連するQ&A

  • c++

    最近c++をはじめたのですが Borland C++を使用しているのですが 定価を入力したら一割引き三割引き五割引きが表示されるようにしようと以下のように入力したのですが、 1000 と入力したら  900 699 500 と表示されました。なぜ699になるのかわかりません。だれか教えてください。お願いします。 #include<stdio.h> #include<conio.h> void main() { int price; printf("定価を入力して下さい:",price); scanf("%d",&price); printf("一割引きは%d円\n",(int)(price*0.9)); printf("三割引きは%d円\n",(int)(price*0.7)); printf("五割引きは%d円\n",(int)(price*0.5)); getch(); }

  • 教えてください。C言語初心者です。

    #include <stdio.h> int main() { int sentaku,hakoA=0,hakoB,*kiroku[10]; char *name[10]; while (sentaku !=3){ printf("1:新規登録\n"); printf("2:データ確認\n"); printf("3:終了\n"); scanf("%d",&sentaku); switch (sentaku){ case 1: printf("登録する名前を入力してください。---"); scanf("%s",name[hakoA]); printf("記録を入力してください。---"); scanf("%d",&kiroku[hakoA]); printf("登録番号は%d番です。\n",hakoA); hakoA++; printf("登録を終了します。\n"); continue; case 2: if (hakoA==0){ printf("登録されてません\n"); continue; }else{ printf("登録番号を入力して下さい。---"); scanf("%d",&hakoB); printf("%s君で記録は%dです。\n",name[hakoB],kiroku[hakoB]); continue; } case 3: break; default : printf("1~3でお願いします。\n"); continue; } } return 0; } このプログラムはコンパイルされたのですが、実行で入力してるとエラーになってしまうのです。 まだ勉強始めたばかりでちょっとなぜか解らないのです。どこかおかしいところがありましたらご教授いただけると嬉しいです。おねがいします。

  • 私はC言語を習い始めて5日の初心者です。

    私はC言語を習い始めて5日の初心者です。 下記のプログラムが動かないので優しく教えてください。 どうかお願いします。 #include <stdio.h> int main() { int ans1,ans; int total printf("コンビニ行くときは(1:車で 2:自転車で 3:歩いて)行く\n"); scanf("%d",&ans1); printf("1:汗かいた記憶がない 2:たまに汗かく 3:よく汗をかく\n"); scanf("%d",&ans2); total=ans1+ans2; if (total<4) { printf("運動不足です\n"); }else { printf("良く運動していますね\n"); } return(0); }

  • 消費税計算

    #include <stdio.h> int main (void) { int price_komi, tax; printf("税込価格を入力してください:"); scanf("%d", &price_komi); tax = (double)(price_komi * 0.05); printf("消費税は%d円です。\n", tax); printf("税抜き価格は%dです。\n",price_komi - tax); return(0); } このプログラムでは消費税計算がうまくできません。型の使い方がよくないと思うのですがわかりません。おねがいします。

  • C言語の初心者です。

    ポインタについて教えてください。 #include <stdio.h> int main() { int *p,a[2],i=0; p=a; scanf("%d",p); printf("%d\n",*p); i++; scanf("%d",p+i); printf("%d\n",*(p+i)); return 0; } これは整数を入力して出力といった簡単なプログラムなのですが、こういうポインタの使いかたって普通はしないでしょうか・・?。ポインタは使わずにこういう場合は2次元配列とかで出すのが普通なのでしょうか? また、下のプログラムなのですが、上記のプログラムをただ単にキャラ型で試しただけなのですが、どうして実行時エラーがおこってしまうのでしょうか? printfのところの*nameの、*を抜くと実行時エラーはおこりません。しかし、上記の整数では*はつけたままでも エラーしません。 整数とキャラ型では何かちがうのでしょうか?? #include <stdio.h> int main() { char *name,a[10]; name=a; printf("入力---"); gets(name); printf("%s\n",*name); return 0; } 初心者特有の質問をしてしまって申しわけございません。でも、ずっと悩んでて、すこしずつでもポインタの本当の使いかたを知りたいとおもいまして、初期段階ではありますがどうしても解らなかったので質問させていただきました。 そういうものだから!以外でご説明いただける方がいらっしゃいましたら宜しくお願いいたします。

  • C言語について。初心者です。

    参考書の問題で、「整数値以下である正の偶数を照準に表示するプログラムを作成せよ」 例)整数を入力してください:19   2 4 6 8 10 12 14 16 18 とあり、自分で以下のプログラムを作ってみたのですが「222222・・・・・・・・・・・・・・・・・・」となるだけです。どう変えればちゃんと表示されるようになりますか?ちなみにwhile文を使うのが条件です。 #include<stdio.h> int main(void) {       int na; int nb=0; printf("整数を入力してください。:"); scanf("%d",&na); while(nb<na) printf("%d",nb+2); putchar('\n'); return 0; }

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • C言語でscanf()が先に実行されるのはなぜですか?

    C言語でscanf()が先に実行されるのはなぜですか? #include <stdio.h> int main(void){ int intNum; printf("整数を入力してください:\n"); scanf("%d", &intNum); printf("入力値は:%d\n",intNum); return(0); }

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • C言語

    文を繰り返すときに、『続けますか(Y=続行。N=終了)』と表示して、Yが入力されたら文を繰り返すようにしたいのですが、わからないので教えてください。 #include<stdio.h> int main(void) { int m,s,r,num; char moji; num=1; do{ printf("距離を入力してください。\n"); scanf("%d",&m); printf("平均速度を入力してください。\n"); scanf("%d",&s); r=m/s; printf("所要時間は%dです。\n",r); printf("続けますか?(Y=続行。N=終了)\n");/*このあたりがどうすればいいのかわかりません*/ moji=getchar(); }while(num) printf("終了します。\n"); return 0; }

専門家に質問してみよう