Как взять целую часть от деления c
Перейти к содержимому

Как взять целую часть от деления c

Арифметические действия в языке Си

Программы работают с данными. Зачастую данные представляют собой числа. В этом уроке, как вы наверное догадались, мы будем заниматься изучением того, как и что в языке Си можно делать с числами. Начнём с арифметики.

Компилятор языка Си понимает все основные арифметические операции, которые вам известны со школы. Плюс есть несколько дополнительных.

Основные арифметические операторы языка Си.

+ оператор сложения
— оператор вычитания
* оператор умножения
% оператор взятия остатка от деления
/ оператор деления

Следующая программа иллюстрирует использование первых четырёх из них. Кстати, обратите внимание на то, как с помощью функции printf вывести на экран символ % .

Результат работы этой программы представлен на следующем рисунке.

Рис.5 Использование арифметических действий в Си.

Всё чётко и понятно. Никаких неожиданностей. А теперь попробуем получить частное двух чисел. Т.к. результат должен получиться 3.5, то res объявим как float .

Как видите, результат получился не тот, что мы ожидали. Это одна из особенностей оператора деления в языке Си.

При делении значение целого типа на значение целого типа результат тоже получается целого типа.

Так уж устроен язык Си. Поэкспериментируйте, попробуйте любые другие целые числа.

Вычислить результат целочисленного деления легко. Поделите числа и отбросьте всё, что получилось в дробной части.

Пример: Как получить результат целочисленного деления

7/2 = 3.5 → 3
11/3 = 3.66 → 3
2/5 = 0.4 → 0

Для того чтобы получить тот результат, который мы в данном случае ожидаем, одно из значений нужно сделать вещественным. Сделать это проще простого. Для этого необходимо рядом с ним в скобках записать float .

Посмотрим на нашем примере:

Теперь результат будет тот, что мы ожидали. Проделанный нами трюк называется явным преобразованием типа .

Явное преобразование (приведение) типа.

Если какое-то значение нужно привести к другому типу, нужно перед этим значением в скобках написать название требуемого типа.

Листинг 4. Примеры явного преобразования типа

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

Обратите внимание, что, когда мы преобразовываем целое значение в вещественное, ничего особенного не происходит, т.к. вещественные числа включают в себя целые.

Совсем иная ситуация, когда мы от вещественного переходим к целому. При этом переходе у нас теряется вся дробная часть. Не забывайте об этом.

Картинка, показывающая различия между операциями взятие остатка, целочисленного деления и обычного деления.

Деление, целочисленное деление и остаток от деления. Отличия

Рис.2 Деление, целочисленное деление и остаток от деления.

Практика

Решите предложенные задачи:

Для удобства работы сразу переходите в полноэкранный режим

Урок №39. Арифметические операторы

На этом уроке мы рассмотрим арифметические операторы и их использование в языке С++.

Унарные арифметические операторы

Унарные операторы — это операторы, которые применяются только к одному операнду. Существуют два унарных арифметических оператора: плюс ( + ) и минус ( − ).

Оператор Символ Пример Операция
Унарный плюс + +x Значение x
Унарный минус −x Отрицательное значение x

Унарный оператор + возвращает значение операнда. Другими словами, +5 = 5 или +х = х . Унарный плюс вам, скорее всего, не придется использовать. Его по большей части добавили в качестве симметрии с унарным оператором минус. Унарный оператор минус возвращает операнд, умноженный на −1 . Например, если х = 5 , то −х = −5 .

Оба этих оператора пишутся непосредственно перед самим операндом, без пробела ( −x , а не − x ).

Не следует путать унарный оператор минус с бинарным оператором вычитания, хоть они и используют один и тот же символ. Например, в выражении х = 5 − −3; , первый минус — это оператор вычитания, а второй — унарный минус.

Бинарные арифметические операторы

Бинарные операторы — это операторы, которые применяются к двум операндам (слева и справа). Существует 5 бинарных операторов.

