- •Предисловие
- •Основные навыки и умения
- •Логическая культура: знание логики, логическая интуиция.
- •Языковые знания и умения.
- •Поисковые знания и умения.
- •Алгоритмические навыки и умения.
- •Общие подходы к построению алгоритмов
- •Тестирование и сопровождение программ
- •Обязательный минимум содержания среднего (полного) общего образования
- •Технология обработки текстовой информации
- •Введение в информатику
- •Системы счисления
- •Перевод из десятичной системы счисления
- •Перевод в десятичную систему счисления
- •Перевод чисел из двоичной системы счисления в восьмеричную, шестнадцатеричную системы и обратно
- •Выполнение арифметических операций в позиционных системах счисления
- •Элементы математической логики
- •Логические законы
- •Алгоритм и его свойства
- •Исполнители. Компьютер - универсальный исполнитель
- •Работа компьютера
- •Turbo pascal - исполнитель паскаль-программ
- •Конструкции Паскаля
- •Типы данных
- •Целый тип данных
- •Вещественный тип данных
- •Символьный тип данных
- •Логический тип данных
- •Выражения
- •Операторы ввода-вывода
- •Оператор присваивания
- •Общий вид программы на Паскале
- •Условный оператор
- •If логическое_выражение then оператор1 else оператор2;
- •If логическое_выражение then оператор1;
- •Операторы цикла
- •Построение линейных алгоритмов
- •Построение ветвящихся алгоритмов
- •Построенние циклических алгоритмов
- •Нахождение суммы
- •Вложенные циклы
- •Переборный метод решения задач
- •Численные методы
- •Метод итераций
- •Метод половинного деления
- •Вычисление определенного интеграла методом трапеций
- •Случайные числа
- •Метод Монте-Карло (метод статистических испытаний)
- •Массивы Одномерные массивы
- •Перебор элементов массива
- •Перебор подмассивов
- •Классы задач по обработке массивов
- •Задачи первого класса
- •Задачи второго класса
- •Задачи третьего класса
- •Задачи четвертого класса
- •Сортировка массивов
- •Сортировка вставками
- •Сортировка пузырьком (обменом)
- •Сортировка выбором
- •Сортировка фон Неймана (слиянием)
- •Двумерные массивы
- •Обработка строк
- •Процедуры и функции
- •Рекурсия
- •Работа с графикой
- •Классы программного обеспечения
- •Компиляция и интерпретация
- •Текстовый редактор
- •Электронные таблицы
- •Системы управления базами данных (субд)
- •Пример решения экзаменационного билета
- •Контрольные работы
- •Контрольная работа №1
- •Контрольная работа № 2
- •Контрольная работа № 3
- •Контрольная работа № 4
- •Контрольная работа № 5
- •Библиографический список
Построение ветвящихся алгоритмов
Условный оператор позволяет выбирать один вариант из двух. Но часто приходится решать задачи, где необходимо делать выбор их нескольких (более двух) вариантов. Алгоритмы, позволяющие решать такие задачи, называют ветвящимися.
Их можно реализовать, используя следующие конструкции:
-
последовательные «if»;
-
вложенные «if».
Поясним использование этих конструкций на следующем примере.
Пример. Зарплата служащих некоторого учреждения определяется следующим образом: при стаже работы менее 5 лет зарплата - 100 рублей, если стаж работы от 5 до 10 лет, то зарплата - 200 рублей, при стаже от 10 лет до 15 зарплата повышается на 10 рублей с каждым годом, а при стаже свыше 15 лет - на 20 рублей с каждым годом.
Решение. Исходные данные: стаж работы. Зарплата принимает разные значения в зависимости от того, в какой из четырех диапазонов попал стаж работы, т.е.
program task5;
{решение задачи с помощью последовательных if}
var st, zp: integer; {st - стаж; zp - зарплата}
begin
write (‘ стаж работы’); readln (st);
if st < 5 then zp := 100;
if (st >= 5) and (st <= 10) then zp := 200;
if (st > 10) and (st<=15) then zp := 200 + (st - 10) * 10;
if st > 15) then zp := 200 + 5 * 10 + (st - 15)*20;
writeln (‘ зарплата равна ’, zp)
end.
Это реализация предложенной задачи с помощью последовательных «if», т.е. каждый диапазон описывается отдельным оператором if, при этом приходится проверять верхнюю и нижнюю границу диапазона.
program task5а;
{решение задачи с помощью вложенных if}
var st, zp: integer; {st - стаж; zp - зарплата}
begin
write (‘ стаж работы’); readln (st);
if st < 5 then zp := 100
else if st <= 10 then zp := 200
else if st <= 15 then zp := 200 + (st - 10) * 10
else zp := 200 + 5*10 + (st - 15)* 20; {*}
writeln (‘ зарплата равна ’, zp)
end.
В данном варианте после служебного слова else опять записан if, но условие проверяет лишь верхнюю границу диапазона. Это естественно, поскольку оператор if работает таким образом, что на ветвь else можно попасть только в случае, если логическое выражение st < 5 не выполняется, т.е. not (st < 5) st >= 5, т.е. проверка нижней границы диапазона осуществляется автоматически. По этой же причине отсутствует проверка условия в строке {*}.
Достоинства второй конструкции несомненны, поскольку проще становятся условия, подлежащие проверке. Однако, если элементами вложенных условных операторов служат неполные условные операторы, то могут возникнуть неясности, связанные с установлением границ условных операторов. В таких случаях служебное слово else относится к ближайшему if.
Упражнения.
-
Может ли в программе быть служебных слов if больше, чем else? Возможна ли обратная ситуация: else больше, чем if?
-
Постройте график функции:
a) if x < -4 then y := 4 else if abs(x) <= 2 then y := sqr(x) else y := -x + 6; |
б) if x < - 1 then y := 1/(x * x) else if x < 2 then y := x * x else y := 4; |
-
Напишите программу вычисления функции y по x, заданной графиком:
-
Напишите программу, определяющую попадает ли точка с координатами (X, Y) в заштрихованную область:
а) используя условный оператор;
б) реализовать как линейный алгоритм, используя логическую переменную.
Примечание: вспомните, что объединение реализуется с помощью оператора or, а пересечение - с помощью and.
Задача 1. Три толстяка поспорили, кто из них самый тяжелый. Напишите программу, которая бы разрешила их спор.
Решение. Исходные данные: вес каждого толстяка, результат: номер самого тяжелого толстяка. Решение задачи сводится к поиску номера наибольшего из трех чисел.
Вариант 1.
var a, b, c: integer;
begin
writeln (‘Уважаемые толстяки! Задайте свой вес’);
readln (a, b, c);
if (a > b) and (a >c) then writeln (‘Cамый тяжелый - первый с весом =’, a);
if (b > a) and (b >c) then writeln (‘Cамый тяжелый - второй с весом =’, b);
if (c > a) and (c >b) then writeln (‘Cамый тяжелый - третий с весом =’, с);
end.
При таком подходе, если бы толстяков было 5, то условия состояли бы уже из четырех частей. Следующий вариант реализует программу с использованием вложенных “if”.
Вариант 2.
if (a > b) and (a > c) then writeln (‘Cамый тяжелый - первый с весом =’, a)
else if b > c then writeln (‘Cамый тяжелый - второй с весом =’, b)
else writeln (‘Cамый тяжелый - третий с весом =’, c);
Вариант 3. Введем дополнительную переменные max, в которой будет запоминаться вес кандидата на звание “самый тяжелый”, и imax, в которой будет храниться номер этого кандидата. В случае появления нового кандидата необходимо будет изменить значения обеих переменных.
var a, b, c, max, imax: integer;
begin
writeln (‘Уважаемые толстяки! Задайте свой вес’);
readln (a, b, c);
if (a > b) then begin max := a; imax := 1 end
else begin max := b; imax := 2 end;
if max < c then begin max := c; imax := 3 end;
(‘Cамый тяжелый - ‘, imax, ‘ с весом =’, max);
end.
Упражнение. Внесите измения в программу для случая, когда толстяков - 5.
Задача 2. У каждого из трех толстяков есть свой трон. Необходимо написать программу, которая позволила бы так пересадить толстяков, чтобы на крайнем левом троне сидел самый тяжелый, а на крайнем правом - самый легкий.
Решение. Исходные данные - вес каждого толстяка a, b, c. Результат - a b c.
var a, b, c, r: integer; {r - вспомогательная переменная}
begin
writeln (‘Уважаемые толстяки! Задайте свой вес’);
readln (a, b, c);
if a < b then begin r := a; a := b; b := r; {a >= b}
if a < c then begin r := a; a := c; c := r; {a >= c}
if b < c then begin r := b; b := c; c := r; {b >= c}
writeln (‘Толстяки должны сидеть в следующем порядке:’, a, ‘ ‘, b, ‘ ‘, c)
end.
Упражнения.
1. Даны пять различных чисел. Найдите два таких числа среди них, чтобы модуль разности между ними был максимален.
2. Напишите программу, которая определяет можно ли построить треугольник со сторонами a, b, c. Если - да, то какой это треугольник - равносторонний, разносторонний, равнобедренный.
3. Напишите программу размена любой суммы, большей 7 рублей, трешками и пятерками.
4. Напишите программу, проверяющую пройдет ли кирпич размерами abc в окно размерами xy.
5. Дано четырехзначное целое число. Напишите программу, проверяющую является ли сумма цифр этого числа полным квадратом.
6. Напишите программу, определяющую какое наименьшее количество почтовых марок по 10 руб., 4 руб. и 1 руб. надо наклеить на бандероль, если: за бандероль весом до 50 г взимается 10 руб., за каждые следующие полные или неполные 50 г - еще по 5 руб.
7. Плата за телефонные услуги осуществляется следующим образом:
10 руб./час - за первые 10 часов;
20 руб./час - за следующие 20 часов;
30 руб./час - за следующие 30 часов;
50 руб./час - за следующие 40 часов
и 60 руб./час - за каждый час свыше 100 часов. Напишите программу, определяющую плату за телефонные услуги для введенного времени переговоров.