dポイントプレゼントキャンペーン実施中!

「苦しんで覚える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;
}

これより前の内容を復習したり、調べたりもしたのですが、自分ではどこに間違いがあるのか見つけられませんでした。非常に初歩的な内容で恐縮ですが、助言をお願いします。

A 回答 (6件)

one = price*0,9;


three = price*0,7;
five = price*0,5;
eight = price*0,2;

0,9 じゃなくて、0.9

「 , 」カンマと「 . 」ピリオドじゃ全然違うからね。

この回答への補足

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

補足日時:2014/02/27 15:44
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 15:13

因みに、式の中の「カンマ」を「カンマ演算子」って呼ぶ。



カンマ演算子は、例えば

int i,j,k;
for (i = 0 , j = 10 , k = 100;i < 10;i++ , j--, k += 10) {
何かの処理
}

みたいに使う。

こういう書き方を許しているので

one = price * 9,0;

もエラーにならないのだ。
    • good
    • 0

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;

と言う書き方も可能なのだ。

カンマで区切られた式は、それぞれが評価され、副作用があれば、その副作用が実行されるし、代入先がなければ評価だけ行って捨てられるのだ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 15:57

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 15:24

one = price*0,9;


の「,」を「.」に変更する。
その他3か所も同様。

なぜ「,」で翻訳エラーが発生しないのか? また一つ勉強の種ができましたね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 15:12

>one = price*0,9;


oneが整数型なので、price*0.9を計算した結果を代入したときに小数点以下を切り捨てます。
小数を保持するためには変数を実数型にしましょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/02/27 15:29

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