Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование. Учебное пособие
.pdf
21
Текст программы.
Var i,s: integer;
Begin
s:=0; //обнуляем счётчик
// перебираем все числа от 1 до 100, если
//число делится на 7 без остатка, то увеличиваем счётчик на 1
for i:= 1 to 100 do if i mod 7=0 then writeln (i);
End.
Задание. Найти сумму ряда
для n и x вве-
дённого с клавиатуры
Текст программы.
Var x,s,sl : real;
i,n:integer;
BEGIN
Writeln(‘введите x’);
Readln(x);
Writeln(‘введите n’);
Readln(n);
for i:=1 to n do begin // перебираем все числа от 1 до n
sl:=1/(i*x); // формируем очередное слагаемое
s:=s+sl; // добавляем слагаемое к сумме
end;
Writeln (‘Сумма ряда =’, s);
END.
Задания для самостоятельной работы
1. Используя оператор Case, составьте следующую программу. Для число-
вой оценки от 1 до 5 вывести соответствующую словесную характеристику
(например, 5 – отлично, 3 – удовлетворительно, 7- такой оценки нет).
2. Используя оператор Case, составьте следующую программу. Для введённого символа определить, является ли он большой английской буквой,
маленькой английской буквой, цифрой или каким-то другим символом
(например, 1 – цифра, Ж – неизвестный символ). Подсказка: нужно использовать диапазоны символов.
3. Используя оператор Case, составьте следующую программу. По введённому номеру месяца определить, время года (например, 1 – зима, 10 –
осень, 15 – такого месяца нет).

22
4. Используя оператор Case, составьте следующую программу. По введённому количеству дней в месяце вывести список месяцев с данным количеством дней (например, 30 – апрель, июнь, сентябрь, ноябрь; 28 – февраль;
5 – ошибка).
5. Используя оператор Case, составьте следующую программу. По номеру
дня недели определить, является ли он рабочим или выходным (например,
3 – рабочий, 6 – выходной, 9 – такого дня нет).
6. Подсчитать общее количество двузначных чисел, произведение цифр
которых равно 12.
7. Выведите на экран все числа от 20 до 100, оканчивающиеся на 7.
8. Подсчитать общее количество двузначных чисел, у которых первая и
вторая цифра различны.
9. Выведите на экран все числа от -30 до 50, которые делятся на 3 и на 4.
10. Выведите на экран все числа из промежутка от -10 до 10, модуль кото-
рых больше 3, но меньше 7.
11. Вычислите сумму ряда для x и n, введённых с клавиатуры.
12. Вычислите сумму ряда для x и n, введённых с клавиатуры.
13. Вычислите сумму ряда для x и n, введённых с клавиатуры.
14. Вычислите сумму ряда для x и n, введённых с клавиатуры.
S = ex+2ex+ 3ex+…+nex
15. Вычислите сумму ряда для x и n, введённых с клавиатуры.
5. МЯГКИЕ ЦИКЛЫ
Оператор цикла for удобно применять, когда заранее известно, сколько
раз требуется выполнить тело цикла. Но часто количество интеракций цикла
заранее неизвестно (например, цикл может продолжаться пока пользователь
не даст команду на его прекращение). В таких случаях используют мягкие
циклы – циклы, число повторений которых не определяется программистом.
В Паскале предусмотрено две конструкции для реализации мягких циклов.
Мягкий цикл с предусловием
Работа данного цикла начинается с проверки условия (некоторого логического выражения). Если условие истинно, выполняется тело цикла.

23
Условие вычисляется при каждом повторении цикла. Цикл с предусловием
продолжает свою работу, пока условие будет истинно. Оператор цикла имеет следующую схему записи:
while условие do тело цикла;
Если перед началом выполнения оператора while значение условия
равно false, тело цикла не будет выполнено ни разу.
Пример.
x:=0;
While x<4 do x:=x+1; // цикл выполнится 4 раза
Пример.
x:= 0;
While x<=4 do begin // цикл выполняется 5 раз
x:=x+1;
Writeln(‘оборот цикла №’, x);
End;
Поскольку при работе с мягкими циклами контроль количества повторений цикла всецело возлагается на программиста, необходимо внимательно следить за тем, чтобы не возникла ситуация “отсутствия условия
выхода из цикла”, которая неизбежно приводит к зависанию компьютера.
Пример.
x:= 0;
While x<=4 do begin // бесконечный цикл, x всегда будет меньше 4
s:=s*2;
Writeln(‘оборот цикла №’, x);
end;
Задание. Написать программу, определяющую, сколько раз цифра 5
встречается в ведённом числе.
Решение. Переберём все цифры числа справа налево. После анализа
каждой цифры, будем исключать её из числа. Процесс продолжим до тех
пор, пока введённое число не исчерпает все цифры, то есть, пока не превратится в ноль.
Текст программы.
Var a,s : integer;
Begin

24
s:=0; //обнуляем счётчик
Writeln('Введите число');
Readln(a);
While a>0 do begin // пока число a>0
//выделяем последнюю цифру числа a,
if a mod 10 =5 then s:=s+1; // если она равна 5, то увеличиваем
// счётчик.
a:=a div 10; //отбрасываем крайнюю правую цифру числа a.
end;
Writeln('Количество цифр 5 =',s);
End.
Мягкий цикл с постусловием
Особенность цикла состоит в том, что операторы, образующие его
тело выполняются до проверки условия. Таким образом, этот цикл всегда выполняется, по крайней мере, один раз. После первого выполнения
операторов проверяется условие, если оно истинно, то работа цикла
прекращается, в противном случае начинается новое повторение цикла.
Цикл продолжает свою работу до тех пор, пока условие ложно. Цикл с
постусловием реализуется в Паскале в следующей конструкции:
Repeat
Тело цикла
Until условие;
Пример:
Repeat e:=Cos(w) Until e>0;
В отличие от всех остальных операторов Паскаля при использовании
оператора Repeat, тело цикла, состоящее из нескольких команд, заключать
в логические скобки begin - end не требуется. Границы тела цикла определяются самими зарезервированными словами Repeat и Until.
Пример:
x:=0;
Repeat
x:=x+1;
Writeln(‘оборот цикла №’, x);
Until x<4; // цикл выполниться только 1 раз.

25
Задание. Вывести на экран все значения функции
для x
изменяющегося от 2 до 10 с шагом 0,5.
Текст программы.
Var x,y:real;
BEGIN
x:=2;
Repeat
y:=0.4*sqr(x)-1/x;
Writeln('y(', x:1:1 ,')=',y:1:1);
x:=x+0.5;
Until x>10;
END.
В принципе, циклы с предусловием и постусловием являются взаимозаменяемыми. Любую задачу, требующую использования мягкого цикла, можно решить, используя любой из них.
Команда прерывания цикла
Если тело цикла представляет собой достаточно длинную последовательность операторов, то может возникнуть необходимость досрочного
прерывания цикла, то есть выхода из цикла до очередной проверки условия.
Для немедленного завершения текущего оператора цикла можно использовать команду break. Она применима к любому циклу (for, while, repeat).
Обычно команда break используется совместно с оператором ветвления.
Задание. Определить, встречается ли в введённом числе хотя бы
одна цифра 7.
Решение. Реализуем рассмотренный ранее алгоритм с помощью цикла с постусловием. Для хранения информации о наличии (или отсутствии)
цифр 7 в слове будем использовать строковую переменную flag. Изначально
в ней будет содержаться предположение, что в ведённом числе отсутствуют семёрки. При обнаружении первой цифры 7, данное утверждение
изменится на противоположное и работа цикла прекратится.
Текст программы.
Var a: integer;
flag: string;
BEGIN

26
Writeln (‘Введите число’);
Readln(a);
flag:='В числе нет цифр 7';
Repeat
if a mod 10 = 7 then begin
flag:='В числе есть цифры 7';
break;
end;
a:=a div 10;
Until a=0;
Writeln(flag);
END.
Команда продолжения цикла
В Паскале имеется команда, по своему действию противоположная
команде прерывания цикла. Она позволяет немедленно продолжить выполнение цикла, пропустив все оставшиеся операторы его в теле. Эта команда continue.
Пример:
for i:=1 to 7 do if i=5 then continue else Writeln(i); // На экран выве-
дутся числа 1,2,3,4,6,7
Задания для самостоятельной работы
1. Найти сумму цифр 7 и 5 в введённом числе (например, в числе 4755
сумма равна 17).
2. Подсчитать количество чётных цифр в введённом числе (например, в
числе 1213 количество чётных цифр равно1).
3. Найти в введённом числе количество всех цифр неравных четырём
(например, в числе 4214 таких цифр 2).
4. Подсчитать количество цифр кратных 3 в введённом числе (например,
в числе 10195 одна такая цифра).
5. В введённом числе подсчитать сумму всех чётных цифр неравных 4
(например, в числе 1426 сумма равна 8).
6. Определить, встречается ли в ведённом числе хотя бы одна нечётная
цифра или хотя бы одна цифра больше 4.
7. Определить, встречается ли в ведённом числе хотя бы одна цифра
больше 2, но не равная 5.
8. Определить, встречается ли в ведённом числе хотя бы одна чётная
цифра больше 4.

27
9. Определить, встречается ли в ведённом числе хотя бы одна чётная циф-
ра неравная 8.
10. Определить, встречается ли в ведённом числе хотя бы одна цифра
кратная 2 или кратная 3.
11. Вычислите значения функции y=-Sin(2x)+25x3 в диапазоне от -4 до 2
включительно с шагом 0,6.
12. Вычислите значения функции y=-7Cos2(x)-2=0 в диапазоне от -3 до 2
включительно с шагом 0,2.
13. Вычислите значения функции y=-3x3+10x2-2 в диапазоне от -7 до 3
включительно с шагом 0,5.
14. Вычислите значения функции y=-2x3+5|x|-4=0 в диапазоне от -6 до 0
включительно с шагом 0,4.
15. Вычислите значения функции y=2x3+Cos(x2) - 3 в диапазоне от 5 до 12
включительно с шагом 0,3.
6. ВЛОЖЕННЫЕ ЦИКЛЫ
Среди команд, образующих тело цикла могут оказаться операторы,
также являющиеся циклами. В этом случае говорят о вложенных циклах.
Количество уровней вложения не ограничивается. В качестве примеров организации работы вложенных циклов рассмотрим две задачи.
Задание. Вывести на экран таблицу умножения для чисел от 1 до 9.
Решение. От нас требуется перебрать все числа от 1 до 9. Каждое
из этих чисел поочерёдно умножить на числа от 1 до 10. Результаты
умножения необходимо вывестись на экран.
Текст программы.
Var a,b: integer;
BEGIN
for a:=1 to 9 do begin
for b:=1 to 10 do Write(' ',a,'*',b,'=',a*b,' '); // Вывод строки таблицы
Writeln; // Перевод курсора для вывода следующей строки
end;
END.
Задание. Найти все “счастливые номера” среди четырёхзначных
чисел (сумма первых двух цифр, равна сумме двух последних).
Решение. Во вложенных циклах переберём все возможные значения
цифр и проверим, будет ли число, состоящее из данных цифр “счастливым номером”.

