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

a/bの値を少数を使った表現で画面に書き出すプログラムを作成するんですが、
#include <stdio.h>
int main(void)
{int a,b;
double n;
scanf("%d", &a);
scanf("%d", &b);
n=a/b;
printf("%d ",n);
return 0;}
で実行しても、a、bに何を入れても0になっていしまいます。どこが違っているでしょうか?

A 回答 (9件)

問題点。


(1)n=a/b;は整数で演算して小数部を捨ててしまうのでdoubleにcastしてから演算する必要があります。
(2)printf("%d",n");の%dは整数(int)用の書式です。doubleを表示するためには%lfを使いましょう。書式が違うとちゃんと表示されません。
    • good
    • 0
この回答へのお礼

%lfと%dの知識が1つ分かりました。 ありがとうございます。

お礼日時:2007/09/22 22:47

#include <stdio.h>



int main(void)
{
int a = 5 / 3;
double b = 5.0 / 3.0;
printf("%d\n", a);
printf("%f\n", b);
}
====
これをコンパイル・リンクして実行すると、
1
1.666667
あたりが出力されると思います。%f のデフォルトの有効桁が 6 なのでこのようになります。たとえば、printf("%.15f\n", b) などと有効桁を 15 にすると、1.666666666666667 と長くなりますが、あまり長くしても、所詮、有限ビットで計算しているので、正確な数値になるとは限りません。

整数型(int など)の変数で割り算をすると、小数点以下が切り捨てられます。浮動小数点型(doubule など)の変数で割り算をすると、小数点以下の切捨ては行われません。ただし、C言語の double などは、ビット数が固定なので、無限小数は扱えません(たぶん、お使いの電卓でもそうだと思います。有理数の計算ができる電卓なんかは別でしょうけど)。

あと、表示の際に指示されている有効桁で表示するため値が丸められる(四捨五入)のと、計算の際にビット数の不足から値が丸められることがあるということを認識しておくといいと思います。

以下のURLなどに、浮動小数点型の説明があるので、興味があれば、ご覧になるとよろしいかと思います。
http://www.cc.kyoto-su.ac.jp/~yamada/programming …
    • good
    • 0
この回答へのお礼

ありがとうございました。 これからも頑張ります。

お礼日時:2007/09/22 22:49

すでに回答されていますが、整数同士の割り算は切り捨てがおこりますし、


printf() の %d で double を出力しようとされているからでしょうね^^

=====
#include <stdio.h>
int main(void)
{
int a, b, rv = 0;
if (scanf("%d%d", &a, &b) != 2) {
rv = 1;
} else if (b == 0) {
fprintf(stderr, "zero divided\n");
rv = 2;
} else {
printf("%g\n", (double)a / b);
}
return rv;
}

この回答への補足

5÷3を計算したら1.66667 と出ましたが、これも切り捨てられていることになるんでしょうか? 電卓では1.6666・・・の6が無数に並ぶんですが。 実行結果の7は四捨五入した値ですか?

補足日時:2007/08/22 20:35
    • good
    • 0

★回答ではなく返信(補足要求)


>秀和システムの「C言語のe本」を買いました。
 ↑
 どうですか?
 イラストが多いようですけど変数の『宣言』『for文』とかの解説は分かりやすかったですか?
>初心者からすると、キャストはかなり進んだ内容ですか?
 ↑
 変数の宣言、型のサイズと役割が理解できていれば『初心者』でもすんなりと分かると思います。
 私が最初に買った本では第1~18章まであり、キャスト演算は第5章、第8章で登場します。
 そこには今回の質問とほぼ同じ内容で
>int a=5, b=2;
>double f;

>f = a/b;      …fは2になる
>f = (double)a/b; …fは2.5になる
 という説明が載っています。
 他にも文章での説明がありますが省略します。
・この本では第5章、第8章の前に
 (1)用語と知識
 (2)定数
 (3)データ型
 (4)配列と文字列
★(5)型変換 ←初登場!キャスト演算
 (6)記憶クラス
 (7)初期化
★(8)演算子 ←2度目のキャスト演算
 (9)制御文
 (10)ポインタ
 (11)関数
 (12)構造体
 (13)ビットフィールド
 (14)共用体
 (15)プロプロセッサ
 (16)コンソール入出力
 (17)入出力以外の標準関数
 (18)ファイル処理関数
 と続きます。
・つまり『キャスト』演算はかなり最初に登場する基本です。
>初心者からすると、キャストはかなり進んだ内容ですか?
 ↑
 私の持っている本では制御文(for,while,if,else)よりも最初に登場します。
 だから初心者が最初に理解しておくべき内容だと思います。
 決して進んだ内容ではないでしょう。
・逆にキャスト演算よりも制御文(for,while,if,else)の方が進んだ内容だと思います。
 やはり基本のデータ型と型変換(キャスト)は先に理解しておきたい内容ですね。

最後に:
・買った本(C言語のe本)でもキャストはかなり最初に登場しませんか?
 もしも最初のページに書かれているのなら初心者さんが最初に学ぶべき事柄となります。
 どんな感じで解説されているかは分かりませんがデータ型と型変換はしっかりと
 理解しておきたい項目です。それでは頑張って下さい。
・以上。→ちなみに『キャスト』は理解できましたか?
    • good
    • 0
この回答へのお礼

ありがとうございました。 とりあえずこの本をマスターすることを目標に頑張ります。次の質問をするので締め切らせていただきます。

お礼日時:2007/09/22 22:43

★キャストすれば。

もう回答があるが…。
>n=a/b;
 ↑
 ここを『n=(double)a/b;』にします。
>実行しても、a、bに何を入れても0になっていしまいます。どこが違っているでしょうか?
 ↑
 a=1、b=1 なら n=1 になりませんか?
 または a=12345、b=1 なら n=12345 になると思いますが…。
 多分は分母の b の数が a よりも大きいのでしょうね。
 小数の表現となっているので。
 ※上記のことは既に回答者 No.1 さん~No.4 さんの回答通りです。

★もう一つの方法
>1以上の自然数を2つ(それぞれa,b)読み込み、
 ↑
 という事なので a、b も int 型ではなくて double 型で宣言してみるのはどうですか。
 つまりは
 int main( void )
 {
  double a, b, n;
  
  // 小数を入力しないと条件をつける
  printf( "必ず整数を入力して下さい:" );
  scanf( "%lf %lf", &a, &b );
  // 計算
  n = a / b;
  // 表示
  printf( "a/b = %f\n", n );
  return 0;
 }
 とこんな感じでも出来そうです。
 もし int 型の整数で入力することを前提としているのなら、やっぱキャスト演算して下さい。
・キャストに関しては
 http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4 …
 を読んでみて下さい。
・あと C 言語の本は用意しましたか?
 しっかりとした本を一冊用意した方が良いですよ。
・以上。

この回答への補足

秀和システムの「C言語のe本」を買いました。初心者からすると、キャストはかなり進んだ内容ですか?

補足日時:2007/08/20 20:10
    • good
    • 0

最近何度か指摘していますが、printf系関数におけるdouble型の書式は %lf ではなく %f です。


%lf を使えるのはC99だけです。

http://seclan.dll.jp/c99d/c99d08.htm#dt19991115
http://www.kijineko.co.jp/tech/superstitions/pri …
    • good
    • 0
この回答へのお礼

参考になりました。 このページを何度も確認したいと思います。ありがとうございました。

お礼日時:2007/09/22 22:48

> a、bに何を入れても0になっていしまいます。



そんなはずはありません。
a > b となるような数値、例えば2と1を入力してみてください。

小数を表示させたいなら、

n = (double)a/b;
printf("%f", n);

とします。
    • good
    • 0

printfについて勉強してください。


分かってないようですので、自分で見つけた方が身に付くと思います。
頑張ってください。

あと、少数でなく小数ですね。
    • good
    • 0
この回答へのお礼

いい教科書を見つけて頑張ります。

お礼日時:2007/09/22 22:45

0になるのは



printf("%d",n);

の%dが問題ですね。%lfでしょうか。

ついでに、n=(double)a/(double)b; とかにしたほうがよろしかろうとおもいます。
    • good
    • 0
この回答へのお礼

すみませんでした。早とちりをしないように注意します。

お礼日時:2007/09/22 22:44

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