L_03_Upr_instr_tsikl.ppt
- Количество слайдов: 40
Программирование 1 Лекция 3 Основные управляющие структуры и операторы (инструкции) языка программирования С++ 21 -22. 09. 2011 Булевский тип Управляющие структуры 1
Основные управляющие структуры и инструкции (операторы) языка С++ Управляющие структуры = способы сочетания простых операторов = управление вычислительным процессом (порядком действий) 1. Структура следования = последовательность операторов Последовательное выполнение S 1; S 2; S 1 S 2 Операторные скобки – { … } { S 1; S 2; } Составной оператор Замечание про точку с запятой 21 -22. 09. 2011 Булевский тип Управляющие структуры 2
2. Структура ветвления = условный оператор = инструкция выбора T S 1 B F if (B) S 1 else S 2 = S 1, при B S 2, при not B B – условие = булевское выражение S 1 и S 2 - инструкции Пример: if (a > b) a = a b ; else b = b a; 21 -22. 09. 2011 Булевский тип Управляющие структуры 3
T B F Сокращенный условный оператор if (B) S S 21 -22. 09. 2011 if (B) S else ПУСТО Булевский тип Управляющие структуры 4
T S 21 -22. 09. 2011 B F Сочетание полного и сокращенного условных инструкций Двусмысленность: if (B 1) if (B 2) S 1 else S 2 ? if (B 1) if (B 2) S 1 else S 2 = ? if (B 1) if (B 2) S 1 else S 2 разрешается путем интерпретации if (B 1) if (B 2) S 1 else S 2 if (B 1) { if (B 2) S 1 else S 2} Булевский тип Управляющие структуры 5
Особенности 1. if (q == true) S 1 else S 2 лучше записать как if (q) S 1 else S 2, а if (q == false) S 1 else S 2 как if (!q) S 1 else S 2 2. if (a == b) flag = true; else flag = false; проще записать как flag = a == b ; или более наглядно как flag = (a == b); 21 -22. 09. 2011 Булевский тип Управляющие структуры 6
3. Некорректное использование сокращенного условного оператора. Пример: 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) S 1 else S 2 не эквивалентно if ( B ) S 1 if ( !B ) S 2 ни по выполнению, ни по результату. 21 -22. 09. 2011 Булевский тип Управляющие структуры 7
Иллюстрация неэквивалентности T B T F B F S 1 S 2 T ! B F S 2 21 -22. 09. 2011 Булевский тип Управляющие структуры 8
if (B) S 1 else S 2 эквивалентно { bool p ; p=B; if (p) S 1 if (!p) S 2 } по результату, но не по выполнению (при этом добавляется bool p и p не должно изменяться оператором S 1). 21 -22. 09. 2011 Булевский тип Управляющие структуры 9
4. Альтернативный выбор: при B 1 S 1, при B 2 S 2, при B 3 S 3. причем B 1 || B 2 || B 3 = True и Bi && Bj = false (при i j) Альтернативный выбор реализуется конструкцией if (B 1) S 1 else if (B 2) S 2 else S 3 // при B 3 Некорректно: if (B 1) S 1 if (B 2) S 2 if (B 3) S 3 21 -22. 09. 2011 Булевский тип Управляющие структуры 10
Пример: при x = 0 x = x + 1, при x > 0 x = x 2, при x < 0 x = x + 3. Правильно if (x == 0) x = x + 1; else if (x > 0) x = x 2; else x = x + 3; //при x < 0 Пример На входе: x = 0 На выходе: x = 1 Проверка условия – 1 раз Присваивание – 1 раз 21 -22. 09. 2011 Неправильно if (x == 0) x = x + 1; if (x > 0) x = x 2; if (x < 0) x = x + 3; Пример На входе: x = 0 На выходе: x = 2 Проверка условия – 3 раза Присваивание – 3 раза Булевский тип Управляющие структуры 11
Неполное вычисление булевского выражения Пример: if ((x > 0) && (y % x ==1) S 1 else S 2 Пусть x = 0, тогда (x > 0) = false, а вычисление (y % x == 1) невозможно! С другой стороны false && B == false при любом B. Варианты: 1) Режим неполного вычисления булевского выражения – например, в выражении A && B при A = false значение B не вычисляется! ( “Ленивые вычисления ”). 1) if (x > 0) if (y % x ==1) S 1 else S 2 21 -22. 09. 2011 Булевский тип Управляющие структуры 12
Пример 1 См. файл upr 1. cpp #include
Пример 2 См. файл upr 1. cpp #include
3. Цикл с предусловием B T S 21 -22. 09. 2011 F while (B) S 1. B – условие продолжения или «охрана» 2. S – тело цикла, выполняется 0 или более раз 3. В теле цикла S должны изменяться переменные, входящие в «охрану» B Булевский тип Управляющие структуры 15
Пример 1. Алгоритм Евклида (был) начало u=a; v=b; while (v != 0) { r =u%v; u =v; v =r; } u = a; v = b; Нет v != 0 Да r = u mod v ; u = v ; v = r; конец 21 -22. 09. 2011 Булевский тип Управляющие структуры 16
Пример 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). 21 -22. 09. 2011 Булевский тип Управляющие структуры 17
Пример 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)} 21 -22. 09. 2011 Булевский тип Управляющие структуры 18
Запись условия продолжения цикла 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) 21 -22. 09. 2011 Булевский тип Управляющие структуры 19
4. Цикл с постусловием S T B F do S while (B) 1. B – условие продолжения ** (окончания) цикла 2. S – тело цикла, выполняется 1 или более раз 3. В теле цикла S должны изменяться переменные, входящие в «охрану» B ** - ср. с языком Паскаль (цикл repeat S until B 21 -22. 09. 2011 Булевский тип Управляющие структуры 20
Запись алгоритма Евклида с использованием цикла с постусловием начало u = a; v = b r = u mod v; u = v; v = r; Да v != 0 u=a; v=b; do { r = u % v ; u = v; v =r; } while (v != 0) ; Нет конец 21 -22. 09. 2011 Булевский тип Управляющие структуры 21
• Комментарии и демонстрация (см. папку с программами) • В том числе с заданием b=0 STOP 21 -22. 09. 2011 Булевский тип Управляющие структуры 22
Цикл с постусловием через цикл с предусловием do S while (B) <1> { S; while (B) do S } //дублирование блока S B S = T F T S B F 21 -22. 09. 2011 Булевский тип Управляющие структуры 23
{2} bool q = true; while (q) { S; q = B; } // ввод дополнительной булевской переменной q = true q S = T F B T S q=B F 21 -22. 09. 2011 Булевский тип Управляющие структуры 24
Цикл с предусловием через цикл с постусловием While (B) S if (B) { do S while (B) } T B T S F B F S = T B F 21 -22. 09. 2011 Булевский тип Управляющие структуры 25
Пример c НОД (АЕ) – см. файл gcd_until 2. 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) 21 -22. 09. 2011 Булевский тип Управляющие структуры 26
5. Цикл do-while-do (в языке С++ нет) do S 1 while (B) do S 2 { S 1; S 1 while (B) {S 2; S 1} } B F T S 1 S 2 F B T S 2 S 1 21 -22. 09. 2011 Булевский тип Управляющие структуры 27
Цикл do-while-do через цикл с постусловием Сделать самостоятельно: 1. Дублирование блоков 2. Введение дополнительной булевской переменной 21 -22. 09. 2011 Булевский тип Управляющие структуры 28
Теорема структуры (в конце семестра, если хватит времени) Достаточно трех управляющих структур: 1. Последовательное соединение 2. Структура выбора: if-else 3. Цикл с предусловием: while-do Большой класс программ (все «разумные» программы) можно сконструировать, используя 3 управляющие структуры. 21 -22. 09. 2011 Булевский тип Управляющие структуры 29
Операции детализации и укрупнения 21 -22. 09. 2011 Булевский тип Управляющие структуры 30
Существуют 5 видов «неструктурированностей» . Например, «цикл с двумя входами» : A T F p C B D F E T q ! Самостоятельно: преобразовать в структурированную схему F 21 -22. 09. 2011 Булевский тип Управляющие структуры 31
СХЕМА ИТЕРАЦИИ И РЕКУРРЕНТНЫЕ ВЫЧИСЛЕНИЯ С ЦЕЛЫМИ ЧИСЛАМИ Использование цикла while–do [ iteratio – (лат. ) повторение] Пример 1. Функция факториал натурального аргумента n обозначается как n! и определяется соотношением n ! = 1 2 3. . . (n – 1) n. Свойство n ! = (n 1)! n при n > 0. Можно доопределить 0! = 1. 21 -22. 09. 2011 Булевский тип Управляющие структуры 32
Функция факториал (продолжение) В функциональных обозначениях 1, fact (n) = fact (n 1) n, если n = 0; если n > 0; «Идея» : последовательно вычислять fact (0), fact (1), fact (2), fact (3), …, fact (n 1), fact (n), пользуясь соотношением: fact (n) = fact (n 1) n, 21 -22. 09. 2011 Булевский тип Управляющие структуры 33
Функция факториал (продолжение) «Идея» : последовательно вычислять 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, 21 -22. 09. 2011 fact(4)=6*4=24, … Булевский тип Управляющие структуры 34
Переход к программе Пусть i номер шага цикла и пусть на i-ом шаге обозначено: xi аргумент, yi = fact (xi). Используются переменные int x, y; На соседних шагах: xi = xi-1 + 1 и yi = yi-1* xi Начальные значения (перед началом цикла): x 0=0 и y 0=1. 21 -22. 09. 2011 Булевский тип Управляющие структуры 35
Пример: вычисление fact (5) xi = xi-1 + 1, yi = yi-1* xi номер шага i xi yi 0 0 1 1 2 2 1*2=2 3 3 2*3=6 4 4 6*4=24 5 5 24*5=120 21 -22. 09. 2011 Булевский тип Управляющие структуры 36
//n 0 x = 0; y = 1; // (x = 0) & (y = fact (x)) while (x < n) { // (0 x < n) & (y = fact (x)) x = x + 1 ; y = y *x ; // (0 < x n) & (y = fact (x)) } // (y = fact (n)) & (x = n) т. е. индексы "стираются", а знак равенства = рассматривается как знак операции присваивания = 21 -22. 09. 2011 Булевский тип Управляющие структуры 37
//n 0 x = 0; y = 1; // (x = 0) & (y = fact (x)) while (x !=n) // x < n { // (0 x < n) & (y = fact (x)) x = x + 1 ; y = y *x ; // (0 < x n) & (y = fact (x)) } // (y = fact (n)) & (x = n) Замечание насчет знака < или != в условии продолжения цикла. Например, "нечаянно" оказалось n<0 (!). Что лучше пропуск цикла или зацикливание? т. е. индексы "стираются", а знак равенства = рассматривается как знак операции присваивания = 21 -22. 09. 2011 Булевский тип Управляющие структуры 38
Демонстрация выполнения программы В файлах: • fact 1. cpp • fact 2. cpp (с другим условием продолжения) • fact 3. cpp (int, short, long) (в т. ч. демонстрация быстрого роста и переполнения при больших n, а также зацикливания при n<0) 21 -22. 09. 2011 Булевский тип Управляющие структуры 39
КОНЕЦ ЛЕКЦИИ КОНЕЦ ЛЕКЦИИ 21 -22. 09. 2011 Булевский тип Управляющие структуры 40