Как на C выделить целую часть числа и как округлить число до ближайшего целого?
Хотите целую часть? — Сделайте явное приведение типов:
double a = 1.11 b = (int) a
Хотите узнать дробную часть? Разделите число на него же, но после приведения типов и проанализируйте остаток от деления через if-else блок: сможете своим способом округление сделать.
Или не забывайте про библиотеку math. C++ style:
double d = 2.71; double x, y; y = std::modf(d, &x); // целая часть запишется в x, дробная - в y
Арифметические действия в языке Си
Программы работают с данными. Зачастую данные представляют собой числа. В этом уроке, как вы наверное догадались, мы будем заниматься изучением того, как и что в языке Си можно делать с числами. Начнём с арифметики.
Компилятор языка Си понимает все основные арифметические операции, которые вам известны со школы. Плюс есть несколько дополнительных.
Основные арифметические операторы языка Си.
+ оператор сложения
— оператор вычитания
* оператор умножения
% оператор взятия остатка от деления
/ оператор деления
Следующая программа иллюстрирует использование первых четырёх из них. Кстати, обратите внимание на то, как с помощью функции printf вывести на экран символ % .
#include int main(void)
Результат работы этой программы представлен на следующем рисунке.
Рис.5 Использование арифметических действий в Си.
Всё чётко и понятно. Никаких неожиданностей. А теперь попробуем получить частное двух чисел. Т.к. результат должен получиться 3.5, то res объявим как float .
#include int main(void)< int a=7, b=2; float res; res = a/b; printf("%d / %d = %f\n",a,b,res); return 0; >
Как видите, результат получился не тот, что мы ожидали. Это одна из особенностей оператора деления в языке Си.
При делении значение целого типа на значение целого типа результат тоже получается целого типа.
Так уж устроен язык Си. Поэкспериментируйте, попробуйте любые другие целые числа.
Вычислить результат целочисленного деления легко. Поделите числа и отбросьте всё, что получилось в дробной части.
Пример: Как получить результат целочисленного деления
7/2 = 3.5 → 3
11/3 = 3.66 → 3
2/5 = 0.4 → 0
Для того чтобы получить тот результат, который мы в данном случае ожидаем, одно из значений нужно сделать вещественным. Сделать это проще простого. Для этого необходимо рядом с ним в скобках записать float .
Посмотрим на нашем примере:
#include int main(void)< int a=7, b=2; float res; res = (float)a/b; printf("%d / %d = %f\n",a,b,res); return 0; >
Теперь результат будет тот, что мы ожидали. Проделанный нами трюк называется явным преобразованием типа .
Явное преобразование (приведение) типа.
Если какое-то значение нужно привести к другому типу, нужно перед этим значением в скобках написать название требуемого типа.
Листинг 4. Примеры явного преобразования типа
int a=7, b; float g= 9.81,v; b = (int) g; //приводим значение 9.81 к типу int, получим 9 v= (float)a; // приводим значение 7 к типу float, получим 7.0
Важный момент: преобразуется не тип исходной переменной, а только лишь значение, которое используется в выражении. В следующем видео-фрагменте об этом говорится подробнее.
Обратите внимание, что, когда мы преобразовываем целое значение в вещественное, ничего особенного не происходит, т.к. вещественные числа включают в себя целые.
Совсем иная ситуация, когда мы от вещественного переходим к целому. При этом переходе у нас теряется вся дробная часть. Не забывайте об этом.
Картинка, показывающая различия между операциями взятие остатка, целочисленного деления и обычного деления.

