Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 25.03.2020, 14:29   #1
bITA666
Пользователь
 
Регистрация: 22.03.2019
Сообщений: 39
По умолчанию Разбор кода

Код:
#include <cmath>     //для sqrt()
using namespace std;
int main()
{
double number,answer;   //аргументы типа double для функции sqrt()
cout « "Введите число: ";
cin » number;    // ввод числа
answer = sqrt(number);   // извлечение корня
cout « "Квадратный корень равен " « answer « endl;   // вывод результата
return 0;
}

Введите число: 1000
Квадратный корень равен 31.622777

Подскажите пожалуйста! Почему тип данных double? если пользователь вводит целочисленное число, 1000?
bITA666 вне форума Ответить с цитированием
Старый 25.03.2020, 15:10   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 14,724
По умолчанию

А что мешает пользователю ввести дробное число?
Arigato на форуме Ответить с цитированием
Старый 25.03.2020, 15:18   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,135
По умолчанию

Цитата:
Сообщение от bITA666 Посмотреть сообщение
если пользователь вводит целочисленное число, 1000?
А что если пользователь захочет ввести не целое число?

Рациональные числа это более широкий класс чисел. Значит мы можем решить более широкий класс задач тем более с минимальным числом усилий.

А вообще это ещё древние торговцы заметили что если решить задачу в символьном виде выписав конечную формулу, то можно быстро решать целые классы арифметических задач при этом сокращая число операций. Так и появилась наука математика наука о символах, а не о числах. А работа с числами это арифметика. А вот сейчас программисты пользуются этим тайным знанием торговцев для написания своих программ.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia на форуме Ответить с цитированием
Старый 25.03.2020, 15:49   #4
bITA666
Пользователь
 
Регистрация: 22.03.2019
Сообщений: 39
По умолчанию

Arigato, Ну разве не должна быть переменная типа int если пользователь вводит 1000? Я лишь хочу понять почему когда пользователь вводит целочисленное число почему не создать под него соответственную переменную с типом int? Как целочисленное число может содержаться в переменной и быть другого типа если пользователь ввел 1000?

Последний раз редактировалось bITA666; 25.03.2020 в 15:52.
bITA666 вне форума Ответить с цитированием
Старый 25.03.2020, 16:00   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 2,419
По умолчанию

Потому что sqrt в принципе заточена под работу с вещественными числами. Если даже ввести целое число, программа в качестве аргумента берёт его вещественный эквивалент. Если так уж хочется int -> int, результат можно усечь или округлить до ближайшего целого. В Делфи для этого существуют функции Trunc и Round, в ++ не помню - кажется, достаточно просто переслать double в int.
Цитата:
Как целочисленное число может содержаться в переменной и быть другого типа?
Никак. Как я уже сказал, будет взят вещественный эквивалент этого введённого целого числа 1000.0 Переменная может быть double, но в содержимом её может отсутствовать дробная часть - от этого мир не перевернётся. Но представлено одно и то же число 1000 в double и int будет совершенно по разному.
https://ru.wikipedia.org/wiki/Число_с_плавающей_запятой - читать
Цитата:
Я лишь хочу понять почему когда пользователь вводит целочисленное число почему не создать под него соответственную переменную с типом int?
А вот тут уже - полное непонимание работы программ. Когда пишется, а затем компилируется и линкуется программа, тогда уже в ней определены переменные, и в процессе работы готовой программы они не создаются (про динамическое выделение памяти не будем, это, похоже, для ТС - древнехалдейский манускрипт.) Поэтому что бы ни вводил юзверь, значения попадают в уже созданные переменные уже определённого типа.
А может, это троллинг? Такой уровень непонимания - запредельно.

Последний раз редактировалось digitalis; 25.03.2020 в 21:37.
digitalis вне форума Ответить с цитированием
Старый 25.03.2020, 16:30   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 14,724
По умолчанию

Цитата:
Сообщение от bITA666 Посмотреть сообщение
Ну разве не должна быть переменная типа int если пользователь вводит 1000?
Так пользователь может ввести и другое число.
Arigato на форуме Ответить с цитированием
Старый 25.03.2020, 17:21   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,135
По умолчанию

Цитата:
Сообщение от bITA666 Посмотреть сообщение
Я лишь хочу понять почему когда пользователь вводит целочисленное число почему не создать под него соответственную переменную с типом int
Как видно из примера не должна.
Если вы хотите, то Вы можете написать int от этого ничего страшного не случится. Солнце все так же будет вставать на востоке и идти на запад. А кароновирус шагать по планете.

Цитата:
cin » number; // ввод числа
Здесь неявный момент оператор "»" выбирает функция чтения из сходя из типа переменной.

sqrt(number) всегда в качестве оператора принимает числа с плавающей точкой. Если вы подадите на вход корню целое число. То компилятор распознает это и вставит в ассемблерный код преобразование типов.
Это называется неявное преобразование.


Цитата:
Сообщение от bITA666 Посмотреть сообщение
Как целочисленное число может содержаться в переменной и быть другого типа если пользователь ввел 1000?
Так целое число это число с бесконечным числом нулей или девяток
1000=1000.00000000(0)
1000= 999.999999999(9)

Вам это могли рассказывать в школе. Если не рассказали в школе то в институте повторят на уроке матанализа.

Внутри компьютера числа усеченные и там ваша 1000 хранится как
Код:
1000.0000000000001
                ^
____.___________|
1              15
При выводе компьютер просто округляет число. Чисел Double могут точно хранить 15 десятичных значащих разрядов поэтому при выводе если компьютер видит что после точки идут одни нули или девятки то он их просто отбрасывает.
А при вводе если нет точки, то читается целочисленное число и вызывается преобразование типов.


Код:
Я лишь хочу понять почему когда пользователь вводит целочисленное число почему не создать под него соответственную переменную с типом int?
Тут пример простой, а вот если вы будете сложную программу делать, то там удобно что-бы все числа имели один формат потому что иначе намучаетесь переводить из одного представления в другой.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 25.03.2020 в 17:31.
Pavia на форуме Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор кода CSharp zxzLeejacKzxz C# (си шарп) 4 13.06.2012 07:25
Разбор кода Arhit Помощь студентам 3 22.01.2012 16:34
Разбор кода Delphi cv0l04b Помощь студентам 3 07.01.2012 13:39
Разбор куска кода. Alexcomeback Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 05.04.2011 18:14
Разбор кода. С++ TIT0 Помощь студентам 0 27.12.2010 12:17


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS