Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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 ≤ ≤ 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 с.) |