вторник, 26 ноября 2013 г.

Робота з файлами

Типи файлів Турбо Паскаль

Турбо Паскаль підтримує три файлових типи:
  • текстові файли;
  • типізовані файли;
  • нетипізовані файли.
Доступ до файлу в програмі відбувається за допомогою змінних файлового типу. Змінну файлового типу описують одним з трьох способів:
file of тип - типізований файл (вказаний тип компоненти);
text - текстовий файл;
file - нетипізований файл.
Приклади опису файлових змінних:
var
   f1: file of char;
   f2: file of integer;
   f3: file;
   t: text;
    

Стандартні процедури та функції

Будь-які дискові файли стають доступними програмі після зв'язування їх з файловою змінною, оголошеної в програмі. Всі операції в програмі здійснюються тільки за допомогою пов'язаної з ним файлової змінної.

Assign(f, FileName)

пов'язує файлову змінну f з фізичним файлом, повне ім'я якого задано в рядку FileName. Встановлений зв'язок буде чинним до кінця роботи програми, або до тих пір, поки не буде зроблено перепризначення.
Після зв'язку файлової змінної з дисковим ім'ям файлу в програмі потрібно вказати напрямок передачі даних (відкрити файл). В залежності від цього напрямку говорять про читання з файлу або запису в файл.

Reset(f)

відкриває для читання файл, з яким пов'язана файлова змінна f. Після успішного виконання процедури Reset файл готовий до читання з нього першого елемента. Процедура завершується з повідомленням про помилку, якщо зазначений файл не знайдений.
Якщо f - типізований файл, то процедурою reset він відкривається для читання і запису одночасно.

Rewrite(f)

відкриває для запису файл, з яким пов'язана файлова змінна f. Після успішного виконання цієї процедури файл готовий до запису в нього першого елемента. Якщо вказаний файл вже існував, то всі дані з нього видаляються.

Close(f)

закриває відкритий до цього файл з файлової змінної f. Виклик процедури Close необхідний при завершенні роботи з файлом. Якщо з якоїсь причини процедура Close не буде виконана, файл усе-таки буде створений на зовнішньому пристрої, але вміст останнього буфера в нього не буде перенесено.
EOF(f): boolean
повертає значення TRUE, коли при читанні досягнутий кінець файлу. Це означає, що вже прочитаний останній елемент у файлі або файл після відкриття виявився порожній.
Rename(f, NewName)
дозволяє перейменувати фізичний файл на диску, пов'язаний з файловою змінною f. Перейменування можливо після закриття файлу.

Erase(f)

видаляє фізичний файл на диску, який був зв'язаний з файловою змінною f. Файл до моменту виклику процедури Erase має бути закритий.

IOResult

повертає ціле число, яке відповідає коду останньої помилки введення - виведення. При нормальному завершенні операції функція поверне значення 0. Значення функції IOResult необхідно надавати якій-небудь змінній, так як при кожному виклику функція обнуляє своє значення. Функція IOResult працює тільки при вимкнутому режимі перевірок помилок введення - виведення або з ключем компіляції {$I-}.

                                 Program p1;
Var a: longint ; t: text; s: integer;
begin
assign( t,'input.txt');
Reset(t);

read(t, a);
 s:= a*2;
close(t);
assign(t,'output.txt');
rewrite(t); {перезаписуємо фаил}
write(t,s); {Выводимо дані. }
close(t);
end.

четверг, 21 марта 2013 г.

