Добавлен: 20.05.2023
Просмотров: 361
Скачиваний: 4
СОДЕРЖАНИЕ
2. ОСНОВНЫЕ СВОЙСТВА АЛГОРИТМОВ
3. ОБЩИЕ ПРИНЦИПЫ РАЗРАБОТКИ АЛГОРИТМОВ
4. СПОСОБЫ ОПИСАНИЯ АЛГОРИТМОВ
5. РАЗВЕТВЛЯЮЩИЙСЯ АЛГОРИТМ С++
5.1. РЕАЛИЗАЦИЯ АЛГОРИТМОВ НА ЯЗЫКАХ ПРОГРАММИРОВАНИЯ
5.2. СОСТАВ И ОПИСАНИЕ АЛГОРИТМИЧЕСКОГО ЯЗЫКА
5.3.1. ТИПЫ ДАННЫХ В ЯЗЫКЕ С++
5.3.2. АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ И ОПЕРАТОРЫ ОТНОШЕНИЯ ЯЗЫКА С++
5.3.2. АРИФМЕТИЧЕСКИЕ ОПЕРАТОРЫ И ОПЕРАТОРЫ ОТНОШЕНИЯ ЯЗЫКА С++
Существуют унарные операторы (unary operator) и парные операторы (binary operator). Унарные операторы, такие как обращение к адресу (&) и обращение к значению (*), воздействуют на один операнд. Парные операторы, такие как равенство (==) и умножение (*), воздействуют на два операнда. Существует также (всего один) тройственный оператор (ternary operator), который использует три операнда, а также оператор вызова функции (function call), который получает неограниченное количество операндов.
Некоторые символы (symbol), например *, используются для обозначения как унарных (обращение к значению), так и парных (умножение) операторов. Представляет ли символ унарный оператор или парный, определяет контекст, в котором он используется. В использовании таких символов нет никакой взаимосвязи, поэтому их можно считать двумя разными символами. Группировка операторов и операндов Чтобы лучше понять порядок выполнения выражений с несколькими операторами, следует рассмотреть концепцию приоритета (precedence), порядка (associativity) и порядка вычисления (order of evaluation) операторов.
В ходе вычисления выражения операнды нередко преобразуются из одного типа в другой. Например, парные операторы обычно ожидают операндов одинакового типа. Но операторы применимы и к операндам с разными типами, если они допускают преобразование в общий тип.
Хотя правила преобразования довольно сложны, по большей части они очевидны. Например, целое число можно преобразовать в число с плавающей запятой, и наоборот, но преобразовать тип указателя в число с плавающей точкой нельзя. Немного неочевидным может быть то, что операнды меньших целочисленных типов (например, bool, char, short и т.д.) обычно преобразуются (promotion) в больший целочисленный тип, как правило int.
Приоритет
Выражения с двумя или несколькими операторами называются составными (compound expression). Результат составного выражения определяет способ группировки операндов в отдельных операторах. Группировку операндов определяют приоритет и порядок. Таким образом, они определяют, какие части выражения будут операндами для каждого из операторов в выражении. При помощи скобок программисты могут изменять эти правила, обеспечивая необходимую группировку. Обычно значение выражения зависит от того, как группируются его части. Операнды операторов с более высоким приоритетом группируются прежде операндов операторов с более низким приоритетом. Порядок определяет то, как группируются операнды с тем же приоритетом.
Например, операторы умножения и деления имеют одинаковый приоритет относительно друг друга, но их приоритет выше, чем у операторов сложения и вычитания. Поэтому операнды операторов умножения и деления группируются прежде операндов операторов сложения и вычитания. Арифметические операторы имеют левосторонний порядок, т.е. они группируются слева направо
Таблица 2. Арифметические операторы (левосторонний порядок)
|
Оператор |
Действие |
Применение |
|
+ |
Унарный плюс |
+ выражение |
|
- |
Унарный минус |
- выражение |
|
* |
Умножение |
выражение * выражение |
|
/ |
Деление |
Выражение / выражение |
|
% |
Остаток |
Выражение % выражение |
|
+ |
Сложение |
Выражение + выражение |
|
- |
Вычитание |
Выражение - выражение |
Примененные к объектам арифметических типов, операторы +, -, * и / имеют вполне очевидные значения: сложение, вычитание, умножение и деление. Результатом деления целых чисел является целое число. Получаемая в результате деления дробная часть отбрасывается
Оператор % известен как остаток (remainder), или оператор деления по модулю (modulus). Он позволяет вычислить остаток от деления левого операнда на правый. Его операнды должны иметь целочисленный тип.
Оператор деления по модулю определен так, что если m и n целые числа и n отлично от нуля, то (m/n)*n + m%n равно m. По определению, если m%n отлично от нуля, то у него тот же знак, что и у m. Прежние версии языка разрешали результату выражения m%n иметь тот же знак, что и у m, причем на реализациях, у которых отрицательный результат выражения m/n округлялся не до нуля, но такие реализации сейчас запрещены. Кроме того, за исключением сложного случая, где -m приводит к переполнению, (-m)/n и m/(-n) всегда эквивалентны -(m/n), m%(-n) эквивалентно m%n и (-m)%n эквивалентно -(m%n)
Логические операторы и операторы отношения
|
Порядок |
Оператор |
Действие |
Применение |
|
Правосторонний |
! |
Логический Not |
! выражение |
|
Левосторонний |
< |
Меньше |
Выражение < выражение |
|
Левосторонний |
<= |
Меньше или равно |
Выражение <= выражение |
|
Левосторонний |
> |
Больше |
Выражение > выражение |
|
Левосторонний |
>= |
Больше или равно |
Выражение >= выражение |
|
Левосторонний |
== |
Равно |
Выражение == Выражение |
|
Левосторонний |
!= |
Не равно |
Выражение != Выражение |
|
Левосторонний |
&& |
Логическое AND |
Выражение && Выражение |
|
Левосторонний |
|| |
Логическое OR |
Выражение || Выражение |
Таблица 3
Теперь рассмотрим более подробно операторы рассмотренные в таблице 3.
Операторы логического AND и OR
Общим результатом оператора логического AND (&&) является true, если и только если оба его операнда рассматриваются как true. Оператор логического OR (||) возвращает значение true, если любой из его операндов рассматривается как true. Операторы логического AND и OR всегда обрабатывают свой левый операнд перед правым. Кроме того, правый операнд обрабатывается, если и только если левый операнд не определил результат. Эта стратегия известна как вычисление по сокращенной схеме (short-circuit evaluation). • Правая сторона оператора && вычисляется, если и только если левая сторона истинна. • Правая сторона оператора || вычисляется, если и только если левая сторона ложна.
Оператор логического NOT (!) возвращает инверсию исходного значения своего операнда.
Операторы отношения (<=, >, <=) имеют свой обычный смысл и возвращают значение типа bool. Эти операторы имеют левосторонний порядок.
5.3.3. ОПЕРАТОРЫ IF И SWITCH C++
Получив понимание того какие типы данных реализованы в языке С++, а так- же какие алгоритмические операторы и операторы отношения к ним могут применяться, можно перейти к изучению операторов, реализованных в языке С++ для разветвляющихся алгоритмов.
Как и в любом языке программирования, существуют два вида операторов ветвления (или, иначе, их называют условными операторами). Первый из них оператор IF. Данный оператор дает возможным два дальнейших пути для программы. Синтаксис оператора следующий:
if (условие) оператор_1; else оператор_2;
Здесь условие — это логическое выражение, переменная или константа.
Работает условный оператор следующем образом. Сначала вычисляется значения выражения, записанного в виде условия. Если оно имеет значение истина (true), выполняется оператор_1. В противном случае (значение ложное (false) ) оператор_2.
Если в задаче требуется, чтобы в зависимости от значения условия выполнялся не один оператор, а несколько, их необходимо заключить в фигурные скобки, как составной оператор.
if (условие) { оператор_1; оператор_2; … }
else { оператор_1; оператор_2; … }
Альтернативная ветвь else в условном операторе может отсутствовать, если в ней нет необходимости.
Рассмотрим несколько примеров использования оператора IF при написании программы.
Пример 1.
Необходимо проверить на равенство две переменные a и b. Код с блоком IF будет выглядеть следующим образом:
int a, b; //инициализация переменных
cin>>a; // ввод значения переменной a
cin>>b; // ввод значения переменной b
if (a==b)
cout<<"a equal b"; // если значения данных переменных равны вывести сообщение об этом
else
cout<<"a not equal b"; // иначе вывести сообщение о противном
Пример 2.
Необходимо произвести сравнение показателей производства относительно имеющихся стандартов.
CONST int kpdWorkers = 80;
CONST int kpdMashineTools = 75; //данные константы будут являться стандартами
Int ActualkpdWorkers, ActualkpdMashineTools; //переменные хранящие фактические значения работоспособности
Cin>> ActualkpdWorkers;
Cin>> ActualkpdMashineTools;
//теперь проводим сравнение фактических показателей со стандартами
IF (ActualkpdWorkers >= kpdWorkers) && (ActualkpdMashineTools>= kpdMashineTools)
Cout<< “Производство работает корректно”;
ELSE
{
IF (ActualkpdWorkers >= kpdWorkers)
Cout<< “Производительность станков не удовлетворяет стандартам”;
ELSE
Cout<< “Производительность рабочих не удовлетворяет стандартам”;
}
Теперь перейдем к оператору множественного выбора switch. Если IF дает возможность указать лишь два пути хода программы, то оператор switch позволяет указать множество путей.
Синтаксис оператора switch следующий:
switch (выражение)
{
case значение_1: операторы_1; break;
case значение_2: операторы_2; break;
case значение_3: операторы_3; break;
…
case значение_n: операторы_n; break;
default: операторы; break;
}
Оператор работает следующем образом. Вычисляется значение выражения.
Затем выполняются операторы, помеченные значением, совпадающим со значением выражения. То есть если, выражение принимает значение_1, то выполняются операторы_1 и т.д.. Если выражение не принимает ни одного из значений, то выполняются операторы, расположенные после слова default.
Ветвь default может отсутствовать, тогда оператор имеет вид:
switch (выражение)
{
case значение_1: операторы_1; break;
case значение_2: операторы_2; break;
case значение_3: операторы_3; break;
…
case значение_n: операторы_n; break;
}
Оператор break необходим для того, чтобы осуществить выход из операторы switch. Если он не указан, то будут выполняться следующие операторы из списка, несмотря на то, что значение, которым они помечены, не совпадает со значением выражения.
Рассмотрим пример использования данного оператора.
Необходимо вывести на название дня недели, соответствующее заданному числу D, при условии, что в месяце 31 день и 1-е число — понедельник.
unsigned int D, R; //описанны целые положительные числа