Слайд 1
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Лекция № 6
Слайд 2
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Программы бывают линейными, разветвленными, циклическими и сложными. Большинство
программ являются сложными.
Любую программу можно разбить на линейные, разветвленные и циклические фрагменты.
Наиболее простыми являются линейные программы или линейные фрагменты сложных программ.
Слайд 3
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Линейные алгоритмы
Линейными называются программы, в которых операторы выполняются
один за другим с первого до последнего, не повторяясь и не изменяя порядка их выполнения.
Линейные программы могут содержать операторы присваивания, математические функции, арифметические операции, действия, связанные с вводом-выводом, и другие операторы, не изменяющие порядка следования операторов в программе.
Слайд 4
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Основные математические функции языка C++
Заголовочный файл, необходимый для
работы этих функций:
или
Слайд 5
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.1. Составить программу для вычисления объема V
и площади поверхности S полого шара по заданным внешнему и внутреннему радиусам R и r, если известно, что S = 4π(R2 + r2), V = 4/3π(R3 - г3).
#include
using namespace std;
#include
const double Pi = 3.1415926; // опредепение числа π
int main()
{ double S,V, R, r;
cout << "Введите внешний радиус";
cin >> R;
cout << "Введите внутренний радиус ";
cin >> r;
S = 4Pi(R*R - r*r);
V = 4.0/3*Pi*(pow(R,3)-pow(r,3));
cout << "S = " S << endl;
cout << "V = " << V << endl;
return 0; }
Слайд 6
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.2. Ввести координаты точек (xl, yl) и
(х2, у2). Определить расстояние между этими точками.
#include
using namespace std;
#include
#include
int main() {int x1,x2,y1,y2;
double dist;
cout << "Введите х1 ->";
cin >> x1;
cout << "Введите х2 ->";
cin >> x2;
cout << "Введите у1 ->";
cin >> y1;
cout << "Введите у2 ->";
Cin >> у2;
dist = sqrt(pow((x1-x2),2)+pow((y1-y2),2));
cout << "Расстояние равно " << dist << endl;
getch(); // подключается с помощью заголовочного файла conio.h, останавливает выполнение программы до нажатия любой клавиши return 0;
}
Слайд 7
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.3. Поменять местами значения переменных х и
у.
#include
using namespace std;
#include
#include
int main()
{int x, y, wrk; // wrk - рабочая переменная
cout << "Введите х и у ->";
cin >> x >> у);
cout << "x = " << x << " у = " << у << endl;
wrk = x; // запомнить в wrk значение переменной х
x = у; // поместить в х значение у
у = wrk; // поместить в у значение х, хранящееся в wrk
cout << "x = " << х << " у = " << у << endl;
getch();
return 0; }
Слайд 8
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Помимо потоковых операций ввода-вывода cin и cout часто
используются функции, применяемые в языке С: printf() и scanf(), которые предназначены для реализации форматного вывода и ввода данных.
Функция printf() имеет следующий синтаксис:
printf ("управляющая_строка", [список_аргументов])
Список аргументов - это последовательность констант, переменных или выражений, значения которых выводятся на экран дисплея в соответствии с форматом управляющей строки.
Список аргументов в функции printf() может отсутствовать.
Слайд 9
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Управляющая строка содержит объекты трех типов:
обычные символы,
выводимые на экран без изменений;
спецификации преобразования, каждая из которых вызывает вывод на экран значения очередного аргумента из последующего списка аргументов;
управляющие символьные константы.
Слайд 10
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Каждая спецификация преобразования начинается с символа % и
заканчивается символом преобразования. Между ними могут записываться:
знак минуса (-), указывающий на то, что выводимый текст выравнивается по левому краю, по умолчанию выравнивание происходит по правому краю;
строка цифр, задающая минимальный размер поля вывода;
точка, являющаяся разделителем;
строка цифр, задающая точность вывода;
символ 1, указывающий на то, что соответствующий аргумент имеет тип long.
Слайд 11
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Символ преобразования может быть следующим:
d - аргумент
преобразуется в десятичное представление;
о - аргумент преобразуется в восьмеричное представление;
х - аргумент преобразуется в шестнадцатеричное представление;
с - значением аргумента является символ;
s - значением аргумента является строка символов;
е - значением аргумента является величина типа float или double в экспоненциальной форме записи;
f - значением аргумента является величина типа float или double в форме записи с десятичной точкой;
g - один из форматов f или е;
u - значением аргумента является целое беззнаковое число;
р - значением аргумента является указатель (адрес).
Таким образом, «управляющая_строка» определяет количество и тип аргументов
Слайд 12
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Среди управляющих символов наиболее часто используются следующие:
\а -
кратковременный звуковой сигнал;
\n - перевод строки;
\t - горизонтальная табуляция;
\b - возврат курсора на один шаг назад;
\r - возврат каретки.
Слайд 13
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Функция scanf описывается аналогично функции printf:
scanf ("управляющая_строка",
[список_аргументов]);
но список аргументов здесь является обязательным и не может отсутствовать.
Аргументы функции scanf() должны быть указателями на соответствующие значения, для этого перед именем переменной записывается символ &. Управляющая строка содержит спецификации преобразования и используется для определения количества и типов аргументов, аналогично функции printf().
Слайд 14
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.4:
printf ("i=%d,\n j=%d, a=%6.2f.\n", i, j, a);
Если
i=1234, j=127, a=86.531, то на экране увидим:
i =1234,
j =127, а = 86.53.
В управляющей строке допустимо использование символов заполнения, по умолчанию в качестве символа заполнения применяется пробел.
printf ("i=%00d,\n j=%d,a=%6.2f.\n",i,j,a);
Теперь значение i выглядит так:
i =001234,
scant ("%d %f %c %s", &i,&a,&ch,r);
Здесь r - строка символов, имя которой само является указателем, поэтому перед ней знак амперсанда (&) не ставится.
Слайд 15
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Если входные данные при вводе с клавиатуры разделяются
разделителями, например запятыми, то и в управляющей строке спецификации преобразования должны быть разделены такими же разделителями. Перепишем пример 3.1 для случая использования операций printf() и scanf().
Пример 3.5:
#include // подключение заголовочных файлов
#include
#define Pi 3.1415926 // определение символической константы с этого момента и на протяжении всей программы Pi определена как 3.1415926
void main() {double S,V;
float R,r;
printf("BBeдите через запятую внешний и внутренний радиусы R и г:");
scanf("%t ,%f", &R,&r);
printf("S=%g,V=%t\n\S=4 * Pi * (R * R-r * r), V=4/3 * Pi * (R * R * R-r * r * r));
}
Слайд 16
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Разветвленные алгоритмы
Разветвленные алгоритмы предусматривают выбор маршрута выполнения программы
в зависимости от истинности или ложности некоторых условий. Это обеспечивается наличием в программе специальных операторов, которые иногда называют конструкциями принятия решений:
if
if - else
switch.
Слайд 17
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Синтаксис оператора if имеет вид:
if (выражение) оператор;
Если
оператор, выполняемый при истинности условия выражения, единственный или если таких операторов несколько:
if (выражение) {оператор1;
оператор2;
…
onepaтopN;
}
Здесь под выражением понимается любое логическое выражение или любое выражение, значение которого приводимо к целочисленному значению. Если его значение истинно, то оператор будет выполняться.
Слайд 18
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Схема алгоритма оператора if
Выражение
Оператор
или
блок операторов
Слайд 19
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
При необходимости сравнить выражение с некоторым значением следует
использовать операции отношений в виде: if (выражение = = значение) оператор;
или
if (выражение!=значение) оператор;
или
if (выражение > значение) оператор;
или
if (выражение < значение) оператор;
Нельзя писать if (выражение =значение) оператор;
Это одна из наиболее распространенных и труднообнаруживаемых ошибок.
Результатом такого использования операции присваивания «=» будет сравнение выражения со значением с последующим присвоением выражению значения, с которым оно сравнивалось.
Слайд 20
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.6. Использование оператора if для определения абсолютной
величины введенного с клавиатуры целого значения.
#include
using namespace std;
int main() {
int dig;
cout << "Введите число:";
cin >> dig;
if (dig < 0) dig = -dig;
cout << dig << endl;
return 0;
}
Выражение, служащее условием, заключается в круглые скобки.
Слайд 21
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.7. По номеру у > 0 некоторого
года определить с - номер его столетия. Учесть, что, например, XXI в. начинается с 2001 г., а не с 2000-го.
#include
using namespace std;
int main() {
int dig;
cout << "Введите год:";
cin >> у;
с = у/100;
if (y%100!=0) c+=1;
cout << "Этот год принадлежит к веку " << с << endl;
return 0;
}
Слайд 22
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Оператор if- else
Оператор if может иметь две ветви,
одна из которых является альтернативной. Синтаксис оператора if - else имеет вид:
if (выражение) оператор1;
else оператор2;
если после if и else находится по одному оператору, или
if (выражение) {оператор-!;
оператор2;}
else {операторЗ;
оператор4;},
если после if и else находится блок операторов, т. е. два или больше оператора, заключенные в фигурные скобки. Точка с запятой после фигурной скобки, закрывающей блок операторов, не ставится.
Слайд 23
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Схема алгоритма оператор if - else
Слайд 24
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Вложенные ветвления
В качестве внутренних операторов оператора if могут
использоваться любые операторы, в том числе и условные. Другими словами, в операторе if допустимо применение вложенных конструкций:
if (выражение1) оператор1;
else if (выражение2) оператор2;
else if (выражениеЗ) операторЗ;
else if (выражениеN) операторN;
else // необязательная часть
оператор_по_умолчанию;
Слайд 25
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Вложенные ветвления
В качестве внутренних операторов оператора if могут
использоваться любые операторы, в том числе и условные. Другими словами, в операторе if допустимо применение вложенных конструкций:
if (x<=0){ y=e^x+x; cout<<“y=e^x+x”<else if (x>0&&x<=7) {tg(3*x); cout<<“y=tg3*x”<else if (x>7) (y=x-6; cout<<“y=x-6”<
Слайд 26
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
В подобных конструкциях часть else связывается с ближайшим
предыдущим if в том же блоке, не имеющем части else. Последний оператор else, за которым следует оператор_по_умолчанию;, не является обязательным. Формально уровней вложенности операторов if может быть много, но реально при количестве таких вложенных конструкций, большем чем 4-5, программа становится трудноотлаживаемой.
Пример 3.8. :
#include
using namespace std;
int main () {int value;
cout << "Input value from 1 to 10:";
cin >> value;
if (value >= 1)
if (value > 10) cout >> "Error: value >10" << endl;
else cout << "Error: value <1“ << endl;
return 0; }
/* Поскольку else связывается с ближайшим if, эта программа будет работать неправильно */.
Слайд 27
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
#include
using namespace std;
int main ()
{int
value;
cout << "Input value from 1 to 10: ";
cin >> value;
if (value >= 1)
{
if (value > 10) cout << "Error: value >10" << endl;
}
else cout << "Error: value <1" << endl;
return 0;
}
/* Фигурные скобки скорректировали поведение программы. Теперь все работает так, как было задумано */.
Слайд 28
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Приведенный пример наглядно демонстрирует, что во избежание неоднозначного
толкования программы следует пользоваться фигурными скобками, не полагаясь в сомнительных случаях на компилятор. При этом отступы, как и комментарии, носят чисто декоративный характер и компилятором игнорируются.
Вычислить d - max(a,b,c); - максимальное из трех введенных с клавиатуры чисел.
#include
using namespace std;
int main() { int a, b, c, d;
cout << "a > ";
cin >> a;
cout >> "b > ";
cin >> a;
cout << "c > ";
cin >> a;
if (a>b && a>c) d = a;
else if (b>c) d = b;
else d = c;
cout << "max = " << d << endl;
return 0; }
Слайд 29
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Условная операция
Условная операция является трехоперандной и имеет синтаксис:
переменная
= выражение? значение1: значение2;
Такая запись является аналогом условного оператора
if (выражение) переменная = значение1;
else переменная = значение2;
Условный оператор и условное выражение в результате компиляции формируют практически идентичный код. Разница состоит в том, что в случае условного оператора обращение к переменной происходит дважды; следовательно, дважды вычисляется ее адрес, а в случае условной операции - лишь один раз. С другой стороны, с точки зрения понимания программы условный оператор намного лучше.
Слайд 30Пример 3.10:
if (test = = ‘Y’)
TestValue = 100;
else
TestValue = 0;
что полностью эквивалентно:
TestValue = (test = = ‘Y’)?100:0;
Пример 3.11:
if (a>b) max = а;
else max = b;
эквивалентно: max = (a>b)?a:b;
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Слайд 31
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Оператор множественного выбора
Если в программе необходимо выбрать один
из многочисленных вариантов, то вместо вложенных конструкций if - else более целесообразно применять оператор-переключатель switch, иначе называемый оператором множественного выбора.
Его синтаксис:
switch (выражение)
{case значение1: оператор1;
break;
case значение2: оператор2;
break;
case значение3: оператор3;
break;
default: // необязательный компонент
оператор_по_несравнению; // если не было ни одного совпадения.
} //end switch (выражение)
Слайд 32
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Фигурные скобки, ограничивающие тело оператора switch, являются обязательными.
Здесь для выполнения выбирается тот вариант (группа операторов), значение которого совпадает со значением выражения.
Оператор в каждом блоке выбора case может быть отдельным оператором или блоком операторов.
Оператор break в каждом блоке выбора case осуществляет выход из оператора switch.
Слайд 33
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Пример 3.12. Ввести с клавиатуры символ. Если он
является символом арифметической операции, то указать, какой именно, и привести соответствующий пример. Если не является, то выдать сообщение об этом.
#include
using namespace std;
int main() { char sym;
int op1, op2, res;
сout << "Введите символ арифметической операции "
cin >> sym;
switch (sym) { case'+': cout << "Сложение << endl;
cout << "1 слагаемое:";
cin >> op1;
cout << "2 слагаемое:";
cin << op2;
res = op1 + op2;
cout << op1 << '+‘ << op2 << '=‘ << res << endl;
break;
Слайд 34
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
case '-': cout
cin << op1;
cout << "Вычитаемое:";
cin >> op2;
res = op1 - op2;
cout << op1 << '-' << op2 << '=' << res << endl;
break;
case '*': cout << "Умножение" << endl;
cout << "Множимое:";
cin >> op1;
cout << "Множитель:";
cin >> op2;
res = op1 * op2;
cout << op1 << '*‘ << op2 << '=‘ << res << endl;
break;
Слайд 35
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
case '/': cout
"Делимое:";
cin >> op1;
cout << "Делитель:";
cin >> op2;
if (op2 != 0)
{res = ор1 / ор2;
cout << ор1 << '/' << ор2 << '=‘ << res << endl;
} else cout << "Деление на 0 запрещено " << endl;
break;
default: cout << "Неарифметическая операция" << endl;
} // end switch (sym)
return 0;
}
Слайд 36
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Контрольные вопросы
Что такое линейные и разветвленные программы?
В чем
заключается понятие форматного вывода данных?
Как осуществляется ввод данных?
Каковы формы условного оператора?
Каким образом строится условное выражение?
Какую структуру имеет оператор-переключатель?
С какой целью используется оператор разрыва break?
Что происходит, если забыть поставить break?
Определить значение переменной w после выполнения следующих операторов:
w= 100; u = 30;
switch (u/7)
{ case 0: w = 0; break;
case 1: w = 1; break;
case 2: w = 2; break;
case 3: w = 3; break;
default: w = 7; }
10. Определить значение переменной m после выполнения следующих
операторов:
т = 5;
if (x>0) {if (y>0) m = 10;} else m = 20;
а) при х = -5, у = 7;
б) при х = 2, у = -3;
в) при х = 9, у = 3.
Слайд 37
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Контрольные вопросы
Что такое линейные и разветвленные программы?
В чем
заключается понятие форматного вывода данных?
Как осуществляется ввод данных?
Каковы формы условного оператора?
Каким образом строится условное выражение?
Какую структуру имеет оператор-переключатель?
С какой целью используется оператор разрыва break?
Что происходит, если забыть поставить break?
Определить значение переменной w после выполнения следующих операторов:
w= 100; u = 30;
switch (u/7)
{ case 0: w = 0; break;
case 1: w = 1; break;
case 2: w = 2; break;
case 3: w = 3; break;
default: w = 7; }
10. Определить значение переменной m после выполнения следующих
операторов:
т = 5;
if (x>0) {if (y>0) m = 10;} else m = 20;
а) при х = -5, у = 7;
б) при х = 2, у = -3;
в) при х = 9, у = 3.
Слайд 38
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Практические задания
Вычислить S=A+B+C+D, если хотя бы одно из
чисел А, В, С, D равно нулю, и P=A*B*O*D, если все числа отличны от нуля.
Составить программу, которая при вводе оценки в виде цифры выводит оценку в буквенном виде: 5 - отлично, 4 - хорошо, 3 - удовлетворительно, 2 – неудовлетворительно.
Составить программу, которая по введенному номеру месяца выводит его название и время года.
Составить программу, которая при вводе символа определяет, скобка ли это, и указывает, какая именно, например фигурная открывающая ({), квадратная закрывающая (]).
Составить программу, которая при вводе символа выводит либо текст «цифра», если введена цифра, либо текст «латинская буква», если введена латинская буква, либо текст «не цифра и не латинская буква» в остальных случаях.
Ввести с клавиатуры координаты точек (xl, yl) и (х2, у2) и определить расстояние между этими точками.
Поменять местами значения переменных х и у.
Слайд 39
ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ
Значения переменных а, Ь, с поменять местами так,
чтобы оказалось а>Ь>с.
Определить: у = max(min(a,b), min(c,d)).
Определить: у = min(a,b,c).
Переменной k присвоить номер четверти координатной плоскости, в которой находится точка с координатами, введенными с клавиатуры. Отдельно учесть случаи, когда точка попадает на одну из координатных осей или в начало координат.
Написать программу преобразования прописных латинских букв в строчные. При написании программы использовать условное выражение.
Написать программу решения квадратного уравнения с произвольными коэффициентами, которые вводятся с клавиатуры.
Определить d = max(a, b, с), если значения переменных a, b и с введены с клавиатуры.