задачі


 Читання послідовності довжиною до 35 символів з ​​текстового файлу example.txt (його вміст, наприклад, "23456 Всім привіт!"

     Функція Eoln (var F: text) повертає булеве значення True, якщо поточна файлова позиція знаходиться на маркері кінця рядка або виклик Eof (F) повернув значення True. У всіх інших випадках значення функції буде False.

     Функція Eof (var F: text) повертає булеве значення True, якщо вказівник кінця файлу знаходиться відразу за останнім компонентом. В іншому випадку - False.


program wtf2;
var F: text; St: string[35];
begin
    assign(F, 'example.txt');     reset(F);
    while not Eoln(F) do
        begin
           read(F,St);
          writeln('St = ',St);         end;
    readln(F);     close(F);
    writeln('вивід символів з ​​файлу закінчено. для виходу — Enter.');
    readln;
end.


 При роботі з файлами в TP використовуються наступні процедури:

     assign (var F; name: string); - встановлює відповідність між файлом і файлової змінної, відкриває всі інші процедури роботи з файлами. F - змінна будь-якого файлового типу, name - повне ім'я файлу.
     close (var F); - закінчення процедур роботи з файлами (закриття файлу).
     rewrite (var F: file); - створює і відкриває новий файл.
     reset (var F: file); - відкриває існуючий файл.
     append (var F: text); - відкриває існуючий текстовий файл і позиціонує покажчик обробки на кінець файлу.

     Після цього можна доповнювати текстовий файл інформацією, починаючи з кінця рядка.

     erase (var F); - видаляє невідкритий зовнішній файл будь-якого типу, що задається змінною F.
     rename (var F: newname: string); - перейменовує невідкритий файл F будь-якого типу. Нове ім'я задається рядком newname.

     Текстовий файл можна розглядати як послідовність символів, розбиту на рядки довжиною від 0 до 256 символів. Для опису використовується стандартний тип text: var F: text; (F - файлова змінна).

вторник, 19 марта 2013 г.

Задачі

Два бандити(Бандити Гаррі і Ларрі відпочивали на природі. Вирішивши постріляти, вони виставили на колоду кілька банок з-під пива (не більше 10). Гаррі почав прострілювати банки по порядку, починаючи з самої лівої, Ларрі - з самої правої. У якийсь момент вийшло так, що вони одночасно прострелили одну і ту ж останню банку.
Гаррі обурився і сказав, що Ларрі повинен йому купу грошей за те, що той позбавив його задоволення прострелити кілька банок. У відповідь Ларрі сказав, що Гаррі повинен йому ще більше грошей з тих же причин. Вони стали сперечатися хто кому скільки винен, але ніхто з них не пам'ятав скільки банок було на початку, а шукати прострелені банки по всій окрузі було неохота. Кожен з них пам'ятали тільки, скільки банок прострелив він сам.
Визначте за цими даними, скільки банок не прострелив Гарі і скільки банок не прострелив Ларрі.Вхідні даніУ єдиному рядку вхідного файлу INPUT.TXT записано 2 числа - кількість банок, прострелених Гаррі і Ларрі відповідно.Вихідні даніУ файл OUTPUT.TXT виведіть 2 числа - кількість банок, не прострелених Гаррі і Ларрі відповідно.


 
program task3;
var
  a,b,c,d,f:integer;
begin
  assign(input,'input.txt'); reset(input);
  assign(output,'output.txt'); rewrite (output);
  readln(a,b);
  c:=a+b-1;
  d:=c-a;
  f:=c-b;
  writeln(output,d,' ',f);
  close(input);
  close(output);
end.
 

Наведемо програму, що виводить на екран перші п'ять рядків текстового файла.

Program ex5;
var f:text;
  s:string;
  i:integer;
begin
  writeln('reading rows from the text file');
  assign(f,'t.txt');
  reset(f);
  for i:=1 to 5 do
    begin
      readln(f,s);
      writeln(s);
    end;
  close(f);
  readln;
end.


четверг, 28 февраля 2013 г.

масиви

Дамо поняття масиву. Масив – це впорядкований іменований набір із фіксованої кількості однотипних даних. Доступ до будь-якого елементу масиву здійснюється за його номером. У масиви можна об’єднувати результати експериментів, списки прізвищ співробітників, різні складні структури даних. Наприклад, список учнів у класному журналі є масивом. У масиві дані розрізняються за своїми порядковими номерами (індексами). Якщо кожний елемент масиву визначається за допомогою одного номера, то такий масив називається одновимірним, якщо за двома – то двовимірним. Двовимірний масив – це таблиця з рядків і стовпців. У таблицях перший номер вказує на рядок, а другий – на положення елемента в рядку. Усі рядки таблиці мають однакову довжину.
Одновимірний масив може бути набором чисел, сукупністю символьних даних чи елементів іншої природи (навіть масив масивів). Так само, як і в послідовності, в одновимірному масиві можна вказати елемент з конкретним номером, наприклад а5, або записати загальний вигляд елемента, використовуючи як індекс змінну і, вказуючи діапазон її зміни:
a[i] , i=1, 2 n.
Задачі, в яких використовуються масиви, можуть мати різне формулювання. Наприклад, задача починається зі слів «Дано n чисел...» і далі вказується, що треба зробити з цими числами. При написанні програми мовою Паскаль для розв'язання подібної задачі слід виконати такі дії:
  • визначити, які числа задані: цілі чи дійсні; якщо про це
конкретно не сказано, то краще вважати їх дійсними;
  • назвати весь масив одним ім'ям (це ім'я буде використовуватись для кожного елемента, тільки до імені масиву додаватиметься номер елемента – індекс);
  • описати масив у розділі змінних var, тим самим відвести місце в пам'яті для масиву;
  • ввести дані до пам'яті.
В описі масиву використовують спеціальне слово array (масив), після якого у квадратних дужках через дві крапки вказують діапазон змінювання номерів елементів, далі слово of (із) і тип даних масиву. Коли транслятор зустрічає опис масиву, він відводить для нього стільки послідовних ділянок пам'яті, скільки вказано в квадратних дужках, і такої довжини, яка відповідає типу даних у масиві.
Здебільшого номери елементів змінюються від 1 до заданого числа n, яке є ocтаннім значенням (верхньою межею) номера елемента масиву. Значення n можна задати в розділі констант (const). Приклад опису масиву:
const n = 10; var a: array [1..n] of real;
Цей опис означає, що для масиву a буде відведено десять ділянок оперативної пам'яті по шість байтів кожна. У Паскалі імена цих ділянок записуються так:
a[1], a[2], a[3], a[4], a[5], a[6].
В описі після імені масиву а ставиться двокрапка, після якої вказується тип даного – масив. Якщо в програмі кілька масивів одного розміру і типу, то, як і для простих змінних, їх імена можна задати через кому, а потім, після двокрапки, вказати опис масиву. Для введення даних у пам'ять необхідно організувати цикл. Оскільки введення описаного масиву а може мати вигляд:
for і := 1 to n do read(a[i]);
Значення, що вводяться, набираються на клавіатурі і відокремлюються одне від одного пропусками, після чого натискається Enter. Введення можна прокоментувати і вводити кожне дане в окремому рядку після підказу:
for і := 1 to n do begin write ('a [', і, '] = '); readl n(a[i]) end;
При обробці масивів розв'язування багатьох задач базується на простіших задачах:
  • обчислення суми (добутку) елементів масиву;
  • знаходження найбільшого (найменшого) елемента;
  • упорядкування елементів за зростанням або спаданням. 

Створити масив за допомогою генератора псевдовипадкових чисел. Ввести з клавіатури деяке значення та визначити номер найпершого з елементів, що дорівнюють цьому значенню. Якщо таких елементів не існує, вивести відповідне повідомлення.
Лінійний пошук здійснюється шляхом перебирання всіх елементів масиву та порівняння кожного з них із заданим значенням. Якщо елемент знайдено, цикл пошуку переривається і виводиться знайдений індекс. А якщо цикл пошуку дійшов останнього елемента, і цей елемент не дорівнює заданому значенню, виводиться повідомлення про відсутність шуканого елемента. Описаний алгоритм пошуку елемента в неупорядкованому масиві реалізовано в програмі ех7_5, код якої наведено нижче. 



 задача

Визначити добуток двох матриць розміром NxN.

вторник, 26 февраля 2013 г.

задачі масиви

Задача 1. У заданій послідовності цілих чисел визначити кількість і суму елементів, кратних 10.





Файл:Pr3.jpg

Задача 3. Дано n чисел. Замінити всі від’ємні числа їх модулями.

Файл:Pr6.jpg 
Задача 3. Напишіть програму для відшукання найбільшого елементу масиву [1..n], де n = 117.

Файл:Pr4.jpg
 

четверг, 21 февраля 2013 г.

задачі. цикл з параметрами



Задача. Обчислити та вивести на екран номери і значення перших n=10 елементів. a := 3 + cos(2*i)
Це можна зробити за допомогою наступної програми:
program Elements;
var i,n: integer; a : real;
begin
n := 10;
for і := 1 to n do begin
a := 3 + cos(2*i); writeln(i:4, a:15:2)
end
end.
3.           Пошук потрібних елементів. Задача пошуку потрібних елементів з-поміж усіх елементів послідовності розв'язують методом перегляду і аналізу всіх елементів. Для відбору потрібних елементів використо­вують деяку умову (логічний вираз). Усе це роблять за допомогою команди if, яка знаходиться в тілі команди циклу.
З а д а ч а 3. Нехай елементи числової послідовності описуються формулою a=2-2cos3i, і = 1,2,...,12. Вивести на екран номери і значення лише додатних елементів.
program Find;
var i,n: integer; a : real;
begin
n := 12;
for і := 1 to n do begin
a := 2 - 2*cos(3*i);
if a > 0 then writeln(i:4, a:15:2)
end
                    end.
Завдання. Виведіть на екран елементи, які більші, ніж 1 і менші, ніж 2.

четверг, 7 февраля 2013 г.

Двохвимірні Масиви

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

Тому двовимірний масив можна задати таким чином: b: array [1 .. n] of array [1 .. m] of integer.
Однак, подібний запис двовимірного масиву на практиці використовується нечасто. Найбільш кращим є наступний варіант: b: array [1 .. n, 1 .. m] of integer.
Схематично, двовимірний масив можна представити у вигляді матриці, де перший індекс [1 .. n] визначає кількість рядків, а другий індекс [1 .. m] визначає кількість стовпців. Для прикладу візьмемо масив b: array [1 .. 7,1 .. 6] of integer. Схематично його можна представити так:


dvumernihyj massiv 

Як видно, такий масив містить 42 елемента (7 × 6). Для доступу до елементу масиву необхідно вказати номер рядка і стовпця, на перетині яких цей елемент розташований. Наприклад, на нашому малюнку елемент масиву b [3,3] має значення 122.
Наступна програма записує в кожен елемент масиву випадкове число і потім виводить всі ці числа на екран.



  1. program massiv10;
  2. uses crt;
  3. const N=5;
  4.          M=4;
  5. var X:array [1..N, 1..M] of integer;
  6.        I, J:integer;
  7. begin
  8. clrscr;
  9. randomize;
  10. for i:=1 to N do
  11.     for j:=1 to M do
  12.     x [I, J]:=random (100);
  13. for i:=1 to N do
  14. begin
  15.   for j:=1 to M do
  16.     write (' ',x[I,J]);
  17.     writeln
  18. end;
  19. readln
  20. end.
 У рядку № 3 і № 4 вкажемо значення для константи «N» і «M».
У рядку № 5 запишемо область двовимірного масиву, що складається з N - рядків і M - стовпців. Він записується також як і одновимірний масив, тільки у квадратних дужках вказується область зберігання двовимірного масиву. Таким чином, наш масив буде складатися з 5 рядків і 4 стовпців
У рядку № 6 записуємо змінні, для зберігання індексів рядка і стовпця.
Рядок № 9,10,11,12 - заповнюємо масив випадковими числами (Усі рядки і стовпці заповняться випадковими числами). Як видно з програми, для того щоб заповнити елементи двовимірного масиву різними значеннями, необхідно використовувати 2 цикли (один цикл вкладається в інший). У зовнішньому циклі лічильником виступає індекс рядка, у внутрішньому циклі - індекс стовпця. Зовнішній цикл виконається один раз тільки коли внутрішній цикл виконається 4 рази. А так як зовнішній цикл повинен виконатися 5 разів, то внутрішній цикл за цей час виконається 20 разів, заповнивши при цьому всі 20 елементів двовимірного масиву.
Рядок № 13 - № 17. Виводимо значення всіх елементів масиву на екран. Причому, як тільки заповнюються всі комірки одного рядка масиву, проиходит перехід на інший рядок, і наступна рядок масиву виводиться на іншому рядку.