Оператор Символ Пример Операция
Сложение + x + y x плюс y
Вычитание x − y x минус y
Умножение * x * y x умножить на y
Деление / x / y x разделить на y
Деление с остатком % x % y Остаток от деления x на y

Операторы сложения, вычитания и умножения работают так же, как и в обычной математике. А вот деление и деление с остатком рассмотрим детально.

Деление целых чисел и чисел типа с плавающей точкой

Оператор деления имеет два режима. Если оба операнда являются целыми числами, то оператор выполняет целочисленное деление. Т.е. любая дробь (больше/меньше) отбрасывается и возвращается целое значение без остатка, например, 7 / 4 = 1 .

Если один или оба операнда типа с плавающей точкой, то тогда будет выполняться деление типа с плавающей точкой. Здесь уже дробь присутствует. Например, выражения 7.0 / 3 = 2.333 , 7 / 3.0 = 2.333 или 7.0 / 3.0 = 2.333 имеют один и тот же результат.

Попытки деления на 0 (или на 0.0 ) станут причиной сбоя в вашей программе, и это правило не следует забывать!

Использование оператора static_cast в операциях деления

На уроке о символьном типе данных char мы уже использовали оператор static_cast для вывода ASCII-символов в виде целых чисел.

Аналогичным образом мы можем использовать static_cast для конвертации целого числа в число типа с плавающей точкой. Таким образом, вместо целочисленного деления выполнится деление типа с плавающей точкой. Например:

Результат выполнения программы:

int / int = 1
double / int = 1.75
int / double = 1.75
double / double = 1.75

Деление с остатком

Оператор деления с остатком ( % ) работает только с целочисленными операндами и возвращает остаток от целочисленного деления. Например:

Пример №1: 7 / 4 = 1 с остатком 3 , таким образом, 7 % 4 = 3 .

Пример №2: 25 / 7 = 3 с остатком 4 , таким образом, 25 % 7 = 4 . Остаток составляет не дробь, а целое число.

Пример №3: 36 % 5 = 7 с остатком 1 . В числе 36 только 35 делится на 5 без остатка, поэтому 36 − 35 = 1 , 1 — это остаток и результат.

Данный оператор чаще всего используют для проверки деления без остатка одних чисел на другие. Если х % у == 0 , то х делится на у без остатка.

Например, мы хотим написать программу, которая выводит числа от 1 до 100 по 20 значений в каждой строке. Мы можем использовать оператор деления с остатком для создания разрыва строк. Несмотря на то, что мы еще не рассматривали цикл while, в следующей программе всё максимально просто и понятно:

Результат выполнения программы:

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 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

О while мы еще поговорим на соответствующем уроке.

Отрицательные числа в операциях деления до C++11

До C++11, если любой из операндов целочисленного деления является отрицательным, то компилятор округляет результат самостоятельно! Например, результатом −5 / 2 может быть либо −3 , либо −2 . Однако большинство современных компиляторов округляют числа в сторону нуля (например, в −5 / 2 результатом будет −2 ). В спецификации C++11 определили, что компилятор должен всегда округлять к нулю (или, проще говоря, просто отбрасывать дробь).

Также до C++11, если один из операндов оператора деления с остатком является отрицательным, то результат может быть как положительным, так и отрицательным! Например, результатом −5 % 2 может быть как 1 , так и −1 . В спецификации C++11 решили сделать так, чтобы результат a % b был того же знака, что и значение а .

Арифметические операторы присваивания

Оператор Символ Пример Операция
Присваивание = x = y Присваиваем значение y переменной x
Сложение с присваиванием += x += y Добавляем y к x
Вычитание с присваиванием −= x −= y Вычитаем y из x
Умножение с присваиванием *= x *= y Умножаем x на y
Деление с присваиванием /= x /= y Делим x на y
Деление с остатком и с присваиванием %= x %= y Присваиваем остаток от деления x на y переменной x

До этого момента, когда нам нужно было добавить число 5 к определенной переменной, мы делали следующее:

Как взять целую часть от деления c

