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

