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

締切り済みの質問

Cのプログラミングを勉強中です。

Cのプログラミングを勉強中です。
Aの値のBに対する割合を表示すしたいのですが、以下のように記述してもうまくいきません。
どこを直したらよいか教えていただけますか。

#include <stdio.h>

int main(void)
{
int n1 , n2 ;

printf("二つの整数を入力してください。\n");
printf("整数A:"); scanf("%d", &n1);
printf("整数B:"); scanf("%d", &n2);


printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 );

return(0);
}

投稿日時 - 2010-05-04 08:56:58

QNo.5870097

すぐに回答ほしいです

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

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

回答(5)

ANo.5

> それなのに整数以外の値を指定しなければ実行できないとすれば、ちょっと不親切な設問ですね。
 既に回答が付いているので、ここだけ反応。

 一概に「不親切」とは言えません。
・他の方も書かれているように、変数の方に整数のみを使っても、計算の優先順位を考慮すれば、実現できる
・「計算の優先順位を考慮しないと、思わぬ誤差が生じる」事を講義受講者や本の読み手に体験させ、実感させるためにこの様な課題を出す事は良くある
からです。因みに、
printf("Aの値はBの%f%%です。\n" , 100.0 * n1 / n2 );
等とすれば、変数の方は整数しか使わなくとも、出力時の型指定で、小数点以下も出力できます。

投稿日時 - 2010-05-04 14:43:36

ANo.4

> printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 );

演算の優先順位、整数の割り算の結果とかちゃんと理解してたら、自明なところ。
有効単位の関係での誤差をなくすための掛け算を先にするのは現実の計算問題でも一般的なことです。

printf("Aの値はBの%d%です。\n" , (n1 * 100) / n2 );

投稿日時 - 2010-05-04 10:26:40

ANo.3

私も初心者ですが、デバッグにはprint文を入れてチェックします。やってみて下さい。頭に来たときは、別のコンパイラを使ったりしますが、成功したことはありません。計算式をprint文から出してみるとか、記述もデバッグし易いよう工夫してください。

投稿日時 - 2010-05-04 09:33:10

ANo.2

現状:
printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 );

改善策
printf("Aの値はBの%d%%です。\n" , (int)((double)n1 / (double)n2 * 100.0));

n1/n2をintで計算されているため、割り算の商が0になるということだと思います。
例えば、n1 = 1, n2 = 100だと、n1 / n2 = 0となるのであとで*100しても0です。
そこで、結果を表示する直前までdouble型で計算させることでこれを回避します。

投稿日時 - 2010-05-04 09:04:56

お礼

ありがとうございます。
基本的な考え方は理解しました。

実はこれ、柴田望洋著『明快C言語』の20ページにある演習問題なのですが、この時点では整数しか扱っていません。
それなのに整数以外の値を指定しなければ実行できないとすれば、ちょっと不親切な設問ですね。

投稿日時 - 2010-05-04 09:56:05

ANo.1

基本的に、整数を入力して整数同士で計算した結果は、整数ですよ?


> printf("Aの値はBの%d%%です。\n" , n1 / n2 * 100 );
→printf("Aの値はBの%.2f%%です。\n" , (float)n1 / n2 * 100 );

にして、内部的に実数で計算しましょう。

投稿日時 - 2010-05-04 09:03:40

お礼

ありがとうございます。
基本的な考え方は理解しました。

実はこれ、柴田望洋著『明快C言語』の20ページにある演習問題なのですが、この時点では整数しか扱っていません。
それなのに整数以外の値を指定しなければ実行できないとすれば、ちょっと不親切な設問ですね。

投稿日時 - 2010-05-04 09:56:49

あなたにオススメの質問