На этом занятии мы научимся читать, писать и считать (в целых числах). Как первоклассники, только на компьютере, с помощью С++.

Домашнее задание:
Обязательное задание:
1) Выполнить все задания из турнира «02. Целые числа — 1» (Если есть не выполненные) (http://contester.petrocollege.ru:8888/ru/)
2) Выполнить все задания из турнира «03. Целые числа — 2»
3) Выполнить задания из турнира «04. Целые числа — 3»

1. Арифметические выражения

Сначала научимся считать. Мы уже знаем, что выводить строки можно с помощью команды cout. Точно так же можно выводить числа и результат вычисления выражений. Например, вот так выглядит программа, которая считает, чему равно (2 + 3) * 5:

Если запустить эту программу, то она выведет 25. Сначала посчитается результат вычисления арифметического выражения, а затем он будет выведен. Посмотрим, какие арифметические операции умеет выполнять C++:

Обозначение операции Что она выполняет Пример
+ сложение (бинарная) 5 + 2
вычитание (бинарная) 15 — 3
* умножение (бинарная) 2 * 4
/ деление нацело (бинарная) 13 / 2 (результат 5)
% вычисление остатка от деления (бинарная) 13 % 2 (результат 1)
++ увеличить на 1 (унарная) int a = 3; a++;(результат 4)
уменьшить на 1 (унарная) int a = 3—; a—; (результат 2)

У операций на C++ тот же приоритет, что и в обычной математике. Сначала выполняются унарные операции (увеличить на 1 и уменьшить на 1), потом бинарные умножение, деление и вычисление остатка, затем бинарные сложение и вычитание. Влиять на порядок операций можно с помощью скобок. Минус и плюс бывают бинарные (это число минус число или число плюс число) и унарные (это просто отрицательное или положительное число). Например, можно написать (−2 + 3) * 4 — это будет корректным выражением с результатом 4.

Гораздо интереснее операции деления и взятия остатка. С помощью операции деления можно узнать целую часть от деления одного числа на другое. Например, 7 / 3 будет равно 2. А с помощью операции взятия остатка от деления можно узнать остаток от деления первого числа на второе. 7 % 3 будет равен 1. Если число делится нацело, то остаток будет равен нулю, например, 8 % 4 даст 0.

Математикам стоит обратить внимание на то, что деление и подсчёт остатка для отрицательных чисел работает в C++ «неправильно». Если в C++ мы разделим отрицательное число на положительное, например, посчитаем результат операции −7 / 3, то получим −2. Фактически в C++ отрицательное число берётся по модулю, делится, а затем к результату приписывается минус.

В C++ операция взятия остатка от деления отрицательного числа на положительное, так же как и деление нацело, берёт делимое по модулю, затем происходит подсчёт остатка от деления, и к результату приписывается минус. Например, −10 % 3 будет равно −1.

  • a 2 = a ∗ a
  • a 3 = a ∗ a ∗ a
  • ( a + b ) 4 = ( a + b ) ∗ ( a + b ) ∗ ( a + b ) ∗ ( a + b )

Программа, которая всегда считает результат вычисления одного и того же выражения, довольно скучная и бестолковая. Полезная программа должна оперировать с различными данными без внесения изменений в код.

Можно представить себе, что программа сидит в кабинете, в который входит конвейер с входными значениями (это поток cin), а выходит конвейер с выводом (это поток cout). В кабинете стоят коробки с хламом, оставшемся от предыдущих жильцов, но мы можем ими воспользоваться, чтобы хранить в этих коробках свои вещи. Переменная, по сути, и является такой коробкой. «Объявить переменную x» — это как взять какую-нибудь из коробочек и подписать её буквой x. «Присвоить значение переменной x» — это вытряхнуть содержимое из коробочки x и положить в неё новое значение.

Пока мы будем работать только с целочисленными переменными. Пусть мы хотим взять из горы неподписанных специальных коробочек для целых чисел две штуки и назвать их x и y. На языке C++ это будет записано как:

