Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИиП.doc
Скачиваний:
29
Добавлен:
10.04.2015
Размер:
14.43 Mб
Скачать

C.10.7. Лекция 7 (2 часа) Множества

Множество - неупорядоченная совокупность неповторяющихся элементов одного типа, имеющих общее имя. Количество элементов множества может меняться в пределах от 1 до 255. Описание типа множество имеет вид:

< имя типа > = Set Of < базовый тип >;

Здесь <базовый тип> - это тип элементов множества, в качестве которого может использоваться любой порядковый тип, кроме Integer. (В Турбо-Паскале также кроме типовWord, Shortint, Longint).Для задания множества используется конструктор множества, заключенный в квадратные скобки список элементов множества, отделяемых друг от друга запятыми. Элементами могут быть константы или выражения базового типа, а также - тип-диапазон того же базового типа. Конструктор пустого множества имеет вид - [ ].

Пример 11.Пример определения и задания множеств:

    Type         digitChar = Set Of ‘0’ .. ‘9’;         digit = Set Of 0 .. 9;     Var         s1, s2, s3 : digitChar;         s4, s5, s6 : digit;         . . . . . .         s1 := [‘1’, ‘2’, ‘3’];        s2 := [‘3’, ‘2’, ‘1’];        s3 := [‘2’, ‘3’];        s4 := [0. .3, 6];        s5 := [4, 5];        s6 := [3. .9];. . . . . .

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

Операция

Смысл

Пример*

Результат

*

пересечение множеств

s1*s3

[‘2’, ‘3’]

+

объединение множеств

s4+s5

[0. .6]

-

разность множеств

s2-s3

[‘1’]

=

True, если множества 

эквивалентны

s1=s2

s1=s3

True

False

<>

True, если множества неэквивалентны

s1<>s2

s1<>s3

False

True

<=

True, если первое множество содержится во втором

s5<=s6

True

>=

True, если второе множество содержится в первом

s2>=s3

True

In

проверка принадлежности значения выражения, стоящего слева множеству, стоящему справа 

7-5 In s4

True

* - примеры приведены согласно описаниям и конструкторам множеств в примере 11.

Пример 12.Организовать ввод элементов трех множествA, B, C.Вычислить и напечатать множества A + B, B * C, C - A.

Program CalcSet;Type SetChar: Set Of Char;Var A, B, C : SetChar;{Процедура ввода множества}Procedure EnterSet(Var D: SetChar);Var ch: Char;Begin    Writeln(‘Введите элементы множества, точка - конец ввода’);    Read(ch);    D:=[];    While ch<>‘.’ Do        Begin D := D + [ch]; Read(ch) End;End;{EnterSet}{Процедура вывода множества}Procedure PrintSet(D: SetChar);Var i: Byte;Begin For i := 0 To 255 Do      If Chr(i) in D Then Writeln(Chr(i))End;{PrintSet}Begin {Основная программа}    Writeln(‘Введите элементы множества A’);    EnterSet(A);    Writeln(‘Введите элементы множества B’);    EnterSet(B);    Writeln(‘Введите элементы множества C’);    EnterSet(C);    PrintSet(A+B); PrintSet(B*C); PrintSet(C-A)End.

C.11. Тема 11

C.11.8. Лекция 8 (2 часа)Типы данных, определяемых пользователем. Записи, файлы, динамические структуры данных, списки: основные виды и способы их реализации; программирование рекурсивных алгоритмов.Понятие записей в языке PASCAL. Правила их конструирования и описания. Оператор для работы с записями(WITH). Примеры программ на работу с записями.Записи с вариантной частью их конструирования и описания. Примеры программ на обработку записей с вариантами

Записи.

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

< имя типа >= Record < список полей > End

Список полей содержит описания полей с указанием их имен и типов. Тип определяется от имени двоеточием, описания полей определяются друг от друга точкой с запятой. Описания нескольких полей одного типа можно объединить, перечислив через запятую их имена и затем указав их общий тип. Пример:     Type         birthday = Record             day : 1..31;             month : 1..12;             year: Integer;         end;         Var a,b: birthday;              ....... В этом примере типbirthday(день рождения) содержит три поля с именамиday, month, year (день месяц и год), переменныеaиb содержат записи типа birthday.К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля:a.day:= 27;b.year:= 1984;

Поля могут быть любого типа (кроме файла), в том числе и типа запись     Var c : Record            name : String;            bd : birthday;    End;    .........    If c.bd.year=1984 Then . . .

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

C.11.9. Лекция 9 Понятие указателей, динамических и статических переменных. Операции над указателями и динамическими переменными. Создание и уничтожение динамических переменных (NEW( ) и DISPOSE( )).Понятие динамических структур данных (списков, деревьев, графов) в программировании. Разновидности списков, деревьев, графов. Построение динамических структур данных и типовые задачи и алгоритмы их обработки.

