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

解決済みの質問

教えてください

case4をキャストしたいのですが、どこにdoubleをつければよいのですか?josan(na/nb)の前においたのですがうまく表示されませんでした。教えてください。


#include <stdio.h>

int kasan(int a, int b)
{
return(a+b);
}
int gensan(int a, int b)
{
return(a-b);
}
int jousan(int a, int b)
{
return(a*b);
}
int josan(int a, int b)
{
return(a/b);
}

int main(void)
{
int na, nb, nc;
puts("二つの整数を入力してください");
printf("整数A"); scanf("%d", &na);
printf("整数b"); scanf("%d", &nb);

printf("1:加算\n2:減算\n3:乗算\n4除算\n");
printf("1から4までのどれかを入力してください");
scanf("%d", &nc);

switch(nc){
case 1: printf("%d+%dは、%dです。\n", na, nb, kasan(na,nb)); break;
case 2: printf("%d-%dは、%dです。\n", na, nb, gensan(na,nb)); break;
case 3: printf("%d*%dは、%dです。\n", na, nb, jousan(na,nb)); break;
case 4: printf("%d/%dは、%fです。\n", na, nb, josan(na,nb)); break;
default: printf("番号が違います。\n"); break;
}
return(0);
}

投稿日時 - 2005-09-11 15:39:58

QNo.1642204

すぐに回答ほしいです

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

まずご質問の趣旨を確認させてください。
たとえば整数Aに10、整数bに3を入力して、4(除算)のときに、

10/3は、3.3333333です。

のように表示させたい。しかし

case 4: printf("%d/%dは、%fです。\n", na, nb, (double)josan(na,nb)); break;

としても

10/3は、3.00000000です。

のように小数点以下が切り捨てられてしまう。

ということでよろしいでしょうか? そうだとして回答します。

int josan(int a, int b)
{
return(a/b);
}



double josan(int a, int b)
{
return((double)a/b);
}

とすればいいとおもいます。case 4: の行はもとのままです。

ポイントは二つ、
(1)josan() の戻り値を、整数型 int ではなく浮動小数点型 double とする。
 でないと、下記(2)で、中身(除算結果)が double になったとしても、戻るときに整数化(たぶん)されてしまいます。

(2)整数型同士の加減乗除は整数型になる。一方でも浮動小数点型なら浮動小数点型になる。
 そこで return のところで a をキャストするわけです。
( return((double)a/(double)b); return(a/(double)b); でも結果は同じはず)

投稿日時 - 2005-09-11 18:04:21

ANo.1

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

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

回答(1)