Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа выводит не правильный ответ, Вывод не правильный 
V
    Опции темы
BEST13
Дата 12.4.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Есть программа:
Код

#include <stdio.h> 
#include <Math.h>
#include <conio.h>
int main (void)
 {
     int A,x;
     float Y;
     printf("\n Enter A,x ");
     scanf(" %d %d", &A, &x);
     printf("\n A= %d,x= %d ", A, x);
     Y=1623;
     if ((x > -1) && (A < 15)) 
         Y=A/(x+1); 
     else 
         if ((x < -2) && (A > 3)) 
             Y=A*x;
         else Y=2*x;
    printf("\n Y= %2.6f",Y);
    _getch();
    return 0;
}


вся проблема в том что при проверки первого варианта( if ((x > -1) && (A < 15))  Y=A/(x+1); ) всегда выводит значения У = 0,0000
Во всех остальных все правильно... не могу понять в чем дело..
PM MAIL ICQ GTalk   Вверх
leniviy
Дата 12.4.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



потому что целые? Попробуйте  Y=A/(x+1.0); 
PM MAIL   Вверх
миг
Дата 12.4.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



или попробуй написать Y=((float)A)/((float)(x+1)); 
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Modul
Дата 12.4.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Цитата

или попробуй написать Y=((float)A)/((float)(x+1)); 


Достаточно приводить к float только в знаменателе.
--------------------
I'll be back !
PM MAIL   Вверх
BEST13
Дата 12.4.2011, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Оба способа действуют, спасибо.
Только не могу понять как первый переводит в float, и почему надо только знаменатель приводить? разве при делании так не получается float?
PM MAIL ICQ GTalk   Вверх
leniviy
Дата 12.4.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Цитата(BEST13 @  12.4.2011,  19:04 Найти цитируемый пост)
Только не могу понять как первый переводит в float почему надо только знаменатель приводить?

1.0 - это double; int + double = double; int / double = double
Это "неявное" преобразова
Цитата(BEST13 @  12.4.2011,  19:04 Найти цитируемый пост)
разве при делании так не получается float? 

это в Паскале. А тут нет разделения на / и div. int / int = int


PM MAIL   Вверх
BEST13
Дата 12.4.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Цитата(leniviy @  12.4.2011,  19:55 Найти цитируемый пост)
1.0 - это double; int + double = double; int / double = doubleЭто "неявное" преобразова

 Ну, так у меня же переменная float они хоть похожи с double но ведь разные типы.
PM MAIL ICQ GTalk   Вверх
leniviy
Дата 12.4.2011, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Он сначала делит два инта, получает int, и уже потом преобразует во float. Вы, вероятно, ожидали, что раз результат деления присваивается переменной типа float, то само деление тоже будет float. Нет, не будет.

Добавлено @ 20:38
Кстааа....
Код

float Y;
...
printf("\n Y= %2.6f",Y);

Так вообще нельзя делать. printf ожидает на входе тип double, а тут float. 
оказывается, можно

Это сообщение отредактировал(а) leniviy - 12.4.2011, 21:05
PM MAIL   Вверх
BEST13
Дата 12.4.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Цитата

Он сначала делит два инта, получает int, и уже потом преобразует во float. Вы, вероятно, ожидали, что раз результат деления присваивается переменной типа float, то само деление тоже будет float. Нет, не будет.

ага , понял спс


Цитата(leniviy @  12.4.2011,  20:29 Найти цитируемый пост)
Кстааа....код C++1:2:3:float Y;...printf("\n Y= %2.6f",Y);highlightSyntax('cpp_AxNzM','cpp');Так вообще нельзя делать. printf ожидает на входе тип double, а тут float. оказывается, можно

так вроде модификатор %f для  float, а для double - %lf 

Это сообщение отредактировал(а) BEST13 - 12.4.2011, 22:30
PM MAIL ICQ GTalk   Вверх
leniviy
Дата 13.4.2011, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: нет
Всего: 5



Цитата(BEST13 @  12.4.2011,  22:29 Найти цитируемый пост)
так вроде модификатор %f для  float, а для double - %lf 

http://c-faq.com/varargs/promos.html
Цитата

Q: How can %f be used for both float and double arguments in printf? Aren't they different types?

A: In the variable-length part of a variable-length argument list, the ``default argument promotions'' apply: types char and short int are promoted to int, and float is promoted to double. (These are the same promotions that apply to function calls without a prototype in scope, also known as ``old style'' function calls; see question 11.3.) Therefore, printf's %f format always sees a double. (Similarly, %c always sees an int, as does %hd.) See also questions 12.9 and 12.13. 


PM MAIL   Вверх
BEST13
Дата 16.4.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 11.4.2008
Где: Ukraine

Репутация: нет
Всего: нет



Цитата(leniviy @  13.4.2011,  10:48 Найти цитируемый пост)
Цитата(BEST13 @  12.4.2011,  22:29 )
так вроде модификатор %f для  float, а для double - %lf 

http://c-faq.com/varargs/promos.html
Цитата

Q: How can %f be used for both float and double arguments in printf? Aren't they different types?

A: In the variable-length part of a variable-length argument list, the ``default argument promotions'' apply: types char and short int are promoted to int, and float is promoted to double. (These are the same promotions that apply to function calls without a prototype in scope, also known as ``old style'' function calls; see question 11.3.) Therefore, printf's %f format always sees a double. (Similarly, %c always sees an int, as does %hd.) See also questions 12.9 and 12.13. 


Ага, спасибо понятно!
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.