Б С Бусигін - Прикладна інформатика - страница 47

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 

ReadLn(Var f:text, W1[,W2, ...Wn]) - діє аналогічно Read. Відмінність полягає в тому, що після прочитання даних у змінні, пропускаються всі символи, що залишилися у даному рядку і маркер кінця рядка. Якщо в процедурі відсутній список змінних, то відбувається перехід до наступного рядку.

Write(f, W1[,W2, ...Wn]) - переводить числа W1[,W2, ...Wn] із заданих змінних у послідовність відповідних символів і записує їх у файл f, не розділяючи пробілами. Тому, при необхідності, пробіли і маркери кінця рядка необхідно вставляти самостійно. Для символьних, арифметичних і строкових змінних у файл виводяться їхні значення, а для Boolean виводиться рядок True чи False у залежності від його значення. Якщо поле задає більшепозицій, чим потрібно для виводу, то воно зліва доповнюється пробілами, інакше виводяться самі праві символи з представлення змінної (рис. 8.84).

У наступному прикладі (рис. 8.85) на диску D у кореневому каталозі формується (записується) текстовий файл. Дані з цього файлу, у свою чергу, можуть бути у майбутньому зчитані для використання в програмі користувача.

8.26.9. Функції для роботи з файлами

Для обробки текстових файлів мається ще і ряд корисних функцій: EoF[(f:Text)]:Boolean  -  повертає   True,  якщо  наступний за

останнім прочитаним символом є маркер кінця файлу. Якщо файлова змінна не

зазначена, то передбачається стандартний файл вводу.

Program WriteFile; Var

Ch

Char;

Bool

Boolean;

S

String;

I

Integer;

R1, R2

Real;

Begin

 

Ch:='X';

Bool:=1>2; S:='abcd'; I:=12; R1:=1.2 5; R2:=R1;

Write('!',Ch:3,Bool:7,S:8,I:4,R1:18,R2:12:4,'!');

ReadLn End.

Р езультат:

!    Х    False        abcd    12    1.2500000000E+00 1.2500! Рис. 8.84. Вивід інформації оператором Write

Eoln[(f:Text)]:Boolean - повертає True, якщо наступний за останнім прочитаним символом є маркер кінця рядка. Якщо файлова змінна не зазначена, то передбачається стандартний файл вводу. Якщо EoF(f) - істина, то і Eoln(f) - істина.

SeekEoln[(f:Text)]:Boolean - аналогічна Eoln, однак до перевірки на маркер кінця рядка видаляє всі наступні пробіли і символи горизонтальної табуляції.

SeekEoF [(f:Text)] :Boolean - аналогічна Eoln, однак до перевірки на маркер кінця файлу видаляє всі наступні пробіли, символи горизонтальної табуляції і CR/LF.

Program FileWorks;

Uses Crt;

Const

Char = ' Char = #10; Char = #13;

{Пробіл - #32}

{Line Feed - переведення рядку} {Carriage Return - повернення каретки}

Text; {Оголошуємо логічну змінну f текстового типу} integer; {Цілі змінні для запису в файл}

Bar lf cr Var f

n, i

Begin ClrScr;

Assign  (f,   'd:\ee.dat'); {Зв'язуємо логічну змінну f з фізичним

файлом на диску для вводу (запису) тексту}

ReWrite(f); {Створюємо новий текстовий файл, до якого можна тільки

додавати строки} i:=1; {Присвоюємо значення 1 цілій змінній i } n:=2; {Присвоюємо значення 2 цілій змінній n} Write(f,  i,  Bar); {Записуємо в буфер 1 і пробіл} Write(f,  n,  cr,  lf); {Додаємо 2 й маркер кінця строки CR/LF} Write(f,  n); {Додаємо 2 у наступну строку} Close(f); {Закриваємо файл. При цьому інформація з буфера

записується у файл на диску, автоматично додається маркер кінця файлу EOF, для файла записуються дані: час запису, довжина у байтах, тип (архівний, прихований і т.д.). Тепер ним можна користуватися}

End.

Результат, у кореневому каталозі диску сі: \ з'явився файл ee.dat, який містить два рядки:

1 2

Рис. 8.85. Програма формування текстового файлу з даними

Приклад: програма, яка запитує у діалозі вихідний пристрій (це може бути консоль, принтер чи дисковий файл) і виводить на нього файл, ім'я якого теж визначає користувач. Програма закінчує роботу, коли замість букви, що визначає пристрій (C, P чи D), користувач натисне клавішу Esc. При завданні імені вхідного файлу програма перевіряє його наявність на диску. При виводуфайлу можна призупинити роботу програми, натиснувши клавіші Ctrl+S. Для продовження виводу - натиснути будь-яку клавішу (рис. 8.86).

Program SelectFile;

Uses Crt;

Var

F  : Text;

S  : String;

Function SelectDevice(Var F  :  Text)   : Boolean; Var

Ch        : Char; Fname  : String; Begin

HighVideo;  {Включення яскравості кольору символів} Write(' C');

LowVideo;  {Виключення яскравості кольору символів}

WriteLn        Вивід файлу на екран');

HighVideo;

Write(' P');

LowVideo;

WriteLn('.  Вивід файлу на принтер');

HighVideo;

Write(' D');

LowVideo;

WriteLn('.Вивід файлу на диск');

HighVideo;

Write(' Esc');

LowVideo;

WriteLn(' - закінчити роботу.'); WriteLn;

Write(' Ваш вибір  : '); Repeat

Ch:=UpCase(ReadKey); Until Ch In   ['C',   'P',   'D', #$18]; SelectDevice:=Ch=#$18; HighVideo; If Ch=#27 Then

WriteLn(' Esc') Else

WriteLn(Ch);

LowVideo;

Рис. 8.86. Вивід файлу на різноманітні пристрої

Case Ch Of

'C' : Assign(F, 'Con'); 'P' : Assign(F, 'Prn'); 'D'   : Begin

Write('Ім'я вихідного файлу :'); ReadLn(FName); Assign(F,FName); End; End; {Case}

If Ch In ['C', 'P', 'D'] Then

ReWrite(F); End;     {Func SelectDevice}

Procedure PrintFile(Var F1  : Text); Var

FIn  : Text;

S      : String;

Ch    : Char;

Procedure GetInputName(Var F  : Text); Var

Fname    : String; IOCode  : Word;

Begin

Repeat

Write('Задайте имя входного файла Ж');

HighVideo;

ReadLn(FName);

LowVideo;

Assign(F, FName);

{$I-} {Відкл. аварійне завершення при виникненні помилки I/O} Reset(F);

{Відновлюємо режим}

IOCode:=IOResult; If IOCode>0 Then

WriteLn(AGAG'  Файл ',Fname,'  не найден!');

Until IOCode=0;

End;   {Proc GetInputName}

Рис. 8.86. Вивід файлу на різноманітні пристрої (продовження)

Begin {Початок Proc PrintFile} GetlnputName(FIn); While Not Eof(FIn) Do Begin

If KeyPressed Then {Натиснуто клавішу}

Begin

Ch:=ReadKey;

If Ch=AS Then {Потрібна пауза}

Ch:=ReadKey;  {Продовжимо по будь-якій клавіші}

End; ReadLn(Fin,S); WriteLn(F1,S); End;

Close(FIn); Close(F1);

End;   {Proc PrintFile}

Begin {Початок основної програми}

While Not SelectDevice(F) Do

PrintFile(F);

End.

Рис. 8.86. Вивід файлу на різноманітні пристрої (закінчення)

8.26.10. Рішення задачі з використанням рекурсії, множин і текстових файлів

Тепер, коли ми з Вами розібралися з поняттями рекурсії, множин і текстових файлів, вирішимо комплексну задачу на використання цих понять.

Отже, поставлена наступна задача1. У комп'ютерній мережі використовується деяка множина різних протоколів. Кожен вузол (комп'ютер) підтримує декілька протоколів. Усі вузли між собою пов'язані. Пакет даних може бути переданий з вузла на вузол тільки у випадку, якщо у цих двох вузлів мається загальний протокол. Спочатку пакет був посланий першому вузлу. Знайти усі вузли, до яких дійде цей пакет, і вивести їхню кількість. (Усього вузлів може бути не більш 100, а протоколів не більше 50). Приклад мережі наведений на малюнку рис. 8.87.

Вхідні дані. Файл e.dat, що містить текстові дані наступного формату:

- перший рядок - кількість вузлів n;

- кожен з наступних n рядків - кількість підтримуваних протоколів і номера цих протоколів.

1 Бобак И. Думай рекурсивно II Мой компьютер. - 2GG1. - № 23. - С. 36-39. (ibobak@torba.com)

337

{1, 2}

{2, 3}

 

{6}

 

 

 

Рисунок 8.87. Схема мережі

Приклад даних для вводу: 5

2 1 2 2 1 4 2 2 3

1 6

2 4 5

Вихідні дані. Кількість вузлів, що можуть одержати пакет, посланий спочатку першому вузлу. Приклад (для наведених вхідних даних):

4

Нижче приведений алгоритм рішення поставленої задачі.

Program Recursion;

Uses Crt;

Type

TProtocolSet = Set Of 1..50;  {TProtocolSet - тип-безліч}

Var

f :  Text;  {Описуємо текстовий файл}

A   :   Array[1..100]    Of   TProtocolSet; {Масив, елементами

якого є множина TprotocolSet, що містить номера протоколів для кожного вузла}

was  :  array[1..100]   of Boolean;  {Статус обробки вузла. На

початку він повинний містити значення False. Вузли обходимо, починаючи з першого. Спочатку ввійдемо в перший вузол. Далі з нього увійдемо в усі вузли, що мають з ним загальний протокол. Потім для кожного зних проробимо то ж саме. Ті вузли, де ми уже побували,   будемо   відзначати   в булевому масиві значенням True.} n      :  integer;  {Кількість вузлів}

cnt  :  integer;  {Результат - кількість вузлів, до яких дійде пакет}

Procedure Rec(const p  : Integer);

{=*= Рекурсивна процедура, що визначає кількість вузлів cnt (глобальна

змінна), до яких дійде пакет =*=} {Суть процедури Rec складається в поширенні пакета. Зробивши виклик Rec(l), ми викличемо її рекурсивно для вузлів, до яких пакет може прийти з вихідного вузла. Далі, для останніх буде зроблений рекурсивний виклик процедури Rec з номерами вузлів, у які пакет може надійти в другу чергу і т.д. Для нашого випадку буде: 1, 2—1, 4; 1, 2—2, 3; 1, 4—4,

5}

var

i  :  Integer;  {Параметр циклу for} Begin

if was[p] then

exit;  {Процедура exit завершує роботу програмного блоку} was[p]   := True;  {Відзначаємо вузол, який відвідано} inc(cnt);    {Убудована процедура inc збільшує на 1 значення аргументу}

for i:=l to n do {Цикл обходу вузлів (n - глобальна змінна)} if A[i]*A[p]   <>   []   then { A[i]*A[p] - перетинання множин.

Результатом є множина, що складається тільки з тих елементів двох множин, що містяться одночасно в кожній з них. [] - порожня безліч. У нашому випадку - це відсутність загального протоколу даних у двох вузлів}

Rec(i);   {Якщо вузли p і i мають загальний протокол, значить дані дійдуть до вузла i . Тоді рекурсивно викликаємо процедуру Rec} End;   {Proc Rec}

Procedure Init;

{=*= Процедура зчитування даних =*=}

Var

i,   j,   sc,   p   :   Integer;   {i,   j - параметри циклів; sc -

Страницы:
1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83 


Похожие статьи

Б С Бусигін - Прикладна інформатика