Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование. Практикум.doc
Скачиваний:
5
Добавлен:
30.04.2019
Размер:
901.63 Кб
Скачать

8. Множества

Цель

Ознакомиться со структурой данных «множество». Изучить основные процедуры и функции для работы с множествами. Применить полученные навыки в решении задач.

Теория

Множества - это наборы однотипных логически связанных друг с другом объектов. Характер связей между объектами лишь подразумевается программистом и никак не контролируется Паскалем. Количество элементов, входящих в множество, может меняться в пределах от 0 до 256 (множество, не содержащее элементов, называется пустым). Именно непостоянством количества своих элементов множества отличаются от массивов и записей.

Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов в множестве безразличен. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. Пустое множество включается в любое другое.

Описание типа множества имеет вид:

<имя типа> = SET OF <баз.тип>

<имя типа> - правильный идентификатор;

SET, OF - зарезервированные слова (множество, из);

<баз.тип> - базовый тип элементов множества, в качестве которого может

использоваться любой порядковый тип, кроме WORD, INTEGER, LONGINT.

Для задания множества используется так называемый конструктор множества: список спецификаций элементов множества, отделяемых друг от друга запятыми; список обрамляется квадратными скобками. Спецификациями элементов могут быть константы или выражения базового типа, а также - тип-диапазон того же базового типа.

Над множествами определены следующие операции:

* пересечение множеств; результат содержит элементы, общие для обоих множеств; на-пример, S4*S6 содержит [3], S4*S5 - пустое множество;

+ объединение множеств; результат содержит элементы первого множества, дополненные недостающими элементами из второго множества:

- разность множеств; результат содержит элементы из первого множества, которые не принадлежат второму:

= проверка эквивалентности; возвращает TRUE, если оба множества эквивалентны;

<> проверка неэквивалентности; возвращает TRUE, если оба множества неэквивалентны;

<= проверка вхождения; возвращает TRUE, если первое множество включено во второе;

>= проверка вхождения; возвращает TRUE, если второе множество включено в первое;

IN проверка принадлежности; в этой бинарной операции первый элемент - выражение, а второй - множество одного и того же типа; возвращает TRUE , если выражение имеет зна-чение, принадлежащее множеству:

Дополнительно к этим операциям можно использовать две процедуры. INCLUDE - вклю-чает новый элемент во множество. Обращение к процедуре:

INCLUDE (S,I)

Здесь S - множество, состоящее из элементов базового типа TSetBase;

I - элемент типа TSetBase, который необходимо включить во множество.

EXCLUDE - исключает элемент из множества. Обращение:

EXCLUDE(S,I)

Пример. Дан текст, определить каких букв больше - гласных или согласных

program example1;

const

glasn=['а','е','и','о','у','ы','э','ю','я'];

soglas=['б','в','г','д','ж','з','й','л','м',

'н','р','к','п','с','т','ф','х','ц','ч','ш','щ'];

var

st: string;

g,s,i:integer;

begin

write('Введите строку> '); readln(st);

g:=0; s:=0;

for i:= 1 to length(st) do

if st[i] in glasn then inc(g) else if st[i] in soglas then inc(s);

if g> s then writeln('Гласных больше')

else if g< s then writeln('Согласных больше')

else writeln('Согласных и гласных букв поровну');

readln;

end.

Задачи A

  1. Найти и вывести все гласные буквы (без повторений) , которые встретились в словах и количество слов.

  2. Найти и вывести все шипящие буквы (без повторений), которые встретились в самом длинном слове.

  3. Найти и вывести все шипящие буквы (без повторений), которые встретились во всех словах и количество слов.

  4. Найти и вывести все гласные буквы (без повторений), которые встречаются в самом коротком слове.

  5. Найти и вывести все согласные буквы (без повторений), которые встречаются в самом длинном слове.

  6. Элементами слов могут быть любые символы. Найти и вывести слово, содержащее наибольшее количество согласных букв.

  7. Найти и вывести слово, содержащее наибольшее количество гласных букв.

  8. В слове, в котором обнаружено наибольшее количество шипящих букв, заменить их на символ "*".

  9. Вывести все гласные буквы, содержащиеся в слове наибольшей длины и вывести число повторений каждой этой буквы.

  10. Вывести все согласные буквы, содержащиеся в слове наибольшей длины и вывести число повторений каждой буквы.

  11. Вывести все согласные буквы, содержащиеся в слове наибольшей длины и вывести число повторений каждой буквы.

