субота, 31 березня 2018 р.

Текстові файли

Текстові файли

Текстові файли складаються з рядків, довжини яких можуть бути різними.

Опис текстових файлів:
Var f:text;         
Команди:
Assign(f,’ім’я файлу на диску’); - вказує адресу файлу на диску (файл з розширенням txt).
Rewrite(f); - створює файл і відкриває його для запису.
Append(f); - відкриває файл для дописування в нього даних.
Write(f,a); - в поточну позицію файлу записує значення змінної а.
Writeln(f,a); - в поточну позицію файлу записує значення змінної а і вказівник поточної позиції переміщується на наступний рядок.
Writeln(f); - у режимі введення даних вказівник поточної позиції переміщується на наступний рядок.
Reset(f); - відкриває файл лише для читання.
Read(f,x); - читає з поточної позиції файлу значення і записує в змінну x.
Readln(f,x); - читає з поточної позиції файлу значення і записує в змінну x, при цьому вказівник поточної позиції переміщується на наступний рядок.
Readln(f); - у режимі зчитування даних вказівник поточної позиції переміщується на наступний рядок.
Close(f); - закриття файлу.
Eof(f); - перевірка на кінець файлу.
Eoln(f); - перевірка на кінець рядка.
Немає команди Seek(f,n).

Задача 1.  Ввести 16 цілих чисел у файл, причому записати в кожен рядок по 4 числа. Надрукувати на екрані пострічково вміст текстового файла f.
Program g1;
Var f:text; i,a:integer;
Begin assign(f,’u:\fff.txt’);
           rewrite(f);
          for i:=1 to 16 do
           begin
               read(a);
               write(f,a)
               if i mod 4=0 then writeln(f)
           end;
           close(f);
           reset(f);         
           while not eof(f) do
              begin
                 while not eoln(f) do
                        begin
                             read(f,a);
                             write(a)
                          end;                
                  readln(f);
                  writeln     
               end;
            close(f)
end.

Задача 2. Сформувати текстовий файл з 5 стрічок таким чином:
a)      1 1 1 1 1 1 1 1 1 1                         
                       2 2 2 2 2 2 2 2 2 2                                          
                       3 3 3 3 3 3 3 3 3 3                             
                       4 4 4 4 4 4 4 4 4 4                             
                       5 5 5 5 5 5 5 5 5 5                             
program program_a;
var f:text; i,j:integer;
begin assign(f,’u:\ggg.txt’);
          rewrite(f);
          for i:=1 to 5 do
           begin
             for j:=1 to 10 do
                 write(f,i)
             writeln(f)
           end;
          close(f)
end.

Д/З №1
  1. Ввести 15 цілих чисел у файл, причому записати в кожен рядок по 5 чисел. Сформувати файл h, у який  записати  пострічково вміст текстового файла f.
  2. Нехай задано текстовий файл f (файл створений в іншій програмі або в блокноті). Знайти суму додатніх елементів у цьому текстовому файлі.

Д/З №2
  1. Знайти суму та кількість додатніх елементів в кожному рядку текстового файла. Вивести у вигляді: номер рядка – сума елементів, кількість елементів.
  2. Заданий текстовий файл. Підрахувати кількість стрічок та вивести стрічки, які
 починаються і закінчуються однаковою літерою;


субота, 17 березня 2018 р.

Типізовані файли


Типізовані файли

Файл - це впорядкована сукупність однотипних елементів довільної кількості.

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

Опис файлів:
var f:file of <тип елементів файлу>
Наприклад,
var f: file of integer;   (всі елементи файлу – цілі числа)
var f: file of real;        (всі елементи файлу – дійсні числа)
або опишемо комбінований тип
type asd = record
                        a:integer;
                        b:string[27]
                 end;
var f:file of asd;          (всі елементи файлу – є записи)

Команди для роботи з файлами:
Assign(f,’ім’я файлу на диску’); - вказує адресу файлу на диску (наприклад, u:\text).
Rewrite(f); - створює файл і відкриває його для запису.
Write(f,a); - в поточну позицію файлу записує значення змінної а.
Reset(f); - відкриває файл для читання і запису.
Read(f,x); - читає з поточної позиції файлу значення і записує у змінну x.
Close(f); - закриває файл.
Eof(f); - перевірка на кінець файлу.
Seek(f,n); - переміщує вказівник поточної позиції на n+1-компоненту.
Seek(f,0); - переміщує вказівник поточної позиції на першу компоненту.
Seek(f,FileSize(f)); - перехід в кінець, тобто на перший порожній запис, де FileSize(f) – розмір файла в записах (тобто кількість елементів файлу).
FilePos(f); - повертає номер поточного запису.

Задача1. Ввести у файл 10 цілих чисел. Порахувати суму додатніх елементів файлу.
program R1;
var f:file of integer;
       c,s,i:integer;
begin
  assign(f,’U:\ hhh’);
  rewrite(f);
  for i:=1 to10 do
    begin
       read(c);
       write(f,c);
    end;
  close(f);
  reset(f) ; s:=0;
  while not eof(f) do
    begin
      read(f,c);
      if c>0 then s:=s+c
    end;
  close(f);
  writeln(‘s=’,s)
