みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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;
}

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

投稿日時 - 2014-02-27 14:21:55

QNo.8492516

困ってます

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

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

0,9 じゃなくて、0.9

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

投稿日時 - 2014-02-27 14:37:35

補足

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

投稿日時 - 2014-02-27 15:44:18

お礼

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

投稿日時 - 2014-02-27 15:13:56

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

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

カンマ演算子は、例えば

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

みたいに使う。

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

one = price * 9,0;

もエラーにならないのだ。

投稿日時 - 2014-02-27 15:37:14

ANo.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;

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

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

投稿日時 - 2014-02-27 15:30:25

お礼

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

投稿日時 - 2014-02-27 15:57:19

ANo.4

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

投稿日時 - 2014-02-27 14:58:23

お礼

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

投稿日時 - 2014-02-27 15:24:17

ANo.3

one = price*0,9;
の「,」を「.」に変更する。
その他3か所も同様。

なぜ「,」で翻訳エラーが発生しないのか? また一つ勉強の種ができましたね。

投稿日時 - 2014-02-27 14:40:15

お礼

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

投稿日時 - 2014-02-27 15:12:05

ANo.2

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

投稿日時 - 2014-02-27 14:39:38

お礼

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

投稿日時 - 2014-02-27 15:29:42