28
Текст программы.
Var a,b,c,d: integer;
BEGIN
for a:=0 to 9 do
for b:=0 to 9 do
for c:=0 to 9 do
for d:=0 to 9 do if a+b=c+d then Writeln(a,b,c,d);
END.
Отметим, что вложенные циклы можно конструировать как с помощью жёстких, так и с помощью мягких циклических конструкций.
Задания для самостоятельной работы
1. Вывести на экран все четырёхзначные числа, у которых сумма первых
трёх цифр кратна последней цифре (например, 1225, 6003, 2514).
2. Вывести на экран все четырёхзначные числа, у которых в записи есть
цифра 0.
3. Вывести на экран все четырёхзначные числа, у которых сумма первых
двух цифр равна числу, образованному последними двумя цифрами
(например, 2204, 8715).
4. Вывести на экран все трёхзначные числа, цифры которых расположены
в порядке возрастания (123, 124, 125 и т.д.).
5. Вывести на экран все трёхзначные числа, цифры у которых все цифры
различны.
6. Вывести на экран все четырёхзначные числа, у которых произведение
крайних цифр равно числу, образованному средними цифрами. Например,
5204, 1077.
7. Вывести на экран таблицу Пифагора.
7. ГЕНЕРАТОР СЛУЧАЙНЫХ ЧИСЕЛ
В современной информатике очень большое место уделяется компьютерному моделированию случайных событий. Для решения подобного
рода задач используют специальный алгоритм, который называется “генератор псевдослучайных чисел”.
Генератор псевдослучайных чисел (ГПСЧ) – это алгоритм, генерирующий последовательность чисел, элементы которой практически независимы друг от друга. Обратим внимание на то, что в определении говорится не о “случайных”, а о “псевдослучайных” числах. Этим подчёркива-

29
ется, что результаты работы данного алгоритма, в принципе, можно предугадать. То есть, используя математические методы, точно определить, какое число будет сгенерировано следующим. Но на качестве моделирования
случайных событий данная особенность генератора псевдослучайных чисел, как правило, существенного влияния не оказывает.
В Паскале за генерацию случайных чисел отвечают функции:
Random - возвращает вещественное число из диапазона [0, 1);
Random (N) - возвращает целое число из диапазона [0, N-1], где N
–целое число.
Также необходимо отметить процедуру Randomize. Она инициализирует (запускает) генератор псевдослучайных чисел. Данную процедуру рекомендуется всегда использовать перед Random.
Используя данные функции и математические операции можно получить случайные числа из любого диапазона.
Пример:
Random*101 – случайное вещественное число из диапазона [0, 100].
Random*101-50 – случайное вещественное число из диапазона [-50, 50].
Random(100)+1– случайное целое число из диапазона [1, 100].
Random(101)+50– случайное целое число из диапазона [50, 150].
Задание. Написать программу, которая загадывает пользователю
число от 1 до 100 до тех пор, пока он его не угадает (с подсказками
“больше” и “меньше”).
Текст программы.
Var r,n: integer;
BEGIN
Randomize; // инициализируем генератор случайных чисел
r:=random(100)+1; // присваеваем r целое случайное число из [1, 100]
Repeat // Открываем мягкий цикл
Writeln('Угадай число от 1 до 100');
Readln(n); // Запрашиваем у пользователя вариант ответа n
if n<r then write('Не угадал, больше'); // сообщаем, если n не равно r
if n>r then write('Не угадал, меньше>');
Until r=n; // Продолжаем запрашивать ответ пока r не станет
// равным n
Writeln('Угадал!');
END.

30
8. МАССИВЫ
Массивом называют совокупность элементов одного типа. Все элементы массива пронумерованы. Массивы достаточно часто применяются
при обработке небольших объёмов однотипных данных. Как правило, работа с массивом осуществляется в четыре этапа:
описание;
заполнение;
обработка;
вывод на экран.
Данные этапы работы с массивом существенно облегчаются при использовании циклов. Рассмотрим названные этапы подробнее.
Описание
Перед использованием массива в программе его необходимо описать. Самый простой способ – описать массив как переменную. Для этого
используется конструкция.
Var имя массива array[начальный_индекс .. конечный_индекс] of тип
данных.
В качестве диапазона индексов может использоваться любой порядковый диапазон. Массив не может содержать более 256 элементов. В нижеследующем примере описан массив x, состоящий из 10 целых чисел с
индексами от 1 до 10, и массив y, состоящий из 5 вещественных чисел с
индексами от b до f.
Пример:
Var x: array [1..10] of integer;
y: array [‘b’..’f’] of real;
Заполнение и обработка
К любому элементу массива можно обратиться, указав имя массива и
номер элемента в квадратных скобках. Действия с элементами массивов
аналогичны действиям с данными соответствующего типа.
Пример: Для массивов, описанных в примере можно выполнить следующие команды:
x[3] : = 25;
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
