Слайд 1АлгоритмизациЯ и программированиЕ
Лекция 25
Тема №6
Слайд 2Разветвляющиеся алгоритмы
Задача. Ввести два целых числа и вывести на экран
наибольшее из них.
Идея решения: надо вывести на экран первое число,
если оно больше второго, или второе, если оно больше первого.
Особенность: действия исполнителя зависят от некоторых условий (если … иначе …).
Алгоритмы, в которых последовательность шагов зависит от выполнения некоторых условий, называются разветвляющимися.
Слайд 3Вариант 1. Блок-схема
полная форма ветвления
блок «решение»
Слайд 4Вариант 1. Программа
max := a;
max := b;
полная форма условного оператора
program
qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
if a > b then begin
end
else begin
end;
writeln ('Наибольшее число ', max);
end.
Слайд 5Условный оператор
if then begin
{что делать, если условие
верно}
end
else begin
{что делать,
если условие неверно}
end;
Особенности:
перед else НЕ ставится точка с запятой
вторая часть (else …) может отсутствовать (неполная форма)
если в блоке один оператор, можно убрать слова begin и end
Слайд 6Вариант 2. Блок-схема
неполная форма ветвления
Слайд 7Вариант 2. Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите
два целых числа');
read ( a, b );
max := a;
if b > a then
max := b;
writeln ('Наибольшее число ', max);
end.
неполная форма условного оператора
Слайд 8Вариант 2Б. Программа
program qq;
var a, b, max: integer;
begin
writeln('Введите
два целых числа');
read ( a, b );
max := b;
if ??? then
???
writeln ('Наибольшее число ', max);
end.
max := a;
a > b
Слайд 9Сложные условия
Задача. Фирма набирает сотрудников от 25 до 40 лет
включительно. Ввести возраст человека и определить, подходит ли он фирме
(вывести ответ «подходит» или «не подходит»).
Особенность: надо проверить, выполняются ли два условия одновременно.
Слайд 10Вариант 1. Алгоритм
начало
ввод x
'подходит'
конец
да
нет
x >= 25?
да
нет
x
Слайд 11Вариант 1. Программа
program qq;
var x: integer;
begin
writeln('Введите возраст');
read ( x );
if x >= 25 then
if x <= 40 then
writeln ('Подходит')
else writeln ('Не подходит')
else
writeln ('Не подходит');
end.
Слайд 12Вариант 2. Алгоритм
начало
ввод x
'подходит'
да
нет
x >= 25
и
x
Слайд 13Вариант 2. Программа
сложное условие
program qq;
var x: integer;
begin
writeln('Введите возраст');
read ( x );
if (x >= 25)
and (x <= 40) then
writeln ('Подходит')
else writeln ('Не подходит')
end.
Слайд 14Сложные условия
Сложное условие – это условие, состоящее из нескольких простых
условий (отношений), связанных с помощью логических операций:
not – НЕ (отрицание,
инверсия)
and – И (логическое умножение, конъюнкция,
одновременное выполнение условий)
or – ИЛИ (логическое сложение, дизъюнкция,
выполнение хотя бы одного из условий)
xor – исключающее ИЛИ (выполнение только
одного из двух условий, но не обоих)
Простые условия (отношения)
< <= > >= = <>
равно
не равно
Слайд 15Сложные условия
Порядок выполнения (приоритет = старшинство)
выражения в скобках
not
and
or, xor
>, >=, =,
Особенность – каждое из простых условий обязательно
заключать в скобки.
Пример
4 1 6 2 5 3
if not (a > b) or (c <> d) and (b <> a)
then begin
...
end
Слайд 16Обобщенный порядок выполнения операций:
1) вычисления в круглых скобках;
2) вычисления значений функций;
3) унарные операции;
4) операции
*, /, div, mod, and;
5) операции +, —, or, xor;
6) операции отношения
=, <>, <, >, <=, >=.
Слайд 17Оператор выбора
Структура оператора имеет следующий вид:
case S of
c1: insruction1;
c2: insruction2;
…
cn:
insructionN;
else instruction
end;
где S – выражение порядкового типа, значение которого вычисляется;
с1,
с2…., сn – константы порядкового типа, с которыми сравнивается выражение S;
instruction1,…, instructionN – операторы, из которых выполняется тот, с константой которого совпадает значение выражения S;
instruction – оператор, который выполняется, если значение выражения S не совпадает ни с одной из констант c1, с2…. сn.
Данный оператор является обобщением условного оператора If для произвольного числа альтернатив. Существует сокращенная форма оператора, при которой ветвь else отсутствует.
Слайд 18ПРИМЕР: Вводится целое число, если это цифра, то определить четная
она или нет, а если число, то определить попадает ли
оно в диапазон от 10 до 100, если нет, то выдать соответствующее сообщение.
program chislo;
var i:integer;
begin
write('Введите целое число: ');
readln(i);
case i of
0,2,4,6,8 : writeln('Четная цифра');
1,3,5,7,9 : writeln('Нечетная цифра');
10...100,200 : writeln('Число от 10 до 100 или 200');
else writeln('Число либо отрицательное, либо > 100, но не 200');
end;
readln
end.
Слайд 19Оператор выбора
Оператор выбора позволяет выбирать одно из нескольких возможных действий
(операторов).
Формат:
case of
: ;
...
значений n>: <оператор n>;
[else <оператор>]
end;
Слайд 20Правила оформления оператора выбора
выражение (переключатель) должно иметь порядковый тип
после
списка значений должен быть один оператор. Если в какой –
либо ветви необходимо выполнить несколько операторов, то используется составной оператор.
Слайд 21Списки значений
могут содержать одно или несколько разделенных запятыми возможных
значений константных выражений; а также диапазоны значений;
константы и константные выражения
должны быть совместимы по типу с объявленным выражением;
не могут включать переменные и многие функции;
не должны пересекаться;
должны располагаться в возрастающем порядке (рекомендовано для получения оптимального кода).
Слайд 22Определить порядок целого числа
N от 0 до 999
Var
N: integer;
…
Randomize; N:=Random(1000);
case N of
0..9: writeln('однозначное');
10..99: writeln('двузначное');
100..999: writeln('трехзначное')
end;
Слайд 23Определить тип символа
Var symbol: Char;
…
case symbol of
’0’..’9’: writeln('это
цифра');
’a’..’z’: writeln('стр.буква');
’A’..’Z’: writeln('прописная буква')
else writeln(‘Это др. символ’)
end;
Слайд 24Var Year: Integer;
…
case Year of
-500..-400:writeln('Древнегреческий абак');
480.. 500: begin
writeln('Первые
записи в десятичной');
writeln('системе счисления, которые');
writeln('были сделаны в Индии')
end;
1642 : writeln('Сум.машина Б.Паскаля')
else writeln(‘И
прочее, прочее, прочее’)
end;
Слайд 25Оператор перехода
Назначение: передача управления оператору в программе, перед которым указана
метка.
Оператор должен использоваться в том блоке, где была описана метка.
Причем управление должно передаваться оператору в том же блоке.
Формат: goto <метка>
При использовании оператора перехода в начале программы вводится Раздел описания меток.
Формат:
Label <имя меток через запятую>;
Пример:
Label met1, met2;
Этот оператор противоречит принципам структурного программирования.
Слайд 26Циклы
Цикл – это многократное выполнение одинаковой последовательности действий.
цикл с известным
числом шагов
цикл с неизвестным числом шагов (цикл с условием)
Задача. Вывести
на экран квадраты и кубы целых чисел от 1 до 8 (от a до b).
Особенность: одинаковые действия выполняются 8 раз.
Слайд 27Алгоритм
начало
i, i2, i3
конец
нет
да
i
1;
i2 := i * i;
i3 := i2 * i;
задать начальное
значение переменной цикла
проверить, все ли сделали
вычисляем квадрат и куб
вывод результата
перейти к следующему i
Слайд 28Алгоритм (с блоком «цикл»)
начало
i, i2, i3
конец
i2 := i * i;
i3
:= i2 * i;
i := 1,8
блок «цикл»
тело цикла
Слайд 29Программа
program qq;
var i, i2, i3: integer;
begin
for i:=1 to
8 do begin
i2 := i*i;
i3 :=
i2*i;
writeln(i, ’ ’, i2, ’ ’, i3);
end;
end.
переменная
цикла
начальное значение
конечное значение
Слайд 30Цикл с уменьшением переменной
Задача. Вывести на экран квадраты и кубы
целых чисел от 8 до 1 (в обратном порядке).
Особенность: переменная
цикла должна уменьшаться.
Решение:
for i:=8 1 do begin
i2 := i*i;
i3 := i2*i;
writeln(i, ’ ’, i2, ’ ’, i3);
end;
downto
Слайд 31Цикл с переменной
for := to
do begin
{тело цикла}
end;
Увеличение переменной на 1:
for <переменная> := <начальное значение>
downto
<конечное значение> do begin
{тело цикла}
end;
Уменьшение переменной на 1:
Слайд 32Цикл с переменной
Особенности:
переменная цикла может быть только целой (integer)
шаг изменения
переменной цикла всегда равен 1 (to) или -1 (downto)
если в
теле цикла только один оператор, слова begin и end можно не писать:
если конечное значение меньше начального, цикл (to) не выполняется ни разу (проверка условия в начале цикла, цикл с предусловием)
for i:=1 to 8 do
writeln('Привет');
Слайд 33Цикл с переменной
Особенности:
в теле цикла не разрешается изменять переменную цикла
при
изменении начального и конечного значения внутри цикла количество шагов не
изменится:
n := 8;
for i:=1 to n do begin
writeln('Привет');
n := n + 1;
end;
нет зацикливания
Слайд 34Цикл с переменной
Особенности:
после выполнения цикла во многих системах устанавливается первое
значение переменной цикла, при котором нарушено условие:
for i:=1 to 8
do
writeln('Привет');
writeln('i=', i);
for i:=8 downto 1 do
writeln('Привет');
writeln('i=', i);
i=9
i=0
Слайд 35for i:=1 to 9 do begin
if ???
then begin
i2 := i*i;
i3 := i2*i;
writeln(i,’ ’,i2,’ ’,i3);
end;
end;
Как изменить шаг?
Задача. Вывести на экран квадраты и кубы нечётных целых чисел от 1 до 9.
Особенность: переменная цикла должна увеличиваться на 2.
Проблема: в Паскале шаг может быть 1 или -1.
Решение:
i mod 2 = 1
i2 := i*i;
i3 := i2*i;
writeln(i,’ ’,i2,’ ’,i3);
выполняется только для нечетных i
Слайд 36Как изменить шаг? – II
Идея: Надо вывести всего 5 чисел,
переменная k изменяется от 1 до 5. Начальное значение i
равно 1, с каждым шагом цикла i увеличивается на 2.
Решение:
???
for k:=1 to 5 do begin
i2 := i*i;
i3 := i2*i;
writeln(i, ’ ’, i2, ’ ’, i3);
???
end;
i := i + 2;
i := 1;
Слайд 37Как изменить шаг? – III
Идея: Надо вывести всего 5 чисел,
переменная k изменяется от 1 до 5. Зная k, надо
рассчитать i.
Решение:
i = 2k-1
for k:=1 to 5 do begin
???
i2 := i*i;
i3 := i2*i;
writeln(i, ’ ’, i2, ’ ’, i3);
end;
i := 2*k – 1;
Слайд 38Цикл с неизвестным числом шагов
Пример: Отпилить полено от бревна. Сколько
раз надо сделать движения пилой?
Задача: Ввести целое число (
определить число цифр в нем.
Идея решения: Отсекаем последовательно последнюю цифру, увеличиваем счетчик.
Проблема: Неизвестно, сколько шагов надо сделать.
Решение: Надо остановиться, когда n = 0, т.е. надо делать «пока n <> 0».
Слайд 39Алгоритм
начало
count
конец
нет
да
n 0?
count := 0;
count := count + 1;
n := n div 10;
обнулить счетчик цифр
ввод n
выполнять «пока n
<> 0»
Слайд 40Цикл с условием
while do begin
{тело цикла}
end;
Особенности:
можно использовать сложные условия:
если в теле цикла только
один оператор, слова begin и end можно не писать:
while (a {тело цикла}
end;
while a < b do
a := a + 1;
Слайд 41Цикл с условием
Особенности:
условие пересчитывается каждый раз при входе в цикл
если
условие на входе в цикл ложно, цикл не выполняется ни
разу
если условие никогда не станет ложным, программа зацикливается
a := 4; b := 6;
while a > b do
a := a – b;
a := 4; b := 6;
while a < b do
d := a + b;
Слайд 42Программа
program qq;
var n, count: integer;
begin
writeln('Введите целое число');
read(n);
count
:= 0;
while n 0 do begin
count
:= count + 1;
n := n div 10;
end;
writeln('В числе ', n, ' нашли ',
count, ' цифр');
end.
while n <> 0 do begin
count := count + 1;
n := n div 10;
end;
, n1: integer;
n1 := n;
n1,
выполнять «пока n <> 0»
Слайд 43Замена for на while и наоборот
for i:=1 to 10 do
begin
{тело цикла}
end;
i := 1;
while i
{тело цикла}
i := i + 1;
end;
for i:=a downto b do
begin
{тело цикла}
end;
i := a;
while i >= b do begin
{тело цикла}
i := i - 1;
end;
Замена while на for возможна только тогда, когда можно заранее рассчитать число шагов цикла.
Замена цикла for на while возможна всегда.
Слайд 44Цикл с постусловием
Задача: Ввести целое положительное число (
число цифр в нем.
Проблема: Как не дать ввести отрицательное
число или ноль?
Решение: Если вводится неверное число, вернуться назад к вводу данных (цикл!).
Особенность: Один раз тело цикла надо сделать в любом случае => проверку условия цикла надо делать в конце цикла (цикл с постусловием).
Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.
Слайд 45Цикл с постусловием: алгоритм
начало
конец
да
нет
n > 0?
тело цикла
условие ВЫХОДА
блок «типовой
процесс»
ввод n
основной
алгоритм
Слайд 46Программа
program qq;
var n: integer;
begin
repeat
writeln('Введите положительное
число');
read(n);
until n > 0;
... { основной алгоритм }
end.
repeat
writeln('Введите положительное число');
read(n);
until n > 0;
until n > 0;
условие ВЫХОДА
Особенности:
тело цикла всегда выполняется хотя бы один раз
после слова until ("до тех пор, пока не…") ставится условие ВЫХОДА из цикла
Слайд 47Структура программы Pascal
Program ;
Uses ;
label
меток>
const ;
type ;
var ;
подпрограмм>;
begin
<раздел операторов>
end.
Слайд 48 Раздел подключаемых модулей
Используется в том случае, когда в программе
применяются константы, переменные, процедуру или функции, типы данных, определяемые в
стандартных модулях или модулях, созданных пользователями.
Формат:
Uses <имена модулей через запятую> ;
В этом предложении перечисляются модули, загружаемые программой
Например:
uses SysUtils;