Лабораторна робота №7 Робота з файлами . МЕТА РОБОТИ: Навчитися працювати з файлами засобами мови Pascal. ПОРЯДОК ВИКОНАННЯ РОБОТИ: 1. При підготовці до лабораторної роботи, згідно із індивідуальним завданням, розробити алгоритм та програму на мові Pascal. 3. Виконати ввід, виконання та відлагодження програми. 4. Проаналізувати отримані результати та оформити звіт по роботі. IНДИВIДУАЛЬНI ЗАВДАННЯ Програмно організувати створення нового типованого файла з записів (кількість записів – 5..10). Аналізуючи в програмі дані зі створеного файла записів, виконати над ними задані перетворення та вивести на екран дисплея вказану в індивідуальному завданні інформацію. Відлагодити та реалізувати розроблену програму. Варіанти індивідуальних завдань 1. Облік телевізорів , наявних на складах підприємства N складу |Шифр виробу |Найменування |К-сть |Відповідальний Витерти в створеному типованому файлі записи з даними про вироби, шифр яких починається кодовою комбінацією "А80". Роздрукувати вміст перетвореного файлу. 2. Список дітей зареестрованих у дитячому садку. N п/п |П.І.П. | Дата народження |Стать |День |Місяць |Рік Вивести список дітей, зареєстрованих до 1 липня 1993 року. 3. Результати модульного тиждня студентів групи ki-1 N п/п |П.І.П. студента |Мат.аналіз |Xімія |Програм. |Диф.р-я |Ін.мова Визначити студента (студентів) групи з мінімальним середнім балом. 4. Облік проданих касою авіаквитків Дата відправлення |N літака |N Категорії |Місце призначення Підрахувати загальну кількість квитків, проданих до м. Львова на 1 грудня 1997 року. 5. Інформація про результати діяльності бригад фабрики за місяць ¦ Найменування ¦ Шифр ¦ План ¦ Фактичний N цеху ¦ виробу ¦ виробу ¦ роботи ¦ випуск Надрукувати список виробів, в шифрі яких містяться "7", по яких не виконано план випуску за місяць. 6. Облік пацієнтів-шахтарів, які звертались за медичною профілактикою
¦ Наявність П.І.П. хворого¦ Вік ¦ Адреса ¦ Діагноз ¦ Код захворюв.¦лікар.листа Вивести список хворих, які перебувають на лікарняному листі, в коді захворювання яких немає комбінаці "А3". 7. Дані про розподіл стипендії по групах 2-го курсу Група ¦ К-сть студентів ¦ Отримують стипендію ¦ Староста Вивести список груп, вказавши прізвище та ім'я старости, в яких понад 70% студентів отримують стипендї. 8. Облік журналів в кіоску ¦ ¦ Місяць ¦ К-сть Автор ¦ Найменування журналу ¦ видання ¦ сторінок Надрукувати перелік журналів, виданих після 7 місяця та присвячених програмуванню на мові Сі. 9. Список спортсменів водних видів спорту математичної школи ¦ ¦ ¦ ¦ Участь у N п/п ¦ Клас ¦ Прізвище, ім'я учня ¦ Розряд ¦ шкільн.змаг. Відсортувати список у алфавітному порядку по прізвищах учнів. 10. Зведена відомість отримання товарів на автосклад Шифр товару ¦ Станція призначення ¦ Дата отримання ¦ Кількість Вивести дати отримання товарів, у шифрі яких є комбінація "К6", на автост. Львів. 11. Лист передплати на періодичні видання журналу ¦ К-сть міс. ¦ П.І.П. ¦ Найменування ¦ Індекс ¦ передплати ¦ передплатника ¦ Адреса Пересортувати список по зростанню індексів видань. 12. Список вокальних колективів області Найменування ¦ Дата реєстрації ¦ К-сть ¦ П.І.П. ¦ Участь в колективу ¦ Місяць ¦ Рік ¦ учасників ¦ керівника ¦ .конкурсі Вивести список колективів, зареєстрованих у липні-жовтні 1994 року, які приймали участь в міжміському конкурсі. 13. Медичний облік дітей, які відвідують дитячі ясла Дитина ¦ Дата народження ¦ ¦ ¦ Наявність Прізвище ¦ Ім'я ¦ рік¦день¦місяць ¦ Зріст ¦ Вага ¦ профіл.щеплень Вивести список дітей, яким на 1.05.95 виповнилось 3 роки, але вони не пройшли профілактичних щеплень. 14. Облік поїздів, що потребують ремонту ¦ Марка ¦ ¦ Дата ген.ремонту ¦ Вид N п/п ¦ поїзду ¦ Номер ¦ рік ¦ місяць ¦ несправності Надрукувати списки поїздів , що проходили генеральний ремонт протягом останніх трьох місяців. 15. Розподіл путівок у спортивні табори по школах міста Найменування ¦ Місце ¦ ¦ Кількість ¦ табору ¦ знаходження ¦ N школи ¦ путівок ¦Відповідальний Вивести список шкіл, що отримали путівки в спортивний табір "Сокіл" в с. Брюховичі. МЕТОДИЧНІ ВКАЗІВКИ ОБРОБКА ФАЙЛІВ ЗАСОБАМИ МОВИ ПАСКАЛЬ Файл - це сукупність логічно пов'язаних та організованих певнним чином даних на зовнішньому носії інформації (диску). FILE OF Т И П Розширення можливостей вводу і виводу реалізується використанням файлових змінних.Файловий тип складається із лінійної послідовності компонент, котрі в свою чергу можуть мати любий тип за виключенням файлового або структурного, до складу якого входить файловий тип. Якшо слово of і тип компоненти відсутні то використовуються нетиповані файли. Паскаль розглядає три класи файлів: - типовані; - нетиповані; - текстові; Типований файл складається із записів (компонент) одного з допустимих у Паскалі типів. Всі компоненти типованого файла мають однаковий розмір, що визначається розміром базового елемента. Тому можливим є доступ до кожного запису файла за його номером. Типованані файли є файлами прямого доступу і відкриваються одразу для читання і для запису.Це так звані дискові файли, які складаються з нумерованої послідовності деякого типу. Нетипованані файли Паскаль розглядає як сукупність символьних або байтових значень, незалежно від того, елементами яких даних вони є. Практично це означає, що кожен файл типований чи текстовий може розглядатись як нетипований, важливим є лише його розмір. Нетиповані файли забезпечують максимальну швидкодію при вводі/виводі інформації, оскільки не потребують затрат часу на перетворення даних. Нетиповані файли також відкриваються для вводу/виводу одночасно. Текстовий файл складається з послідовності рядків символів, кожен з яких закінчується парою кодів #13#10 ("перевід рядка", "повернення каретки"). Оскільки рядки файла мають різну довжину, то текстові файли є файлами послідовного доступу. Тобто, ввід/вивід n-го рядка файла можливий лише після зчитування/запису попередніх (n-1) рядків, а сам файл відкривається тільки для читання або тільки для запису. Кожному файлу в програмі ставиться у відповідність файлова змінна одного з трьох типів (за класом файла). А процес роботи з файлами включає наступні етапи: - опис файлової змінної (типи text, file of <базовий тип>, file); - встановлення зв'язку між файловою змінною та конкретним фізичним файлом (процедура Assign); - відкривання файла (процедури Reset, Rewrite, Append); - обмін даними з файлом - ввід/вивід (процедури Read, Readln, BlockRead, Write, Writeln, BlockWrite); - закриття файла (процедура Close). Кожен клас файлів має свої особливості при виконанні названих етапів. Крім наведених операцій Паскаль дозволяє здійснювати аналіз помилок при роботі з файлами (за допомогою функці IOResult), переміщення по файлу (процедура Seek, функція SeekPos), встановлення статуса кінця рядка та кінця файла (функці EOLn, EOF, SeekEOLn, SeekEOF), визначення розміру файла ( функція FileSize), перейменування (процедура Rename) та витирання файла (процедура Truncate) та інші ді. Список стандартних процедур та функцій для роботи з файлами наведений далі. Перелік стандартних процедур та функцій модуля System для роботи з файлами Процедури Append (Var f:text); Відкриває існуючий текстовий файл для доповнення (запису в кінець); f - файлова змінна. Пр. var game:text; ... append(game) {цей приклад відкриває файл game} Assign (Var f; name:string); Пов'язує файлову змінну f з зовнішнім файлом, ім'я якого задається параметром name (змінна або символьний рядок). Якщо файл розташований в іншому каталозі,то необхідно вказати шлях до нього. Пр. var File1:text; ... assign(File1,progr);{ Тут файловою змінною є змінна File1} Reset (Var f[:file;recsize:word]); Відкриває існуючий файл і встановлює вказівник на його початок: текстовий файл - відкривається тільки для читання; типований і нетипований файли відкриваються для читання і запису. Для нетипованого файла додатково задається розмір запису у байтах. Пр. Reset(File1); Rewrite (Var f[:file;recsize:word]); Створює і відкриває новий файл або відкриває для запису існуючий (занесена попередньо у файл інформація при цьому витирається). Пр. Rewrite(File1); Close (Var f); Закриває відкритий файл. Пр. Close(file1); Seek (Var f; n:longint); Встановлює вказівник файла на компоненту з номером n. Пр. Seek(File1,N-1) BlockRead (Var f:file;Var buf; n:word; [; Var result:word]); Читає з нетипованого файла n записів даних у область пам'яті, виділену для змінної buf; f - змінна нетипованого файла; buf - змінна довільного типу, що задає буферну область, куди заноситься інформація з файла; result - (необов'язковий параметр) повертає число фактично зчитаних блоків. Пр. BlockRead(f1,buf,l4,iw); BlockWrite (Var f:file; Var buf; n:word;[; Var result:word]); Записує у файл n блоків даних з області пам'яті змінної buf (див. BlockRead). Пр. BlockWrite (f1,buf,l4,iw); Erase (Var f); Витирає закритий файл, який представляє змінна f. Пр. Erase(File1); Rename (Var f;newname:string); Перейменовує закритий файл, представлений змінною f на нове ім'я,задане параметром newname Пр. Rename(File1,ParamStr(2)); Flush (Var f:text); Переносить у текстовий файл інформацію з буфера виводу. Пр. var file1:text; Flush(file1); Read (f,v1[,v2,...vk]); Якщо f - типований файл, то читає біжучу його компоненту у змінну v1. Якщо f - текстований файл,то читає одне або більше послідовних значень у змінні v1,...vk. Пр. Read(f,x1,x2); Readln (Var f:text; v1[,v2,...vk]); Виконує Read-процедуру текстового файла з наступним переходом на новий рядок. Пр. Readln(f,a1,a2,a3); SetTextBuf (Var f:text; Var buf[;size:word]); Створює буфер користувача для обміну даними з текстовим файлом; buf - змінна достатнього розміру, щоб вмістити всю інформацію; size - (необов'язковий параметр) визначає розмір буфера. Без нього буфер має розмір змінно buf. Truncate (Var f); Витирає частину файла, яка розташована за позицією курсора. Write (f,v1[,v2,...vk]); Якщо f - типований файл, то записує значення змінної v1 у біжучий компонент файла. Якщо f - текстовий файл, то заносить значення змінних v1,..vk у біжучий рядок файла. Пр. Write (File1,v1,v2); Writeln (Var f:text;v1[,v2,...vk]); Заносить дані у текстовий файл як процедура Write, виставляючи в кінці маркер кінця рядка. Пр. Writeln(f,v1,v2); Функції. EOF (Var f):boolean true - при досягненні кінця файла;false - в інших випадках. f - змінна відкритого файла будь-якого класу. Пр. While not EOF (File1) do EOLn (Var f:text):boolean true - при досягненні кінця рядка;false - в інших випадках. f - змінна текстового файла. FilePos (Var f):longint Номер запису файла, на якому розташований вказівник. f - змінна типованого або нетипованого файла. FileSize (Var f):longint Кількість записів (розмір) файла. Розмір файла в байтах можна визначити: FileSize(f)*Sizeof(a) де Sizeof(a) - довжина компоненти файла. IOResult: word Повертає код результату виконання останньої операції.Функція без параметрів вводу/виводу: при успішному завершенні - 0, при невдалому - код помилки. SeekEOF(Var f:text):boolean Стан кінця для відкритого текстового файла. Кінцеві пропуски та знаки табуляцій ігноруються. SeekEOln(var f:text):boolean Стан кінця рядка в текстовому файлі. Кінцеві пропуски та знаки табуляцій ігноруються. Пр. var f:text ; ...; SeekEOln(f) Приклад програми. Необхідно створити типований файл з інформацією про книги: назва, автор, рік видання, видавництво, наявність книги в бібліотеці, коротка анотація. Дані вводяться з клавіатури. Існує текстовий файл з відповідними даними про деякі книги: N п/п книги, автор (1-й рядок), назва (2-й рядок), видавництво і рік видання (3-й рядок) – так по кожній книзі. Зі створеного типованого файла здійснити доповнення текстового файла даними про книги наявні у бібліотеці та видані не раніше заданого року. Program FILES; Const MinRik=1993; ESC=#27; {27 - код клавіші "Esc"} Type knyga= record nazva: string[150]; avtor: string[150]; rik: word; vydav: string[50]; nayavn: boolean; anotac: string end; Var bibliogr: file of knyga; literat: text; filename: string[60]; zap_bibliogr: knyga; n,k: byte; c: char; pomim: boolean; Label m; BEGIN { Відкриваємо типований файл для занесення даних } write ('Ім''я типованого файла з даними про книги - '); readln (filename); assign (bibliogr, filename); rewrite (bibliogr); writeln ('Введіть дані про книги'); writeln ('( для завершення "Esc" замість назви книги )'); n:=1; { n - номер книги, інформація по якій вводиться } { Цикл створення типованого файлу з даними про книги } repeat with zap_bibliogr do begin writeln; { Ввід даних про n-ну книгу } writeln ('Книга ',n,':'); write (' Назва - '); c:=readkey; if c=ESC then break; write (c); readln (nazva); write (' Автор - '); readln (avtor); write (' Рік видання та видавництво - '); readln (rik,vydav); write (' Наявність в бібліотеці (Так/Ні) - '); m: readln (c); case c of 'т','Т': nayavn:=true; 'н','Н': nayavn:=false; else writeln ('Введіть Т або Н'); goto m; end; writeln (' Анотація (до 255 символів):'); readln (anotac) end; { Занесення введено інформаці у запис файла } write (bibliogr,zap_bibliogr); Inc (n); until false; writeln; writeln ('Створено типований файл ', filename, ' з повною інформаціїю про ', n-1, ' книги'); writeln; { Відкриваємо існуючий текстовий файл для читання, щоб визначити номер останнньої занесеної в нього книги } {$I-} { відключаємо контроль вводу/виводу } repeat write ('Ім''я текстового файла з даними про книги - '); readln (filename); assign (literat,filename); reset (literat); pomim:=false; { pomim - наявність помилки в імені файла } if IOResult<>0 then begin pomim:=true; writeln (' Помилка в імені файла !!!') end; until not pomim; {$I+} n:=0; { Читаємо файл, підраховуючи кількість рядків у ньому } while not EOF(literat) do begin readln (literat); Inc(n) end; close (literat); k:=n div 3; n:=k; {n=k - номер останнньо книги з текстового файла } { Відкриваємо файл для доповнення новими даними } append (literat); { Встановлюємо вказівник типованого файла на його початок } seek (bibliogr,0); { Цикл читання записів типованого файла та вибору з них даних, які заносяться в кінець текстового файла } while not EOF(bibliogr) do begin read (bibliogr,zap_bibliogr); with zap_bibliogr do if (rik>=MinRik) and nayavn then begin Inc (n); writeln (literat,' ',n,'. ',avtor); writeln (literat,' ',nazva); writeln (literat,' ',vydav,':',rik) end end; writeln; writeln ('Файл доповнено даними про ',n-k,' книги'); readln; close (bibliogr); close (literat) END. І ще один приклад: Приклад на 4 процедури : Assign,Rewrite,Writeln,Close. PROGRAM FileEx1; var File1:text; begin Assign(file1,'File1.txt');{Назначае файлу ім'я} Rewrite(file1);{Будує новий пустий файл і відкриває його для запису} Writeln(File1,'Треба вчитися'); writeln(File1,'гарно і вивчати'); writeln(File1,'Turbo pascal '); close(File1); end.{FileEx1} {Програма записує в текстовий файл( File1 ) таку комбінацію: Треба вчитися гарно і вивчати Turbo pascal } Приклад на процедури : Reset,Readln,EOF. PROGRAM FileEx2; var File1:text; St:string; begin Assign(file1,'File1.txt');{Назначае файлу ім'я} Reset(file1);{відкриття файлу за читанням} While not EOF(File1) do {функція EOF даї значення True коли настане кінець файлу } begin Readln(File1,St);{читання з файлу} Writeln(st);{вивід зчитаного на монітор} end; Close(File1); end.{FileEx1}