Студопедия — Операции с целыми числами
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Операции с целыми числами






 

Ранее мы уже рассматривали понятие типа и в качестве примера приводили как раз тип целых чисел. Вспомним:

 

Тип переменной определяет множество значений, которые может принимать переменная, и множество операций, в которых она может участвовать. Например, значениями переменных целого типа (такой тип определен во многих языках программирования) могут быть целые числа из некоторого диапазона (конкретные границы диапазона, как правило, определяются на уровне реализации языка), для них определены арифметические операции (сложение, вычитание, умножение, деление, нахождение остатка) и операции сравнения.

 

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

 

В список допустимых операций для целых чисел входят 5 арифметических операций, 6 сравнений и присваивание.

 

Включение присваивания в список операций привычно для программистов на Си, но может показаться неожиданным для программистов на Паскале и Бейсике. Сейчас мы не будем анализировать подход к присваиванию как к операции более глубоко, так как для данной темы это не столь существенно, а сам факт того, что присваивание целых чисел возможно, удивления не вызывает, б видов сравнений тоже хорошо известны. Целые числа можно сравнивать на "равно", "не равно", "меньше", "больше", "меньше или равно", "больше или равно". Синтаксис (правила записи) сравнений в разных языках может отличаться (например, "не равно" в Паскале записывается как "<>", в Си — "!=", а в Фортране — ".NE."), но суть от этого не зависит. Важно понимать, что сравнение — это операция. Как и у более привычных нам арифметических операций, у операций сравнения есть операнды (исходные целые числа) и результат, только результат в данном случае имеет не целый, а логический тип.

 

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

 

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

 

Во многих языках целое деление рассматривается как отдельная операция, для которой существует специальное обозначение. Например, во многих версиях Бейсика для этого используется обратная косая черта, а в Паскале — служебное слово div. В КуМире целое деление выполняется с помощью встроенной функции div. Имя этой функции совпадает с именем операции в Паскале, но синтаксис их использования различен.

 

Таким образом, для выполнения целого деления Х на У в указанных языках необходимо писать следующее:

 

Бейсик: X\Y Паскаль: Х div Y КуМир: div (X, Y)

 

Запись X/Y, использующая обычную операцию деления, недопустима, так как она дает вещественный результат.

 

Другой подход принят в Си. В этом языке нет специальной операции целого деления, но обычное деление выполняется как целое, если делимое и делитель имеют целый тип. Несмотря на внешнюю простоту и естественность такого решения, оно часто оказывается источником ошибок у начинающих программистов. Например, 1 / 3 в Си дает результат 0, так как 1 и 3 — целые и деление здесь воспринимается как деление нацело. Впрочем, это уже проблемы вещественной арифметики, которые выходят за рамки нашей темы.

 

Последняя арифметическая операция с целыми числами — остаток от деления. Неформальноё описание этой операции дается в начальной школе: остаток — это то, что остается после деления поровну, то есть, в наших терминах, целого деления.

 

Более формально деление с остатком можно определить так (запись соответствует синтаксису Паскаля):

 

Х mod Y = Х - (X div Y) * Y (1)

 

Вот как записывается операция остаток в разных языках:

 

Бейсик и Паскаль: Х mod Y

Си: Х % Y

КуМир: mod(X, Y)

 

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

 

Проблема заключается в том, что единых общепринятых соглашений по этому поводу не существует. Например, в книге "Конкретная математика" (Р.Грэхем, Д.Кнут, ОЛапшшник. Конкретная математика. Основание информатики. М.: Мир, 1998. Я очень рекомендую эту книгу всем, кто не боится математики и всерьез интересуется теоретической информатикой) авторы рекомендуют при выполнении целого деления всегда выполнять округление к меньшему числу, а остаток вычислять по формуле (1), так как этот подход значительно упрощает математические преобразования с использованием этих действий. В частности, знак остатка всегда совпадает со знаком делимого. Однако авторы тут же предупреждают: "Остерегайтесь машинных языков, в которых используется другое определение".

 

Действительно, в различных системах программирования операции целого деления и остатка работают с отрицательными числами по-разному, причем очень часто эти особенности никак не отражены в описании. Чаще всего округление при делении производится к нулю, то есть в меньшую сторону при положительном результате и в большую при отрицательном. Остаток вычисляется по формуле (1), его знак совпадает со знаком делителя. Именно так работают многие популярные реализации Паскаля, Си, Бейсика.

 

Совсем необычно подошли к этому вопросу создатели КуМира. В этой системе остаток (он, как обычно, вычисляется по формуле (1))не может быть отрицательным. Поэтому округление производится в меньшую сторону, если делитель положителен, и в большую — если отрицателен.

 

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

Си,

 

Паскаль, Бейсик КуМир

10 div 3 3 3 3

10 mod 3 1 1 1

-10 div 3 -4 -3 -4

- 10 mod 3 2 -1 2

10 div -3 -4 -3 -3

10 mod —3 -2 1 1

-10 div -3 3 3 4

-10 mod -3 -1 -1 2

 

 

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

 

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

 

Кроме перечисленных, многие системы программирования разрешают выполнять с целыми числами битовые операции (поразрядные логические операции, сдвиги). Mы не будем их рассматривать, так как эти операции существенно используют двоичное представление, а мы решили сосредоточиться на универсальных свойствах, от внутреннего представления не зависящих.

 







Дата добавления: 2015-08-30; просмотров: 477. Нарушение авторских прав; Мы поможем в написании вашей работы!



Обзор компонентов Multisim Компоненты – это основа любой схемы, это все элементы, из которых она состоит. Multisim оперирует с двумя категориями...

Композиция из абстрактных геометрических фигур Данная композиция состоит из линий, штриховки, абстрактных геометрических форм...

Важнейшие способы обработки и анализа рядов динамики Не во всех случаях эмпирические данные рядов динамики позволяют определить тенденцию изменения явления во времени...

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Тема: Изучение приспособленности организмов к среде обитания Цель:выяснить механизм образования приспособлений к среде обитания и их относительный характер, сделать вывод о том, что приспособленность – результат действия естественного отбора...

Тема: Изучение фенотипов местных сортов растений Цель: расширить знания о задачах современной селекции. Оборудование:пакетики семян различных сортов томатов...

Тема: Составление цепи питания Цель: расширить знания о биотических факторах среды. Оборудование:гербарные растения...

Способы тактических действий при проведении специальных операций Специальные операции проводятся с применением следующих основных тактических способов действий: охрана...

Искусство подбора персонала. Как оценить человека за час Искусство подбора персонала. Как оценить человека за час...

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

Studopedia.info - Студопедия - 2014-2024 год . (0.011 сек.) русская версия | украинская версия