Слайд 121-22.09.2011
Булевский тип
Управляющие структуры
Программирование 1
Лекция 3
Основные управляющие структуры и операторы (инструкции) языка
программирования С++
Слайд 221-22.09.2011
Булевский тип
Управляющие структуры
Основные управляющие структуры и инструкции (операторы) языка С++
Управляющие структуры
= способы сочетания простых операторов
= управление вычислительным процессом (порядком действий)
1. Структура следования = последовательность операторов
Последовательное выполнение S1; S2;
Операторные скобки – { … }
{ S1; S2; }
Составной оператор
Замечание про точку с запятой
Слайд 321-22.09.2011
Булевский тип
Управляющие структуры
2. Структура ветвления = условный оператор = инструкция выбора
Пример:
if (a > b) a = a b ; else b = b a;
Слайд 421-22.09.2011
Булевский тип
Управляющие структуры
Сокращенный условный оператор
if (B) S
if (B) S
else ПУСТО
Слайд 521-22.09.2011
Булевский тип
Управляющие структуры
Сочетание полного и сокращенного условных инструкций
Двусмысленность:
if (B1) if
(B2) S1 else S2
? if (B1) if (B2) S1 else S2
? if (B1) if (B2) S1 else S2
разрешается путем интерпретации
if (B1) if (B2) S1 else S2
if (B1) { if (B2) S1 else S2}
Слайд 621-22.09.2011
Булевский тип
Управляющие структуры
Особенности
if (q == true) S1 else S2 лучше
записать как
if (q) S1 else S2,
а if (q == false) S1 else S2 как
if (!q) S1 else S2
if (a == b) flag = true; else flag = false;
проще записать как
flag = a == b ;
или более наглядно как
flag = (a == b);
Слайд 721-22.09.2011
Булевский тип
Управляющие структуры
Некорректное использование сокращенного условного оператора. Пример:
if (a > b
) a = a b; else b = b a; (1)
не то же самое, что
if (a > b ) a = a b ; (2)
if (a <= b ) b = b a ; (3)
Например, при a = 5, b = 3. Результат по (1): a = 2, b = 3. Результат после (2): a = 2, b = 3, а после (3): a = 2, b = 1.
В общем случае if (B) S1 else S2 не эквивалентно
if ( B ) S1
if ( !B ) S2
ни по выполнению, ни по результату .
Слайд 821-22.09.2011
Булевский тип
Управляющие структуры
Иллюстрация неэквивалентности
F
T
F
T
! B
F
T
Слайд 921-22.09.2011
Булевский тип
Управляющие структуры
if (B) S1 else S2 эквивалентно
{ bool p ;
p
= B ;
if (p) S1
if (!p) S2
}
по результату, но не по выполнению
(при этом добавляется bool p и p не должно изменяться оператором S1).
Слайд 1021-22.09.2011
Булевский тип
Управляющие структуры
Альтернативный выбор:
при B1 S1,
при B2 S2,
при
B3 S3.
причем B1 || B2 || B3 = True и
Bi && Bj = false (при ij)
Альтернативный выбор реализуется конструкцией
if (B1) S1
else if (B2) S2
else S3 // при B3
Некорректно: if (B1) S1
if (B2) S2
if (B3) S3
Слайд 1121-22.09.2011
Булевский тип
Управляющие структуры
Пример: при x = 0 x = x +
1,
при x > 0 x = x 2,
при x < 0 x = x + 3.
Слайд 1221-22.09.2011
Булевский тип
Управляющие структуры
Пример:
if ((x > 0) && (y % x ==1)
S1 else S2
Пусть x = 0, тогда (x > 0) = false, а вычисление
(y % x == 1) невозможно!
С другой стороны false && B == false при любом B.
Варианты:
Режим неполного вычисления булевского выражения – например, в выражении A && B при A = false значение B не вычисляется!
( “Ленивые вычисления ”).
if (x > 0) if (y % x ==1) S1
else S2
else S2
Неполное вычисление булевского выражения
Слайд 13Пример 1
#include
using namespace std ;
int main () {
bool f;
int
a=0;
int b=3;
f = (a > 0);
cout
endl;
if ((a > 0)) && (b % a ==1) cout << "s1" << endl;
else cout << "s2" << endl;
return 0;
}
21-22.09.2011
Булевский тип Управляющие структуры
См. файл upr1.cpp
Слайд 14Пример 2
#include
using namespace std ;
int main () {
bool f;
int
a=0;
int b=3;
f = (a > 0);
cout
endl;
if ((b % a ==1) && (a > 0)) cout << "s1" << endl;
else cout << "s2" << endl;
return 0;
}
21-22.09.2011
Булевский тип Управляющие структуры
См. файл upr1.cpp
Слайд 1521-22.09.2011
Булевский тип
Управляющие структуры
while (B) S
B – условие продолжения или «охрана»
S –
тело цикла, выполняется 0 или более раз
В теле цикла S должны изменяться переменные, входящие в «охрану» B
3. Цикл с предусловием
Слайд 1621-22.09.2011
Булевский тип
Управляющие структуры
Пример 1. Алгоритм Евклида (был)
u = a ; v
= b ;
while (v != 0) {
r = u % v ;
u = v ;
v = r ;
}
u = a; v = b;
r = u mod v ;
u = v ;
v = r;
v != 0
начало
конец
Нет
Да
Слайд 1721-22.09.2011
Булевский тип
Управляющие структуры
Пример 2. (был)
Способ вычисления НОД на основе определения (из
Л.1-2)
Последовательно перебираем числа c = 1, 2, 3, …, min(a, b) и находим максимальное среди тех из них, для которых справедливо a c и b c.
Улучшенный способ: числа перебираются в порядке убывания от min(a, b) до 1, тогда первое встретившееся c, такое, что a c и b c, и будет НОД(a, b).
Слайд 1821-22.09.2011
Булевский тип
Управляющие структуры
Пример 2. Алгоритм
// a > 0 & b >
0
if ( a < b ) c = a;
else c = b;
// c=min(a,b)}
while ( ((a % c ) != 0) || ((b % c ) != 0)) { c = c - 1; } ;
// c = gcd(a, b)}
Слайд 1921-22.09.2011
Булевский тип
Управляющие структуры
Запись условия продолжения цикла
while (! ((a % c
== 0) && (b % c == 0)) { c = c - 1; }
!((a % c == 0) && (b % c == 0))
!(a % c == 0) || !(b % c == 0)
(a % c != 0) || (b % c != 0)
Слайд 2021-22.09.2011
Булевский тип
Управляющие структуры
do S while (B)
B – условие продолжения ** (окончания)
цикла
S – тело цикла, выполняется 1 или более раз
В теле цикла S должны изменяться переменные, входящие в «охрану» B
** - ср. с языком Паскаль (цикл repeat S until B
4. Цикл с постусловием
Слайд 2121-22.09.2011
Булевский тип
Управляющие структуры
Запись алгоритма Евклида с использованием цикла с постусловием
u
= a ; v = b ;
do { r = u % v ;
u = v;
v = r ;
}
while (v != 0) ;
u = a; v = b
r = u mod v;
u = v;
v = r;
v != 0
начало
Нет
Да
Слайд 2221-22.09.2011
Булевский тип
Управляющие структуры
Комментарии и демонстрация (см. папку с программами)
В том числе
с заданием b=0
STOP
Слайд 2321-22.09.2011
Булевский тип
Управляющие структуры
do S while (B)
{ S;
while (B) do S }
//дублирование блока
Цикл с постусловием через цикл с предусловием
=
Слайд 2421-22.09.2011
Булевский тип
Управляющие структуры
{2} bool q = true;
while (q) {
S; q = B; }
// ввод дополнительной булевской переменной
=
Слайд 2521-22.09.2011
Булевский тип
Управляющие структуры
Цикл с предусловием через цикл с постусловием
=
While (B) S
if (B) { do S while (B) }
F
T
F
T
Слайд 2621-22.09.2011
Булевский тип
Управляющие структуры
Пример c НОД (АЕ) – см.файл gcd_until2.cpp
u = a;
v = b;
// u>=0 & v>=0 & GCD(u,v)=GCD(a,b)
if ( v != 0 )
{
do { // u>0 & v>0 & GCD(u,v)=GCD(a,b)
Remainder = u % v;
u = v;
v = Remainder;
// u>0 & v>=0 & GCD(u,v)=GCD(a,b)
} while ( v != 0 );
} // end_if
// u>0 & v=0 & u=GCD(u,0)=GCD(a,b)
Слайд 2721-22.09.2011
Булевский тип
Управляющие структуры
5. Цикл do-while-do (в языке С++ нет)
F
B
T
do S1 while
(B) do S2
{ S1;
while (B) {S2; S1}
}
B
F
T
Слайд 2821-22.09.2011
Булевский тип
Управляющие структуры
Сделать самостоятельно:
Дублирование блоков
Введение дополнительной булевской переменной
Цикл do-while-do через цикл
с постусловием
Слайд 2921-22.09.2011
Булевский тип
Управляющие структуры
Теорема структуры (в конце семестра, если хватит времени)
Достаточно трех
управляющих структур:
Последовательное соединение
Структура выбора: if-else
Цикл с предусловием: while-do
Большой класс программ (все «разумные» программы) можно сконструировать, используя 3 управляющие структуры.
Слайд 3021-22.09.2011
Булевский тип
Управляющие структуры
Операции детализации и укрупнения
Слайд 3121-22.09.2011
Булевский тип
Управляющие структуры
Существуют 5 видов «неструктурированностей».
Например, «цикл с двумя входами»:
F
D
C
B
A
E
p
q
T
T
F
F
! Самостоятельно:
преобразовать в структурированную схему
Слайд 3221-22.09.2011
Булевский тип
Управляющие структуры
СХЕМА ИТЕРАЦИИ И РЕКУРРЕНТНЫЕ ВЫЧИСЛЕНИЯ С ЦЕЛЫМИ ЧИСЛАМИ
Использование цикла
while–do
[ iteratio – (лат.) повторение]
Пример 1. Функция факториал натурального аргумента n обозначается как n! и определяется соотношением
n ! = 123...(n – 1)n .
Свойство n ! = (n 1)!n при n > 0.
Можно доопределить 0! = 1.
Слайд 3321-22.09.2011
Булевский тип
Управляющие структуры
Функция факториал (продолжение)
В функциональных обозначениях
1, если n = 0;
fact
(n) = fact (n 1) n, если n > 0;
«Идея»: последовательно вычислять
fact (0), fact (1), fact (2), fact (3), …, fact (n 1), fact (n),
пользуясь соотношением: fact (n) = fact (n 1) n,
Слайд 3421-22.09.2011
Булевский тип
Управляющие структуры
Функция факториал (продолжение)
«Идея»: последовательно вычислять
fact (0), fact (1),
fact (2), fact (3), …, fact (n 1), fact (n),
пользуясь соотношением: fact (n) = fact (n 1) n,
т.е. если на предыдущем шаге вычислено fact(n-1), то на этом (текущем) шаге мы можем вычислить fact(n) как fact(n-1)*n.
fact(0)=1, fact(1)=1*1=1, fact(2)=1*2=2, fact(3)=2*3=6, fact(4)=6*4=24, …
Слайд 3521-22.09.2011
Булевский тип
Управляющие структуры
Пусть i номер шага цикла
и пусть на i-ом
шаге обозначено:
xi аргумент,
yi = fact (xi).
Используются переменные int x, y;
На соседних шагах: xi = xi-1 + 1 и
yi = yi-1* xi
Начальные значения (перед началом цикла): x0=0 и y0=1.
Переход к программе
Слайд 3621-22.09.2011
Булевский тип
Управляющие структуры
Пример: вычисление fact (5)
xi = xi-1 + 1,
yi = yi-1* xi
Слайд 3721-22.09.2011
Булевский тип
Управляющие структуры
}
// (y = fact (n)) & (x = n)
//n 0
x = 0;
y = 1;
// (x = 0) & (y = fact (x))
while (x < n)
{
x = x + 1 ;
y = y *x ;
// (0 x < n) & (y = fact (x))
// (0 < x n) & (y = fact (x))
т.е. индексы "стираются", а знак равенства = рассматривается как знак операции присваивания =
Слайд 3821-22.09.2011
Булевский тип
Управляющие структуры
}
// (y = fact (n)) & (x = n)
//n 0
x = 0;
y = 1;
// (x = 0) & (y = fact (x))
while (x !=n) // x < n
{
x = x + 1 ;
y = y *x ;
// (0 x < n) & (y = fact (x))
// (0 < x n) & (y = fact (x))
т.е. индексы "стираются", а знак равенства = рассматривается как знак операции присваивания =
Замечание насчет знака < или !=
в условии продолжения цикла.
Например, "нечаянно" оказалось n<0 (!).
Что лучше пропуск цикла или зацикливание?
Слайд 3921-22.09.2011
Булевский тип
Управляющие структуры
Демонстрация выполнения программы
В файлах:
fact1.cpp
fact2.cpp (с другим условием продолжения)
fact3.cpp (int,
short, long)
(в т.ч. демонстрация быстрого роста и переполнения при больших n, а также зацикливания при n<0)
Слайд 4021-22.09.2011
Булевский тип
Управляющие структуры
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ
ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ
КОНЕЦ ЛЕКЦИИ