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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2017, 10:10   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Натуральные числа

Здравствуйте!
Скажите пожалуйста, какая стандартная функция возвращает дробную часть числа?
Где можно просмотреть все подобные полезные функции чтобы не изобретать велосипед?
KAMLS вне форума Ответить с цитированием
Старый 06.12.2017, 10:19   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
какая стандартная функция возвращает дробную часть числа?
stackoverflow предлагает такой код:
Код:
f = f-(long)f;
но я бы проверил, как это сработает для отрицательных чисел.

а ещё гугл мне подсказывает функцию С++ modf из math.h:
Цитата:
Код:
/* modf example */
#include <stdio.h>      /* printf */
#include <math.h>       /* modf */

int main ()
{
  double param, fractpart, intpart;

  param = 3.14159265;
  fractpart = modf (param , &intpart);
  printf ("%f = %f + %f \n", param, intpart, fractpart);
  return 0;
}


Цитата:
Сообщение от KAMLS Посмотреть сообщение
Где можно просмотреть все подобные полезные функции
в стандартных библиотеках.


Цитата:
Сообщение от KAMLS Посмотреть сообщение
Натуральные числа
простите, а как название темы связано с вопросом? при чём здесь натуральные числа?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.12.2017, 10:46   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

простите, а как название темы связано с вопросом? при чём здесь натуральные числа?[/QUOTE]

Да надо проверить число на натуральность перед применением. Вот я и решил сравнивать дробную часть с нулем.
KAMLS вне форума Ответить с цитированием
Старый 06.12.2017, 11:22   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Да надо проверить число на натуральность перед применением. Вот я и решил сравнивать дробную часть с нулем.
А не проще ли взять целочисленный тип данных? Тогда никакой дробной части нет и быть не может.
А чтобы проверить на натуральность, достаточно проверить, что это целое число больше нуля.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.12.2017, 11:52   #5
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

В итоге так и сделал)))
Но на всякий случай знать инструмент надо..
KAMLS вне форума Ответить с цитированием
Старый 06.12.2017, 11:53   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
А не проще ли взять целочисленный тип данных?
ИМХО не только проще, но и нужно. Потому как если мы начинаем какие-то операции над числами, связанные с их дробной частью - получаем вещественный результат. И ни о какой натуральности числа после этого речи уже не идёт.

Цитата:
Вот я и решил сравнивать дробную часть с нулем.
Ага, и можете очень удивиться, когда обнаружите, что число 2.0 вполне себе ненатуральное Потому что дробная часть, если её полностью расписать, вполне может быть равна единице где-нибудь в стопицотом знаке после запятой.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.12.2017, 11:58   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Ага, и можете очень удивиться, когда обнаружите, что число 2.0 вполне себе ненатуральное. Потому что дробная часть, если её полностью расписать, вполне может быть равна единице где-нибудь в стопицотом знаке после запятой.
Это сильно зависит от способа получения того 2.0
Если получить как t:=3; v:=6.0/t, то вполне возможно, а если v:=2.0 то нет, наверно ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.12.2017, 13:32   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
ИМХО не только проще, но и нужно.
согласен. это я не до конца свою мысль сформулировал.
Если возможно, нужно всегда использовать такие структуры данных, которые физически не позволят нарушить условия задачи. Поэтому в данном случае и проще и лучше, и обязательно для натуральных чисел взять целочисленный тип данных.

чтобы потом не было мучительно больно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.12.2017, 11:17   #9
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Ну вообще, задача стояла так. Пользователь должен ввести натуральное число, которое потом используется. Я хотел поставить проверочную функцию, что там ввел пользователь. Если просто использовать int и проверять на 1>a, то проскальзывает ошибка при введенном 2.45. Будет засчитано просто 2 без показа ошибки ввода.
А я хотел показывать именно ошибку ввода. Всегда стараюсь так делать предусматривая различные варианты развития событий.))
KAMLS вне форума Ответить с цитированием
Старый 07.12.2017, 11:38   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Будет засчитано просто 2 без показа ошибки ввода.
ага. а если написать -E0 то что будет введено? а если ввести пустую строку или пробел, то что будет введено?

ну, вообще, это смотря как вводить и как проверять
можете проверить вариант отсюда - http://www.programmersforum.ru/showp...57&postcount=3
или пример со stackoverflow:
Код:
#include <iostream>
#include <limits>

int main (void)
{    
    std::cout<<"ENTER number please"<<std::endl;
    int n;
    std::cin>>n;
    while(n<=0)
    {
        std::cin.clear(); // вся работа производится в этой и следующей строчке
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
        std::cout<<"ERROR, Enter number again"<<std::endl;
        std::cin>>n;
    }
    std::cout<<"You've entered "<<n<<std::endl;
    return 1;
}
а можно вводить в строку, строку преобразовывать через atoi()
и сравнивать с тем, что ввели, можно просто пробежаться по введённой строке - в ней должны только строго ЦИФРЫ, никаких знаков, букв, точек и т.д.

но, в конечном итоге, должен использоваться только целочисленный тип данных.
вещественный тип в данном случае не подходит от слова "совсем".

Последний раз редактировалось Serge_Bliznykov; 07.12.2017 в 11:41.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны натуральные числа N, M. Найти все натуральные числа, меньшие N, квадрат суммы цифр которых равен M Namatrasnik Помощь студентам 1 03.11.2016 23:29
Даны натуральные числа a и b (a<b). Получить все простые числа из промежутка от a до b. ( с# ) NastyaShuvalova Помощь студентам 0 16.12.2013 18:08
Даны натуральные числа n и m. Получить сумму m последних цифр числа n pahanzona Microsoft Office Excel 11 27.02.2011 02:17
вводим два числа, получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m Sparky Помощь студентам 2 22.11.2009 21:59
Даны натуральные числа m,n. Посчитать сумму m последнего числа n. лялька Паскаль, Turbo Pascal, PascalABC.NET 6 25.12.2008 15:22