end.

Задача 2. Нехай файли g і h вже створені і містять дійсні елементи. Сформувати файл f  послідовно з елементів файлу g та елементів файлу h. Вивести елементи файлу f на екран.

program pr2;
var g,h,f:file of real;
       x:real;
begin
assign(g,'U:\g.dat');
reset(g);
assign(h,'U:\h.dat');
reset(h);
assign(f,'U:\f.dat');
rewrite(f);

while not eof(g) then
   begin
      read(g,x);
      write(f,x);
   end;
while not eof(h) then
   begin
       read(h,x);
      write(f,x);
   end;
close(h);close(g);close(f);

reset(f);
while not eof(f) then
    begin
        read(f,x);
        write(x);
    end;
close(f);

end.

Д/з №1
1. Ввести 15 цілих чисел, всі парні з них записати у файл f. Порахувати суму та кількість елементів файлу, що належать проміжку [a,b].
2. Файл f вже створений в попередній програмі. Сформувати  файл h з від'ємних елементів файлу f.

Д/з №2
1. Ввести 10 цілих чисел ( 5 додатніх і 5 від'ємних). Додатні записати у файл g, а від'ємні - у файл h. Сформувати файл f  з елементів файлу g та елементів файлу h таким чином:
Якщо сума відповідних елементів файлів g i h більша числа 5   , то у файл f записати цю суму , інакше записати 0.                
2. Файл f вже створений в попередній програмі. Порахувати кількість елементів файлу f, які  більші середнього арифметичного всіх елементів цього файлу.

вівторок, 27 лютого 2018 р.

Множини

Множини

Множина – основне математичне поняття.
            У Паскалі розглядаються тільки скінченні множини, що складаються не більш ніж з 256 різних елементів. Всі елементи мають бути значеннями одного порядкового типу (це типи Byte і Char або діапазон чи перелік значень з урахуванням допустимої кількості елементів).
            У Паскалі елементи множини беруть у квадратні дужки. Множина може не мати елементів, тобто бути порожньою, тоді її зображають так [ ].
            У квадратних дужках можуть знаходитися допустимі вирази зі змінними, наприклад, [i, j] – множина, що містить значення змінних i, j типу Byte. Порядок перерахування елементів ролі не грає і кожний елемент враховується тільки один раз, тому множина [1, 7, 3] еквівалентно [3, 1, 7]. Запис типу [5..5]  відповідає множині [5] , а [9..0] - порожній множині.
            Після задання типу множини сукупність значень відповідної змінної множинного типу визначається автоматично. У неї входять всі можливі підмножини, що є довільними комбінаціями значень.
            Змінну множинного типу описують так:
1 спосіб
type IntSet = set of 1..3;
var m: IntSet;

2 спосіб
var m: set of 1..3;
      c: set of char;
      y: set of (a,b,c);
      z: set of ‘a’..’f’;

Змінні множини m можуть набувати значень: [1, 2, 3],  [1, 2], [1, 3], [2, 3], [1], [2], [З], [].
Змінні множини b:Set of Boolean можуть мати значення: [true, false], [true], [false], [].
Змінній m задамо значення [1, 2] за допомогою оператора присвоєння: m:= [1, 2];
           
Набір операцій над множинами у Паскалі:
А = В     (Множини А і В збігаються)
А <>  В    (Множини А і В не збігаються)
А >= В  (Всі елементи множини В належать множині А)
А <= В  (Всі елементи множини А належать множині В)
х in А    (Значення х є того ж  типу, що і елементи множини А і належить множині А)
А + В    (Об’єднання множин А і В)
А * В    (Перетин множин А і В)
А - В     (Різниця множин А і В)
            Перші п’ять операцій у таблиці – це операції відношення. Вони повертають логічне значення true або false. Останні три операції утворюють нові множини. Операнди повинні бути одного типу.
            Є дві спеціальні процедури для роботи з одиночними елементами множини: include(А, x) і exclude(А, х), які відповідно включають або виключають елемент х з множини А.
            Множини зберігаються у пам’яті дуже компактно: кожне значення типу множини представляється лише одним бітом. У пам’ять комп’ютера заноситься 1 або 0 залежно від того, містить множина цей елемент чи ні. Наприклад, опишемо змінну var m: set of 1..5; то якщо m:= [1, 3]; то у пам'яті множина буде представлена так 10100, якщо M := []; тоді - 00000.

Д/З
1. Ввести рядок з цифр та малих латинських літер. Визначити, яких букв – голосних (a, e, i, o, u) чи приголосних – більше в цьому тексті.
2. var x,y,z:set of  8..100;
Змінній x присвоїти множину всіх цілих чисел від 8 до 100, змінній y – множину всіх простих чисел із цього діапазону, а змінній z – множину всіх складених чисел з цього діапазону.
3.  Ввести рядок. В алфавітному порядку надрукувати (по одному разу) всі малі англійські голосні літери (a, e, i, o, u), що входять в цей текст.
4.  Дано текст із малих латинських літер, який закінчується крапкою. Надрукувати:
a) перші входження букв у текст, зберігаючи їх початковий взаємний порядок;
b) всі літери, що входять в текст не менше ніж два рази;
c) всі літери, що входять в текст по одному разу.


субота, 3 лютого 2018 р.

Комбінований тип

Комбінований тип

1. Задано список з 30 учнів, для кожного вказані такі дані: прізвище, ім’я, вага, зріст, адреса (record з назви вулиці, номерів будинку та квартири)  та  10 оцінок.  Знайти
            а) середню вагу учнів;
            б) максимальний зріст учнів;
            в) прізвище та імя учня з максимальним зростом;
г) кількість учнів класу з імям Андрій;
д) прізвища та імена учнів, прізвища яких починаються на А.

program pr1;
type Pupilrecord
                                  Surname, Name: string[20];
                                   Vaga:integer;
   Zrist: real;
   Adress:record
                  Street:string[15];
                  House, flat:integer
                end;
                                   Marks: array [1..10of 1..12;
                        end;
var klass: array[1..30] of Pupil;
      I,j:integer;
Begin

Вводимо дані }
  for i := 1 to 30 do
  begin
     writeln('Введіть прізвище');
     readln(Klass[i].Surname);
     writeln('Введіть імя');
     readln(Klass[i].Name);
     writeln('Введіть вагу');
     readln(Klass[i].Vaga);
     writeln('Введіть зріст');
     readln(Klass[i].Zrist);
     writeln('Введіть адресу');
     readln(Klass[i].Adress.Street);
     readln(Klass[i].Adress.House, Klass[i].Adress.Flat);
     for j:=to 10 do
      begin
      writeln('Введіть оцінку');
           readln(Klass[i].Marks[j]);
     end;
  end;

{Використаємо оператор приєднання для вводу }
      for i:=to 30 do  
          with klass[i] of
               begin
                    readln(Surname);
                    readln(Name);
                      readln(Vaga, Zrist);
                    readln(Adress.Street);
                      readln(Adress.House, Adress.Flat);
                    for j:=to 10 do  readln(Marks[j]);
               end;

{ а) Знайти середню вагу школярів }
  SerVaga := 0;     
  for i := 1 to 30 do
    SerVaga:= SerVaga+Klass[i].Vaga;
SerVaga:= SerVaga /30;
writeln(SerVaga);

{ б) Знайти максимальний зріст }
  MaxZrist := 0;          {Описати змінну MaxZrist }
  for i := 1 to 30 do
     if Klass[i].Zrist> MaxZrist then MaxZrist := Klass[i].Zrist;
  writeln(MaxZrist);

{ г) Знайти кількість щколярів на ім'я Андрій }
  NameCount := 0;
  for i := 1 to 30 do
     if Klass[i].Name = 'Андрійthen NameCount:= NameCount+1;
  writeln(NameCount);

{ д) Вивести прізвища та імена школярів, у яких прізвище починається на літеру ‘А’ }
  for i := 1 to 30 do
      if Klass[i].SurName[1] =’A then writeln(Klass[i].Surname ,' ',Klass[i].Name);
    
-------------------------------------------------------------------------------------------------------------------
Продовжуємо цю задачу

{ Знайти  кількість щколярів, у яких середня оцінка не менша 8 і не більша 10}
Count := 0;
for i := 1 to 30 do
begin
    MarkSum := 0;
    for j := 1 to 10 do
        MarkSum:=MarkSum+Klass[i].Marks[j];          { inc(MarkSum,Klass[i].Marks[j]) }
    AvgMark := MarkSum/10;
    if (AvgMark >= 8and (AvgMark <= 10then
        Inc(Count);
  end;
  writeln(Count);

{ Вивести прізвища та імена школярів, у яких найменша оцінка 10 }
  for i := 1 to 30 do
  begin
    MinMark := 13;
    for j := 1 to 10 do
        if Klass[i].Marks[j] < MinMark then MinMark := Klass[i].Marks[j];
    if MinMark = 10 then
        writeln(Klass[i].Surname ,' ',Klass[i].Name);
  end;

end.    {Кінець програми}

Д/з №1

  1. Знайти кількість учнів з вагою більше середньої.
  2. Вивести прізвища та імена учнів, прізвища яких починаються на літери Бо.
  3. Знайти кількість учнів, які проживають по вулицях Петлюри та Садова.
  4. Вивести прізвища учнів, які проживають у будинках  та квартирах з парними номерами

Д/з №2 (виконати ті завдання, що не встигли на уроці)
Знайти
  1. Середнє арифметичне значення оцінок кожного учня.
  2. Максимальну оцінку кожного учня.
  3. Середнє арифметичне оцінок по кожному предмету.
  4. Максимальну оцінку по кожному предмету.
  5. Вивести прізвища та імена учнів, у яких всі оцінки не менші 10 балів.
  6. Вивести прізвища учнів, які мають оцінки не нижче 8 балів та прізвища яких починаються з літер Б або В.
  7. обчислити середній бал класу і вивести список учнів, які мають середній бал вищий  за середній бал класу;
  8. Вивести дані про учня, який найкраще вчиться.
  9. Вивести дані учня з імям Андрій, який найкраще вчиться.