Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
#1

Неявное преобразование переменных - C++

24.01.2011, 18:33. Просмотров 891. Ответов 4
Метки нет (Все метки)

Добрый вечер!
Хочу попросить помощи в разъяснении следующей ситуации:
есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
 
using namespace std;
 
int main()
{
    int userCh;
    float tempCel, tempFahr;
    cout << "If you want convert temperature in Celsius to temperature in Fahrenheit push 1,\n";
    cout << "if you want convert temperature in Fahrenheit to temperature in Celsius push 2: ";
    cin >> userCh;
    switch(userCh)
    {
        case 1:
            cout << "Insert temperature in Celsius: ";
            cin >> tempCel;
            tempFahr = 9.0 /5.0 *tempCel +32.0;
            cout << "Temperature in Fahrenheit is: " << tempFahr << endl;
            break;
       case 2:
            cout << "Insert temperature in Fahrenheit: ";
            cin >> tempFahr;
            tempCel = (tempFahr -32.0) *5.0 /9.0;
            cout << "Temperature in Celsius is: " << tempCel << endl;
        break;
        default:
        {
            cout << "You inserted wrong symbol!" << endl;
        }
    }
    return 0;
}
Если все константы сделать целыми, то ветвление case 1:, будет работать не верно, будет отбрасывать, в формуле, 9/5*.
Подскажите, пожалуйста чем это связано, чтобы уложить у себя в голове и больше не сталкиваться с этой ошибкой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2011, 18:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неявное преобразование переменных (C++):

Неявное преобразование типов - C++
если я правильно понял, то explicit работает таким образом: class abc { int x; public: abc(int x_):x(x_){} ~abc(){} };

Неявное преобразование типов - C++
Здравствуйте, определен класс: template&lt;typename T&gt; class Polynomial { public: explicit...

Неявное преобразование типов? - C++
есть класс Vector затем с его помощью создается класс Matrix (матрица - массив векторов) дошла очередь до операции умножения матрицы...

Неявное преобразование типа - C++
Привет. Решаю задачу, не могу решить проблему. Есть класс 'time' и производный от него класс 'interval'. 1 - содержит поля h, m, s,...

Объясните неявное преобразование в этом случае - C++
scoped_ptr p = new Object();То есть &quot;p&quot; неявно преобразовывается в указатель, но как не понятно. Это я встретил просматривая вот это. В...

Неявное преобразование типа данных через структуры - C++
Помню что вроде был в С/С++ такой прием, который позволял посмотреть на содержимое переменной одного типа с точки зрения другого типа....

4
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
24.01.2011, 18:40 #2
поясните что именно не работает, перевод из одной систему в другую правильный
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.01.2011, 18:49 #3
Цитата Сообщение от zabuka Посмотреть сообщение
C++
1
tempFahr = 9 /5 *tempCel +32;
? Это
C++
1
tempFahr = 1 *tempCel +32;
, то есть
C++
1
tempFahr = tempCel +32;
. Кроме переполнения типа ничем не грозит, но и это вылетать не должно. У флоата диапазон не только больше, но у границ диапазона
C++
1
tempFahr = tempCel +32
; даёт
C++
1
tempFahr == tempCel
.
1
zabuka
1 / 1 / 0
Регистрация: 16.12.2010
Сообщений: 38
24.01.2011, 19:02  [ТС] #4
Цитата Сообщение от panicwassano Посмотреть сообщение
поясните что именно не работает, перевод из одной систему в другую правильный
Например пользователь выбирает перевод Цельсия в Фаренгейты. То есть работает:
C++
1
2
3
4
5
6
case 1:
            cout << "Insert temperature in Celsius: ";
            cin >> tempCel;
            tempFahr = 9.0 /5.0 *tempCel +32.0;
            cout << "Temperature in Fahrenheit is: " << tempFahr << endl;
            break;
если формулу переписать как: tempFahr = 9 /5 *tempCel +32;
оставив тип переменной как float, то 9/5 *, не будет участвовать в расчете tempFahr. И когда пользователь введет 100, он получит результат 132, а не 212.
Я не понимаю почему так происходит.
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.01.2011, 19:06 #5
Потому что
C++
1
9/5
- это
C++
1
(int)(9/5)
. То есть, какой тип делимого, таков и частного, а округление всегда вниз.
1
24.01.2011, 19:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2011, 19:06
Привет! Вот еще темы с ответами:

Неявное восходящее преобразование при защищенном/закрытом наследовании - C++
Здравствуйте. Читаю книгу Стивена Прата по C++. Попался непонятный момент: в одной таблице (в таблице 14.1 в 6-й рус. редакции на стр....

Продемонстровать неявное преобразование типов: из целого в вещественный и обратно - C++
Помогите решить задачи по С++, никак не могу, вся надежда только на вас. 1. Даны вещественные и целые числа. Наглядно продемонстрируйте...

Как запретить компилятору неявное преобразование из числового типа в символьный? - C++
У мя возникла такая проблема: я ввожу данные типа char и мне надо быть уверенным, что я ввел именно символ, т.е. если я ввожу число мне...

Внутреннее устройство многомерного массива и неявное преобразование массива в указатель - C++
Букв получилось многовато. Поэтому, чтобы сэкономить Ваше время, предлагаю сразу вопрос: Буду очень благодарен, если кто-то сможет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru