ЛЕКЦИЯ 5 «ЯЗЫКИ ПРОГРАММИРОВАНИЯ. ОПЕРАТОРЫ ВЕТВЛЕНИЯ И ОРГАНИЗАЦИИ ЦИКЛА»

advertisement
ЛЕКЦИЯ 5
«ЯЗЫКИ ПРОГРАММИРОВАНИЯ.
ОПЕРАТОРЫ ВЕТВЛЕНИЯ И ОРГАНИЗАЦИИ
ЦИКЛА»
1
СОСТАВНОЙ ОПЕРАТОР
Составной оператор представляет собой совокупность
произвольного числа операторов, отделенных друг от друга
точкой с запятой, ограниченную операторными скобками
begin и end:
begin
оператор 1;
оператор 2;
…
end;
Эта конструкция рассматривается в программе как один
оператор.
2
ПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF
Формат:
if
<условие>
then
<оператор 1>
else <оператор 2> ;
Схема выполнения оператора:
да
оператор 1
<условие>
нет
оператор 2
<оператор 1> и
<оператор 2> могут быть
как простыми, так и
составными
операторами
Условие – это некоторое логическое выражение.
Например: A+B <> 0
K Mod 5 = 0
(A + 1 > B) or ( X = C )
3
ПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF: ПРИМЕРЫ
1) if
a>=b
then
Max:=a
else
Max:=b;
2) if (х<= 0) And (y>5) then
begin
u:=х*х–2*y+3; v:=1/2*х+1
end
else
begin
u:=1/3*х+2; v:=х*х+3*y–2
end;
!
Перед словом else символ «;» не ставится
НИКОГДА - ведь это разорвало бы оператор на две
части
4
НЕПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF
Формат:
if
<условие>
then
<оператор 1>;
Если условие истинно, то выполняется <оператор 1>,
если ложно – оператор, следующий сразу за
оператором if.
Схема выполнения оператора:
да
<условие>
нет
оператор 1
5
НЕПОЛНЫЙ УСЛОВНЫЙ ОПЕРАТОР IF:
ПРИМЕРЫ
1) If
F mod 3 = 0 then write(i);
2) If (х<= 0) And (y>5) then
begin
u:=х*х–2*y+3; v:=1/2*х+1
end;
6
ПРИМЕР
Задача. Ввести два
целых числа и
вывести на экран
наибольшее из
них.
начало
ввод a,b
да
a > b
max:= a;
нет
max:= b;
полная
форма
ветвления
вывод max
конец
?
Если a = b?
7
ВАРИАНТ 1. ПРОГРАММА
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
полная форма
if a > b then
условного
max := a
оператора
else
max := b;
writeln ('Наибольшее число ', max);
end.
8
ВАРИАНТ 2. БЛОК-СХЕМА
начало
ввод a,b
max:= a;
да
b > a
нет
неполная
форма
ветвления
max:= b;
вывод max
конец
9
ВАРИАНТ 2. ПРОГРАММА
program qq;
var a, b, max: integer;
begin
writeln('Введите два целых числа');
read ( a, b );
неполная
форма
max := a;
условного
if b > a then
оператора
max := b;
writeln ('Наибольшее число ', max);
end.
10
СЛОЖНЫЕ УСЛОВИЯ
Сложное условие – это условие, состоящее из нескольких
простых условий (отношений), связанных с помощью
логических операций:
•not – НЕ (отрицание, инверсия)
•and – И (логическое умножение, конъюнкция,
одновременное выполнение условий)
•or – ИЛИ (логическое сложение, дизъюнкция,
выполнение хотя бы одного из условий)
•xor – исключающее ИЛИ (выполнение только
одного из двух условий, но не обоих)
Простые условия (отношения)
<
<=
>
равно
>=
=
не равно
<>
11
СЛОЖНЫЕ УСЛОВИЯ
Порядок выполнения (приоритет)
• выражения в скобках
• not
• and
• or, xor
• <, <=, >, >=, =, <>
Особенность – каждое из простых условий обязательно
заключается в скобки.
Пример
4
1
6
2
5
3
if not (a > b) or (c <> d) and (b <> a)
then begin
...
end
12
СЛОЖНЫЕ УСЛОВИЯ
Истинно или ложно логическое выражение при
a := 2; b := 3; c := 4;
1) not (a > b)
True
2) (a < b) and (b < c)
True
3) not (a >= b) or (c = d)
4) (a < c) or (b < c) and (b < a)
5) (a < b) xor not (b > c)
True
True
FALSE
13
СЛОЖНЫЕ УСЛОВИЯ: ПРИМЕР ИСПОЛЬЗОВАНИЯ
Задача. Фирма набирает сотрудников в возрасте от 25
до 40 лет включительно. Ввести возраст человека и
определить, подходит ли он фирме (вывести ответ
«подходит» или «не подходит»).
Особенность задачи. Необходимо проверить,
выполняются ли одновременно два условия:
возраст  25 и возраст  40.
14
СЛОЖНЫЕ УСЛОВИЯ
АЛГОРИТМ: ВАРИАНТ 1
начало
ввод x
да
да
'подходит'
x <= 40?
x >= 25?
нет
нет
'не подходит'
'не подходит'
конец
15
СЛОЖНЫЕ УСЛОВИЯ
ПРОГРАММА: ВАРИАНТ 1
program qq;
var x: integer;
begin
writeln('Введите возраст');
read ( x );
if x >= 25 then
if x <= 40 then
writeln ('Подходит')
else writeln ('Не подходит')
else
writeln ('Не подходит');
end.
16
СЛОЖНЫЕ УСЛОВИЯ
АЛГОРИТМ: ВАРИАНТ 2
начало
ввод x
да
x >= 25
и
x <= 40?
нет
'не подходит'
'подходит'
конец
17
СЛОЖНЫЕ УСЛОВИЯ
ПРОГРАММА: ВАРИАНТ 2
program qq;
var x: integer;
begin
сложное
writeln('Введите возраст');
условие
read ( x );
if (x >= 25) and (x <= 40) then
writeln ('Подходит')
else writeln ('Не подходит')
end.
18
ЗАДАЧА
Телекомпания принимает заказы на размещение рекламы в телеэфире.
Существует базовая цена на показ в эфире рекламного ролика длительностью
1 мин. Стоимость показа зависит от длительности показа ролика и от времени
выхода в эфир.
Если время выхода в эфир попадает в интервал от 17 до 24 час, к базовой
цене применяется коэффициент 2. Если время выхода в эфир от 7 до 17 час,
коэффициент равен 1, в ночное время от 24 до 7 час цена снижается на 40%
от базовой.
Составить программу определения стоимости показа рекламного ролика,
если известна длительность показа ролика, базовая цена на показ 1 мин и
время выхода в эфир.
Исходные данные:
С – базовая цена 1 мин рекламы в телеэфире;
D – длительность показа ролика в минутах;
T – время выхода рекламы в эфир.
Требуется определить:
ST – стоимость показа рекламного ролика .
19
РАСЧЕТНЫЕ ФОРМУЛЫ
Стоимость показа рекламного ролика определяется как
произведение длительности показа (в мин) на цену 1 мин
показа.
Цена 1 мин показа (C1) определяется как значение следующей
функции от переменной T:

C, если 7  T  17
C 1  C* 2, если 17  T  24
С* 0.6, если 0  T  7
0, если T  0 или T  24
Если время выхода в эфир попадает в интервал от 17 до 24 час, к базовой
цене применяется коэффициент 2. Если время выхода в эфир от 7 до 17 час,
коэффициент равен 1, в ночное время от 24 до 7 час цена снижается на 40%
от базовой.
Значение С1, равное нулю, означает, что время показа рекламы введено
неверно. В этом случае результатом вычислений будет вывод на экран
соответствующего сообщения.
20
АЛГОРИТМ
С – базовая цена 1 мин
рекламы в телеэфире;
D – длительность показа
ролика в минутах;
T – время выхода
рекламы в эфир.

C, если 7  T  17
C 1  C* 2, если 17  T  24
С* 0.6, если 0  T  7
0, если T  0 или T  24
Начало
C, D, T
нет
да
T<0 или T>24
нет
да
C1 := 0
T<7
да
C1 := C
нет
T <= 17
C1 := C*0.6
C1 := C*2
нет
ST := C1*D
да
C1= 0
«Время введено
неверно»
ST
Конец
21
Программа
program Lab_2;
var c , d , t , c1, st : real ;
begin
Writeln ( ' Введите базовую цену 1 мин рекламы ' );
Readln ( с );
Writeln ( ' Введите длительность рекламы в минутах ' );
Readln ( d );
Writeln ( ' Введите время начала демонстрации рекламы ' );
Readln ( t );
{выбор формулы для расчета значения c1}
if (t < 0) or (t > 24) then c1 := 0
else
if t < 7 then с1 := с * 0.6
else
if t <= 17 then c1 := c
else c1 := c * 2;
if c1 = 0 then Writeln ( ' Время введено неверно ' )
else
begin
st := c1 * d;
Writeln ( 'Стоимость рекламы =' , st:8:2)
end;
end.
22
ЦИКЛЫ
Цикл – это последовательность операторов, которая может
выполняться более одного раза.
Для реализации циклических алгоритмов в языке Паскаль
используются операторы повторения:
 оператор цикла с параметром (со счетчиком);
 оператор цикла с предусловием;
 оператор цикла с постусловием.
Если количество повторов известно заранее, используется
оператор цикла с параметром.
Если количество повторов неизвестно, а задано некоторое
условие окончания или продолжения цикла применяются
оператор цикла с предусловием или оператор цикла с
постусловием.
23
ЦИКЛ FOR
Оператор For состоит из заголовка и тела цикла. Оператор
может быть представлен в двух форматах:
for
<имя> := N1 to N2 do
<оператор>;
for
<имя> := N1
downto N2
<оператор>;
Цикл по
возрастанию
параметра
do
Здесь
for … to … do (for … downto … do ) – заголовок цикла;
<имя> – имя переменной–параметра цикла ;
N1 – начальное значение параметра цикла;
N2 – конечное значение параметра цикла;
<оператор> – тело цикла.
Цикл по
убыванию
параметра
Тело цикла может быть простым или составным оператором. 24
СХЕМА ВЫПОЛНЕНИЯ ОПЕРАТОРА FOR
Цикл по возрастанию
параметра (for … to … do).
Параметр цикла <имя>
изменяется от N1 до N2 с
шагом 1.
вход
<имя>:= N1, N2, 1
Цикл по убыванию параметра
(for … downto… do).
Параметр цикла <имя>
изменяется от N1 до N2 с
шагом -1.
вход
<имя>:= N1, N2, -1
<оператор>
<оператор>
выход
выход
При каждом значении параметра выполняется <оператор>.
25
ПРИМЕР ИСПОЛЬЗОВАНИЯ ОПЕРАТОРА FOR
Вывести на экран числа от 1 до 10 сначала в прямом
порядке, затем – в обратном порядке.
program Prim ;
var k : byte;
begin
{В прямом порядке}
for k := 1 to 10 do Writeln ( k ) ;
{В обратном порядке}
for k := 10 downto 1 do Writeln ( k ) ;
end.
26
ПРИМЕРЫ
1.Сколько раз выполнится цикл?
2. Чему будет равно значение переменной a после выполнения цикла?
a := 1;
for i:=1 to 3 do a := a+1;
3 раза
a= 4
a := 1;
for i:=3 to 1 do a := a+1;
0 раз
a= 1
a := 1;
for i:=1 downto 3 do a := a+1;
0 раз
a= 1
a := 1;
for i:=3 downto 1 do a := a+1;
3 раза
a= 4
27
КАК ИЗМЕНИТЬ ШАГ?
Задача. Вывести на экран значения нечётных целых чисел
от 1 до 9.
Особенность: переменная цикла должна изменяться с шагом 2.
Проблема: в Паскале шаг может быть равен 1 или -1.
Решение
for i:=1 to 9 do
if i mod 2 = 1 then
writeln(i);
?
выполняется
только для
нечетных i
Что плохо?
28
КАК ИЗМЕНИТЬ ШАГ?
Идея. Для хранения нечетных чисел используем переменную k,
отличную от переменной i (параметра цикла). Переменная i
изменяется от 1 до 5. Начальное значение k равно 1, с
каждым шагом цикла k увеличивается на 2.
Решение
k := 1;
for i := 1 to 5 do
begin
writeln(k);
k := k + 2;
end;
29
ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ
Формат оператора:
while <условие> do
begin
{тело цикла}
end;
Схема выполнения
оператора:
Последовательность действий при
выполнении цикла:
1. Проверяется истинно ли <условие>.
<условие>
да
оператор
нет
2. Если это так, то выполняется оператор
тела цикла.
3. Пункты 1 и 2 выполняются до тех пор,
пока <условие> не станет ложным.
30
ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ
Особенности оператора:
• условие окончания цикла может быть выражено
переменной, константой или выражением, имеющим
логический тип.
• можно использовать сложные условия:
while (a<b) and (b<c) do
begin
{тело цикла}
end;
• если в теле цикла только один оператор, слова
begin и end можно не писать:
while a < b do
a := a + 1;
31
ОПЕРАТОР ЦИКЛА С ПРЕДУСЛОВИЕМ
Особенности оператора:
• условие пересчитывается каждый раз при входе в цикл;
• если условие на входе в цикл ложно, цикл не выполняется
ни разу:
a := 4; b := 6;
while a > b do
a := a – b;
• если условие никогда не станет ложным, программа
зацикливается:
a := 4; b := 6;
while a < b do
d := a + b;
32
ПРИМЕРЫ
1.Сколько раз выполнится цикл?
2. Чему будет равно значение переменной a после выполнения цикла?
a := 4; b := 6;
while a < b do a := a + 1;
2 раза
a=6
a := 4; b := 6;
while a < b do a := a + b;
1 раз
a = 10
a := 4; b := 6;
while a > b do a := a + 1;
0 раз
a=4
a := 4; b := 6;
while a < b do b := a - b;
1 раз
b = -2
a := 4; b := 6;
while a < b do a := a - 1;
зацикливание
33
ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ
Оператор используется, когда количество повторений
заранее неизвестно, а задано некоторое условие выхода
из цикла.
Формат оператора:
Repeat
<оператор 1>;
...
<оператор K>
Until <условие>;
Цикл с постусловием – это цикл, в котором проверка
условия выполняется в конце цикла.
34
ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ
Схема выполнения
оператора:
Последовательность действий при
выполнении цикла:
оператор 1
1. Выполняются <оператор 1>, …
<оператор K>.
оператор K
2. Проверяется <условие>. Если оно
ложно, то выполняется возврат к
метке Repeat, т.е. к выполнению
операторов тела цикла.
<условие>
нет
да
3. Пункты 1 и 2 выполняются до тех
пор, пока <условие> не станет
истинным.
35
ОПЕРАТОР ЦИКЛА С ПОСТУСЛОВИЕМ
Пример. С клавиатуры вводится целое число x. По
условию задачи требуется, чтобы число было в диапазоне
от 10 до 50. Организовать проверку вводимого значения на
соответствие условию.
Комментарий
Программа
При входе в цикл выполняется оператор
program Prim;
Write, который выводит на экран
подсказку «Ввод числа». Оператор
var x : integer;
Readln ( x ) вводит в переменную x
begin
число. Затем проверяется выполнение
repeat
условия (x >= 10) and (x <= 50). Если
введено число из диапазона 10 – 50,
Write('Ввод числа');
условие выполняется и происходит
Readln ( x ) ;
выход из цикла. Если введено число, не
until (x >= 10) and
удовлетворяющее заданному условию,
управление передается на начало цикла.
(x<= 50);
Вновь выводится подсказка, вводится
. . .
новое число, и так будет продолжаться
end.
до тех пор, пока не будет введено число
из диапазона 10 – 50.
36
СКОЛЬКО РАЗ ВЫПОЛНИТСЯ ЦИКЛ?
a := 4; b := 6;
repeat
a := a + 1;
until a > b;
a := 4; b := 6;
repeat
a := a + b;
until a > b;
a := 4; b := 6;
repeat
a := a + b;
until a < b;
3 раза
a=7
1 раз
a = 10
зацикливание
37
МАССИВЫ
Массив – это последовательность однотипных данных,
объединенная общим именем, элементы которой отличаются
индексами.
Индекс элемента указывает место (номер) элемента в
массиве.
Особенности:
• все элементы имеют один тип;
• весь массив имеет одно имя;
• все элементы расположены в памяти рядом.
Примеры:
• список студентов в группе;
• номера квартир в доме;
• данные о температуре воздуха за год.
38
ОДНОМЕРНЫЕ МАССИВЫ
4
5
10
33
15
15
20
25
A[2]
A[3]
A[4]
A[5]
1
2
5
A[1]
ЗНАЧЕНИЕ
элемента массива
НОМЕР (ИНДЕКС)
элемента массива: 2
A[2]
ЗНАЧЕНИЕ
элемента массива: 10
39
ОБЪЯВЛЕНИЕ ОДНОМЕРНЫХ МАССИВОВ
Зачем объявлять?
• определить имя массива;
• определить тип массива;
• определить число элементов;
• выделить место в памяти.
Массив целых чисел:
Имя массива
начальный
индекс
конечный
индекс
тип
элементов
var A : array[ 1..5 ] of integer ;
40
ОБЪЯВЛЕНИЕ ОДНОМЕРНЫХ МАССИВОВ
Массивы других типов:
var X, Y: array [1..10] of real;
C: array [1..20] of char;
Другой диапазон индексов:
var Q: array [0..9] of real;
C: array [-5..13] of char;
41
ЧТО НЕПРАВИЛЬНО?
var a: array[1..10] of integer;
...
A[5] := 4.5;
var a: array [0..9] of integer;
...
A[10] := 5;
42
ОДНОМЕРНЫЕ МАССИВЫ
Объявление:
var a: array[1..100] of integer;
i, n: integer;
Вывод на экран:
for i:=1 to n do
begin
write('a[',i,']=');
read (a[i]);
end;
Ввод с клавиатуры:
writeln('Массив A:');
for i:=1 to N do
write(a[i]:4);
a[1] =
a[2] =
a[3] =
a[4] =
a[5] =
5
12
34
56
13
?
Почему
write?
Массив A:
10 24 68 112
26
43
ДВУМЕРНЫЕ МАССИВЫ
Двумерный массив – это массив, у которого в описании
указаны два индекса. Двумерный массив можно
рассматривать как матрицу или таблицу, в которой каждый
элемент однозначно определяется номером строки и
номером столбца, на пересечении которых он находится.
Первый индекс – номер строки, второй индекс – номер
столбца.
a [ 1, 1 ]
a [ 1, 2 ]
a [ 1, 3 ]
a [ 2, 1]
a [ 2, 2 ]
a [ 2, 3 ]
a [ 3, 1 ]
a [ 3, 2 ]
a [ 3, 3 ]
44
ДВУМЕРНЫЕ МАССИВЫ
Доступ к каждому конкретному элементу массива
осуществляется по имени с указанием значений индексов
элемента:
a [ 1, 2 ] – элемент массива, расположенный на пересечении
строки с номером 1 и столбца с номером 2.
Двумерный массив можно объявить, например, следующим
образом:
var a : array [ 1 .. 10, 1 .. 10 ] of integer;
Здесь объявляется двумерный массив a, содержащий данные
типа integer, состоящий из 10 строк и 10 столбцов.
45
Download