![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву ![]() Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Операторы управления программой. Базовые управляющие структуры.Содержание книги
Похожие статьи вашей тематики
Поиск на нашем сайте
Программисты, имеющие опыт работы с каким-нибудь языком программирования, приступая к изучению нового языка, ищут в нем знакомые конструкции и возможности. В первую очередь это относится к организации ввода-вывода и реализации о с н о в н ы х у п р а в л я ю щ и х с т р у к т у р. В работе [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 ≤ Прежде всего заметим, что в С/С++ нельзя условие проверки на принадлежность диапазону записывать непосредственно, вроде:
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; просмотров: 616; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.2.158 (0.011 с.) |