Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Операторы управления программой. Базовые управляющие структуры.

Поиск

 

 

Программисты, имеющие опыт работы с каким-нибудь языком программирования, приступая к изучению нового языка, ищут в нем знакомые конструкции и возможности. В первую очередь это относится к организации ввода-вывода и реализации о с н о в н ы х у п р а в л я ю щ и х с т р у к т у р. В работе [13] было строго доказано, что любой корректный алгоритм может быть записан средствами выбранного языка программирования, использующего только три управляющие структуры: последовательное выполнение (следование), в е т в л е н и е и п о в т о р е н и е (цикл). Это утвеждение лежит в основе структурного программирования, которое предполагает ряд организационных мер и дисциплину программирования, способствующих созданию простых, легких для понимания и удобных для модификации программ.

 

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

 

 
 


 

 

Здесь оператор_1, оператор_2 - простые или составные операторы языка, которые выполняются последовательно, в порядке их естественного расположения в программе, с возможным отклонением для вызова внешнего фрагмента (функции), но с обязательным возвратом в точку вызова. (Иногда вызов функции рассматривают как самостоятельную управляющую структуру). Порядок выполения операторов в конструкции следование не зависит от конкретных значений обрабатываемых ими данных.

 

Ветвление позволяет выбрать одно из двух возможных направлений обработки данных в программе (оператор_1, оператор_2), в зависимости от выполнения определённых условий и схематически изображается так:

 
 

 

Повторение (цикл) обеспечивает многократное выполнение некоторой последовательности операторов. Повторяющийся участок программы называют телом цикла. Различают циклы с предусловием и циклы с постусловием.

Структурная схема их такова:

 
 

Операторы ветвления

Условный оператор if

 

Ветвление в языке С/С++ реализуется с помощью условного оператора, имеющего вид:

 

if (выражение) оператор 1; [else оператор 2; ]

 

где часть else может и отсутствовать. Сначала вычисляется " выражение" в скобках (скобки обязательны!); если оно истинно (отлично от нуля), то выполняется оператор_1. Если же " выражение" ложно (равно нулю), то оператор_1 пропускается и при наличии else -ветви выполняется оператор_2. В любом случае далее будет выполняться оператор, следующий за if- оператором. Если в качестве альтернативных операторов оператор_1, оператор_2 должна располагаться группа из нескольких операторов языка, то они заключаются в фигурные скобки. Чаще всего "выражение" в скобках представляет логическое условие, задаваемое с помощью операций отношения и логических операций.

 

 

Пример. Для иллюстрации применения условного оператора рассмотрим программу определения большего из трех чисел.

 

#include <stdio.h>

int main()

{

int x,y,z,max;

printf("Введи три числа:\n");

scanf("%d %d %d",&x,&y,&z);

if(x>y)

max=x;

else

max=y;

if(z>max)

max=z;

printf("Максимальное из (%d,%d,%d)=%d\n", x,y,z,max);

return 0;

}

 

 

Протокол выполнения программы:

 

Введи три числа:

33 –88 66

Максимальное из (33, -88, 66) = 66

 

Первый if-оператор представляет полную условную конструкцию, во втором - часть else отсутствует. Обратите внимание, что точка с запятой, завершая оператор присваивания max = x, не нарушает целостности if-оператора (что имеет место, например, в аналогичном операторе языка Паскаль).

Максимальное из трех чисел x, y, z можно найти и без оператора if, используя тернарную операцию (мы об этом уже упоминали в разделе "Операторы "):

 

max = (max=(x > y)? x: y) > z? max: z;

 

 

Альтернативные операторы оператор_1 и оператор_2 могут содержать другие (вложенные) if-операторы. Если else-ветвь пропускается во вложенных условных операторах, возможна неоднозначность их толкования. Что, по – вашему, будет выдано на экран в результате выполнения следующего фрагмента:

 

int a = 2, b = 7, c = 3;

if (a > b)

if (b < c)

c=777;

else

c=999;

cout << c;

 

Ответ: 3

 

 

Для лучшего понимания логики программы рекомендуется делать 3-5 отступов вправо относительно ключевых слов if и else перед каждой из альтернативных групп операторов оператор_1 и оператор_2. В предыдущем примере, чтобы окончательно сбить с толку малоопытного читателя, слово else записано напротив первого if. Но вы должны во избежание двусмысленностей твердо помнить о следующем: компилятор ассоциирует очередное ключевое слово else с ближайшим оператором if, у которого отсутствует конструкция else. В сомнительных случаях лучше использовать фигурные скобки.

