Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование. Учебное пособие
.pdf
41
4. В ведённой строке удвойте вхождение каждой буквы, кроме буквы “б”
(например, забор → ззаабоорр).
5. Удалить в слове все удвоенные буквы (например, а11бв222г → абв2г).
6. В ведённой строке удвойте каждое вхождение буквы “а” (например, ма-
ма → маамаа).
7. Для введённой строки построить слово, “симметричное” его первой по-
ловине (например, 12345 → 1221; река → реер).
8. Из букв введённого слова получить новое слово, переставив все буквы
“а” в начало (например, каравай → ааакрвй).
9. Переписать введённую строку наоборот (например, кот → ток).
10. Из букв введённого слова получить новое слово, переставив все буквы
“а” в конец (например, каравай → крвйааа).
12. Найти сумму всех двоек и троек в строке (например, для слова
h2z2h5jj3 сумма равна 7).
13. Проверить, есть ли в введённом слове удвоенные буквы.
14. Из букв введённого слова получить новое слово, записывая после каж-
дой буквы символ “*” (например, класс → к*л*а*с*с*).
15. Проверить, являются ли все буквы слова одним и тем же символом.
10. МНОЖЕСТВА
Множество ‒ это тип данных, представляющий собой набор взаимосвязанных по какому-либо признаку или группе признаков объектов,
которые можно рассматривать как единое целое. Каждый объект в множестве называется элементом множества. Все элементы множества
должны принадлежать одному из порядковых типов, содержащему не
более 256 значений. Этот тип называется базовым типом множества. Базовый тип задается диапазоном, перечислением или идентификатором
типа, содержащего не более 256 значений. Все значения базового типа,
образующие конкретные значения множественного типа, должны быть
различны. Областью значений типа множество является набор всевозможных подмножеств, составленных из элементов базового типа. В тексте программы значения элементов множества указываются в квадратных скобках.
Пример:
[1,2,3,4], ['а',‘b','с'], ['a'..'z'].
Порядок "расположения" элементов во множестве никак не фиксируется. Например, [1, 2, 3] и [3, 2, 1] ‒ это эквивалентные множества.
Каждый элемент в множестве учитывается только один раз. Поэтому

42
множество [1, 2, 3, 4, 2, 3, 4, 5] эквивалентно [1..5] или [5, 2, 4, 1 ,3]. Если
множество не имеет элементов, оно называется пустым и обозначается
пустыми квадратными скобками.
Самый простой способ описания множества в программе – описание переменной множественного типа. Для этого используют конструкцию:
Var имя_переменной: set of базовый_тип;
Пример:
Var a, d : set of byte; // a и d – множества, соответствующие типу
byte
b : set of 'a'..'z'; // d – множество маленьких латинских букв
f: set of 1..8; // f – множество чисел от 1 до 8.
Значения во множественную переменную нельзя вводить процедурой ввода и выводить процедурой вывода. Множественная переменная
может получить конкретное значение только в результате выполнения
оператора присваивания по формуле:
множественная переменная := множественное выражение;
Пример:
a : = [50, 100, 150, 200];
b : = ['m', 'n', 'k'];
d : = a;
f:=[2, 5, 8];
Операции над множествами
Объединением двух множеств A и B называется множество, состо-
ящее из элементов, входящих хотя бы в одно из множеств A или B. Данная операция обозначается знаком «+».
Пример:
1) [1, 2, 3, 4] + [3, 4, 5, 6] = [1, 2, 3, 4, 5, 6].
2) []+[‘a’..’z’]+[‘A’..’E’, ‘k’] = [‘A’..’E’, ‘a’..’z’].
Пересечением двух множеств A и B называется множество, состоящее из элементов, одновременно входящих во множество A и во множество B. Для обозначения пересечения используют знак «*».

43
Пример:
1) [1, 2, 3, 4] * [3, 4, 5, 6] = [3, 4]
2) [‘a’..’z’]*[‘A’..’E’, ‘k’] = [‘k’]
Разностью двух множеств A и B называется множество, состоящее
из элементов множества A, не входящих во множество B. Обратим внимание, что A-B в общем случае не равно B-A.
Пример:
1) [1, 2, 3, 4] - [3, 4, 5, 6] = [1, 2]
2) [3, 4, 5, 6] - [1, 2, 3, 4] = [5, 6]
Добавление элемента. Добавить новый элемент во множество можно с использованием операции объединения. Например, a:= a+[5]. Для
этих же целей предназначена процедура Include (M, A), где M – множество, A – переменная того же типа, что и элементы множества M. Тот же
пример можно записать так: Include (a, 5)
Исключение элемента. Исключить элемент из множества можно
с помощью операции “разность множеств”. Например, a:= a-[5]. Для
этих же целей используется процедура Exclude (M, A) , где M – множество, A – переменная того же типа, что и элементы множества M. Тот же
пример можно записать так: Exclude (a, 5)
Проверка вхождения элемента во множество. Если x ‒ некоторое значение, а M ‒ множество, то операция проверки вхождения записывается так: x in M. Её результатом будет значение true, если x входит
во множество M, и false в противном случае.
Пример:
1) 4 in [3, 4, 7, 9] = true.
2) 5 in [3, 4, 7, 9] = false.
Использование данной операции в ряде случаев позволяет формировать логические выражения более рационально, чем с использованием
оператора условия.
Пример:
1) Условие “натуральное число n является двухзначным” можно
записать “ n in [10..99]” (вместо “ (n >= 10) and (n <=99) ”).
2) Условие “символ z является русской буквой” можно записать
“ z in [‘А’.. ‘Я’, ‘а’.. ‘п’, ‘р’.. ‘я’] “ (вместо выражения “ (z >= ‘А’) and
(z <= ‘Я’) or (z>=‘а’) and (z<=‘п’) or (z>=‘р’) and (z<=‘я’) ”).

44
Для вывода всех элементов множества на экран также удобно использовать проверку вхождения. Обычно организуют цикл, перебирающий все возможные значения множества. В цикле осуществляется проверка вхождения значения во множества и, в случае положительного результата, это значение выводится.
Пример:
for i:=2 to 8 do if i in f then write(i);
for k:=’a’ to ‘z’ if k in b then write(k);
Сравнение множеств. Множества считаются равными (эквивалентными), если все элементы одного множества присутствуют в другом и
наоборот. Для проверки на равенство или неравенство используются операции “=” и “<>”.
Пример:
[2,1,3]= [1,3,2] – true.
Проверка включения. Одно множество считается включенным
в другое (множество является подмножеством другого), если все его элементы содержатся во втором множестве. Обратное утверждение может
быть и несправедливым. Операции проверки включения обозначаются
“<=” и “>=”.
Пример:
[2,1,3] <= [1..5] – true.
[2,1,3] >= [1..5] – false.
[2,1,3] >= [1,3,2] – true.
[2,1,4] >= [1,3,2] – false.
Следует отметить, что применение операций “<” и “>” над операндами множественного типа недопустимо.
Задание. Из множества целых чисел 1..20 выделить: множество
чисел, делящихся на 6 без остатка; множество чисел делящихся на 2 или
на 3 без остатка. Вывести содержимое этих множеств на экран.
Текст программы.
Var a,a6,a23: set of 1..20;
i:integer;
Begin
a6:=[];

45
a23:=[];
for i:= 1 to 20 do begin
if i mod 6=0 then a6:=a6+[i];
if (i mod 3=0) or (i mod 2=0) then a23:=a23+[i];
end;
Writeln ('На 6 делятся числа:');
for i:=1 to 20 do if i in a6 then Write(i, ' ');
Writeln;
Writeln ('На 2 или на 3 делятся числа:');
for i:=1 to 20 do if i in a23 then Write(i, ' ');
End.
Задание. Вывести на экран все цифры, которые не содержатся в введенном слове. Например, в слове 1аа2а3456 не содержатся цифры 0,7,8,9.
Решение. Сформируем контрольное множество, состоящее из символов от “0” до “9”. Переберём все символы введённого слова. Если текущий
символ присутствует в контрольном множестве, то исключаем его из
множества. После перебора в контрольном множестве останутся только
цифры, которые не содержатся в введённом слове.
Текст программы.
Var n: set of '0'..'9';
s:string;
i:integer;
c:char;
BEGIN
n:=['0'..'9']; // Контрольное множество
Writeln('Введите слово');
Readln(s);
for i:=1 to length(s) do if s[i] in n then n:=n-[s[i]];
Writeln ('В слове ', s, ' не встречаются цифры');
for c:='0' to '9' do if c in n then Write(c, ' ');
END.
Задание. Написать программу, проверяющую, состоит ли введённое
слово исключительно из букв английского алфавита, или в нём присутствуют “посторонние символы”.
Текст программы.
Var n: set of char;
s, flag:string;

46
i:integer;
BEGIN
n:=['a'..'z','A'..'Z']; // Контрольное множество
Writeln('Введите слово');
Readln(s);
flag:='Слово состоит только из английских букв';
for i:=1 to length(s) do if not (s[i] in n) then
flag:='В слове содержатся посторонние символы';
Writeln (flag);
END.
Задания для самостоятельной работы
1. Из множества чисел от 1 до 50 сформируйте множество чётных чисел
и выведите его на экран. Затем из полученного множества сформируйте
множество чисел, не оканчивающихся на 2 и на 4, и также выведите его
на экран.
2. Из множества чисел от 1 до 40 сформируйте множество чисел, которые
не оканчиваются на 2 и на 3, и выведите его на экран. Затем из полученно-
го множества сформируйте множество нечётных чисел и также выведите
его на экран.
3. Из множества двузначных чисел сформируйте множество чисел, кратных четырём и выведите его на экран. Затем из полученного множества
сформируйте множество чисел, являющихся точными квадратами, и также
выведите его на экран.
4. Для введённого числа сформируйте множество его делителей и выведи-
те его на экран. Затем из полученного множества сформируйте множество
чётных чисел и также выведите его на экран.
5. Выведите на экран все согласные русские буквы, содержащиеся в введённом слове (множество для проверки можно задать перечислением согласных букв).
6. Проверить, есть ли в введённом слове чётные цифры.
7. Подсчитать количество гласных русских букв в введённом слове (мно-
жество для проверки можно задать перечислением гласных букв).
8. Подсчитайте количество символов в введённом слове, не являющихся
цифрами (множество для проверки можно задать перечислением).
9. Проверить, есть ли в введённом слове повторяющиеся символы.
10. Есть ли в введённом слове хотя бы одна из букв “а”, “ф”, “ж”, “ю”?
11. Выведите на экран все символы введённого слова, не являющиеся
буквами русского алфавита (множество для проверки можно задать перечислением).
12. Проверить, можно ли из букв слова А составить слово B, если все бук-
вы каждого из слов различны.

47
12. ПРОЦЕДУРЫ
При составлении программы достаточно часто возникает необходимость повтора определенной последовательности операторов в разных частях кода. Для того, чтобы описывать эту последовательность один раз, а
применять многократно, в языках программирования применяются подпрограммы. Подпрограмма – это автономная часть программы, выполняющая определенный алгоритм и допускающая обращение к ней из различных частей общей программы. Использование подпрограмм позволяет реализовать один из самых современных методов программирования - структурное программирование.
Процедуры – это вид подпрограмм, который используются в случаях, когда подпрограмма возвращает в основную программу несколько значений или же не возвращает ничего. Подпрограммы в Паскале объявляются в разделе описания за разделом переменных. Для описания процедур
используется схема:
Procedure Имя процедуры (список параметров);
БЛОК ОПИСАНИЯ
Begin
БЛОК ОПЕРАТОРОВ
End;
Процедуры Паскаля можно условно разделить на два вида: процедуры с параметрами и без параметров. Обращение к процедуре без параметров из основной программы осуществляется по имени.
Задание. Описать процедуру без параметров, которая выводит
строку из 60 звездочек.
Текст программы.
Procedure Pr; // Описываем процедуру Pr
Var i : integer ;
Begin
for i :=1 to 60 do Write (‘ * ');
Writeln;
End;
BEGIN
Pr; // Вызываем процедуру. На экран выведется 180 звёздочек.
Pr;
Pr;
END.

48
Если предполагается, что результат работы процедуры будет зависеть от данных, получаемых из программы, или процедура будет возвращать в основную программу какие-то значения, то используют процедуры
с параметрами. Параметры описываются как обычные переменные в скобках после имени процедуры с указанием их типа. При обращении к такой
процедуре, указывается её имя и в скобках перечисляются все параметры.
Параметры, используемые в обращении к подпрограммам, называются
фактическими; параметры, указанные в описании подпрограмм - формальными. Фактические параметры должны соответствовать формальным по
количеству, порядку следования и типу.
Задание. Описать процедуру, находящую сумму двух чисел.
Текст программы.
Var a,b,c : integer;
Procedure Sum(var x,y,z: integer); //x,y,z – формальные параметры
Begin
z:=x+y;
End;
BEGIN
Writeln(‘введите первое число’);
Readln(a);
Writeln(‘введите второе число’);
Readln(b);
Sum(a,b,c); //a,b,c – фактические параметры
Writeln(a,’+’,b,’=’,c)
END.
Отметим особенность использования ключевого слова Var при описании формальных параметров подпрограммы. Если формальные параметры стоят после слова Var, это означает, что процедура может изменять
значение соответствующих фактических параметров. Так, в приведённом
выше примере, значение фактической переменной c изменилось. Значение переменных a и b процедура не поменяла, но чисто теоретически, она
могла бы это сделать. В случае, когда изменение подпрограммой фактических параметров недопустимо, их описывают без слова Var. Процедуру
из приведённого примера можно было описать следующим образом.
Procedure Sum(x,y: integer; var z: integer);
Begin
z:=x+y;
End;

49
Задание. Описать процедуру, выделяющую из трёхзначного числа
цифры сотен, десяток и единиц и возвращающую их в основную программу.
Текст программы.
Var r,x,y,z: integer;
Procedure cifra(Var n,a,b,c:integer);
Begin
a:=n div 100;
b:=(n-a*100) div 10;
c:=n mod 10;
End;
BEGIN
Writeln('Введите число');
Readln(r);
cifra(r,x,y,z);
Writeln('цифра сотен -',x);
Writeln('цифра десятков -',y);
Writeln('цифра едениц -',z);
END.
Задание. Описать процедуру Printer(s, s1, k), формирующую строку
s1, состоящую из k повторений строки s.
Текст программы.
Var t,t1:string;
a: integer;
Procedure Printer(Var s, s1:string; k:integer);
var i :integer;
Begin
s1:='';
for i:=1 to k do s1:=s1+s;
End;
BEGIN
Write('Введите строку');
Readln(t);
Writeln('Введите число');
Readln(a);
Printer(t, t1, a);
Writeln('Результат-',t1);
END.

50
Рис. 1. Пример структуры подпрограмм
Все формальные параметры
являются локальными для данной
процедуры и глобальными для каждой процедуры в ней. Например,
при организации структуры подпрограмм, представленной на Рисунке
1, к переменной T можно обратиться
из любой точки программы, к переменной a из процедуры PB или PA, к
переменной b только из процедуры
PB.
Как можно заметить, структура подпрограммы напоминает собой саму
структуру Паскаль-программы. Здесь также присутствуют имя, блок описания, блок операторов, и т.д. В блоке описания по стандартным для Паскаля
правилам могут быть описаны переменные, которые предполагается использовать внутри подпрограммы, а также другие подпрограммы. Параметры,
объявленные в основной (главной) программе, действуют в любой подпрограмме и называются глобальными. Параметры, объявленные в подпрограмме, действуют только в этой подпрограмме и называются локальными.
Задания для самостоятельной работы
1. Описать процедуру, находящую наибольшую цифру трёхзначного
числа и возвращающую её в основную программу.
2. Описать процедуру, находящую сумму цифр трёхзначного числа и
возвращающую её в основную программу.
3. Описать процедуру, St(s:string; a:char), заменяющую в строке s все
символы a на символ “*”. В основную программу возвращается изменённая строка s. Например, если s=’sddffd’ и a=’d’, после выполнения
процедуры s примет значение s**ff*
4. Описать процедуру, St(s:string; a:char, n:integer), находящую количество (n) вхождений символа a в строке s. Параметр n возвращается в основную программу. Например, если s=’sddffd’ и a=’d’, после выполнения процедуры n примет значение 3.
5. Описать процедуру AR(d, k), добавляющую к целому положительному
числу k справа цифру d.
6. Описать процедуру AL(d, k), добавляющую к целому трёхзначному
числу k слева цифру d.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
