- •§1. Начало программирования на языке Паскаль.
- •Краткое знакомство.
- •Функциональные клавиши Турбо Паскаль.
- •§2. Алфавит языка Паскаль. Переменные. Типы переменных Алфавит языка Паскаль.
- •Стандартные математические функции
- •Типы переменных
- •§3. Операторы присваивания.
- •Оператор ввода-вывода.
- •Арифметические операции.
- •Стандартные функции
- •Правила записи арифметических выражений.
- •Правила записи стандартных функций.
- •Оператор ввода .
- •Оператор вывода .
- •§4. Структура программы.
- •Первая программа.
- •Эксперименты с программой.
- •§5. Разветвляющие алгоритмы. Составной оператор
- •Оператор if или условный оператор
- •Блок-схема полного у словного оператора
- •Блок-схема неполного у да Условие словного оператора
- •§6. Оператор цикла с параметром Циклический алгоритм
- •Цикл с предусловием «Пока»
- •Цикл с постусловием «До»
- •Цикл с параметром «Для» Цикл с параметром «Для»
- •Блок-схема цикла «for»
- •§7. Базовые циклические алгоритмы
- •1. Алгоритм вычисления суммы чисел.
- •2. Подсчет количества чисел удовлетворяющих заданному условию.
- •3. Вычислить сумму чисел, кратных 3, из десяти чисел введенных с клавиатуры.
- •4. Алгоритм вычисления n!.
- •5. Алгоритм вычисления аn.
- •§8. Цикл с предусловием while
- •Блок-схема цикла «Пока»
- •§9. Оператор цикла с постусловием Repeat
- •Блок-схема цикла «До»
- •§10. Эксперимент с программой. Лабораторная работа
- •§11. Оператор варианта выбора
- •§12. Типы определенные пользователем Раздел описания типов
- •Перечислимый тип данных
- •§13. Вложенные циклы
- •§14. Одномерные массивы Работа с элементами
- •Способы задания значений элементов массива
- •Алгоритмы работы с массивами
- •Эксперименты с программой
- •§15. Обработка символьных массивов. Данные символьного типа.
- •Описание строковых переменных
- •Операции над строковыми переменными
- •§16. Двумерные массивы Работа с элементами
- •5.Вычисление суммы элементов всего двумерного массива.
- •6. Задача поиска максимального (минимального) элемента и его индексов.
- •7. Алгоритм поиска минимального элемента и его индексов для всего массива.
- •8. Квадратные матрицы.
- •Примеры решения задач
- •§17. Подпрограммы
- •Процедура в Паскале и ее формат.
- •Функции
- •§18. Примеры рекурсивного программирования
- •Задачи с рекурсивной формулировкой
- •Задачи, из постановки которых можно извлечь рекурсию
- •Задачи, которые можно решить как частный случай обобщенной
- •Задачи, в которых можно использовать характеристику или свойство функции
- •§19. Графика
- •Установка цвета и стиля заполнения
- •Процедуры создания графических примитивов
- •1. Текущий указатель.
- •2. Вывод точки
- •3. Вывод отрезка
- •4. Построение прямоугольника
- •5. Построение дуг, окружностей, эллипсов.
- •6. Построение закрашенного эллипса:
- •7. Заполнение внутренней или внешней области замкнутой фигуры.
- •Материалы для дополнительного чтения. §20. Файловый тип данных
- •Связь переменной файлового типа с файлом на диске.
- •Чтение из файла.
- •Закрытие файла
- •Признак конца файла
- •Запись в файл
- •Прямой доступ к элементам файла
- •§21. Текстовые файлы
- •§22. Множества
- •Операции над множествами
- •Операция определения принадлежности элемента множеству
- •Сравнение множеств
- •§23. Комбинированный тип данных (записи)
- •2. С использованием оператора присоединения.
- •§24. Приближенные вычисления.
- •§25. Основы структурного программирования
- •10. Комплексный пример
- •Содержание
Операция определения принадлежности элемента множеству
Эта логическая операция обозначается служебным словом in. Результат операции имеет значение true, если элемент входит в множество, и false в противном случае.
Примеры.
1. Выражение 5 in [3..7] имеет значение true, так как 5 [3;7]
Выражение ‘a’ in [‘A’..’Z’] имеет значение false, так как маленькой латинской буквы «а» нет среди больших латинских букв.
Сравнение множеств
Для сравнения множеств используются операции отношения:
= - проверка на равенство (совпадение) двух множеств;
<> - проверка на неравенство двух множеств;
<=, < - проверка на вхождение первого множества во второе множество;
>=, > - проверка на вхождение второго множества в первое множество.
Первое множество меньше или равно второму (AB)
B A B A B A
true false true
Первое множество меньше второго (A<B)
B
B A B A A
true false false
Пример. Составить программу выделения следующих множеств из множества целых чисел от 1 до 30 :
- множества чисел, кратных 2;
- множества чисел, кратных 3;
- множества чисел, кратных 6;
- множества чисел, кратных 2 или 3;
Вопросы для обсуждения :
1. Сколько множеств надо описать? (Каков тип их элементов? (четыре множества с элементами типа Byte).
2. Каково начальное значение множеств ? (начальное значение множеств - пустое множество).
3. Как формируются множества? (Первые два формируются перебором всех чисел данного промежутка и отбором подходящих, а третье и четвертое получаются из первых двух путем применения операции пересечения или объединения).
4. Как осуществить вывод сформированных множеств? (Вывод множеств производится ТОЛЬКО поэлементно, поэтому удобно составить процедуру и передавать в нее множество, элементы которого и будут выводить на экран. Для этого в разделе типов надо создать соответствующий тип и использовать его в дальнейшем).
Program mnog;
const n=30;
type mn=Set Of 1..n;
var n2, n3, n6, n23 : mn;
k : integer;
procedure print(m: mn);
var i: integer;
begin
for i:=1 to n do if i In m then write(i:3);
writeln;
end;
BEGIN
n2=[ ]; n3=[ ];
for k:=1 to n do
begin
{если число делится на 2, то заносим его в n2 }
if k Mod 2 = 0 Then n2:=n2+[k];
{если число делится на 3, то заносим его в n3 }
if k Mod 3 = 0 Then n3:=n3+[k];
end;
{числа, кратные 6, - это те, которые кратны и 2 и 3, поэтому это пересечение двух множеств, а числа, кратные 2 или 3, - это объединение этих же множеств}
n6:=n2*n3; n23:=n2+n3;
writeln(‘числа, кратные 2’); print(n2);
writeln(‘числа, кратные 3’); print(n3);
writeln(‘числа, кратные 6’); print(n6);
writeln(‘числа, кратные 2 или 3’); print(n23);
END.
Пример 2. Если взять то общее, что есть у боба с ложкой, добавить кота и поместить в тепло, то получится муравей. Так ли это ?
program bob;
var y1, y2, y3, y4, x : Set Of Char;
s : Char;
BEGIN
y1:=[‘б’, ‘о’, ‘б’]; y2:=[‘л’, ‘о’, ‘ж’, ‘к’, ‘а’];
y3:=[‘к’, ‘о’, ‘т’]; y4:=[‘т’, ‘е’, ‘п’, ‘л’, ‘о’];
x:=(y1*y2) + y3 - y4;
writeln(‘множество х’);
for s:=’a’ to ‘я’ do if s In x then write(s); writeln;
{проверка: состоит ли муравей из кота}
if y3<=x then write(‘муравей состоит из кота’)
else write(‘муравей не состоит из кота’);
END.
Пример 3. Дан ребус МУХА + МУХА = СЛОН
Каждой букве соответствует некоторая цифра, разным буквам соответствуют разные цифры. Необходимо заменить буквы цифрами так, чтобы получить верное равенство.
Для решения этой задачи применим метод перебора с возвратом. Используем множество S1 для хранения цифр слова МУХА, причем будем заносить в него цифры последовательно, учитывая уже внесенные цифры. Начальное значение S1 - пустое множество. После выбора всех цифр первого слова формируем соответствующее число и находим число, соответствующее слову СЛОН. Выделяем цифры СЛОНа (множество S2), и если слова состоят из различных цифр (то есть пересечение S1 и S2 пустое) и все цифры СЛОНа разные, то выводим решение на экран. Далее удаляем из множества S1 последнюю внесенную цифру и пытаемся выбрать еще одно ее значение. Таким образом, мы перебираем все возможные варианты и выводим на экран только те, которые удовлетворяют равенству.
Заметим, что букве «М» в слове МУХА может соответствовать цифра от 1 до 4, а букве «А» в этом же слове не может соответствовать 0.
Program myxa;
type mn=Set Of 0..9;
var m, y, x, a : 0..9; {цифры числа МУХА}
n1, n2 : integer; {числа МУХА и СЛОН}
a1, a2, a3, a4 : 0..9; {цифры числа СЛОН}
S1, S2 :mn;
procedure Print(x,y:integer); {вывод решения в виде ребуса }
begin
writeln(x:5);
writeln(‘+’);
writeln(x:5);
writeln(‘____’);
writeln(y:5);
end;
BEGIN
s1:=[ ]; s2:= [ ];
for m:=1 to 4 do
begin
s1:=s1+[m]; { заносим первую использованную цифру}
for y:=0 to 9 do {если это цифра не была еще взята, то добавляем ее во множество цифр числа МУХА и выбираем цифру для следующей буквы }
if Not (y In s1)
then begin s1:=s1+[y];
for x:=0 to 9 do
if Not (x In s1)
then begin s1:=s1+x;
for a:=1 to 9 do
if Not (a In s1)
then begin s1:=s1+[a];
n1:=1000*m+100*y+10*x+a;
n2:=2*n1;
a1:=n2 div 1000;
a2:=n2 div 100 mod 10;
a3:=n2 div 10 mod 10;
a4:=n2 mod 10;
s2:=[a1,a2,a3,a4];
if (s1*s2=[]) and ([a1]*[a2]*[a3]*a[4]=[])
then Print(n1,n2);
s1:=s1-[a];
end;
s1:=s1-[x];
end;
s1:=s1-[y];
end;
s1:=s1-[m];
end;
END.
