Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Код:
#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, 14:10   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,547
По умолчанию

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

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

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

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

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

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

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

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

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

Цитата:
Сообщение от 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 в 16:31.
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор кода 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 11:17