C.11.10. Лекция 10 (4 часа) Понятие файлов в программировании. Процедуры для работы с файлами. Двоичные файлы. Их создание и обработка. Текстовые файлы. Их создание и обработка. Типизированные и нетипизированные файлы. Работа с нетипизированными файлами.

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

< имя > = File Of < тип > ; < имя > = Text ; Первые называются типизированными файлами, а вторые -текстовыми.

В Турбо-Паскале описанные выше файлы называются логическими (кроме того, в системе Турбо-Паскаль есть логические файлы третьего вида - не типизированные). Основное назначение логического файла - обеспечить программе средства для обмена данными с периферийными устройствами компьютера. В связи с этом вводится понятие физического файла, как совокупности данных во внешней памяти (дискета, жесткий диск, магнитная лента и др.) Кроме того, в качестве физического файла могут использоваться и сами периферийные устройства, например, принтер). Средством установления связи между логическими и физическими файлами в Турбо-Паскале является процедура Assign.

Assign (< ф.п. >, < имя файла >); < ф.п. > - файловая переменная (переменная файлового типа), описанная в программе (имя логического файла). < имя файла > - текстовое выражение, значением которого является записанное по правилам операционной системы MS DOS имя файла (имя физического файла). Типы компонент логического и физического файла должны совпадать. Затем необходимо инициализировать файл, указав для него направление передачи данных, т.е. открыть файл для записи или чтения. Для чтения файл открывается стандартной процедурой Reset (< ф.п. >); при этом специальная переменная-указатель устанавливается на начало файла. Стандартная процедура Rewrite (< ф.п. >) открывает файл для записи, при этом файл всегда создается заново, с потерей информации в данном физическом файле, если она была туда ранее записана. Стандартная процедура Append(< ф.п. >) открывает для записи существующий текстовой файл с целью его расширения, при этом переменная-указатель ставится в конец файла. Чтение и запись происходят при помощи уже знакомых нам процедур ввода-вывода Read и Write, с тем лишь отличием, что в них необходимо указать в качестве первого параметра файловую переменную. После каждой операции переменная-указатель перемещается на одну компоненту. После завершения в программе операций по обмену данными с файлом его необходимо закрыть стандартной процедурой. Close(< ф.п. >). При работе с файлами используется функция Eof(< ф.п. >), которая возвращает значение True, если переменная-указатель стоит в конце файла, и False - в противном случае.

Пример 13. Дан файл f компоненты которого являются целыми числами. Получить в файле g все четные компоненты файла f, а в файле h все нечетные.

Program Dfile; Var f,h,g: File Of Integer;     i: Integer; Begin {Установка связи между файловыми переменными и соответствующими именами файлов}     Assign( f ,’Data.dat’);     Assign(g , ‘Chet.dat’);     Assign(h , ‘Nechet.dat’);     {Открытие файлов для чтения и записи}     Reset(f); Rewrite(h); Rewrite(g);     While Not(Eof(f)) Do         Begin             Read( f, i); {чтение из файла f}             If Odd(i)                 Then Write(h,i) {запись в файл h}                 Else Write(g, i) {запись в файл g}         End; {Закрытие файлов} Close(f); Close(g); Close(h); End.

Пример 14. Дан текстовой файл. Получить копию файла.

Program CopyFile; Var f,g: Text;     s: String; Begin     {установка связи файловых переменных с именами файлов}     Assign(f, ‘data1.txt’);     Assign(g, ‘data2.txt’);     {открытие файлов для чтения и записи}     Reset(f); Rewrite(g);     While Not(Eof(f)) Do         Begin             Readln(f,s); {чтение из файла в строку}             Writeln(g,s) {запись в файл из строки}         End;     {закрытие файлов}     Close(f); Close(g) End.  

Процедуры и функции для текстовых файлов

Обращение

Действие

Append(f)

Открывает файл для добавления в конец файла

Read(f, СписокВвода)

Считывает из файла одно или более значений в одну или более переменных

ReadLn(f, СписокВвода)

То же с переходом к следующей строке файла

Write(f, СписокВывода)

Записывает одно или несколько значений в файл, заранее открытый для вывода

WriteLn(f, СписокВывода)

То же с выводом маркера – признака конца строки

SetTextBuf(f, Буфер [, Размер])

Назначает буфер ввода/вывода для файла (по умолчанию размер буфера – 128 байт)

Flash(f)

Выталкивает буфер файла вывода

Eoln(f)

Возвращает признак конца строки

SeekEoln(f)

Возвращает признак конца строки, предварительно пропустив все пробелы и символы табуляции

SeekEof(f)

Возвращает признак конца файла, предварительно пропустив все пробелы, символы табуляции и признаки конца строки