Слово int означает, что переменные будут целочисленные, затем перечисляются имена создаваемых переменных через запятую. В конце ставится точка с запятой.

Если мы хотим присвоить значение переменной, то слева следует написать имя присваиваемой переменной, затем знак равно, а справа — арифметическое выражение, в котором могут использоваться числа и другие переменные. Например:

В результате выполнения этих операций в переменной x окажется число 5, а в переменной y — число 20.

Переменные также можно считывать с клавиатуры. Для этого по аналогии с потоком вывода cout используется поток cin (console input). Этот как раз тот конвейер, по которому к нам приезжают числа. Как и в случае cout, вводимые значения разделяются стрелочками, только теперь они направлены вправо, так как мы забираем данные из потока cin.

Задача 1. Ввести одно число и вывести это число, увеличенное на 1.

Добавим строчки ввода и вывода данных. Данная программа при запуске откроет консоль и будет ожидать, пока пользователь не наберёт целое число. После нажатия клавиши Enter число будет размещено в переменной a. Далее оно увеличится на единицу и будет выведено обратно на консоль:

Обратите внимание, что при чтении из cin стрелочки направлены в противоположную по сравнению с cout сторону. Мы «забираем» данные из потока ввода cin и «кладём» в cout .

Задача 2. Ввести с клавиатуры два числа и вывести их сумму.

Рассмотрим теперь пример программы, которая считывает с клавиатуры два числа a и b и выводит на экран их сумму:

Данная программа при запуске откроет консоль и будет ожидать, пока пользователь не наберёт два целых числа, разделённых пробелом или переводом строки (нажатием Enter). После нажатия клавиши Enter первое число будет размещено в переменной a , а второе число — в переменной b . Далее будет выведена на консоль сумма этих двух чисел.

Обратите внимание, что если мы хотим считать несколько переменных, то при перечислении их следует разделять стрелочками. Строку

можно заменить строками

которые будут делать то же самое.

Задача 3. Ввести с клавиатуры три числа и вывести суммы первого и второго чисел, первого и третьего, второго и третьего, сумму всех трех чисел и их произведение.

Следующая программа запрашивает три целых числа a , b, c . Программа в первой строке выводит сумму a +b , во второй строке a +c , в третьей строке b +c , в четвёртой, через пробел сумму всех трёх переменных и их произведение:

В C++ на целые числа типа int отводится 4 байта (32 бита). А это значит, что различных целых чисел может быть только 2 32 . Числа могут принимать значения от −2 31 до 2 31 −1 (это примерно от минус двух миллиардов до двух миллиардов). Если в процессе вычислений произойдёт выход за эти пределы, то результат будет посчитан неверно. Использование принципиально больших чисел требует ухищрений, поэтому в наших задачах все числа и все правильные промежуточные вычисления не будут выходить за эти пределы.

3. Изощрённый вывод

В cout также можно класть несколько значений, причём числа и строки могут идти вперемешку. Рассмотрим это на примере.

Задача 4. Ввести два числа и вывести их сумму и разность в виде арифметических выражений.

Пусть нам нужно считать два числа и вывести их сумму и разность в виде арифметического выражения, каждое в отдельной строке. Решение этой задачи выглядит так:

Если ввести числа 1 и 2, то на экран будет выведено:

1 + 2 = 3 1 — 2 = -1

Все различные значения, которые мы хотим вывести с помощью cout, следует разделять стрелочками <<. На место переменных и арифметических выражений будет подставлено их значение, а всё, что выводится в кавычках, останется без изменения. Особого внимания заслуживает слово endl — так в C++ делается переход на новую строку.

Если вы выводите несколько чисел, то обязательно добавляйте между ними пробел, иначе они склеятся и ответ будет неправильным.

Задача 5. Предположим, пассажир самолёта перепутал дверь туалета с выходом и случайно вышел на высоте. Приземлился он через t секунд, и нужно определить, на какой высоте летел самолёт.

