UL 89Lu 89ul 89 LU - unsigned short
Void main ( )
#include <имя.h> | → | Подключение заголовочных файлов |
function1 ( ) { оператор; } function2 ( ) { оператор; } … | → | Определение функций программы |
void main ( ) | → | Определение главной функции |
{ | → | Начало тела главной функции |
оператор 1; оператор 2; … оператор 3; | → | Операторы функции |
function1 ( ); function2 ( ); … | → | Вызов функций программы |
} | → | Конец тела главной функции |
Рисунок 1.1 – Структура программы на языке С++
Обычную функцию необходимо вызывать (обращаться к ней) программно, в ходе выполнения кода. Функция main() вызывается операционной системой, и обратиться к ней из кода программы невозможно. Слово void служит признаком того, что программа не возвращает конкретного значения. В случае возврата значения операционной системе перед функцией main() указывается слово int, а в конце тела этой функции помещается выражение return() или return0.
После определения главной функции следуют операторы программы, которые заключены в группирующие фигурные скобки { }. Каждый оператор оканчивается точкой с запятой (;), указывающей на его завершение. Программа выполняется по строкам, в порядке их расположения в исходном коде, до тех пор, пока не встретится вызов какой-нибудь функции, тогда управление передается строкам этой функции. После выполнения функции управление возвращается той строке программы, которая следует за вызовом функции. Более подробно функции будут рассмотрены позже.
1.3 Стандартные типы данных
1.3.1 Базовые типы данных и их объем
Определяя данные, необходимо предоставить компилятору информацию об их типе. Благодаря этой информации компилятору будет известно, сколько места нужно выделить (зарезервировать) для хранения информации и какого рода значение в ней будет находиться.
В С++ определены пять базовых типов данных: символьные (char), целые (int), вещественный с плавающей точкой (float), вещественный с плавающей точкой двойной длины (double), а также пустой, не имеющий значения тип (void).
На основе перечисленных типов строятся все остальные. Простейшим приемом является использование модификаторов типа, которые ставятся перед соответствующим типом: знаковый (signed), беззнаковый (unsigned), длинный (long) и короткий (short). В таблице А3 приведены все возможные типы с различными комбинациями модификаторов с указанием диапазона изменения и занимаемого размера в байтах.
При многократном использовании в программе типов данных с различными комбинациями модификаторов, например, unsigned short int, легко сделать синтаксические ошибки, во избежание которых в С++ предусмотрена возможность создания псевдонима (синонима) с помощью ключевого слова typedef. Например, строка typedef unsigned short int USHORT;создает новый псевдоним USHORT, который может использоваться везде, где нужно было бы написать unsigned short int.
1.3.2 Переменные, константы, символы
Переменная – это имя, связанное с областью памяти, которая отведена для временного размещения хранимого значения и его последующего извлечения. Для длительного (постоянного) хранения значений переменных используются базы данных или файлы. В С++ все переменные должны быть объявлены до их использования. Объявление предполагает наличие имени переменной и указание ее типа. Однако следует иметь в виду, что нельзя создать переменную типа void. Основная форма объявления переменных имеет вид
тип <список_переменных>;
В этом объявлении: тип– один из существующих типов переменных; <список_переменных>может состоять из одной или нескольких переменных, разделенных запятыми. Например,
int x, e, z;
float radius;
long double integral;
Можно объявлять переменные и одновременно присваивать им значения, т.е. инициализировать их. Инициализацией называется присваивание переменным начальных значений. Например,
int min=15; float p1=1.35;
Переменная называется глобальной, если она объявлена вне каких-либо функций, в том числе функции main (). Такая переменная может использоваться в любом месте программы (за исключением глобальных статических переменных), а при запуске программы ей присваивается нулевое значение. Переменная, объявленная внутри тела функции (одного блока), является локальной и может использоваться только внутри этого блока. Вне блока она неизвестна. Важно помнить, что:
- две глобальные переменные не могут иметь одинаковые имена;
- локальные переменные разных функций могут иметь одинаковые имена;
- две локальные переменные в одном блоке не могут иметь одинаковые имена.
Данные в языках программирования могут представляться также в виде констант. Константы используются в тех случаях, когда программе запрещено изменять значение какой-либо переменной. Для определения константы традиционным способом используется #define, которая просто выполняет текстовую подстановку. Например,
#define StudentsOfGroup 15
В данном случае константа StudentsOfGroup не имеет конкретного типа и каждый раз, когда препроцессор встречает имя StudentsOfGroup, он заменяет его литералом 15. Поскольку препроцессор запускается раньше, компилятор никогда не увидит константу, а будет видеть только число 15.
Наиболее удобным способом определения констант является следующий:
const тип имя_константы = значение_константы;
Этот способ облегчает дальнейшее сопровождение программы и предотвращает появление ошибок. Так как определение константы содержит тип, компилятор может проследить за ее применением только по назначению (в соответствии с объявленным типом). Например,
const int Diapazon=20;
Литеральные константы (литералы) – это значения, которые вводятся непосредственно в текст программы. Поскольку после компиляции нельзя изменить значения литералов, их также называют константами. Например, в выражении int MyAge=19; имя MyAgeявляется переменной типа int, а число 19 – литеральной константой, которой нельзя присвоить никакого иного значения.
Символьная константасостоит из одного символа, заключенного в апострофы: ‘q’, ‘2’, ‘$’. Например,
const char month=’December’;
К символьным константам относятся специальные символы (в том числе управляющие, список приведен в таблице А1).
Строковые константы состоят из последовательности символов кода ASCII, заключенной в кавычки, оканчивающейся нулевым байтом. Конец символьной строки (нулевой байт) обозначается символом NULL ('\0').
Перечислимые константы позволяют создавать новые типы данных, а затем определять переменные этих типов, значения которых ограничены набором значений константы. Для создания перечисляемой константы используется ключевое слово enum, а запись имеет вид
enum имя_константы {список_значений_константы};
Значения константы в списке значений разделяются запятыми. Например,
enum COLOR {RED, BLUE, GREEN, WHITE, BLACK};
Каждому элементу перечисляемой константы соответствует определенное значение. По умолчанию первый элемент имеет значение 0, а каждый последующий - на единицу большее. Каждому элементу константы можно присвоить произвольное значение, тогда последующие инициализируются значением на единицу больше предыдущего. Например,
enum COLOR {RED=100, BLUE, GREEN=200, WHITE=300, BLACK};
В этом примере значение RED=100, BLUE=101, GREEN=200,WHITE=300,BLACK=301.
Существует механизм явного задания типов констант с помощью суффиксов. Для констант целого типа в качестве суффиксов могут использоваться буквы u, l, h, L,H, а для чисел с плавающей точкой – l, L, f, F.Например,
H 34H - short int
L -273l - long int
F 67.7E-24F - float
uL 89Lu 89ul 89 LU - unsigned short
1.3.3 Выражения, операции, операторы
Выражение в языке С++ представляет собой некоторую допустимую комбинацию операций и операндов (констант, переменных или функций). Перечень операций языка C++ приведен в таблице А4. Все перечисленные операции выполняются традиционным способом, за исключением операции деления. Особенность операции деления заключается в том, что если оба операнда целого типа, то она даст целый результат, например, 3/2даст 1. Для получения действительного результата необходимо иметь хотя бы один действительный операнд, например, 3/2.0 даст 1.5.
Для каждой операции языка определено количество операндов:
а) один операнд – унарная операция, изменяющая знак, например, унарный минус –х;
б) два операнда – бинарная операция, например, операция сложения х+у;
в) три операнда – операция условие ?:, она единственная.
Каждая операция может иметь только определенные типы операндов. Каждая бинарная операция имеет определенный порядок выполнения: слева направо или справа налево. Наконец, каждая операция имеет свой приоритет. Приоритет и порядок выполнения операций приводятся в таблице А4.
Часто в выражениях используются математические функции языка C++, которые находятся в библиотеке math, расположенной в каталоге INCLUDE. Чтобы воспользоваться этими функциями в начало программы необходимо включить заголовочный файл #include <math.h>. Основные математические функции приводятся в таблице А5.
Все выражения являются операторами.
Операторы в языке C++ предназначены для описания действий. Любой оператор может быть помечен меткой. Операторы отделяются друг от друга точкой с запятой (;).
В любом месте программы, где может быть размещен один оператор, можно разместить составной оператор, называемый блоком. Блок содержит несколько операторов, которые выполняются как одно выражение, ограничивается фигурными скобками {}, но не заканчивается точкой с запятой (;).
Объявление переменной в программе означает всего лишь выделение места в памяти компьютера для ее размещения. Программа же должна позволять оперировать данными. В этом процессе наиболее важна операция присваивания, которая выглядит следующим образом: переменная = выражение. Операция присваивания заменяет значение операнда, расположенного слева от знака «=», значением, вычисляемым справа от него. При этом могут выполняться неявные преобразования типа. Знак «=» в С++ - это знак присваивания, а не равенства.
В отличие от других языков, где присваивание – оператор по определению, в С++ существуют понятия «операция присваивания» и «оператор присваивания». Операция «превращается» в оператор, если в конце выражения поставить точку с запятой, например, ++x – это выражение, а ++х ; - это оператор. Оператор присваивания удобно использовать при инициализации переменных, например, j=k;. Кроме того, в C++ операция присваивания может использоваться в выражениях, которые включают в себя операторы сравнения или логические операторы, например, if ((x=x+5)>0) cout<<"Вывод";.В этом примере сначала переменная х увеличивается на 5, а затем ее значение сравнивается с нулем.
Еще одной особенностью использования операции присваивания в С++ является возможность многократного присваивания, которое выполняется справа налево. Например, для того, чтобы присвоить значение 2*k нескольким переменным, можно воспользоваться операцией: x=y=z=2*k.
В языке C++ имеются дополнительные операции присваивания +=, -=, *=, /= и %=. При этом величина, стоящая справа, добавляется (вычитается, умножается, делится или делится по модулю) к значению переменной, стоящей слева. Например, вместо оператора х=х+5; можно записать х+=5;. Причем, операция х+=5выполняется быстрее, чем операциях=х+5.
Очень часто в программах к переменным добавляется (или вычитается) единица. В языке С++ увеличение значения на 1 называется инкрементом (++), а уменьшение на 1 - декрементом (--). Например, оператор с=с+1; эквивалентен оператору с++;, оператор с=с-1; эквивалентен оператору с--;.
Операторы инкремента и декремента существуют в двух вариантах: префиксном и постфиксном.
Префиксные операции увеличивают (или уменьшают) значение переменной на единицу, а затем используют это значение. Например, оператор х=++у; эквивалентен выполнению двух операторов у=у+1; х=у;. В этом примере сначала происходит увеличение на единицу значения переменной у, а затем присваивание этого значения переменной х.
Постфиксные операции сначала используют значение переменной, после чего увеличивают (или уменьшают) его. Например, оператор х=у--; эквивалентен выполнению двух операторов х=у; у=у-1;. В этом примере переменная х получает значение у, после чего значение у уменьшается на единицу.
1.3.4 Преобразование типов
Строго говоря, в выражениях лучше использовать операнды одного типа, но С++ допускает преобразование типов, то есть если операнды принадлежат к разным типам, то они приводятся к некоторому общему типу. Приведение выполняется в соответствии со следующими правилами:
а) автоматически производятся лишь те преобразования, которые превращают операнды с меньшим диапазоном значений в операнды с большим диапазоном значений, т.к. это происходит без какой-либо потери информации;
б) выражения, не имеющие смысла (например, число с плавающей точкой в роли индекса), не пропускаются компилятором еще на этапе трансляции;
в) выражения, в которых могла бы потеряться информация (например, при присваивании длинных целых значений более коротким или действительных значений целым), могут вызвать предупреждение (warning), но они допустимы.
В отличие от других языков программирования в С++ для любого выражения можно явно указать преобразование его типа, используя унарный оператор, называемый приведением типа. Выражение приводится к указанному типу по перечисленным правилам конструкцией вида
(имя типа) выражение;
Например, (int) i=2.5*3.2;
Однако пользоваться этим оператором можно лишь в том случае, если вполне осознаются цель и последствия такого преобразования.
1.4 Задания к лабораторной работе
Изучить особенности использования среды Turbo С++ (или консольного приложения C++ Builder) и набрать в ней заготовку программы:
#include <math.h>
#include <iostream.h>
Void main ()
{
//инициализация переменных
//вычисление выражения
cout<<”Result=”<<y;
//операция над результирующей переменной
cout<<”Result operation”<<y;
}
1.4.1 Согласно варианту (таблица 1.1) записать арифметическое выражение, используя библиотеку стандартных математических функций.
1.4.2 Инициализировать все входные и объявить все выходные переменные, используя известные типы данных.
1.4.3 Разместить переменные и выражение в заготовке программы.
1.4.4 Выполнить с результирующей переменной операцию, указанную в варианте (таблица 1.1).
Таблица 1.1 – Варианты заданий
№ варианта | Арифметическое выражение | Входные переменные | Константы (const) | Операция |
a, b | c | инкремент | ||
x, z | a | декремент | ||
x, z | a | *= const | ||
a, b | c | -=const | ||
x, z | a | +=const | ||
a, b | x | /=const | ||
x, z | a | декремент | ||
x, z | b | декремент | ||
a, b | x | *= const | ||
a, b | x | -=const | ||
x, z | a | +=const | ||
x, z | b | /=const | ||
x, z | b | инкремент | ||
x, z | b | декремент | ||
x, z | a | *= const | ||
a, b | x | -=const |
Окончание таблицы 1.1
x, z | b | +=const | ||
a, b | x | /=const | ||
a, b | x | инкремент | ||
x, z | a | инкремент | ||
x, z | a | *= const | ||
x, z | a | -=const | ||
a, b | x | +=const | ||
a, b | c | /=const | ||
a, b | x | инкремент | ||
a, b | x | декремент | ||
a, b | x | *= const | ||
x, z | a | -=const | ||
a, b | c | +=const | ||
x, z | a | /=const |
1.5 Контрольные вопросы
1.5.1 Какие особенности языка следует учитывать при идентификации переменных? Как инициализируется переменная?
1.5.2 Как подключаются необходимые библиотеки? Где они размещаются?
1.5.3 Какие типы комментариев существуют в С++ и в чем их разница?
1.5.4 В чем заключаются особенности функции main()?
1.5.5 Перечислите базовые типы данных. Какие модификаторы могут быть использованы для получения новых типов?
1.5.6 Каковы особенности операции присваивания в С++?
1.5.7 Каковы преимущества использования ключевого слова const вместо директивы #define?
1.5.8 Что представляют собой перечислимые константы и как они объявляются?
1.5.9 Что представляют собой выражения и операции? Какие существуют типы операндов?
1.5.10 С какой целью выполняется преобразование типов и каких правил следует придерживаться при этом?
2 Лабораторная работа №2. Программирование алгоритмов линейной и разветвляющейся структуры
Цель работы – ознакомиться с особенностями использования операторов ввода-вывода данных и операторов передачи управления, а также с программированием алгоритмов линейной и разветвленной структур.
2.1 Линейные алгоритмы и операторы ввода-вывода
В любой достаточно сложной программе можно выделить линейные фрагменты. Фрагмент программы имеет линейную структуру, если все операции в нем выполняются последовательно, друг за другом, и может содержать операторы присваивания, математические функции, арифметические операции, функции ввода-вывода данных и другие операторы, не изменяющие общего порядка следования операторов.
Редкая программа обходится без операций ввода-вывода. В языке С его авторами были реализованы две новаторские идеи: средства ввода-вывода были отделены от языка и вынесены в отдельную библиотеку stdio (стандартная библиотека ввода-вывода, входит в стандарты С/C++), а также была разработана и реализована концепция процесса ввода/вывода, независимого от устройств. Таким образом, С++ имеет большой набор функций, осуществляющих ввод-вывод данных различных типов.
Для реализации форматного ввода-вывода часто используются две функции, подключаемые с помощью заголовочного файла #include <stdio.h>: printf и scanf. Использование этих функций С++ унаследовал от своего «прародителя» языка С.
Функцию printf можно использовать для вывода любой комбинации символов, целых и вещественных чисел, строк, беззнаковых целых, длинных целых и беззнаковых длинных целых. Она описывается следующим образом:
printf (“управляющая_строка”, список_аргументов);
Список аргументов – это последовательность констант, переменных или выражений, значения которых выводятся на экран в соответствии с форматом управляющей строки, которая определяет количество, тип аргументов и обычно содержит следующие объекты:
- обычные символы, выводимые на экран без изменений;
- спецификации преобразования, каждая из которых вызывает вывод на экран значения очередного аргумента из последующего списка аргументов;
- управляющие символьные константы (список наиболее используемых констант приводится в таблице A1).
Спецификация преобразования начинается с символа % и заканчивается символом преобразования (таблица A6), между которыми могут записываться:
- знак «минус», указывающий на то, что выводимый текст выравнивается по левому краю, по умолчанию выравнивание происходит по правому краю;
- строка цифр, задающая минимальный размер поля вывода;
- точка, являющаяся разделителем;
- строка цифр, задающая точность вывода;
- символ l, указывающий, что соответствующий аргумент имеет тип long.
Например,
printf ("\nВозраст Эрика - %d. Его доход $%.2f", age, income);
Предполагается, что целой переменной age (возраст) и вещественной переменной income (доход) присвоены какие-то значения. Последовательность символов \nпереводит курсор на новую строку, поэтому последовательность символов «Возраст Эрика» будет выведена с начала новой строки. Символы %d являются символами преобразования формата (спецификацией) для переменной age. Затем следует литерная строка «Его доход $» и символы %.2f - спецификация для значения переменной income, а также указание формата для вывода только двух цифр после десятичной точки.
Функция ввода данных scanfописывается аналогично функции printf:
scanf (“управляющая_строка”, список_аргументов);
Аргументы функции scanf должны быть указателями на соответствующие значения (более подробно указатели будут рассмотрены позже), для чего перед именем переменной записывается символ &. Как и в функции printf, управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В ней допустимо использование пробелов, символов табуляции и перехода на новую строку, которые игнорируются при вводе. В управляющей строке спецификации преобразования должны быть отделены теми же разделителями, что и при вводе с клавиатуры. Например, scanf (“%d %f %c”, &i, &a, &ch);
Пример 2.1 - Составить программу вычисления объема V и площади поверхности полого шара S по заданным внешнему R и внутреннему r радиусам, если известно, что S = 4p (R2-r2), V = 4/3p (R3-r3).
#include <stdio.h> //подключение заголовочных файлов
#include <math.h>
#define Pi 3.1415926 //определение символической константы Pi
Void main ( )
{
double S, V;
float R, r;
printf (“Введите внешний и внутренний радиусы R и r:”);
scanf (“%f%f”, &R, &r);
printf (“S=%g,V=%f\n”,S=4*Pi*(R*R-r*r),V=4/3*Pi*(pow(R,3)-pow(r,2)));
}
Программы на С/С++ не имеют дело ни с устройствами, ни с файлами - они работают с потоками. Ввод информации осуществляется из входного потока, вывод производится в выходной поток,которые связаны с устройством или с файлом. В C++ концепция независимого от устройств ввода/вывода получила дальнейшее развитие в виде объектно-ориентированной библиотеки ввода/вывода iostream, в которую входят объект coutдля вывода данных на экран и объект cin, используемый для ввода информации.
Оператор вывода cout выглядит следующим образом:
cout<<переменная1<<...<<переменнаяN;
Знак “<<” называется операцией вставки, которая вставляет символы в выходной поток. Для перевода курсора в начало следующей строки в операторе cout часто используется символ endl (конец строки), например, cout<<xl<<endl;. В операторе вывода можно использовать специальные символы, которые должны быть заключены в одинарные кавычки, если они используются самостоятельно, например: соut<<'\а'<<"Звонок";.Если же специальные символы используются внутри двойных кавычек, то дополнительно заключать их в апострофы не нужно.
Например,
cout<<"Вывод\tx="<<x<<endl;
По умолчанию в C++ числа выводятся в десятичной системе счисления. Для вывода чисел в восьмеричной или шестнадцатеричной системе счисления внутри выходного потока нужно разместить модификаторы oct или hex. Чтобы вернуться к десятичной системе счисления, следует воспользоваться модификатором dec.
Например,
cout<<”8-cc: “<<oct<<x<<endl;
cout<<”16-cc: “<<hex<<x<<endl;
cout<<”10-cc: “<<dec<<x<,endl;
Для организации форматного вывода чисел с помощью оператора cout можно воспользоваться функциями, предоставляемыми библиотекой iomanip, включив в программу заголовочный файл #include <iomanip.h>:
а) с помощью модификатора setw можно в явном виде указать число позиций, отводимых под число (ширину вывода), например,
cout<<"Число"<<setw (10)<<5<<endl;
В результате выполнения этого оператора на экран дисплея будет выведено:
Число 5
Тот же результат можно получить, воспользовавшись функцией cout.width:
cout<<"Число";
cout.width (10);
cout<<5<<endl;
б) функция cout.fill позволяет указать символ заполнения пустого пространства, который cout будет использовать вместо пробела при выводе данных с помощью модификатора setw или функции cout.width, например,
cout. fill ('.') ;
cout<<"Число"<<setw (10)<<5<<endl;
В результате выполнения этих операторов на экран дисплея будет выведено:
Число…..5
в) для управления форматом вывода чисел с плавающей точкой можно воспользоваться манипулятором setprecision, который определяет количество цифр после десятичной точки, например,
float x=3.14159265359;
cout<<setprecision(5)<<x<<endl;
В результате выполнения этого оператора на экран будет выведено: 3.14159
г) для посимвольного вывода на экран используется функция cout.put, например,
char с[ ]="Си++";
cout.put (c[0]);
cout.put (c[2]) ;
cout.put (c[3]);
Результатом выполнения блока будет: C++.
Оператор ввода cin имеет вид:
cin>>переменная1>>...>>переменнаяN;
Знак “>>” называется операцией извлечения (эта операция извлекает данные из входного потока, присваивая значение указанной переменной). Значения вводимых переменных должны соответствовать типам переменных, указанным в операторах объявления, а при вводе с клавиатуры отделяются друг от друга хотя бы одним пробелом, например, 1.5 2.15 -1.1 25.
Значения символьных переменных и строк при вводе записываются во входном потоке без апострофов или кавычек. Для их ввода C++ предоставляет дополнительно две функции: cin.get и cin.getline. В случае, когда необходимо считывать по одному символу, следует воспользоваться функцией cin.get, например, cl=cin.get();. Тогда символьная переменная, объявленная char cl, получит значение символа, введенного с клавиатуры. Если же нужно ввести с клавиатуры целую строку, можно воспользоваться функцией cin.getline, указав имя символьной строки и ее длину (с учетом нулевого байта), например, cin.getline(c2,11);. В этом случае в символьную строку, объявленную char с2 [64], будет записано 10 символов, введенных с клавиатуры.
Пример 2.2 – Вычислить целую часть и остаток от деления чисел xиy.
#include <iostream.h> //подключение заголовочных файлов
Void main ( )
{
int x, y; /* переменные х и у объявлены как целочисленные,
т.к. остаток от деления даст операция %, применяемая исключительно к целым переменным, а целую часть можно получить, если учесть, что при обычном делении двух целых чисел остаток отбрасывается */
cout<<“Введите значения х и у:”<<endl;
cin>>x>>y;
cout<<’\n’<<”Целая часть от деления:”<<x/y<<endl;
cout<<’\n’<<”Остаток от деления:”<<x%y<<endl;
}
Для оформления внешнего вида программы можно воспользоваться функциями, которые описываются в заголовочном файле #include <conio.h>:
а) цвет фона текста устанавливается с помощью функции:
void textbackground (int bkcolor);
где bkcolor (цвет фона) – число от 0 до 7 или одна из констант (BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY);
б) цвет символов устанавливается с помощью функции:
void textcolor (int txcolor);
где txcolor (цвет текста) может быть числом от 0 до15, либо одной из констант (BLACK, …, LIGHTGRAY, DARKGRAY, LIHGTBLUE, …, LIGHTMAGENTA, YELLOW, WHITE);
в) для очистки экрана или текущего текстового окна используется функция:
void clrscr ();
2.2 Разветвляющиеся алгоритмы и операторы передачи управления
Для изменения естественной последовательности выполнения операторов (передачи управления) в C++ содержится ряд специальных конструкций, относящихся к конструкциям принятия решений и по своему смыслу совпадающих с аналогичными конструкциями алгоритмов.
К операторам передачи управления относятся оператор безусловного перехода, оператор условного перехода, оператор выбора (варианта), которые имеют аналоги и в других языках программирования (например, в Pascal), а также троичный условный оператор.
Оператор безусловного перехода имеет вид:
goto метка;
Метка перехода указывает оператор в программе, которому следует передать управление. При выполнении оператора goto переход осуществляется без проверки каких-либо условий. Поскольку такие переходы разрушают связи между структурой программы и структурой вычислений, что приводит к потере ясности программы и затрудняет задачу верификации, оператор безусловного перехода следует использовать только в исключительных ситуациях.
Оператор условного перехода предназначен для выбора одного из двух вариантов развития решения задачи в зависимости от значения некоторого проверяемого условия, и его полная форма имеет вид:
if (условие) оператор1; else оператор2;
В качестве условия используется некоторое произвольное выражение, задающее условие выбора выполняемого оператора; оператор1 и оператор2 могут быть как простыми, так и составными. Если условие истинно (TRUE или любое ненулевое значение), то выполняется оператор1, если же условие ложно (FALSE или нуль), то выполняется оператор2. Например, if (x==3) b=1; else b=0;
Краткая форма оператора условного перехода имеет вид:
if (условие) оператор;
В этом случае, если условие истинно, то выполняется оператор, если же условие ложно, то управление передается следующему оператору программы. Например, if (x==3) b=1; х=у;
Чаще всего условие представляет собой логическое выражение, состоящее из операндов и знаков операций. В качестве операций в логическом выражении, прежде всего, используются операции сравнения (==,!=,<,>,<=,>=). Кроме операций сравнения, для построения логических выражений можно использовать логические операции (!,||,&&).Значение логического выражения вычисляется путем выполнения указанных в нем операций с учетом их приоритета и расставленных круглых скобок, например,
(abs(x)<=2) - значение хпо модулю не превышает 2;
((х>=1)&&(х<=2)) - точка принадлежит отрезку [1,2];
(х*х+у*у<1)- точка с координатами (х,у) принадлежит единичному кругу с центром в начале координат.
Поскольку в C++ истина представляется как ненулевое значение, а ложь как нуль, то возможно и другое использование оператора условного перехода:
х = значение;
if (x) оператор;
В этом случае условие в операторе if представляет собой не логическое выражение, а переменную, которой предварительно присваивается какое-либо значение. Если значение переменной отлично от нуля, то условие истинно, если значение переменной равно нулю, то условие ложно.
Т.к. в качестве внутренних в операторе if могут использоваться любые операторы, следовательно, в нем допустимо использование вложенных конструкций:
if (выражение1) оператор1;
else if (выражение2) оператор2;
…
else if (выражениеN) операторN;
else оператор_по_умолчанию;// необязательная часть
Однако во избежание неоднозначного толкования программы следует пользоваться фигурными скобками для выделения вложенностей в единые блоки, т.к. в подобных конструкциях else связывается с ближайшим предыдущим if.
Если в программе необходимо выбрать один из многочисленных вариантов, то вместо вложенной конструкции if целесообразнее применять оператор-переключатель switch, называемый оператором выбора или варианта, который имеет вид:
Switch (выражение)
{
case n1 : оператор1; break;
case n2 : оператор2; break;
case nk : операторК; break;
default : операторN; break;
}
Выполнение оператора варианта начинается с вычисления значения выражения (селектора). Затем оператор выбора передает управление тому оператору, перед которым стоит константа, совпадающая с вычисленным значением переключателя switch. Если совпадений не обнаружено, выполняется оператор, стоящий после default. Например,
Switch (i)
{
case l: x=0; break;
case 2: x=2*x; break;
case 100: x=sin (x); break;