Задачи В

  1. Дан текст из строчных латинских букв, за которым следует точка. Напечатать первые вхождения букв в текст, сохраняя их взаимный исходный порядок.

  2. Дан текст из строчных латинских букв, за которым следует точка. Напечатать все буквы, входящие в текст не менее двух раз.

  3. Дан текст из строчных латинских букв, за которым следует точка. Напечатать все буквы, входящие в текст по одному разу.

  4. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все гласные буквы, которые входят в каждое слово.

  5. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все согласные буквы, которые не входят ни в одно слово.

  6. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все звонкие согласные буквы, которые входят хотя бы в одно слово.

  7. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все глухие согласные буквы, которые не входят хотя бы в одно слово.

  8. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все согласные буквы, которые входят только в одно слово.

  9. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все глухие согласные буквы, которые не входят только в одно слово.

  10. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все звонкие согласные буквы, которые входят более чем в одно слово.

  11. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все гласные буквы, которые не входят более чем в одно слово.

  12. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все звонкие согласные буквы, которые входят в каждое нечетное слово и не входят ни в одно четное слово.

  13. Дана непустая последовательность слов из строчных русских букв; между соседними словами - запятая, за последним словом - точка. Напечатать в алфавитном порядке все глухие согласные буквы, которые входят в каждое нечетное слово и не входят хотя бы в одно четное слово.

9. Процедуры и функции

Цель

Научиться разрабатывать и использовать процедуры и функции. Изучить понятия локальных и глобальных переменных.

Теория

При разработке программ часто возникают ситуации, когда часть кода повторяется в различных местах программы и используется для разных параметров. В этих случая целесообразным является использование подпрограмм – процедур и функций.

Пример: Program Primer;

Procedure Vp1;

begin

....... {Тело процедуры Vp1}

end;

Procedure Vp2;

begin ...... {Тело процедуры Vp2}

end;

Begin Vp1; {Вызов процедуры Vp1} Vp2; {Вызов процедуры Vp2} End.

Структура описания подпрограммы выглядит так:

Procedure <имя>[(параметры значения; var параметры-переменные )];

{Раздел описаний}

BEGIN

{Раздел исполняемых операторов}

END;

<Объявление программной единицы> - заголовок процедуры или функции.

Заголовок процедуры обязательно содержит имя и (опционально) в скобках список параметров-значений, затем после слова VAR список параметров-переменных:

procedure Vr(a: string; var i:integer);

Заголовок функции обязательно содержит имя и тип возвращаемого значения, (опционально) в скобках список параметров-значений:

function Fn(i:integer, b:real): real;

Функция всегда возвращает какое-либо значение после выполнения, поэтому обязательным является наличие присвоение функции значения в конце ее описания:

function Fn(i:integer, b:real): real;

begin

...

Fn:=sqr(i);

end;

Значения параметров функции не могут меняться в ходе выполнения подпрограммы, также как и параметры-значения в процедуре. Изменять можно только параметры-переменные, т.е. процедура представляет собой обобщенный вариант функции, которая может возвращать несколько значений или не возвращать ничего.

В описании подпрограмм часто требуются переменные, например счетчики для организации циклов. Для этого используют локальные переменные, существующие только в рамках выполнения подпрограммы. Изменять глобальные переменные (описанные в блоке var основной программы) из подпрограммы настоятельно не рекомендуется, поскольку такой подход, как правило, влечет за собой массу ошибок.

Рассмотрим пример распространенной подпрограммы – возведение целого положительного числа в целую положительную степень для процедуры и для функции:

program Example;

var a,b,c: integer; {глобальные переменные}

procedure PowerP(a,b:integer; var result:integer);

var i:integer; {локальная переменная}

begin

result:=1;

for i:=1 to b do

result:=result*a;

end;

function PowerF(a,b:integer):integer;

var i,result:integer; {локальные переменные}

begin

result:=1;

for i:=1 to b do

result:=result*a;

PowerF:=result;

end;

Begin

Writeln(‘a, b’);

Readln(a,b);

PowerP(a,b,c);

c:=PowerF(a,b);

Writeln(‘a^b = ’, c);

End.

Очевидно, что в данном случае использование функции более удобно при вызове.

Задачи А

1. Даны действительные числа s, t. Получить

f (t, -2s, 1.17) + f (2.2, t, s - t),

где

f (a, b, c) =

2. Даны действительные числа s, t. Получить

g (1.2, s) + g (t, s) - g (2s - 1, st),

где

g (a, b) =

3. Дано действительное число y. Получить

, где t (x) =

4. Даны действительные числа a, b, c. Получить

5. Даны действительные числа a, b. Получить

u = min (a, b), v = min (ab, a + b), min (u + v2, 3.14).

6. Даны натуральные числа k, l, m, действительные числа x1, ..., xn, y1, ..., yl, z1, ..., zm. Получить

t =

(max (y1, ..., yl) + max (z1, ..., zm))/2

при max (x1, ..., xk)  10,

1 + (max (x1, ..., xk))2 в противном случае

7. Даны действительные числа s, t. Получить

h (s, t) + max (h2 (s - t, st), h4 (s - t, s + t)) + h (1, 1),

где

h (a, b) = + - (a - b)3.

8. Даны действительные числа a0, ..., a6. Получить для x = 1, 3, 4 значения p (x + 1) - p (x), где

p (y) = a6y6 + a5y5 + ... + a0.

9. Даны действительные числа s, t, a0, ..., a12. Получить p (1) - p (t)+ + p2 (s - t) - p3 (1), где

p (x) = a12x12 + a11x11 + ... + a0.

10. Даны натуральные числа n, m, целые числа a1, ..., an, b1, ..., bm, c1, ..., c30. Получить

t =

min (b1, ..., bm) + min (c1, ..., c30)

при | min (a1, ..., an)| > 10,

1 + (max (c1, ..., c30))2 в противном случае

11. Составить процедуру вычисления значения целого числа по заданной строке символов, являющейся записью этого числа в десятичной системе счисления;

12. Составить процедуру вычисления значения целого числа по заданной строке символов, являющейся записью этого числа в шестнадцатеричной системе счисления (шестнадцатеричные цифры - это цифры от 0 до 9 и буквы от A до F).

13. Составить процедуру построения строки символов, являющейся записью заданного действительного числа в десятичной системе счисления; строка должна содержать указанное количество цифр после запятой.

14. Составить процедуру, результатом работы которой является истинное значение, если символ, заданный при обращении к процедуре, - буква, и ложное значение в противном случае.

15. Составить процедуру «сжатия» исходной последовательности символов: каждая последовательность, состоящая из нескольких вхождений одного и того же символа, заменяется на текст x (k), где x - символ, а k - строка, являющаяся записью числа вхождений символа x в исходную последовательность.

Задачи B - из лабораторной работы №6; необходимо решить их с помощью технологии процедурного программирования.

1. Дано натуральное число n. Получить все натуральные числа, меньшие n и взаимно простые с ним.

2. Найти наименьшее натуральное число n, представимое двумя различными способами в виде суммы кубов двух натуральных чисел х3 + y3 (х  у).

3. Натуральное число называется совершенным, если оно равно сумме всех своих делителей, за исключением себя самого. Число 6 - совершенное, так как 6 = 1 + 2 + 3. Число 8 - не совершенное, так как 8  1 + 2 + 4.

Дано натуральное число n. Получить все совершенные числа, меньшие n.

4. Даны целые числа р и q. Получить все делители числа q, взаимно простые с р.

5. Даны натуральные числа a, b (ab). Получить все простые числа p, удовлетворяющие неравенствам apb.

6. Найти 100 первых простых чисел.

7. Найти натуральное число от 1 до 10000 с максимальной суммой делителей.

8. Дано натуральное число n. Получить все простые делители этого числа.

9. Даны натуральные числа n, m. Получить все меньшие n натуральные числа, квадрат суммы цифр которых равен m.

10. Даны целые числа a1, …, an (в этой последовательности могут быть повторяющиеся члены). Получить все числа, которые входят в последовательность по одному разу.

12. Даны целые числа a1, …, an (в этой последовательности могут быть повторяющиеся члены). Получить числа, взятые по одному из каждой группы равных членов.

13. Даны целые числа a1, …, an (в этой последовательности могут быть повторяющиеся члены). Найти число различных членов последовательности.

14. Даны целые числа a1, …, an (в этой последовательности могут быть повторяющиеся члены). Выяснить, имеется ли в последовательности хотя бы одна пара совпадающих чисел.

15. Даны пять различных целых чисел. Найти среди них два числа, модуль разности которых имеет наибольшее значение.

Задачи С

1. Даны действительные числа u1, u2, v1, v2, w1, w2. Получить 2u + + - 7, где u, v, w - комплексные числа u1 + iu2, v1 + iv2, w1 + iw2. (Определить процедуры выполнения арифметических действий над комплексными числами.)

2. Дано четное число n > 2. Для этого числа проверить гипотезу Гольдбаха. Эта гипотеза (по сегодняшний день не опровергнутая и полностью не доказанная) заключается в том, что каждое четное n, большее двух, представляется в виде суммы двух простых чисел. (Определить процедуру, позволяющую распознавать простые числа.)

3. Дано натуральное число n. Выяснить, имеются ли среди чисел n, n + 1, ..., 2n близнецы, т. е. простые числа, разность между которыми равна двум. (Определить процедуру, позволяющую распознавать простые числа.)

4. Дано натуральное число n. Среди чисел 1, 2, ..., n найти все те, которые можно представить в виде суммы квадратов двух натуральных чисел. (Определить процедуру, позволяющую распознавать полные квадраты.)

5. Даны натуральное число n, целые числа a1, ..., an. Рассмотреть отрезки последовательности a1, ..., an (подпоследовательности идущих подряд членов), состоящие из полных квадратов. Получить наибольшую из длин рассматриваемых отрезков. (Определить процедуры, позволяющие распознавать полные квадраты, степени пятерки, простые числа.)

6. Даны натуральное число n, целые числа a1, ..., an. Рассмотреть отрезки последовательности a1, ..., an (подпоследовательности идущих подряд членов), состоящие из степеней пятерки.

Получить наибольшую из длин рассматриваемых отрезков. (Определить процедуры, позволяющие распознавать полные квадраты, степени пятерки, простые числа.)

7. Даны натуральное число n, целые числа a1, ..., an. Рассмотреть отрезки последовательности a1, ..., an (подпоследовательности идущих подряд членов), состоящие из простых чисел.

Получить наибольшую из длин рассматриваемых отрезков. (Определить процедуры, позволяющие распознавать полные квадраты, степени пятерки, простые числа.)

8. Бесконечная последовательность рациональных чисел v0, v1, ... образована по следующему закону:

v0 = 1; v0 + C1k+1 v1 + ... + Ckk+1 vk = 0, k = 1, 2, ...;

Дано неотрицательное целое число n. Вычислить числитель и знаменатель несократимой формы числа vn. (Определить процедуры полного сокращения рационального числа, заданного числителем и знаменателем, а также процедуры сложения и умножения рациональных чисел.)

9. Бесконечная последовательность рациональных чисел v0, v1, ... образована по следующему закону:

v0 = 1; v0 + C22k v1 + C42k v2 + ... + C2k2k vk = 0, k = 1, 2. ...

Дано неотрицательное целое число n. Вычислить числитель и знаменатель несократимой формы числа vn. (Определить процедуры полного сокращения рационального числа, заданного числителем и знаменателем, а также процедуры сложения и умножения рациональных чисел.)

10. Даны натуральное число n, действительные числа x1, y1, x2, y2, ..., xn, yn. Найти площадь n-угольника, вершины которого при некотором последовательном обходе имеют координаты (x1, y1), (x2, y2), ..., (xn, yn). (Определить процедуру вычисления площади треугольника по координатам его вершин.)

11. Даны натуральное число n, целые числа a1, ..., an. Вывести на экран последовательность a1, ..., an, состоящую из совершенных чисел. Определить процедуру, позволяющую распознавать совершенные числа.)

12. Даны натуральное число n, целые числа a1, ..., an. Вывести на экран последовательность a1, ..., an, состоящую из простых чисел. Определить процедуру, позволяющую распознавать простые числа).

9. Файлы

Цель

Научиться использовать текстовые и типизированные файлы, ввод и вывод данных из файла. Применить знания на практике.

Теория

В Паскале имеется возможность организовать ввод и вывод данных в файлы, хранимые на диске. Рассмотрим два типа файлов: текстовые и типизированные.

Типизированный файл содержит данные одного типа и фиксированной длины, например целые числа типа Integer. Работа с файлом организуется через соответствующий тип: в файл записываются и считываются данные только этого типа. Переменная типизированного файла объявляется в блоке var

<имя переменной>: file of <базовый тип>

Текстовый файл хранит последовательность символов. Работа с ним организуется через типы Char и String. Переменная типизированного файла объявляется в блоке var

<имя переменной>: text

Вся информация в текстовом файле разбивается на строки, ограниченные символами возврат каретки (CR) и перевод строки (LF). Допустимые символы это символы с кодами от 32 до 255, символы с кодами ниже 32 являются управляющими и допустимы только следующие коды:

08 (BS) - возврат на шаг

09 (TAB) - табуляция

0A (LF) - перевод строки

0C (FF) – перевод листа

0D (CR) – возврат каретки

1A (EOF) – конец файла

Работа с файлом возможна в двух режимах – чтение и запись. Ввод и вывод данных осуществляются с помощью команд Read(f, data) и Write(f, data), где f – переменная файлового типа, а data – некие данные. Readln и Writeln используются только для текстовых файлов, чтобы пропускать возврат каретки (CR) и перевод строки (LF) при считывании и записывать эти символы автоматически при записи.

Перед использованием файла, необходимо его инициализировать: установить соответствие между переменной файлового типа и именем файла на диске. Такая инициализация осуществляется с помощью команды Assign(f, str), где f – переменная файлового типа, а str – строка, содержащая имя файла. Если указано полное имя файла (“C:\Temp\input.dat”), то вне зависимости от текущего каталога, программа будет обращаться к одному файлу. Если указано краткое имя (“input.dat”), то программа будет обращаться к файлу с текущем каталоге, т.е. в том месте, где она запущена.

После инициализации, файл нужно открыть. Команда Reset(f) открывает файл f для чтения, команда Rewrite(f) открывает файл f на запись, стирая его содержимое, команда Append(f) открывает файл f на продолжение записи, не стирая его содержимое. После использования файла обязательно нужно закрыть его с помощью команды Close(f).

Если файл не существует, то команда Rewrite создаст его. Однако выполнение команды Reset повлечет за собой ошибку ввода-вывода и программа аварийно завершит выполнение. Чтобы избежать этого рекомендуется использовать функцию IOResult, которая возвращает 1 если произошла ошибка ввода-вывода.

Специально для работы с файлами в паскале есть функция EOF(f), которая возвращает true, если достигнут конец файла.

Рассмотрим пример программы, которая открывает текстовый файл и записывает в него строку, введенную пользователем.

Program Primer;

var f: text;

s: string;

Begin

Assign(f,’C:\Temp\output.txt’);

Rewrite(f);

Readln(s);

Writeln(f,s);

Close(f);

End.

Рассмотрим пример программы, которая генерирует десять псевдослучайных целых чисел и записывает их в типизированный файл.