Эту задачу можно решать так, как обычно решаются задачи по физике. Ускорение свободного падения нам известно (поскольку наши числа целые, то мы возьмём его равным 10). Мы посчитаем скорость (v), на которой пассажир достиг земли, затем среднюю скорость (vm, это конечная скорость, поделенная на 2) и, зная среднюю скорость и время, легко рассчитаем расстояние.

В этом решении мы заводили переменные там, где они нам понадобились впервые, а также сразу клали в переменную заданное число при её создании.

Задача 6. Написать программу, которая запрашивает шестиразрядное число и выводит только его три старших разряда.

Рассмотрим, как решить совсем простую на первый взгляд задачу, которая превращается в достаточно сложную из-за того, что мы мало что умеем и знаем. Напомню, что при делении C++ округляет результат вниз, не так, как нам нужно.

Первая идея — разделить с округлением вниз и прибавить к результату единицу. Эта идея неправильная: она не работает, если одно число делится на другое нацело. Так 8 / 2 + 1 будет равно 5, хотя правильный ответ 4.

Следующая идея, правильная, — прибавить к числу что-нибудь и затем разделить его с округлением вниз. Осталось понять, что же нужно прибавлять к числу. Если число a делится на b нацело, то результат не должен изменяться, значит, нельзя прибавлять к числу a что-либо большее b − 1 (если прибавить больше, то результат деления получится уже больше правильного). Можно ли прибавить что-нибудь меньшее b − 1? Рассмотрим «худший» случай, когда остаток от деления a на b равен единице, например, a = 11, b = 5. Тогда мы сложим a и b − 1 (получим 15) и разделим на 5 — получится правильный ответ 3.

Наше решение будет работать и для отрицательных чисел за счёт особенностей деления на C++. Полный код решения выглядит так:

6. Как решать задачи в проверочной системе Contester

У каждой задачи в вашем домашнем задании в системе проверки Contester есть условие, формат входных и выходных данных и примеры. В условии содержится описание задачи, которую нужно решить. В формате входных данных сказано, какие числа вводятся и в каком порядке они даны, а также указаны ограничения на эти числа. Гарантируется, что чисел будет столько, сколько нужно, и они будут удовлетворять ограничениям. Вам нужно решить задачу только для указанных ограничений. Как программа будет работать для чисел, не удовлетворяющих ограничениям — абсолютно неважно, таких тестов не будет. В формате выходных данных указывается, что и в каком порядке программа должна выводить — ничего, кроме этого, в решении быть не должно.

Примеры к задаче нужны для лучшего понимания условия и первоначальной самопроверки. Естественно, программа должна работать не только на примерах, но и на любых других допустимых входных данных.

Если программа работает правильно, то она получит статус OK. Если программа получила другой статус — вам следует придумать тесты, удовлетворяющие ограничениям, и проверить работу своей программы. Обязательно найдётся ошибка. Наша тестирующая система работает правильно. Наши тесты правильные. Правильные ответы к нашим тестам правильные. Это точно. Мы проверяли много раз. И не только мы.

7. Правила оформления кода

Программы нужно писать красиво, иначе их будет неудобно читать. На реальной работе программы много раз читаются и переписываются другими людьми, поэтому соблюдать правила оформления кода очень важно. Если в общем, то главное правило — «делайте как в образце». Если конкретно:

1. После открывающейся фигурной скобки добавляется отступ в начале строки, на строке с закрывающейся фигурной скобкой отступ убирается.
2. Все бинарные операции (+,−, *, /, %, =, <<, >>) окружаются пробелами.
3. После унарного минуса пробел не ставится (−5 нужно писать слитно).
4. Перед знаками препинания (запятая и точка с запятой) пробел не ставится, после — ставится.
5. После открывающейся и перед закрывающейся круглой скобкой пробел не ставится.
6. Если в условии задачи сказано «на вход даются два числа A и B», то переменные, в которые считываются эти числа, должны называться так же, но маленькими буквами (a и b соответственно).

Ваши коллеги будут очень благодарны вам, если вы будете соблюдать правила оформления кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *