Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию..pdf
Скачиваний:
10
Добавлен:
15.11.2022
Размер:
12.2 Mб
Скачать

Тогда следующие операции отношения дадут следующие результаты:

М

=

[ 4 ,

7 ,

 

3 ,

9 ]

true,

М

<>

[ 7 ,

4 ,

3 ,

9 ]

false,

[ 3 ,

4 ]

<=

М

 

true,

[]

< =

М

 

 

 

 

true,

М

> =

[ 1 . . 1 0

]

 

false,

М

<=

[ 3 . . 9

]

 

 

true.

Операция вхождения. Это операция, устанавливающая связь между множеством и скалярной величиной, тип которой совпадает с базовым типом множества. Если х — такая скалярная величина, а М — мно­ жество, то операция вхождения записывается так:

хin М.

Результат — логическая величина true, если значение х входит в мно­ жество М , и false — в противном случае. Для описанного выше мно­ жества

4

in

М

-

true,

5

in

М

-

false.

12.3.Примеры использования множеств

Пример 1. Дана символьная строка. Под^штать в ней количество знаков препинания (. - , * ! ?).

Program Р1;

 

 

 

Var S

String;

 

 

I, К

Byte;

 

 

Begin

 

 

 

 

ReadLn(S);

 

 

 

К := 0;

 

 

 

 

For I :* 1 To Length(S) Do

’I'l

If SCI] In

l>.> •->, V ,

Then К

:= К

+

1;

К)

WriteLn('Число

знаков препинания равно

End.

В этом примере использована множественная константа с сим­ вольным типом элементов. Эту задачу можно решить и без мно­ жества, записав в операторе if длинное логическое выражение.

(S[I] = ’ ) Or (SCI] = ' - О и т.д. Использование множества со­ кращает запись.

П ример 2. Даны две символьные строки, содержащие только строчные латинские буквы. Построить строку 53, в которую войдут только общие символы 51 и 52 в алфавитном порядке и без повторе­ ний.

Program

Р2;

 

 

 

 

 

Type Meet = Set Of >a*..'z*;

 

 

Var SI,

S2,

S3

String;

 

 

MSI,

MS2, MS3

Mset;

 

 

C

Char;

String; Var MS

Mset);

 

Procedure SM(S

содержащее_______

{__________ Процедура

формирует множество MS,

__________ все символы

строки

S________________________________ }

Var I

Byte;

 

 

 

 

Begin MS := [] ;

 

 

 

 

For I

:= 1 to Length(S) Do

 

End;

MS

:= MS

+ [S[I]]

 

 

 

 

 

 

 

 

Begin {____ Ввод исходных строк____ }

 

ReadLn(Sl);

 

 

 

ReadLn(S2);

 

 

 

символов____

{____ Формирование множеств MSI и MS2 из

____ строк S1 и S2__________________________________ }

SM(S1, MSI);

SM(S2, MS2);

{__ Пересечение множеств - выделение общих элементов___

__ в множество MS3___________________________________ }

MS3 := MSI * MS2;

{____ Формирование результирующей строки S3___________ }

S3 :=

 

For С := >а> То >z> Do

 

If С

In MS3

 

Then

S3 := S3 + С;

S3)

WriteLn( Результат

End.

П ример 3. Составить программу, по которой из последовательно­ сти натуральных чисел от 2 до N будут выбраны все простые числа.

Существует алгоритм, известный под названием ’’ Решето Эра­ тосфена” Суть его в следующем:

а) из числовой последовательности выбираем минимальное значе­ ние, это будет простое число;

б) удаляем из последовательности все числа, кратные выбранному;

в)

веди после удаления послецова/гельность не стала пустой, то воз­

вращаемся к выполнению пункта а.

 

 

 

 

Вот пример работы такого алгоритма для N = 15 (подчеркнуты

выбранные простые числа):

 

 

 

 

 

 

 

1

3

4

5

6

7

8

9

10

11

12

13

14

3

5

7

9

11

13

15

 

 

 

 

 

 

5

7

11

13

 

 

 

 

 

 

 

 

 

1

11

13

 

 

 

 

 

 

 

 

 

 

И

13

 

 

 

 

 

 

 

 

 

 

 

13 Решение этой задачи удобно программировать, используя множе­

ственный тип.

Program Eratosfen;

Const N = 201;

{___ Возможно любое значение 1 < N < 256___ } Var А, В Set Of 2..N;

К, Р Integer;

Begin {Формирование исходного множества А;

В- искомое множество простых чисел, сначала - пустое}

А[2..N];

В

Р := 2; Repeat

{____ Поисх минимального числа в рожестве А____ } While Not(P In A) Do

 

Р

Р + 1;

В

{____ Включение найденного числа в множество В___ }

:* В + [Р] ;

К

:= Р;

 

 

{_______ Исключение из А чисел, кратных р________ }

While К <= N Do

Begin

А := А - [К] ; К := К + Р; End

Until А = [] ;

{___ Вывод результата, т.е. всех чисел из множества В в порядке возрастания________________________ 1

For Р :■ 2 То Н Do

If Р In В Then WriteLn(P)

End.

Красивая программа! К сожалению, ею нельзя воспользоваться для

а)

[2]

<> [2,

2,

2]

 

 

б)

[ ’ а\

’ Ь’ ] =

[ ’ Ь’ ,

’ а ’ ]

 

 

в)

[4,

5,6]

=

[4, 5,

6]

 

г)

[ 'с ’ ,

’ Ъ’ ] =

[ ’ с ’ . . ’ Ь’ ]

 

 

д)

[2,

3,5,

7]

<= [1. .9]

 

е) [3,

6 ..8 ]

<=

[2 ..7 ,

9]

 

 

 

ж)

Trunc(3.9)

In [1,

3,

5]

о) Odd(4) In []

 

 

 

 

 

 

3. Вычислить значения выражений:

 

 

 

 

 

 

 

 

 

а)

[1,

3,5]

+

[2, 4]

б)

[1,

3,

5]

*

[2,

4]

в)

[1,

3,

5]

-

[2, 4]

г)

[1 ..6 ]+ [3. .8]

д)

[1 ..6]

*

[3. .8]

 

ej

[1 ..6 ]

-

[3.

.8]

ж)

[]

+ [4]

 

 

з)

[]

*

[4]

 

 

 

и) [] - [4]

 

 

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

5.Составить программу, печатающую в возрастающем порядке все целые числа из диапазона 1. .255, представимые в виде n2 -Ьга2, где

п, т > 0.

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

а) все гласные буквы, которые входят в каждое слово; б) все согласные буквы, которые не входят ни в одно слово;

в) все согласные буквы, которые входят только в одно слово; г) все гласные буквы, которые входят более чем в одно слово.

обработки (записи или чтения). Этот адрес называется указателем или окном файла.

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

Rewrite(FV)\

где FV — имя файловой переменной. При этом указатель устанавли­ вается на начало файла. Если в файле до этого была информация, то она исчезает. Схематически выполнение процедуры ReWrite можно представить так:

До:

эл. 0 ЭЛ. 1

M . K.

Rewrite(FV);

После: м. к.

Т

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

Write(FV,V)i

где V — переменная того же типа, что и фалл FV Запись проис­ ходит в то место, на которое установлено окно (указатель). Сначала записывается значение, затем указатель смещается в следующую по­

зицию.

Если новый элемент вносится в конец файла, то сдвигается

маркер конца. Схема выполнения оператора:

 

До:

эл. 0

ЭЛ. 1

эл. N

м. K.

 

 

 

W rite(FV,V)\

 

 

эл. 0

ЭЛ. 1

эл. N

< v > M . K .

 

 

 

 

Т

П ример. В файловую переменную Fx занести 20 вещественных чисел, последовательно вводимых с клавиатуры.

Var Fx

File Of Real;

X

Real;

I

Byte;

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

П ример. В переменной х получить 10-й элемент вещественного файла F x.

Program

А;

Var Fx

File Of Real;

X

Real;

Begin

 

Reset(Fx);

For I :* 1 To 10 Do

Read(Fx, X)

End.

Функция E of(FV ) — проверяет маркер конца файла (end of file). Это логическая функция, которая получает значение true, если указа­ тель установлен на маркер конца, в противном случае — false.

П ример. Просуммировать все числа из файла F T , описанного в предыдущем примере.

Reset(Fx);

Sx := 0;

While Not Eof(Fx) Do

Begin

Read(Fx, X);

Sx := Sx + X

End;

Или то же самое с помощью цикла Repeat:

Repeat

Read(Fx, X);

Sx := Sx + X

Until Eof(Fx);

Во втором варианте возможна ошибка чтения, если файл Fx — пустой. Первый вариант от такой ошибки застрахован, поэтому он более пред­ почтителен.

13.2.Внешние файлы

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

файл со стандартным именем, предназначенный для обмена с внутрен­ ней памятью ЭВМ текстовой (символьной) информацией.

Стандартные имена логических устройств определяются операцион­ ной системой, в среде которой работает Паскаль. В системе MS DOS определены следующие имена:

CON (консоль) — логическое устройство, связанное при вводе с кла­ виатурой, при выводе — с экраном;

PRN (принтер) — логическое имя файла, связанного с устройством печати;

AUX — логическое имя коммуникационного канала, который ис­ пользуется для связи ПК с другими машинами;

INPUT — стандартное устройство ввода, связанное с клавиатурой; при этом вводимые с клавиатуры символы отражаются на экране дис­ плея;

OUTPUT — стандартное устройство вывода на экран.

Магнитный диск — многофайловое устройство. На нем могут хра­ ниться как стандартные (системные) файлы, так и файлы, создаваемые пользователем. На магнитном диске могут создаваться файлы любых типов. Файлы на МД могут использоваться как в режиме чтения, так и в режиме записи.

Список файлов на диске хранится в директории (каталоге) диска. Каталог вызывается на экран системной командой DIR. В полной форме каталог содержит идентификаторы файлов, объем занижаемой памяти, дату и время создания файла. Идентификатор файла состоит из имени и типа файла:

< имя файла > < тип файла >

Имя содержит от 1 до 8 латинских букв и (или) цифр; тип — необя­ зательный элемент (от 0 до 3 символов), указывающий на Характер информации, хранимой в файле.

Например:

PROGRAM.PAS — в файле текст программы на Паскале; NUMBER.DAT — файл числовых данных;

NAMES.TXT — текстовый файл.

Для организации связи между файловой переменной и внеш не фай­ лом в ТУрбо-Паскалё используется процедура назначения:

ASSIGN(<имя файловой переменной>, «идентификатор внешнего файлам).

Здесь < идентификатор внешнего файла> — строковая величина (кон­ станта или переменная). Например:

ASSIGN(Fi,1Number.dat');

После выполнения процедур Assign и Rewrite создается новый внешний файл, имя которого заносится в директорий.

Если файл открывается для чтения (Assign и Reset), то в текущем каталоге уже должен содержаться указанный внешний файл. В проти­ вном случае будет обнаружена ошибка.

Работа с файлом в программе завершается его закрытием с по­ мощью процедуры

CLOSE{<mAs. файловой переменной>);

Например: CLOSE(Fi).

Подведем итог сказанному. Для создания и заполнения файла тре­ буется следующая последовательность действий:

— описать файловую переменную;

— описать переменную того же типа, г го и файл;

произвести назначение (Assign);

открыть файл для записи (Rewrite);

записать в файл данные (Write);

закрыть файл (Close).

П ример 1. Создать файл, содержащий среднесуточно темпера­ туры за некоторое количество дней. При этом не обязательно пред­ варительно указывать количество чисел во вводимой информации. Можно договориться о каком-то условном значении, которое будет признаком конца ввода. Пусть, например, признаком конца ввода будет число ” 9999”

Program Taskl;

Var Ft

File Of Real;

T Real;

Begin

Assign(Ft, ,Temp.dat,)j

Rewrite(Ft);

WriteLnCВводите данные. Признак конца - 9999’);

ReadLn(T);

While Т <> 9999 Do

Begin

WriteCFt, T);