2017-02-12 19 views
-2

Мой вывод должен быть:C «Поплавок» генерации случайных ответов

ch = * 
f = 200 
ch =/
f = 0.50 

Но по какой-то причине «/» дело случайное число каждый раз, когда я запускаю программу. 1639747584, а в следующий раз я получу 206200832, почему это? Это также единственная часть программы, где я использую «float» вместо «int».

Мой код:

#include <stdio.h> 
#include <float.h> 

void main() { 
    char ch; 
    int f; 
    int a = 10, b = 20; 

    ch = '*'; 
    printf("ch = %c\n", ch); 
    switch (ch) { 
     case '*': f = a * b; printf("f = %d\n", f); 
     break; 
     case '/': f = a/b; printf("f = %d\n", f); 
     default: printf("invalid operator\n"); 
    } 
    ch = '/'; 
    printf("ch = %c\n", ch); 
    (float) f; 
    switch (ch) { 
     case '*': f = a * b; printf("f = %d\n", f); 
     case '/': f = a/b; printf("f = %d\n", f); 
     break; 
     default: printf("invalid operator\n"); 
    } 
} 

Хорошо, я заменил «(с плавающей точкой) F» строку с новой переменной, изменил команду печати, и литая (а/б) «поплавка», но теперь В результате я получаю 0.00. Что еще не так?

Обновленный код:

ch = '/'; 
    printf("ch = %c\n", ch); 
    float g; 
    switch (ch) { 
     case '*': f = a * b; printf("f = %d\n", f); 
     case '/': g = (float)(a/b); printf("f = %.2f\n", g); 
     break; 
     default: printf("invalid operator\n"); 
    } 
+0

Итак, вы ожидаете, что 'int f' будет' 0,5'? –

+1

Что вы пытаетесь сделать с '(float) f;'? –

+0

Вы не можете изменить тип 'f' после его определения. Вы можете захотеть объявить другую переменную числа с плавающей запятой для '/', а также отбросить ваш 'a/b' до float перед делением, так как' 1/2 = 0' в 'C' также изменить вывод на' printf ("f =% f \ n", float_f) '. –

ответ

0
int a = 10, b = 20; 
float g = (float)(a/b); // problem code 

Выполняет целочисленное деление a/b. Результатом является int. Выделение этого коэффициента в (float) не восстанавливает фракцию, отбрасываемую как часть целочисленного деления. Зафиксируйте аргументы с плавающей запятой перед делением.

float g = (float) a/b; 
// or better 
// in general, better to avoid casts to accomplish coding goals. 
float g = 1.0 * a/b; 
// or 
float g = a; 
g /= b; 

(float) f; 

Эта строка кода не имеет никакого эффекта. Он отлит от int переменной f до значения float. Результат этого отбрасывания отбрасывается, и строка кода, вероятно, оптимизирована, в результате чего нет испускаемого исполняемого кода.


Для сохранения различных типов данных в одном объекте, используйте union и отслеживать поле, которое последний используется для сохранения данных в нем.

struct universal { 
    char kind; 
    union { 
    int i; 
    float f; 
    } u; 
} y; 

switch (ch) { 
    case '*': 
    y.kind = 'i'; 
    y.u.i = a * b; 
    break; 
    case '/': 
    y.kind = 'f'; 
    y.u.f = (float) a/b; 
    break; 
    default: 
    y.kind = 0; 
} 

switch (y.kind) { 
    case 'f' : printf("y = %f\n", y.u.f); break; //or "%.2f" for only 2 places to right of . 
    case 'i' : printf("y = %d\n", y.u.d); break; 
    default : printf("y = ?\n" 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^