- •Институт математики, экономики и механики кафедра математического обеспечения компьютерных систем в. С. Макогон, и. Н. Лисицына
- •Оглавление
- •Введение
- •Основныетипы данных, операции и выражения
- •Описание переменных.
- •Операции , выражения и операторы.
- •3. Операторы управления программой. Базовые управляющие структуры.
- •Операторы ветвления Условный оператор if
- •Оператор - переключатель
- •Операторы повторения (цикла).
- •4. Программирование алгоритмов линейной структуры.
- •5. Программирование разветвляющихся алгоритмов (оператор if).
- •6. Программирование разветвляющихся алгоритмов (оператор switch)
- •Оператор for
- •Цикл с постусловием do -while
- •8. Итерационные циклы
- •Задачи для самостоятельного решения
- •9. Программирование алгоритмов с использованием функций
- •Основные понятия численного решения уравнений
- •10. Программирование алгоритмов с использованием массивов
- •11. Символьные переменные и строки. Обработка строк.
- •Другие средства ввода-вывода символов и строк
- •Массивы строк
- •12. Указатели
- •Массивы указателей
- •2. Описание метода трапеций
- •3. Программный комплекс
- •13. Структуры
- •Указатели на структуры
- •14. Файлы. Потоковый ввод-вывод
- •Функции для работы с файлами
- •Открытие файловых потоков
- •Закрытие файловых потоков
- •Удаление файлов
- •Переименование файлов
- •Реинициализация
- •Функции для ввода-вывода по символам
- •1 Вариант) содержит только буквы исходной строки
- •2 Вариант) перевернута по отношению к исходной
- •Двоичные (бинарные) файлы. Блочно-ориентированный ввод-вывод.
3. Операторы управления программой. Базовые управляющие структуры.
Программисты, имеющие опыт работы с каким-нибудь языком программирования, приступая к изучению нового языка, ищут в нем знакомые конструкции и возможности. В первую очередь это относится к организации ввода-вывода и реализации о с н о в н ы х у п р а в л я ю щ и х с т р у к т у р. В работе [13] было строго доказано , что любой корректный алгоритм может быть записан средствами выбранного языка программирования, использующего только три управляющие структуры: последовательное выполнение (следование), в е т в л е н и е и п о в т о р е н и е (цикл). Это утвеждение лежит в основе структурного программирования, которое предполагает ряд организационных мер и дисциплину программирования, способствующих созданию простых, легких для понимания и удобных для модификации программ.
Следование как одна из базовых конструкций программирования столь обычна, что мы редко о ней задумываемся, как об управляющей структуре. Схематически её можно изобразить так:
Оператор_1
Оператор_2
Здесь оператор_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;
}
При глубине вложенности условных операторов свыше трех ветвление теряет наглядность и понятность.
Очередная программа реализует простейший калькулятор ( на 4 арифметические действия ).
#include <conio.h>
#include<stdio.h>
#include <iostream.h>
int main()
{ double a, b, y; char znak;
cout << "Введи 1 число, знак операции, 2 число "<<endl;
cout << "Например, 25*4 ";
cin>>a>>znak>>b;
if (znak=='+')
y=a+b;
else if (znak=='-')
y=a-b;
else if (znak=='*')
y=a*b;
else if (znak=='/'&& b!=0)
y=a/b;
else
{ cout<<"Так нельзя !!!";
goto m1;
}
cout<<"Вот результат: "<<a<<znak<<b<<" = "<<y<<endl;
m1: getch();return 0;
}
Для реализации многозначного ветвления обычно прибегают к управляющей структуре выбор (переключатель), которая специально предназначена для выбора одного из многих возможных вариантов обработки данных в программе. Схематически эту конструкцию можно изобразить следующим образом:
В зависимости от значения проверяемого выражения выполняется та или иная группа операторов (Блок_операторов_1, Блок_операторов_2, …, Блок_операторов_N).