1

Cで一定の速度で入力された距離を移動するのにかかる時間を見つけようとしています.コードは機能しますが、出力は0として出力されますか? 何がうまくいかないのですか?

#include <stdio.h>
#include <stdlib.h>
int main() {
    int distance, speed = 80;
    float time;

    // This is how to read an int value
    printf("Please enter a distance in kilometers to be covered at 80KPH. \n");
    scanf("%d", & distance);
    printf("You typed: %d\n", distance);
    printf("\n");
    time = distance / speed;
    printf("It will take you %.2f to cover ", time);
}
4

3 に答える 3

8

2 つのオペランドが整数であるため、コンパイラは整数除算のコードを生成します。しかし、あなたは本当の分裂を望んでいます。したがって、1 つ以上のオペランドを浮動小数点型にキャストすると、コンパイラは実際の除算のコードを出力します。

time = (float) distance / time;

整数の割り算は、小学校で習ったものです。たとえば、11/3 は 3 余り 2 です。C では、式 11/3 は 3 に評価されます。これは整数除算です。あなたの場合、分子(距離)が分母(時間)よりも小さいように見えるので、式

distance / time

0 に評価されます。

これは、除算演算子のオーバーロードによって引き起こされる一般的な混乱です。この演算子は、両方のオペランドが整数の場合は整数の除算を意味し、そうでない場合は実数の除算を意味します。

学ぶべき重要な点は、整数除算と実数除算のどちらが使用されるかを決定するのはオペランドの型であるということです。結果が格納される変数の型は、この選択に影響しません。

于 2013-10-27T21:28:34.140 に答える
3

変化する

time = distance / speed;

time = (float) distance / speed;

浮動小数点除算ではなく整数除算を行っていました。

于 2013-10-27T21:26:42.977 に答える
0

他の人が言ったことに従ってコードを変更したら(最初にfloatまたはdoubleにキャスト)、浮動小数点数(floatまたはdouble)を表示するために、フォーマット指定子を「%d」から「%f」に変更する必要もあります)、そうしないと、出力にゴミが表示されます。

編集:これを混同して申し訳ありません。速度と距離を int ではなく float として定義する修正を考えていました。その場合、単に "int" を "float" に、"%d" を "%f" に変換できます (おそらく、精度や丸めフラグを使用して)。ただし、これによりプログラムの動作が変更されるため (ユーザーが整数以外の値を入力できるようになったため)、希望どおりにならない可能性があります。

于 2013-10-27T21:34:28.577 に答える