超初歩的な質問です。おしえてください!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あす

超初歩的な質問です。おしえてください!

#1

投稿記事 by あす » 14年前

定価を入力すると、1割引、3割引、5割引、8割引の値段を、一覧表示するプログラムを作成せよ。
という書取問題についてなんですが、解答を見ると↓のようになってました。

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

そこで分からない事があったので教えてください。計算部分の(int)(price*0.9)の(int)は何故、必要なんですか?これを付け足さないとエラーになるので何となくつけてるだけです。明確な理由を知りたいです。
かなり低レベルな質問ですが、どなたか宜しければ教えてください。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 超初歩的な質問です。おしえてください!

#2

投稿記事 by softya(ソフト屋) » 14年前

printfの%dと言う書式はint型の値しか正しく表示できません。
それに対して(price * 0.9)は、priceはint型ですが0.9は浮動小数点のdouble型なので暗黙の型変換で計算結果はdouble型になります。
つまり表示する型と計算結果の型が食い違うのです。
そこで(int)でキャストしてint型に変換する必要が出てくるのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 超初歩的な質問です。おしえてください!

#3

投稿記事 by bitter_fox » 14年前

%dは、printf等においては、整数を表示する事を示すものです。

(price * 0.9) この文は、整数でしょうか??
残念ながら違います、0.9という実数(少数)をかけているのでこの文は、実数になり、printfは整数が欲しいので
(int)(price * 0.9) といったように整数にしてあげます。

(型)(何らかの値)
このように書いて、「「なんらか値」を指定した型の範囲に丸め込むこと」を、型キャストといい、非常に重要なテクニック(すべてが重要ですが)なので、ぜひマスターしてください。
またこのときに、「何らかの値」の一部が、指定した型の範囲外にある場合、その一部は、無理矢理切り捨てられてしまいます。


ちなみに型キャストを使わずに同様の出力を得たい場合は以下のようにすると可能です。
printf("%.0f", price*0.9);

いろいろ、しっかりと解るまで実験してみてください。

あす

Re: 超初歩的な質問です。おしえてください!

#4

投稿記事 by あす » 14年前

(price * 0.9)は実数だったんですね・・!気付けない自分が恥ずかしいです;
お二人ともありがとうございました。精進します

アバター
Ultimate
記事: 38
登録日時: 14年前
住所: 埼玉県
連絡を取る:

Re: 超初歩的な質問です。おしえてください!

#5

投稿記事 by Ultimate » 14年前

price * 0.9となっているとき、0.9のほうが整数でないため、計算した結果はこちらが優先されて少数の型の数値が返されます。
つまりこのままでは%fなどで表示する型です。
%dは10進数の整数を表示するためのものです。
つまり、%dで表示させるためにはこの計算結果を整数に型変換しなくてはなりません。
なので(int)を使用しています。
これは型キャストというものです。

●型キャストの使い方
(変換後の型)変換したい数値
です。

>(price * 0.9)は実数だったんですね・・!
ここに登場した数値はすべて実数です。しかし、price * 0.9は整数ではありません。
ここで(int)を抜くと、10進数の整数を示すもので10進数の少数型を受けてしまい正しく表示されないということです。

一応ここらへんで勉強しておいたほうがいいと思います。
苦しんで覚えるC言語 数値の種類
苦しんで覚えるC言語 変数の種類
苦しんで覚えるC言語 型の変換


閉鎖

“C言語何でも質問掲示板” へ戻る