Как записать на языке c что число находится в допустимых значениях
Свод правил по работе с целыми числами в C/C++
В основу статьи легли мои собственные выработанные нелегким путем знания о принципах работы и правильном использовании целых чисел в C/C++. Помимо самих правил, я решил привести список распространенных заблуждений и сделать небольшое сравнение системы целочисленных типов в нескольких передовых языках. Все изложение строилось вокруг баланса между краткостью и полноценностью, чтобы не усложнять восприятие и при этом отчетливо передать важные детали.
Всякий раз, когда я читаю или пишу код на C/C++, мне приходится вспоминать и применять эти правила в тех или иных ситуациях, например при выборе подходящего типа для локальной переменной/элемента массива/поля структуры, при преобразовании типов, а также в любых арифметических операциях или сравнениях. Обратите внимание, что типы чисел с плавающей запятой мы затрагивать не будем, так как это большей частью относится к анализу и обработке ошибок аппроксимации, вызванных округлением. В противоположность этому, математика целых чисел лежит в основе как программирования, так и компьютерной науки в целом, и в теории вычисления здесь всегда точны (не считая проблем реализации вроде переполнения).
Типы данных
Базовые целочисленные типы
Целочисленные типы устанавливаются с помощью допустимой последовательности ключевых слов, взятых из набора
Несмотря на то, что битовая ширина каждого базового целочисленного типа определяется реализацией (т.е. зависит от компилятора и платформы), стандартом закреплены следующие их свойства:
Наличие знака
Дополнительные правила
Типы из стандартных библиотек
Преобразования
Представим, что значение исходного целочисленного типа нужно преобразовать в значение целевого целочисленного типа. Такая ситуация может возникнуть при явном приведении, неявном приведении в процессе присваивания или при продвижении типов.
Как происходит преобразование?
Главный принцип в том, что, если целевой тип может содержать значение исходного типа, то это значение семантически сохраняется.
Арифметика
Продвижение/преобразование
Неопределенное поведение
Счетчик цикла
Выбор типа
Отсчет вниз
Для циклов, ведущих отсчет вниз, более естественным будет использовать счетчик со знаком, потому что тогда можно написать:
При этом для беззнакового счетчика код будет таким:
Заблуждения
Все пункты приведенного ниже списка являются мифами. Не опирайтесь на эти ложные убеждения, если хотите писать корректный и портируемый код.
Область допустимых значений функции
Статья находится на проверке у методистов Skysmart.
Если вы заметили ошибку, сообщите об этом в онлайн-чат (в правом нижнем углу экрана).
Допустимые и недопустимые значения переменных
В 7 классе заканчивается математика и начинается ее-величество-алгебра. Первым делом школьники изучают выражения с переменными.
Мы уже знаем, что математика состоит из выражений — буквенных и числовых. Каждому выражению, в котором есть переменная, соответствует область допустимых значений (ОДЗ). Если игнорировать ОДЗ, то в результате решения можно получить неверный ответ. Получается, чтобы быстро получить верный ответ, нужно всегда учитывать область допустимых значений.
Чтобы дать верное определение области допустимых значений, разберемся, что такое допустимые и недопустимые значения переменной.
Рассмотрим все необходимые определения, связанные с допустимыми и недопустимыми значениями переменной.
Выражение с переменными — это буквенное выражение, в котором буквы обозначают величины, принимающие различные значения.
Значение числового выражения — это число, которое получается после выполнения всех действий в числовом выражении.
Выражение с переменными имеет смысл при данных значениях переменных, если при этих значениях переменных можно вычислить его значение.
Выражение с переменными не имеет смысла при данных значениях переменных, если при этих значениях переменных нельзя вычислить его значение.
Теперь, опираясь на данные определения, мы можем сформулировать, что такое допустимые и недопустимые значения переменной.
Допустимые значения переменных — это значения переменных, при которых выражение имеет смысл.
Если при переменных выражение не имеет смысла, то значения таких переменных называют недопустимыми.
В выражении может быть больше одной переменной, поэтому допустимых и недопустимых значений может быть больше одного.
Пример 1
Рассмотрим выражение
В выражении три переменные (a, b, c).
Запишем значения переменных в виде: a = 1, b = 1, c = 2.
Такие значения переменных являются допустимыми, поскольку при подстановке этих значений в выражение, мы легко можем найти ответ:
Таким же образом можем выяснить, какие значения переменных — недопустимые.
Подставим значения переменных в выражение
На ноль делить нельзя.
Что такое ОДЗ
ОДЗ — это невидимый инструмент при решении любого выражении с переменной. Чаще всего, ОДЗ не отображают графически, но всегда «держат в уме».
Область допустимых значений (ОДЗ) — это множество всех допустимых значений переменных для данного выражения.
Пример 2
Рассмотрим выражение
Пример 3
Рассмотрим выражение
ОДЗ такого выражения будет выглядеть вот так: b ≠ c; a — любое число.
Такая запись означает, что область допустимых значений переменных b, c и a = это все значения переменных, при которых соблюдаются условия b ≠ c; a — любое число.
Как найти ОДЗ: примеры решения
Найти ОДЗ — это значит, что нужно указать все допустимые значения переменных для выражения. Часто, чтобы найти ОДЗ, нужно выполнить преобразование выражения.
Чтобы быстро и верно определять ОДЗ, запомните условия, при которых значение выражения не может быть найдено.
Мы не можем вычислить значение выражения, если:
Теперь, приступая к поиску ОДЗ, вы можете сверять выражение по всем этим пунктам.
Давайте потренируемся находить ОДЗ.
Пример 4
Найдем область допустимых значений переменной выражения a 3 + 4 * a * b − 6.
В куб возводится любое число. Ограничений при вычитании и сложении нет. Это значит, что мы можем вычислить значение выражения a 3 + 4 * a * b − 6 при любых значениях переменной.
ОДЗ переменных a и b — это множество таких пар допустимых значений (a, b), где a — любое число и b — любое число.
Ответ: (a и b), где a — любое число и b — любое число.
Пример 5
Найдем область допустимых значений (ОДЗ) переменной выражения
Здесь нужно обратить внимание на наличие нуля в знаменатели дроби. Одним из условий, при котором вычисление значения выражения невозможно явлется наличие деления на ноль.
Это значит, что мы может сказать, что ОДЗ переменной a в выражении — пустое множество.
Пустое множество изображается в виде вот такого символа Ø.
Пример 6
Найдем область допустимых значений (ОДЗ) переменных в выражении
Если есть квадратный корень, то нам нужно следить за тем, чтобы под знаком корня не было отрицательного числа. Это значит, что при подстановке значений a и b должны быть условия, при которых a + 3 * b + 5 ≥ 0.
Ответ: ОДЗ переменных a и b — это множество всех пар, при которых a + 3 * b + 5 ≥ 0.
Пример 7
Найдем ОДЗ переменной a в выражении
Прежде всего, нам нужно подобрать такое условие, при котором в знаменателе дроби не будет ноля —
Мы знаем, что выражение под знаком корня должно быть положительным. Это дает нам второе условие: a + 1 ≥ 0.
Мы не можем вычислить логарифм отрицательного выражения. Получаем третье условие: a 2 + 2 > 0.
Выражении в основании логарифма не должно быть отрицательным и не должно равняться единице. Получаем условие 4: a + 6 > 0.
Как видите, записывая ОДЗ, мы ставим квадратные и круглые скобки.
Запомните
Например, если х > 6, но х
Зачем учитывать ОДЗ при преобразовании выражения
Иногда выражение просто невозможно решить, если не выполнить ряд тождественных преобразований. К ним относятся: перестановки, раскрытие скобок, группировка, вынесение общего множителя за скобки, приведение подобных слагаемых.
Кроме того, что видов таких преобразований довольно много: нужно понимать, в каких случаях какое преобразование возможно. В этом может помочь определение ОДЗ.
Тождественное преобразование может:
Рассмотрим каждый случай в отдельности.
Пример 8
Поскольку мы должны следить за тем, чтобы в выражении не возникало деление ноль, определяем условие a ≠ 0.
Это условие отвечает множеству (−∞ ; 0) ∪ (0 ; +∞).
В выражении есть подобные слагаемые, если привести подобные слагаемые, то мы получаем выражение вида a.
ОДЗ для a — это R — множество всех вещественных чисел.
Преобразование расширило ОДЗ — добавился ноль.
Пример 9
Рассмотрим выражение a 2 + a + 4 * a
ОДЗ a для этого выражения — множество R.
В выражении есть подобные слагаемые, выполним тождественное преобразование.
После приведения подобных слагаемых выражение приняло вид a 2 + 5 * a
ОДЗ переменной a для этого выражения — множество R.
Это значит, что тождественное преобразование никак не повлияло на ОДЗ.
Пример 10
Рассмотрим выражение
Решить такое неравенство можно методом интервалов, что дает нам ОДЗ (−∞; 1] ∪ [4 ; +∞).
Затем выполним преобразование исходного выражения по свойству корней: корень произведения = произведению корней.
Приведем выражение к виду
Решив систему линейных неравенств, получаем множество [4; + ∞).
Отсюда видно, что тождественные преобразования сузили ОДЗ.
От (−∞; 1] ∪ [4 ; +∞) до [4; + ∞).
Решив преобразовать выражение, внимательно следите за тем, чтобы не допустить сужение ОДЗ.
Запомните, что выполняя преобразование, следует выбирать такие, которые не изменят ОДЗ.
Операции в языке Си
Над объектами в языке Си могут выполняться различные операции:
Результатом выполнения операции является число.
Операции могут быть бинарными или унарными.
Бинарные операции выполняются над двумя объектами, унарные — над одним.
Операция присваивания
Операция присваивания обозначается символом = и выполняется в 2 этапа:
объект = выражение;
В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.
объект = (тип)выражение;
Операции отношения
Основные операции отношения:
Арифметические операции
Основные бинарные операции, расположенные в порядке уменьшения приоритета:
Основные унарные операции:
Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него). Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций. Если операция ++ или — расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на 1.
Бинарные арифметические операции могут быть объединены с операцией присваивания:
Логические операции
Логические операции делятся на две группы:
Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:
Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.
Основные условные логические операции:
Побитовые логические операции оперируют с битами, каждый из которых может принимать только два значения: 0 или 1.
Основные побитовые логические операции в языке Си:
Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.
a
a; // e = 241 = 1111 0001
f = a ^ b; // f = 7 = 0000 0111
Бит | Маска |
0 | 0x01 |
1 | 0x02 |
2 | 0x04 |
3 | 0x08 |
4 | 0x10 |
5 | 0x20 |
6 | 0x40 |
7 | 0x80 |
Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:
Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:
0x02); // a = 1, бит 1 сброшен
Бинарные побитовые логические операции могут быть объединены с операцией присваивания:
Сдвиговые операции
Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:
Общий синтаксис осуществления операции сдвига:
объект = выражение сдвиг КоличествоРазрядов;
Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2.
Арифметический сдвиг целого числа влево на 1 разряд соответствует умножению числа на 2.
Как записать на языке c что число находится в допустимых значениях
Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ. Среди преимуществ языка Си следует отметить переносимость программ на компьютеры различной архитектуры и из одной операционной системы в другую, лаконичность записи алгоритмов, логическую стройность программ, а также возможность получить программный код, сравнимый по скорости выполнения с программами, написанными на языке ассемблера. Последнее связано с тем, что хотя Си является языком высокого уровня, имеющим полный набор конструкций структурного программирования, он также обладает набором низкоуровневых средств, обеспечивающих доступ к аппаратным средствам компьютера. С 1989 года язык Си регламентируется стандартом Американского института национальных стандартов ANSI С. В настоящее время, кроме стандарта ANSI C разработан международный стандарт ISO C (International Standard Organization C).
В пособии в разделах 1-6 рассматриваются основные конструкции языка Си (общие для Си и Си++). Примеры программ приведены в разделе 7.
РАЗДЕЛ 1. ОСНОВНЫЕ ПОНЯТИЯ И ДАННЫЕ
Основные понятия языка
Программа, написанная на языке Си, состоит из операторов. Каждый оператор вызывает выполнение некоторых действий на соответствующем шаге выполнения программы.
При написании операторов применяются латинские прописные и строчные буквы, цифры и специальные знаки. К таким знакам, например, относятся: точка (.), запятая (,), двоеточие (:), точка с запятой (;) и др. Совокупность символов, используемых в языке, называется алфавитом языка.
В персональном компьютере символы хранятся в виде кодов. Соответствие между каждым символом и его кодом задается специальной кодовой таблицей. На нее разработан стандарт ASCII, поэтому коды символов называют ASCII-кодами.
Для представления каждого символа в персональном компьютере используется один байт, поэтому общее число символов равно 2 8 = 256. Кодовая таблица, которая устанавливает соответствие между символом и его кодом, имеет 256 строк вида:
Первая половина кодовой таблицы является стандартной, а вторая используется для представления символов национальных алфавитов, псевдографических элементов и т.д.
Важным понятием языка является идентификатор, который используется в качестве имени объекта (функции, переменной, константы и др.). Идентификаторы должны выбираться с учетом следующих правил:
В программах на языке Си важная роль отводится комментариям. Они повышают наглядность и удобство чтения программ. Комментарии обрамляются символами /* и */. Их можно записывать в любом месте программы.
В языке Си++ введена еще одна форма записи комментариев. Все, что находится после знака // до конца текущей строки, будет также рассматриваться как комментарий. Отметим, что компилятор языка Си, встроенный в систему программирования Borland C++, позволяет использовать данный комментарий и в программах на Си.
Пробелы, символы табуляции и перехода на новую строку в программах на Си игнорируются. Это позволяет записывать различные выражения в хорошо читаемом виде. Кроме того, строки программы можно начинать с любой позиции, что дает возможность выделять в тексте группы операторов.
Типы данных
Дадим им краткую характеристику:
Объект некоторого базового типа может быть модифицирован. С этой целью используются специальные ключевые слова, называемые модификаторами. В стандарте ANSI языка Си имеются следующие модификаторы типа:
Модификаторы записываются перед спецификаторами типа, например: unsigned char. Если после модификатора опущен спецификатор, то компилятор предполагает, что этим спецификатором является int. Таким образом, следующие строки:
являются идентичными и определяют объект а как длинный целый. Табл. 1 иллюстрирует возможные сочетания модификаторов (unsigned, signed, short, long) со спецификаторами (char, int, float и double), а также показывает размер и диапазон значений объекта (для 16-разрядных компиляторов).
Переменные и константы
Все переменные до их использования должны быть определены (объявлены). При этом задается тип, а затем идет список из одной или более переменных этого типа, разделенных запятыми. Например:
В языке различают понятия объявления переменной и ее определения. Объявление устанавливает свойства объекта: его тип (например, целый), размер (например, 4 байта) и т.д. Определение наряду с этим вызывает выделение памяти (в приведенном примере дано определение переменных).
Переменные можно разделять по строкам произвольным образом, например:
Переменные в языке Си могут быть инициализированы при их определении:
Выясним теперь, где в тексте программы определяются данные. В языке возможны глобальные и локальные объекты. Первые определяются вне функций и, следовательно, доступны для любой из них. Локальные объекты по отношению к функциям являются внутренними. Они начинают существовать, при входе в функцию и уничтожаются после выхода из нее. Ниже показана структура программы на Си и возможные места в программе, где определяются глобальные и локальные объекты.
Отметим, что выполнение программы всегда начинается с вызова функции main( ), которая содержит тело программы. Тело программы, как и тело любой другой функции, помещается между открывающей и закрывающей фигурными скобками.
В языке Си все определения должны следовать перед операторами, составляющими тело функции. В языке Си++ это ограничение снято и определения могут находиться в любом месте программы. Если они сделаны в функции, то соответствующие объекты будут локальными, а если вне функций, то глобальными.
Наряду с переменными в языке существуют следующие виды констант:
Как вводить и выводить информацию
Операции ввода/вывода в языке Си организованы посредством библиотечных функций (причем их довольно много).
Здесь определен тип единственного аргумента (void) и тип возвращаемого функцией значения (int).
присваивает переменной х очередной вводимый символ. Переменная х должна иметь символьный или целый тип.
Объявления getchar( ) и putchar( ) сделаны в заголовочном файле stdio.h, содержащем описания заголовков библиотечных функций стандартного ввода/вывода. Чтобы библиотечные функции стали доступны программе, к ней необходимо подключить данный файл. Подключение осуществляется с помощью директивы препроцессора
помещаемой в начало программы (подробнее см. в разделе 5).
Форматированный вывод данных
Функция printf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный вывод. Ее можно записать в следующем формальном виде:
Управляющая строка содержит компоненты трех типов: обычные символы, которые просто копируются в стандартный выходной поток (выводятся на экран дисплея); спецификации преобразования, каждая из которых вызывает вывод на экран очередного аргумента из последующего списка; управляющие символьные константы.
Каждая спецификация преобразования начинается со знака % и заканчивается некоторым символом, задающим преобразование. Между знаком % и символом преобразования могут встречаться другие знаки в соответствии со следующим форматом:
Все параметры в квадратных скобках не являются обязательными.
На месте параметра c_n (символ преобразования) могут быть записаны:
Необязательные параметры в спецификации преобразования:
Если после знака % записан не символ преобразования, то он выводится на экран. Таким образом, строка %% приводит к выводу на экран знака %.
Функция printf( ) использует управляющую строку, чтобы определить, сколько всего аргументов и каковы их типы. Аргументами могут быть переменные, константы, выражения, вызовы функций; главное, чтобы их значения соответствовали заданной спецификации.
При наличии ошибок, например, в числе аргументов или типе преобразования, результаты будут неверными.
Среди управляющих символьных констант наиболее часто используются следующие:
Например, в результате вызова функции:
сначала выполняется горизонтальная табуляция (\t), т.е. курсор сместится от края экрана, затем на экран будет выведено слово Computer, после этого курсор переместится в начало следующей строки (\n), затем будет выведено целое число i по формату %d (десятичное целое), и, окончательно, курсор перейдет в начало новой строки (\n).
Напечатать строку символов можно и так:
Форматированный ввод данных
Функция scanf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный ввод. Ее можно записать в следующем формальном виде:
Аргументы scanf( ) должны быть указателями на соответствующие значения. Для этого перед именем переменной записывается символ &. Назначение указателей будет рассмотрено далее.
Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В нее могут включаться:
Рассмотрим символы преобразования функции scanf( ) (указываются после символа %):
Перед некоторыми символами преобразования могут записываться следующие модификаторы:
Ввести целое число (int a;), символ (char b;) и вещественное число (float t;) можно так:
РАЗДЕЛ 2. ОПЕРАЦИИ И ОПЕРАТОРЫ
Операции языка Си
Операции выполняются в строгой последовательности. Величина, определяющая преимущественное право на выполнение той или иной операции, называется приоритетом. В табл. 2 перечислены различные операции языка Си. Их приоритеты для каждой группы одинаковы (группы выделены цветом). Чем большим преимуществом пользуется соответствующая группа операций, тем выше она расположена в таблице. Порядок выполнения операций может регулироваться с помощью круглых скобок.