О программировании ветвлений в C++

NovaInfo 76, с.51-56, скачать PDF
Опубликовано
Раздел: Технические науки
Просмотров за месяц: 2
CC BY-NC

Аннотация

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

Ключевые слова

ТЕРНАРНАЯ ОПЕРАЦИЯ, ЯЗЫК ПРОГРАММИРОВАНИЯ С++, ПРОГРАММИРОВАНИЕ, ВЕТВЛЕНИЕ

Текст научной работы

В самом простом случае компьютерная программа выполняется по порядку, строка за строкой. Однако в подавляющем большинстве случаев на каком-то этапе выполнения потребуется изменить ход выполнения программы в зависимости от результатов, полученных в предыдущих выражениях. В таком случае необходимо проверить выполнение некоторых условий, и изменить ход выполнения программы в соответствии с ними. Для программирования ветвлений в языке C++ имеются инструкции ifelse и switch, а также тернарная операция (?:).

Инструкция выбора if…else

Выполняет указанное в ней действие, только если условие истинно и пропускает его в ином случае. Инструкция (структура) ifelse позволяет определить различные действия, которые должны выполняться в случаях, если условие истинно или ложно. Допускается использование вложенных инструкций if. Формат инструкции if имеет вид

if (логическое выражение) выражение-1; else выражение-2;

или

if (логическое выражение) выражение-1;

При этом выражение-1 и выражение-2 могут быть составными (т.е. представлять собой совокупность последовательно выполняемых выражений, заключенных в операторные скобки), или в более общем случае — структурированными. Отметим также, что вложенная структура ifelse может работать гораздо быстрее, чем серия структур if с единственным выбором вследствие возможности быстрого выхода после удовлетворения одному из условий.

При построении логических выражений участвуют логические операторы, наиболее часто используются операторы (&&), (||), (!). Операторы (&&) и (||) вычисляют второй аргумент только в случае, если в этом есть необходимость. Так, например, в выражении

if (a>b && c>100) a=c;

вначале проверяется первое условие a>b, а проверка условия c>100 будет осуществляться только в том случае, если первое условие истинно. В выражении

if (a>b || c!=0) a=c;

второе условие будет проверяться только в случае, если первое условие ложно; если же первое условие истинно, то второе условие не проверяется, и результатом проверки сразу возвращается true. Такая реализация проверок носит название механизма быстрых вычислений.

При написании условий можно объявлять переменную прямо в условии. В этом случае область видимости такой переменной будет простираться от точки ее объявления до конца инструкции, контролируемой условием. Если в инструкции if есть ветвь else, область видимости такой переменной простирается на обе ветви. При этом объявление в условии должно объявлять и инициализировать единственную переменную или константу.

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

Ниже в качестве примера приводится текст программы, выводящей на экран значение корня из указанного числа, если число является полным квадратом, и "No" в противном случае.

#include
#include
#include
using namespace std;
long f (long a)
{long s=pow(a,0.5);
if (s*s == a) return s; else return 0;}
int main()
{ long ch;
cout<<"ch= "; cin>>ch;
if (long sum = f(ch)) cout<<"Yes: "< else cout<<"No";
getch(); return 0;}

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

Условная операция ?:

В С++ имеется еще условная операция (?:) — единственная тернарная операция в С++ с тремя операндами, которая близка к структуре ifelse. Первый операнд является условием, второй — содержит значение условного выражения в случае, если условие истинно, а третий операнд равен значению условного выражения, если условие ложно. Например, оператор вывода

cout << ( a >=10 ? "Да" : "Нет");

содержит условное выражение, равное строке "Да", если условие a>=10 истинно, и равно строке "Нет", если оно ложно. Т.к. условная операция имеет низкое старшинство, в приведенном выражении потребовались скобки. Значения условного выражения могут быть также некоторыми исполняемыми действиями. Например, условное выражение

a >=10 ? cout << "Да \n" : cout << "Нет \n";

следует понимать так: «Если значение переменной a больше или равно 10, то выдать строку "Да", иначе строку "Нет"».

Инструкция switch (структура множественного выбора)

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

Инструкция switch состоит из ряда меток case и необязательной метки default. Структура инструкции имеет вид:

switch (a) {
case a1: выражение-1; break;
case a2: выражение-2; break;
…………………………...;
case aN: выражение-N; break;
default: выражение-0; break; }

Здесь a — выражение любого целого типа (в том числе и символьного), значение которого вычисляется; a1, a2, …, aN — константы, с которыми сравнивается значение выражения a; выражение-0 — выражение, которое выполняется, если значение выражения a не совпадает ни с одной из констант a1, a2, …, aN.

Инструкция break вызывает передачу программного управления на первое выражение после структуры switch. В случае если инструкцию break не указывать, то условия case в инструкции switch работают совместно: если везде в приведенной выше структуре switch не использовать break, тогда каждый раз, когда одно из условий case удовлетворяется, будут выполняться выражения всех последующих меток case. Если ни одно из условий не выполнено, то выполняются выражения после метки default (если в структуре switch метка default помещена последней в списке, то инструкция break в ней не требуется).

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

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

cout<<"Символ (a) в ASCII имеет значение "< ('a');

напечатает символ a и его целочисленное представление в таблице ASCII (American Standard Code for Information Interchange) в виде:

Символ (a) в ASCII имеет значение 97

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

Пример использования инструкции switch приведен ниже.

Задача

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

#include 
#include 
#include 
using namespace std;
int main()
{ float a,h,S; //сторона, высота и площадь треугольника
  float r,R;   //радиус вписанной и описанной окружностей
  int variant; //номер сделанного выбора (вариант выбора)
  system("cls");
  cout<<"Выберите известный параметр из списка: "<>variant;
  system("cls");
  switch (variant) {
         case 1: cout<<"Введите сторону треугольника"<>a;
                    cout<<"Высота треугольника h="
          <>h;
                 cout<<"Сторона треугольника a="<<2*h/sqrt(3)<>S;
                 cout<<"Сторона треугольника a="
                        <>r;
                 cout<<"Сторона треугольника a="<<2*r*sqrt(3)<>R;
                 cout<<"Сторона треугольника a="<

Инструкция goto (безусловного перехода)

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

Одной меткой можно пометить только одно выражение. Метка от помеченного выражения отделяется двоеточием. Имя метки — это идентификатор. Формат инструкции следующий:

goto имя-метки;
………………..;
имя-метки: выражение;

Используя инструкцию goto, можно передавать управление внутрь составного выражения. Однако при входе в составное выражение нужно соблюдать осторожность, т.к. оно может дать неправильный результат. Например, в составном выражении, содержащем объявления переменных с инициализацией, так как объявления располагаются перед выполняемыми выражениями, значения объявленных переменных при таком переходе будут не определены. Кроме того, безусловный переход можно осуществлять далеко не из каждого места программы и не в любое ее место.

Читайте также

Цитировать

Дмитриев, В.Л. О программировании ветвлений в C++ / В.Л. Дмитриев. — Текст : электронный // NovaInfo, 2017. — № 76. — С. 51-56. — URL: https://novainfo.ru/article/14402 (дата обращения: 12.08.2022).

Поделиться