Рис.2 Деление, целочисленное деление и остаток от деления.
Сохрани в закладки или поддержи проект.
Практика
Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим
Исследовательские задачи для хакеров
- Подумайте и приведите примеры, когда обычное деление не имеет смысла. Например, деление трёх лицензионных ключей от программы между двумя людьми. Зачем кому-то нужна половина лицензионного ключа? (если, конечно, он не занимается reverse engineering).
- Что происходит при делении на ноль в вашей системе?
Дополнительные материалы
- Дополнительные задачи с автоматической проверкой решения из курса » Введение в программирование (C++) » от компании Яндекс. не беспокойтесь, что курс по С++. Удаляйте заготовку из поля для решения и спокойно вставляйте код на Си. Проверяющая система его будет нормально воспринимать.
Математические операторы
Разберем, какие математические действия мы можем делать в бейсике. Четыре действия нам уже знакомы: сложение, вычитание, умножение, деление. Рассмотрим, как они записываются в бейсике:
За сложение отвечат знак +
За вычитание отвечает знак —
За умножение отвечает знак * Его можно напечатать на дополнительной клавиатуре или с помощью комбинации клавиш shift-8
За деление отвечает знак /
Возвести в степень можно с помощью значка степени ^ Shift-6
Кроме того, в бейсике есть 2 оператора, которых нет в алгебре: это оператор целочисленного деления и оператор вычисления остатка:
Оператор целочисленного деления: \
Оператор вычисления остатка: mod
Поскольку два эти оператора отсутствуют в алгебре, разберем их более подробно:
Целочисленное деление
Данный оператор позволяет разделить одно число (или переменную) на другое до целой части. Дробная часть игнорируется. Например:
Если мы будем делить 10 на 3, то мы либо получим 3 и 1 в остатке, либо(если будем делить до конца), получим 3,33333333333333333(3). Если поделить 10 на 3 до целой части, записав это в виде 10\3, то мы получим 3 целую часть от деления, т.е 3.
Остаток от деления
Данный оператор позволяет вычислить остаток от деления числа А на число B. Например, если мы разделим число 10 на число 3, записав это в виде 10 mod 3, то мы получим остаток от деления 10 на 3, т.е 1.
Необходимо заметить, что эти операторы не могут использоваться «сами по себе». Результат использования оператора обязательно должен быть присвоен какой-то переменной:
Примеры правильного использования оператора:
a=2+3
b=c*8
H=9/3
j=18^a
k=10\2
p=10 mod 4
Задание 1. Записать на языке бейсика следующие действия:
- Умножить значение переменной А на 2, записав в переменную В.
- Увеличить значение переменной G на 15, записав результат в переменную В
- Возвести значение переменной J в 20ю степень, записав результат в переменную U.
- Разделить до целой части переменную U на 250, записав результат в переменную h
- Вычислить остаток от деления значения переменной А на 256, результат записать в переменную K
- Умножить значение переменной А на 2, записав в переменную В.
Ответ: B=A*2 - Увеличить значение переменной G на 15, записав результат в переменную В
Ответ: N=G*15 - Возвести значение переменной J в 20ю степень, записав результат в переменную U.
Ответ: U=J^20 - Разделить до целой части переменную U на 250, записав результат в переменную h
Ответ: h=U\250 - Вычислить остаток от деления значения переменной А на 256,результат записать в переменную K
Ответ: K= A mod 256
Математические функции
Из курса алгебры вам наверняка знакомы некоторые математические функции: Синус, косинус, квадратный корень, и т.д. В бейсике они не сильно отличаются от алгебры, хотя отличия все же есть.
Любая функция записывается в виде Y=f(x), где Y — имя переменной, в которую будет записан результат, f — название функции, х — аргумент функции (т.е от чего мы эту функцию считаем). Аргумент функции может представлять собой как число, так и переменную. Аргумент функции ВСЕГДА находится в скобках.
Например:
a=sin(b)
b=sqr(6)
g=ABS(15)
j=sqr(a^2+5^b)
Следует обратить внимание, что математическая функция не существует сама по себе, ее результат ВСЕГДА должен быть записан в переменную. Способ записи cos(-2) некорректен, правильная запись будет выглядеть как a=cos(2).
Рассмотрим существующие функции более подробно:
| Название | Описание |
|---|---|
| sin(a) | Синус числа а |
| cos(a) | Косинус числа а |
| tan(a) | Тангенс числа а. Примечание: именно tan, а не tg |
| sqr(a) | Квадратный корень из а |
| int(a) | Наибольшее целое число, не превышающее а |
| cint(a) | Целое число, ближайшее к числу а |
| fix(a) | Целое число, равное а без дробной части |
| abs(a) | модуль числа а (абсолютное значение, если по-умному) |
| rnd(a) | случайное число |
Примечание: со случайным числом все сложнее, чем в остальных функциях, эту функцию будем разбирать отдельно. К примеру, она может работать без аргумента.
Задание 2. Записать на языке бейсика следующие действия:
- Переменная А равна синусу от квадрата переменной В
- Переменная В равна квадратному корню суммы переменных А и С
- Переменная С равна тангенсу квадратного корня переменной А
- Переменная В равна целой части частного числа 53 и переменной А
- Переменная А равна модулю квадратного корня из синуса А, возведенному в 15ю степень
- Переменная А равна синусу от квадрата переменной В
Ответ: A=sin(B^2) - Переменная В равна квадратному корню суммы переменных А и С
Ответ: B=sqr(A+C) - Переменная С равна тангенсу квадратного корня переменной А
Ответ: C=tan(sqr(A)) - Переменная В равна целой части частного числа 53 и переменной А
Ответ: B=fix(53/А) - Переменная А равна модулю квадратного корня из синуса А, возведенному в 15ю степень
Ответ: A=(abs(sqr(sin(a))))^15
Как взять целую часть от деления c



Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required