Program Primer;

var f: file of integer;

i,x: integer;

Begin

Assign(f,’C:\Temp\input.dat’);

Rewrite(f);

Randomize;

for i:=1 to 10 do begin

x:= Random(10);

Write(f,x);

Close(f);

End.

Рассмотрим пример программы, которая открывает типизированный файл, сформированный в прошлой задаче, считывает из него числа и выводит на экран.

Program Primer;

var f: file of integer;

x: integer;

Begin

Assign(f,’input.dat’);

Reset(f);

If IOResult = 0 then begin

While not EOF(f) do begin

Read(f,x);

Writeln(x);

end;

Close(f);

end else

Writeln(‘File not found’);

End.

Цикл выполняется до тех пор пока не достигнут конец файла. Программа читает из файла целое число, затем выводит его на экран.

Задачи А

1. Дан файл f, компоненты которого являются действительными числами. Найти сумму компонент файла f.

2. Дан файл f, компоненты которого являются действительными числами. Найти произведение компонент файла f.

3. Дан файл f, компоненты которого являются действительными числами. Найти сумму квадратов компонент файла f.

4. Дан файл f, компоненты которого являются действительными числами. Найти модуль суммы и квадрат произведения компонент файла f.

5. Дан файл f, компоненты которого являются действительными числами. Найти последнюю компоненту файла.

6. Дан файл f, компоненты которого являются действительными числами. Найти наибольшее из значений компонент.

7. Дан файл f, компоненты которого являются действительными числами. Найти наименьшее из значений компонент.

8. Дан файл f, компоненты которого являются действительными числами. Найти сумму наибольшего и наименьшего из значений компонент;

9. Дан файл f, компоненты которого являются действительными числами. Найти разность первой и последней компонент файла.

10. Дан файл f, компоненты которого являются целыми числами. Найти количество четных чисел среди компонент.

11. Дан файл f, компоненты которого являются целыми числами. Найти количество нечетных чисел среди компонент.

Задачи Б

1. Дан текстовый файл f1, в который через пробел записаны целые числа. Найти сумму этих чисел.

2. Дан текстовый файл f. Записать в файл g компоненты файла f в обратном порядке.

3. Даны текстовые файлы f и g. Записать в файл h сначала компоненты файла f, затем - компоненты файла g с сохранением порядка.

4. Дан текстовый файл f. Подсчитать число вхождений в файл сочетаний ab.

5. Дан текстовый файл f. Определить, входит ли в файл сочетание abcdefgh.

6. Дан текстовый файл f. Подсчитать число вхождений в файл каждой из букв a, b, c, d, e, f .

7. Даны текстовые файлы f и g. Определить, совпадают ли компоненты файла f с компонентами файла g. Если нет, то получить номер первой компоненты, в которой файлы f и g отличаются между собой.

8. Даны текстовые файлы f и g. Записать в файл h все совпадающие компоненты файлов f и g.

9. Дан текстовый файл f. Группы символов, разделенные пробелами (одним или несколькими) и не содержащие пробелов внутри себя, будем называть словами. Удалить из файла все однобуквенные слова и лишние пробелы. Результат записать в файл g.

10. Дан текстовый файл f. Найти самое длинное слово среди слов, вторая буква которых есть e; если слов с наибольшей длиной несколько, то найти последнее.

11. Дан текстовый файл f. Определить количество слов в файле f.

12. Дан текстовый файл f. Получить все его строки, содержащие более 60 символов.

13. Дан текстовый файл f. Переписать в файл g все компоненты файла f с заменой в них символа 0 на символ 1 и наоборот.

14. Дан текстовый файл f. Получить самую длинную строку файла. Если в файле имеется несколько строк с наибольшей длиной, то получить одну из них.

15. Дан текстовый файл f. Записать в перевернутом виде строки файла f в файл g.

Задачи С

Выбрать любую задачу из любой предыдущей лабораторной работы и организовать в ней ввод и вывод данных через текстовые файлы input.txt и output.txt.

Приложение. Таблицы символов

CP-1251

OEM