Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]