Перед ключевым словом if можно поставить метку, а перед else – нельзя (однако можно пометить оператор_2, следующий за else).

 

Иногда вложенности if -операторов удаётся избежать, используя составные логические условия с привлечением логических операций && и | |.

 

Пример. На плоскости в декартовой системе координат задано кольцо (см. рис), образованное двумя концентрическими окружностями радиусов R1 и R2 (R1 < R2), с центром в начале координат. Проверить, попадает ли точка с заданными координатами (х, у) в область кольца.

 

Очевидно, точка (х, у) попадает внутрь кольца, если выполняется такое двойное неравенство:

R1 ≤ ≤ R2

Прежде всего заметим, что в С/С++ нельзя условие проверки на принадлежность диапазону записывать непосредственно, вроде:

 

if (R1 <= sqrt(x * x + y * y) <= R2)

 

Можно, конечно, записать два вложенных if – оператора:

 

if (R1 <= sqrt (x * x + y * y))

if (sqrt (x * x + y * y) <= R2)

сout << "точка в кольце";

 

Однако более изящным, на наш взгляд, будет решение, приведенное ниже.

#include <conio.h>

#include <iostream.h>

#include <math.h>

int main()

{

float x, y, R1, R2, L;

clrscr(); //Очистка экрана

cout<<"Введи x "; cin>>x;

cout<<"Введи y "; cin>>y;

R1=2; R2=4; //радиусы

L = sqrt(x*x + y*y); //расстояние от (0,0) до точки (x, y)

if (L >= R1 && L <= R2)

cout<<" Точка ("<<x<<","<<y<<")"<<" в кольце"<<endl;

else

cout<<" Точка ("<<x<<","<<y<<")"<<" вне кольца"<<endl;

getch();return 0;

}

 

Когда управляющая структура ветвления становится особенно запутанной, определенную ясность могут внести правильно расставленные отступы и фигурные скобки. Скобки обязательны, когда в условном операторе некоторые альтернативные действия выражаются более, чем одним простым оператором; мы уже отмечали, что заключение такой группы операторов в фигурные скобки образует с о с т а в н о й о п е р а т о р, который можно применять там, где по определению должен быть только один оператор языка. Желательно, чтобы закрывающая фигурная скобка блока располагалась в тексте программы строго под открывающей.

 

Пример. Следующая программа, в которой применяются несколько вложенных друг в друга условных операторов, решает известную школьную задачу: найти действительные корни квадратного уравнения ax2 + bx +c=0 или сообщить об их отсутствии.

 

Программа несколько усложнилась из-за того, что мы выделили " в отдельное производство" случай, когда a = 0 и квадратное уравнение, таким образом, вырождается в линейное вида bx +c=0.

 

#include<iostream.h>

#include<conio.h>

#include<math.h>

int main()

{

double a,b,c,d,x1,x2;

char ch; clrscr();

cout<<"Введи коэффициенты квадратного уравнения:"<<endl;

cout<<" a= "; cin >> a;

cout<<" b= "; cin >> b;

cout<<" c= "; cin >> c;

if (a!=0)

{

d=b*b-4*a*c;

if(d>=0)

{

x1=(-b+sqrt(d))/(2*a);

x2=(-b-sqrt(d))/(2*a);

cout<<"Корни: x1= "<<x1<<" x2= "<<x2<<endl;

}

else

cout<<"Нет корней\n";

}

else

{

cout << "Первый коэффициент равен нулю."<<endl;

cout << "Решать линейное уравнение "<<b<<"x + "<<c<<" = 0(y/n)?";

cin>>ch; // лучше ch = getch();

if (ch == 'y' || ch == 'Y')

{ if(b)

cout << "Корень х = " << -c/b << endl;

else

if (c == 0)

cout << "x - любое число " << endl;

else

cout << "решений нет " << endl;

}

}

cout << "Нажми Enter";

getch();return 0;

}

 

При глубине вложенности условных операторов свыше трех ветвление теряет наглядность и понятность.

 



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 602; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.118.163 (0.008 с.)