SlideShare a Scribd company logo
1 of 87
Програмування на
       мові Паскаль
         Частина II
              Тема 1. Масиви


© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Масиви
Масив – це група однотипних елементів, які мають
 спільне ім’я і розміщені в пам’яті поряд.
Особливості:
  • всі елементи мають один тип
  • весь масив має одне ім’я
  • всі елементи розміщені в пам’яті поряд
Приклади:
  • список учнів в класі
  • квартири в будинку
  • школи в місті
  • дані про температуру повітря за рік
Масиви
                                                 НОМЕР
                                             елемента масиву
                                                (ІНДЕКС)
 A   масив
      1       2        33         4          5
      5       10       15
                       15        20        25


     A[1]    A[2]    A[3]   A[4]
                     ЗНАЧЕННЯ             A[5]
                    елемента масиву

                                 НОМЕР (ІНДЕКС)
                                 елемента масиву: 2

          A[2]
                                      ЗНАЧЕННЯ
                                  елемента масиву: 10
Оголошення масивів
Для чого оголошувати?
  • визначити ім’я масиву
  • визначити тип масиву
  • визначити кількість елементів
  • виділити місце в пам’яті
Масив цілих чисел:
                     початковий     кінцевий      тип
        ім’я           індекс         індекс   елементів

     var A : array[ 1 .. 5 ] of integer ;
Розмір через константу:
      const N=5;
     var A: array[1.. N ] of integer;
Оголошення масивів
Масиви інших типів:
   var X, Y: array [1..10] of real;
       C: array [1..20] of char;
Інший діапазон індексів:
   var Q: array [0..9] of real;
       C: array [-5..13] of char;
Індекси інших типів:
   var A: array ['A'..'Z'] of real;
         B: array [False..True] of integer;
   ...
       A['C'] := 3.14259*A['B'];
       B[False] := B[False] + 1;
Що неправильно?
var a: array[10..1] of integer;
            [1..10]
...
  A[5] := 4.5;

var a: array ['a'..'z'] of integer;
             ['z'..'a']
...
  A['b'] := 15;
  A['B']

var a: array [0..9] of integer;
...
  A[10] := 'X';
Масиви
Оголошення:
   const N = 5;
   var a: array[1..N] of integer;
       i: integer;
Введення з клавіатури:         a[1] =   5
   for i:=1 to N do begin
     write('a[', i, ']=');
                               a[2] =
                               a[3] =
                                        12
                                        34
                                               ?      Чому
     read ( a[i] );
                                                      write?
                               a[4] =   56
   end;                        a[5] =   13
Поелементні операції:
   for i:=1 to N do a[i]:=a[i]*2;

Виведення на екран:
   writeln('Масив A:');       Масив A:
   for i:=1 to N do             10 24        68 112    26
     write(a[i]:4);
Завдання
"4": Ввести з клавіатури масив з 5 елементів, знайти
      середнє арифметичне всіх елементів масиву.
      Приклад:
       Введіть п’ять чисел:
       4   15   3 10     14
       середнє арифметичне 9.200
"5": Ввести з клавіатури масив з 5 елементів, знайти
      мінімальний з них.
      Приклад:
       Введіть п’ять чисел:
       4   15    3    10     14
       мінімальний елемент 3



  !   При зміні N решта програми не повинна змінюватися!
Програмування на
       мові Паскаль
                 Частина II
       Тема 2. Максимальний
               елемент масиву
© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Максимальний елемент
Задача: знайти в масиві максимальний елемент.
Алгоритм:




Псевдокод:
  { вважаємо, що перший елемент – максимальний }
  for i:=2 to N do
    if a[i] > { максимального } then
      { запам’ятати новий максимальний елемент a[i] }


                             ?   Чому цикл від i=2?
Максимальний елемент
Додатково: як знайти номер максимального елемента?
max := a[1]; { вважаємо, що перший – максимальний }
iMax := 1;
for i:=2 to N do     { перевіряємо всі решта }
  if a[i] > a[iMax] then { знайшли новий максимальний }
            max
  begin
    max := a[i];         { запам’ятати a[i] }
    iMax := i;           { запам’ятати i }


                                   ?
  end;
                                       Як спростити?


По номеру елемента iMax завжди можна знайти його значення
a[iMax]. Тому всюди замінюємо max на a[iMax] і забираємо
змінну max.
Програма
program qq;
const N = 5;
var a: array [1..N] of integer;
    i, iMax: integer;
begin
  writeln(‘Вихідний масив:');          випадкові числа в
  for i:=1 to N do begin               інтервалі [50,150)
    a[i] := random(100) + 50;
                                             пошук
    write(a[i]:4);
                                         максимального
  end;
  iMax := 1; { вважаємо, що перший – максимальний }
  for i:=2 to N do     { перевіряємо всі решта }
    if a[i] > a[iMax] then { новий максимальний }
       iMax := i;          { запам’ятати i }
  writeln; {перейти на новий рядок}
  writeln('Максимальний елемент a[', iMax, ']=', a[iMax]);
end;
Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
     інтервалу [-10..10] і знайти в ньому максимальний і
     мінімальний елементи та їх номери.
     Приклад:
       Вихідний масив:
       4   -5     3 10 -4 -6 8 -10 1 0
       максимальний a[4]=10
       мінімальний a[8]=-10
"5": Заповнити масив з 10 елементів випадковими числами з
     інтервалу [-10..10] і знайти в ньому два максимальних
     елементи та їх номери.
     Пример:
      Вихідний масив:
      4   -5   3 10 -4 -6 8 -10                1   0
      максимальний a[4]=10, a[7]=8
Програмування на
       мові Паскаль
                 Частина II
          Тема 3. Опрацювання
                 масивів
© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Інверсія масиву
Задача: переставити елементи масиву в зворотному
 порядку.
    1   2   …   N-1   N     1   2   …   N-1   N

    3 5 … 9 7               7 9 … 5 3


                            сума індексів N+1
Алгоритм:
   поміняти місцями A[1] і A[N], A[2] і A[N-1], …
Псевдокод:
  for i:=1 to N do 2 do
                 N div
    { поміняти місцями A[i] і A[N+1-i] }

                                ?   Що неправильно?
Як переставити елементи?

Задача: поміняти місцями                 2
 вміст двох чашок.




                                     1




                                                 3
Задача: поміняти місцями вміст двох комірок пам’яті.
                                 x                   y
              c := x;            4
                                 6       2           6
                                                     4
  x := y;
              x := y;
  y := x;
              y := c;




                                                 3
                                     1
  ?   Чи можна обійтися без c?               ?
                                             4
                                             c
Програма
program qq;
const N = 10;
var A: array[1..N] of integer;
     i, c: integer;
begin
  { заповнити масив }
  { вивести вихідний масив }
  for i:=1 to N div 2 do begin
     c:=A[i]; A[i]:=A[N+1-i]; A[N+1-i]:=c;
  end;
  { вивести одержаний масив }
end;
Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
     інтервалу [-10..10] і виконати інверсію окремо для 1-ї і 2-ї
     половини масиву.
     Приклад:
       Вихідний масив:
       4   -5     3 10 -4 -6 8 -10 1 0
       Результат:
       -4 10      3 -5        4    0 1 -10 8 -6
"5": Заповнити масив з 12 елементів випадковими числами з
     інтервалу [-12..12] і виконати інверсію для кожної третини
     масиву.
     Приклад:
      Вихідний масив:
      4   -5   3 10   -4          -6     8 -10    1   0    5   7
      Результат:
      10   3 -5    4 -10            8   -6   -4   7   5    0   1
Циклічний зсув
Задача: зсунути елементи масиву на 1 комірку, перший
 елемент стає на місце останнього.
               1   2   3   4   …   N-1   N

               3 5 8 1 … 9 7

               5 8 1 … 9 7 3


Алгоритм:
  A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];
Цикл:               чому не N?

   for i:=1 to N-1 do
      A[i]:=A[i+1];                 ?
                               Що неправильно?
Програма
program qq;
const N = 10;
var A: array[1..N] of integer;
     i, c: integer;
begin
  { заповнити масив }
  { вивести вихідний масив }
  c := A[1];
  for i:=1 to N-1 do A[i]:=A[i+1];
  A[N] := c;
  { вивести одержаний масив }
end;
Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
     інтервалу [-10..10] і виконати циклічний зсув ВПРАВО.
     Приклад:
       Вихідний масив:
       4   -5     3 10 -4 -6 8 -10 1 0
       Результат:
       0    4    -5      3 10 -4 -6 8 -10 1
"5": Заповнити масив з 12 елементів випадковими числами з
     інтервалу [-12..12] і виконати циклічний зсув ВПРАВО на 4
     елементи.
     Приклад:
      Вихідний масив:
      4   -5   3 10 -4         -6    8 -10    1   0   5   7
      Результат:
      -4 -6    8 -10  1         0    5    7   4 -5    3   10
Програмування на
       мові Паскаль
                 Частина II
     Тема 4. Сортування масивів

© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Сортування
Сортування – це розстановка елементів масиву в
 заданому порядку ( по зростанню, спаданню, останній
 цифрі, сумі дільників, …).
Задача: переставити елементи масиву в порядку
 зростання.
                         складність O(N2)
Алгоритми:
  • прості і зрозумілі, проте неефективні для переважної більшості
    масивів
      метод бульбашки           складність O(N·logN)
      метод вибору
                                             час             O(N2)
  • складні, проте ефективні
      “швидке сортування" (Quick Sort)
                                                     O(N·logN)
      сортування “купою" (Heap Sort)
      сортування злиттям
      пірамідальне сортування                                       N
Метод бульбашки
Ідея – бульбашка повітря в стакані води піднімається з дна вверх.
Для масивів – самий маленький ("легкий") елемент переміщується
 вверх ("спливає").
1-ий прохід
                                   • починаємо знизу, порівнюємо два
   5          5    5       1         сусідніх елементи; вони стоять
                                     “неправильно”, міняємо їх місцями
   2          2    1       5
   1          1    2       2       • за 1 прохід по масиву один елемент
                                     (самий маленький) стає на своє
   3          3    3       3
                                     місце
2-ий прохід                3-ій прохід

   1          1    1           1         1    Для сортування масиву з N
    5                          2         2    елементів потрібен
              5    2
                                              N-1 прохід (достатньо
    2         2    5           5         3    поставить на свої місця
    3         3    3           3         5    N-1 елемент).
Програма
1-ий прохід:    порівнюються пари
  1     5         A[N-1] і A[N],    A[N-2] і A[N-1]   A[j] і A[j+1]
                  …
  2     2         A[1] і A[2]
  …     …
                  for j:=N-1 downto 1 do
 N-1    6           if A[j] > A[j+1] then begin
  N     3             c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c;
                    end;

2-ий прохід
   1    1
                  !   A[1] вже на своєму місці!

   2    5                            2
                  for j:=N-1 downto 2 do
  …     …           if A[j] > A[j+1] then begin
                      c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c;
  N-1   3
                    end;
  N     6

  i-ий прохід     for j:=N-1 downto   i do
                                      i
                    ...
Програма
program qq;
const N = 10;
var A: array[1..N] of integer;
     i, j, c: integer;
begin
  { заповнити масив }
                        ?    Чому цикл по i до N-1?
  { вивести вихідний масив }       елементи вище A[i]
  for i:=1 to N-1 do begin            вже поставлені
     for j:=N-1 downto i do
       if A[j] > A[j+1] then begin
         с := A[j];
         A[j] := A[j+1];
         A[j+1] := с;
       end;
   end;
  { вивести одержаний масив }
end;
Метод бульбашки з прапором
Ідея – якщо при виконанні методу бульбашки не          2   1
  було обмінів, масив вже посортований і решта         1   2
  проходів не потрібні.                                4   3
Реалізація: змінна-прапор, показує, був чи ні обмін;   3   4
  якщо вона дорівнює False, то вихід.

 repeat                           var flag: boolean;
   flag := False; { скинути прапор }
   for j:=N-1 downto 1 do
     if A[j] > A[j+1] then begin
        с := A[j];
                                          ?
                                        Як покращити?
        A[j] := A[j+1];
        A[j+1] := с;
       flag := True; { підняти прапор }
     end;
 until not flag; { вихід при flag=False }
Метод бульбашки з прапором

i := 0;
repeat
  i := i + 1;
  flag := False; { скинути прапор }
                    i
  for j:=N-1 downto 1 do
    if A[j] > A[j+1] then begin
      с := A[j];
      A[j] := A[j+1];
      A[j+1] := с;
      flag := True; { підняти прапор }
    end;
until not flag; { вихід при flag=False }
Метод вибору
Ідея:
  • знайти мінімальний елемент і поставити на місце
    першого (помінять місцями з A[1])
  • із решти знайти мінімальний елемент і поставити на
    друге місце (поміняти місцями з A[2]), і т.д.



          4           1            1          1
          3           3            2          2
          1           4            4          4
          2           2            3          3
Метод вибору
                        потрібен N-1 прохід

for i := 1 to N-1 do begin
                                 пошук мінімального
  nMin = i ;                      від A[i] до A[N]
  for j:= i+1 to N do
    if A[j] < A[nMin] then nMin:=j;
  if nMin <> i then begin
    c:=A[i];                     якщо потрібно,
                                переставляємо
    A[i]:=A[nMin];
    A[nMin]:=c;
  end;              ?Чи можна забрати if?
end;
Завдання
"4": Заповнити масив з 10 елементів випадковими числами з
     інтервалу [0..100] і відсортувати його за останньою цифрою.
     Приклад:
       Вихідний масив:
       14 25 13 30 76 58 32 11 41 97
       Результат:
       30 11 41 32 13 14 25 76 97 58
"5": Заповнити масив з 10 елементів випадковими числами з
     інтервалу [0..100] і відсортувати першу половину по
     зростанню, а другу – по спаданню.
     Приклад:
      Вихідний масив:
      14 25 13 30 76           58   32   11   41   97
      Результат:
      13 14 25 30 76           97   58   41   32   11
Програмування на
       мові Паскаль
                 Частина II
         Тема 5. Пошук в масиві

© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Пошук в масиві

Задача – знайти в масиві елемент, рівний X, або
 встановити, що його немає.
Розв’язання: для довільного масиву: лінійний пошук
 (перебір)
     недостаток: низька швидкість
Як спростити? – завчасно підготувати масив для
 пошуку
  • як саме підготувати?
  • як використовувати “підготовлений масив"?
Лінійний пошук
                                        nX – номер потрібного
                                          елемента в масиві
  nX := 0; { поки не   знайшли ...}
  for i:=1 to N do {   цикл по всіх елементах }
    if A[i] = X then   { якщо знайшли, то ... }
       nX := i;        { ... запам’ятати номер}
  if nX < 1 then writeln('Не нашли...')
  else           writeln('A[', nX, ']=', X);
Покращення: після того, як знайшли X,
 виходимо з циклу.                      ?    Що погано?

nX := 0;                       nX := 0; i := 1;
for i:=1 to N do               while i <= N do begin
 if A[i] = X then begin          if A[i] = X then begin
   nX := i;                         nX := i; i := N;
   break; {вихід з циклу}        end;
 end;                            i := i + 1;
                               end;
Двійковий пошук
                                        1          1          1
                             X=7
                                        2          2          2
                                        3          3          3
                                        4          4          4
                                             X>4
                                        5          5          5
                                        6          6    X>6   6
                                        7          7          7
                                  X<8   8          8          8
                                        9          9          9
                                        10         10         10
 •   Вибрати середній елемент A[c] і    11         11         11
     порівняти з X.
                                        12         12         12
 •   Якщо X = A[c], знайшли (вихід).
 •                                      13         13         13
     Якщо X < A[c], шукати дальше в
     першій половині.                   14         14         14
 •   Якщо X > A[c], шукати дальше в     15         15         15
     другій половині.                   16         16         16
Двійковий пошук

        1         L       c       R              N
 nX := 0;
 L := 1; R := N; {межі: шукаємо від A[1] до A[N] }
 while R >= L do begin
                                          номер середнього
   c := (R + L) div 2;
                                              елемента
   if X = A[c] then begin
      nX := c;
                                 знайшли
      R := L - 1; { break; }             вийти з
   end;                                   циклу
   if x < A[c] then R := c - 1;
   if x > A[c] then L := c + 1;              зсуваємо
 end;                                           межі
 if nX < 1 then writeln(‘Не знайшли...')
 else           writeln('A[', nX, ']=', X);


  ?   Чому не можна while R > L do begin … end; ?
Порівняння методів пошуку

               Лінійний            Двійковий
підготовка         ні            відсортувати
                      кількість кроків
   N=2            2                  2

   N = 16         16                 5

  N = 1024       1024                11

 N= 1048576    1048576               21

     N           ≤N              ≤ log2N+1
Завдання
"4": Написати програму, яка сортує масив ПО
    СПАДАННЮ і шукає в ньому елемент, рівний X (це
    число вводиться з клавіатури). Використати
    двійковий пошук.


"5": Написати програму, яка рахує середню кількість
    кроків в двійковому пошуку для масиву з 32
    елементів з інтервалу [0,100]. Для пошуку
    використати 1000 випадкових чисел в цьому ж
    інтервалі.
Програмування на
       мові Паскаль
                 Частина II
        Тема 6. Символьні рядки

© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Чим поганий масив символів?
Це масив символів:
 var B: array[1..N] of char;
• кожен символ – окремий об’єкт;
• масив має довжину N, яка задана при
  оголошенні
Що потрібно:
 • опрацьовувати послідовність символів як єдине
   ціле
 • рядок повинен мати змінну довжину
Символьні рядки
var s: string;                           !   В Delphi це
                                             обмеження знято!
довжина рядка      s[3]       s[4]
      1                                                         255
 6    П р и в             і    т     !   ¤ ¤ ¤ … ¤ ¤ ¤
             робоча частина

     s[1]
            s[2]
                                     1                          20
 var s: string[20];
 Довжина рядка:
                                         var i: integer;
     n := length ( s );
Символьні рядки
Задача: ввести рядок з клавіатури і замінити всі букви "а"
 на букви "б".
 program qq;
 var s: string;           введення рядка
      i: integer;
 begin
                                    довжина рядка
    writeln(‘Введіть рядок');
    readln(s);
    for i:=1 to Length(s) do
        if s[i] = 'а' then s[i] := 'б';
    writeln(s);
 end.                 виведення рядка
Завдання
"4": Ввести символьний рядок і замінити всі букви "а" на букви "б" і
      навпаки, як великі, так і маленькі.
      Приклад:
       Ввести рядок:
       ааббссААББСС
       Результат:
       ббаассББААСС
"5": Ввести символьний рядок і перевірити, чи є він паліндромом
      (паліндром читається однаково в обох напрямках).
      Приклад:                        Приклад:
       Введіть рядок:                  Введіть рядок:
       АБВГДЕ                          КОРОК
       Результат:                      Результат:
       Не паліндром.                   Паліндром.
Операції з рядками
 var s, s1, s2: string;
Запис нового значення:
 s := 'Вася';
Об’єднання: додати один рядок в кінець другого.
 s1 := 'Привіт';
 s2 := 'Вася';
 s := s1 + ', ' + s2 + '!';            'Привіт, Вася!'
Підрядок: повернути частину рядка з іншого рядка.
                      з 3-го символу
  s := '123456789';
                              6 штук
  s1 := Copy ( s, 3, 6 );                   '345678'
  s2 := Copy ( s1, 2, 3 );
                                            '456'
Знищення і вставка
Знищення частини рядка:
                                  6 штук
  s := '123456789';                        '123456789'
  Delete ( s, 3, 6 );                      '129'
     рядок
   міняється!    з 3-го символу

Вставка в рядок:         починаючи з 3-го символу
  s := '123456789';
  Insert ( 'ABC', s, 3 );                  '12ABC3456789'
                       куди
        що          вставляєм
    вставляємо           о

  Insert ( 'Q', s, 5 );                    '12ABQC3456789'
Пошук в рядку
Пошук в рядку:       s[3]
                                       var n: integer;
   s := ‘Тут був Вася.';
   n := Pos ( ‘у', s );
                                      3
   if n > 0 then
        writeln(‘Буква у - це s[', n, ']')
   else writeln(‘Не знайшли'); n = 11
   n := Pos ( 'Вася', s );
   s1 := Copy ( s, n, 4 );

Особливості:
  • функція повертає номер символу, з якого
    починається зразок в рядку
  • якщо слова немає, повертається 0
  • пошук з початку (знаходиться перше слово)
Приклади

s := 'Вася Петя Мітя';
n := Pos ( 'Петя', s );    6
Delete ( s, n, 4 );        'Вася Мiтя'
Insert ( ‘Катя', s, n );   'Вася Катя Мiтя'

s := 'Вася Петя Мітя';
n := length ( s );         14
s1 := Copy ( s, 1, 4 );    'Вася'
s2 := Copy ( s, 11, 4 );   'Мітя'
s3 := Copy ( s, 6, 4 );    'Петя'
s := s3 + s1 + s2;         'ПетяВасяМітя'
n := length ( s );          12
Приклад розв’язання задачі
Задача: Ввести ім’я, по батькові і прізвище. Перетворити їх до
    формату “прізвище-ініціали".
    Приклад:
      Введіть ім’я, по батькові і прізвище:
      Василь Алібабаєвич Хрюндіков
      Результат:
      Хрюндіков В.А.

Алгоритм:
 • знайти перший пропуск і виділити ім’я
 • знищити ім’я з пропуском із основного рядка
 • знайти перший пропуск і виділити по батькові
 • знищити по батькові з пропуском із основного рядка
 • “склеїти" прізвище, перші букви імені і фамілії, крапки,
   пропуски…
Програма
program qq;
var s, name, otch: string;
     n: integer;
begin
   writeln(‘Введіть ім’я, по батькові і прізвище');
   readln(s);
   n := Pos(' ', s);
   name := Copy(s, 1, n-1); { вирізати ім’я }
   Delete(s, 1, n);
   n := Pos(' ', s);
   otch := Copy(s, 1, n-1); { вирізати по батькові }
   Delete(s, 1, n);         { залишилось прізвище }
   s := s + ' ' + name[1] + '.' + otch[1] + '.';
   writeln(s);
end.
Завдання
"4": Ввести ім’я файлу (можливо, без розширення) і змінити його
      розширення на ".exe".
      Приклад:
       Ввести ім’я файлу:          Ввести ім’я файлу:
       qqq                         qqq.com
       Результат:                  Результат:
       qqq.exe                     qqq.exe
"5": Ввести шлях до файлу і "розібрати" його, виводячи кожну вкладену
      папку з нового рядка
      Приклад:
       Ввести шлях до файлу:
       C:Мої документи10-БВасяqq.exe
       Результат:
       C:
       Мої документи
       10-Б
        Вася
        qq.exe
Програмування на
       мові Паскаль
                 Частина II
    Тема 7. Рекурсивний перебір

© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Рекурсивний перебір
Задача: Алфавіт мови племені "тумба-юмба" складається з
    букв И, Ц, Щ і О. Вивести на екран всі слова із К букв, які
    можна скласти в цій мові, і підрахувати їх кількість. Число
    K вводиться з клавіатури.

                в кожній комірці може бути будь-яка з 4-х букв
                 1                             K




        4 варіанти
                4 варіанти
                             4 варіанти            4 варіанти

Кількість варіантів:

             N = 4 ⋅ 4 ⋅ 4 ⋅ ⋅ 4 = 4      K
Рекурсивний перебір
Рекурсія: Розв’язання задачі для слів з К букв зводиться до 4-х
     задач для слів з K-1 букви.
                                              перебираємо
             1                         K       всі варіанти

            И                                 перебираємо
             1                         K       всі варіанти

            Ц                                 перебираємо
             1                         K       всі варіанти

            Щ                                перебираємо
             1                         K      всі варіанти

            О
Процедура
     1           p   p+1       K

s    ● ● ● ?         ?     ?   ?       Глобальні змінні:
                                        var s: string;
    procedure Rec(p: integer);              count, K:
    begin                              integer;
      if p > K then begin
         writeln(s);                   закінчення рекурсії
         count := count+1;
      end
                                         рекурсивні виклики
      else begin
         s[p]:='Ы'; Rec ( p+1 );
         s[p]:='Ц'; Rec ( p+1 );
         s[p]:='Щ'; Rec ( p+1 );
         s[p]:='О'; Rec ( p+1 );
      end;

                                   ?
    end;
                                        А якщо букв багато?
Процедура

 procedure Rec(p: integer);       всі букви
 const letters = 'ЫЦЩО';
                   ‘ИЦЩО';
 var i: integer;
 begin                  локальна змінна
   if p > k then begin
       writeln(s);
       count := count+1;
                              цикл по всіх буквах
   end
   else begin
      for i:=1 to length(letters) do begin
         s[p] := letters[i];
         Rec(p+1);
      end;
   end;
 end;
Програма
program qq;
var s: string;               глобальні змінні
    K, i, count: integer;
    procedure Rec(p: integer);     процедура
    ...
    end;
begin
  writeln(‘Введіть довжину слова:');
                                   рядок з K пропусків
  read ( K );
  s := '';
  s := '';
  for i:=1 to K do s := s + ' ';
  for i:=1 to K do s := s + ' ';
  count := 0;
  Rec ( 1 );
  writeln(‘Всього ', count, ' слів');
end.
Завдання
Алфавіт мови племені "тумба-юмба" складається з букв И, Ц, Щ
і О. Число K вводиться з клавіатури.


"4": Вивести на екран всі слова з К букв, в яких буква И
      зустрічається більше 1 разу, і підрахувати їх кількість.
"5": Вивести на екран всі слова з К букв, в яких є однакові
      букви, що стоять поряд (наприклад, ИЩЩО), і підрахувати
      їх кількість.
Програмування на
       мові Паскаль
                 Частина II
               Тема 8. Матриці

© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Матриці
Задача: запам’ятати розміщення фігур на шаховій дошці.


                 1           2           3       4               5               6
        a   b    c   d   e   f   g   h               1   2   3       4   5   6       7   8
    8                                        8       0   0   0       0   2   0       0   0

    7                                        7       0   0   0       0   0   0       0   0

    6                                        6       0   0   3       0   0   0       0   0

    5                                        5       0   0   0       0   0   0       0   0

    4       c6                               4       0   A[6,3]
                                                         0 0         0   0   0       4   0

    3                                        3       0   0   0       0   0   0       0   0

    2                                        2       0   0   0       0   0   0       0   0

    1                                        1       0   0   0       0   0   0       0   0
Матриці
Матриця – це прямокутна таблиця чисел.
Матриця – це масив, в якому кожний елемент має два індекси
       (номер рядка і номер стовпця).

                                  стовбець 3
             A       1   2    3      4    5
                 1   1   4    7      3    6    рядок 2
                 2   2   -5   0     15 10
                 3   8   9    11 12 20


                               комірка A[3,4]
Матриці
Оголошення:
  const N = 3;
        M = 4;
  var A: array[1..N,1..M] of integer;
      B: array[-3..0,-8..M] of integer;
      Q: array['a'..'d',False..True] of real;

Введення з клавіатури:   ?   Якщо переставити цикли?
 for i:=1 to N do
     j:=1    M                         i    j
   for j:=1 to M do begin
        i:=1   N                      A[1,1]=   25
     write('A[',i,',',j,']=');        A[1,2]=   14
     read ( A[i,j] );                 A[1,3]=   14
   end;                                  ...
                                      A[3,4]=   54
Матриці
Заповнення випадковими числами

 for i:=1 to N do            ?
                            цикл по рядках
                                 Який інтервал?
                              цикл по стовпцях
   for j:=1 to M do
     A[i,j] := random(25) - 10;

Вывод на экран            виведення рядка
 for i:=1 to N do begin
   for j:=1 to M do                12 25    1 13
     write ( A[i,j]:5 );          156   1 12 447
   writeln;
 end;                               1 456 222 23
                   в тому ж рядку


                    ?
    перейти на
    новий рядок
                        Якщо переставити цикли?
Опрацювання всіх елементів матриці
Задача: заповнити матрицю з 3 рядків і 4 стовпців випадковими
         числами і вивести її на екран. Знайти суму елементів
         матриці.
 program qq;
 const N = 3; M = 4;
 var A: array[1..N,1..M] of integer;
      i, j, S: integer;
 begin
   ... { заповнення матриці і виведення на екран}
   S := 0;
   for i:=1 to N do
      for j:=1 to M do
        S := S + A[i,j];
   writeln(‘Сума елементів матриці ', S);
 end;
Завдання
Заповнити матрицю з 8 рядків і 5 стовпців випадковими
числами з інтервалу [-10,10] і вивести її на екран.

"4": Знайти мінімальний і максимальний елемент в матриці і їх
      номера. Формат виведення:
       Мінімальний елемент         A[3,4]=-6
       Максимальний елемент A[2,2]=10
"5": Вивести на екран рядок, сума елементів якого
      максимальна. Формат виведення:
       Рядок 2:    3   5   8   9   8
Операції з матрицями
Задача 1. Вивести на екран головну діагональ квадратної
        матриці з N рядків і N стовпців.
        A[1,1]
          A[2,2]
             A[3,3]          for i:=1 to N do
                               write ( A[i,i]:5 );
                  A[N,N]


Задача 2. Вивести на екран другу діагональ.

                   A[1,N]      сума номерів рядка в стовпця N+1
                 A[2,N-1]    for i:=1 to N do
                               write ( A[i, N+1-i ]:5 );
          A[N-1,2]
        A[N,1]
Операції з матрицями
Задача 3. Знайти суму елементів, які стоять на головній
        діагоналі і нижче її.

                ?    Одиночний цикл чи вкладений?

                  рядок 1: A[1,1]
                  рядок 2: A[2,1]+A[2,2]
                  ...
                  рядок N: A[N,1]+A[N,2]+...+A[N,N]

                                   цикл по всіх рядках
    S := 0;
    for i:= 1 to N do                    додаємо потрібні
      for j:= 1 to i do                  елементи рядка i
        S := S + A[i,j];
Операції з матрицями
Задача 4. Перестановка рядків або стовпців. В матриці з N
        рядків і M стовпців переставити 2-й і 4-й рядок.
              j        A[2,j]
                                for j:=1 to M do begin
  2   1   2   5   2    1          c := A[2,j];
                                  A[2,j] := A[4,j];
  4   7   3   1   3    7          A[4,j] := c;
                                end;
                      A[4,j]

Задача 5. До третього стовпця додати шостий.
          for i:=1 to N do
            A[i,3] := A[i,3] + A[i,6];
Завдання
Заповнити матрицю з 7 рядків і 7 стовпців випадковими
числами з інтервалу [-10,10] і вивести її на екран. Обнулити
елементи, відмічені зеленим фоном, і вивести одержану
матрицю на екран.

"4":                         "5":
Програмування на
       мові Паскаль
                 Частина II
                Тема 9. Файли

© К.Ю. Поляков, 2006-2007
Переклад: Р. М. Васильчик
Файли
Файл – це область на диску, яка має ім’я.

                                Файли


        Текстові                   Двійкові                 Папки
тільки текст без оформлення,    може містити будь-які
                                                          (каталоги)
не містить керівних символів (з символи кодової таблиці
кодами < 32)
                                *.doc, *.exe,
ACSII (1 байт на символ)
UNICODE (2 байта на символ) *.bmp, *.jpg,
 *.txt, *.log,                 *.wav, *.mp3,
 *.htm, *.html                 *.avi, *.mpg
Принцип сендвіча                                  Змінна типу
                                               «текстовий файл":
                                               var f: text;
                    I етап. відкрити файл :
                        • зв’язати змінну f з файлом
                              assign(f, 'qq.dat');

                        •     відкрити файл (зробити його
                              активним, приготувати до роботи)
                              reset(f); {для читання}

                              rewrite(f); {для запису}
      II етап: робота з файлом
         read ( f, n );         { ввести значення n }

         write ( f, n ); { записати значення n }
         writeln ( f, n );{з переходом на новий рядок}
     III етап: закрити файл
         close(f);
Робота з файлами
Особливості:
 • ім’я файлу згадується тільки в команді assign,
   звернення до файлу іде через файлову змінну
 • файл, який відкривається для читання, повинен
   існувати
 • якщо файл, який відкривається на запис, існує, то
   старий вміст знищується
 • дані записуються в файл у текстовому вигляді
 • при завершенні програми всі файли закриваються
   автоматично
 • після закриття файлу змінну f можна
   використовувати ще раз для роботи з іншим файлом
Послідовний доступ
• при відкритті файлу курсор встановлюється в початок
    assign ( f, 'qq.dat' );
    reset ( f );                           кінець файлу
                                         (end of file, EOF)

       12      5        45          67            56●

• читання виконується з тієї позиції, де стоїть курсор
• після читання курсор зміщується на перший непрочитаний
  символ
     read ( f, x );


        12     5        45           67            56●
Послідовний доступ
• читання до кінця рядка
    readln ( f, x );
                                    кінець рядка
                                  (end of line, EOL)

      12      5     45¤    36   67¤        56●


• як повернутися назад?
    close ( f );
    reset ( f ); { почати з початку }
Приклад
Задача: в файлі input.txt записані числа (в стовпчик), скільки
  їх – невідомо. Записати в файл output.txt їх суму.



Алгоритм:
              ?    Чи можна обійтися без масиву?

    • Відкрити файл input.txt для читання.
    • S := 0;
   •   Якщо чисел не залишилося, перейти до кроку 7.
   •   Прочитати наступне число в змінну x.
   •   S := S + x;
   •   Перейти до кроку 3.                  цикл з умовою
                                             «поки є дані"
   •   Закрити файл input.txt.
   •   Відкрити файл output.txt для запису.
   •   Записати в файл значення S.
   •   Закрити файл output.txt.
Програма
program qq;
var s, x: integer;
     f: text;
begin
                                   логічна функція,
                                 повертає True, якщо
   assign(f, 'input.txt');
                               досягнуто кінець файлу
   reset(f);
   s := 0;
   while not eof(f) do begin
       readln(f, x);
       s := s + x;
                                     запис результату у
   end;                              файл output.txt
   close(f);
   assign(f, 'output.txt');
   rewrite(f);
   writeln(f, 'Сума чисел ', s);
   close(f);
end.
Завдання
В файлі input.txt записані числа, скільки їх –
невідомо.
"4": Знайти середнє арифметичне всіх чисел і
      записати його в файл output.txt.
"5": Знайти мінімальне і максимальне число і
      записати їх в файл output.txt.
Опрацювання масивів
Задача: в файлі input.txt записані числа (в стовпчик), скільки
  їх – невідомо, але не більше 100. Переставити їх в порядку
  зростання і записати в файл output.txt.

          ?    Чи можна обійтися без масиву?

Проблеми:
   1. для сортування потрібно утримувати в пам’яті всі числа
      одночасно (масив);
   2. скільки чисел – невідомо.
Розв’язання:
    • виділяємо в пам’яті масив з 100 елементів;
    • записуємо прочитані числа в масив і рахуємо їх в змінній N;
    •   сортуємо перші N елементів масиву;
    •   записуємо їх в файл.
Читання даних в масив
Глобальні змінні:
   var A: array[1..100] of integer;
       f: text;
 Функція: вводить масив, повертає кількість елементів
    function ReadArray: integer;
                                      цикл закінчується, якщо
    var i: integer;
                                      досягнутий кінець файлу
    begin
                                     або прочитано 100 чисел
      assign(f, 'input.txt');
      reset(f);
      i := 0;
      while (not eof(f)) and (i < 100) do begin
         i := i + 1;
         readln(f, A[i]);
      end;
      close(f);
      ReadArray := i;
    end;
Програма
program qq;
var A: array[1..100] of integer;
    f: text;
    N: integer;
    function ReadArray: integer;
    ...
    end;
Begin
   N := ReadArray;
   ... { сортування перших N елементів }
   assign(f, 'output.dat');        вивід відсортованого
   rewrite(f);                        масиву у файл
   for i:=1 to N do
     writeln(f, A[i]);
   close(f);
end.
Завдання
В файлі input.txt записані числа (в стовпчик),
відомо, що їх не більше 100.
"4": Відсортувати масив по спаданню останньої
      цифри і записати його в файл output.txt.
"5": Відсортувати масив по зростанню суми цифр і
      записати його в файл output.txt.
Опрацювання текстових даних
Задача: в файлі input.txt записані рядки, в яких є слово-
 паразит "коротше". Очистити текст від мусора і записати в файл
 output.txt.
Файл input.txt :
    Мама, коротше, мила, коротше, раму.
    Декан, коротше, пропив, коротше, бутан.
    А роза, коротше, упала на лапу, коротше, Азора.
    Кожний, коротше, мисливець бажає, коротше, знати,
      де ...

Результат - файл output.txt :
    Мама мила раму.
    Декан пропив бутан.
    А роза упала на лапу Азора.
    Кожний мисливець бажає знати, де сидить фазан.
Обробка текстових даних
                                     поки не закінчилися дані
Алгоритм:
   • Прочитати рядок з файлу (readln).
   • Знищити всі слова ", коротше," (Pos, Delete).
   • Перейти до кроку 1.

Опрацювання рядка s:
                                шукати ", коротше,"
   repeat
                                     знищити 9 символів
     i := Pos(', коротше,', s);
     if i <> 0 then Delete(s, i, 9);
   until i = 0;

Особливості:
   потрібно одночасно тримати відкритими два файли (один
   в режимі читання, другий – в режимі запису).
Робота з файлами

program qq;
var s: string;           файлові змінні
    i: integer;
    fIn, fOut: text;            відкрити файл для читання
begin
  assign(fIn, 'instr.txt');
  reset(fIn);                            відкрити файл
                                           для запису
  assign(fOut, 'outstr.txt');
  rewrite(fOut);
  ... { опрацювати файл }
  close(fIn);
  close(fOut);
end.
Повний цикл опрацювання файлів

                  поки не досягнутий кінець файла


  while not eof(fIn) do begin
    readln(fIn, s);             опрацювання рядка
   repeat
     i := Pos(', коротше,', s);
     if i <> 0 then
        Delete(s, i, 9);
   until i = 0;

    writeln(fOut, s);
  end;
                            запис "очищеного"
                                  рядка
Завдання
В файлі input.txt записані рядки, скільки їх –
невідомо.
"4": Замінити всі слова "коротше" на "в загальному" і
     записати результат у файл output.txt.
"5": Вивести в файл output.txt тільки ті рядки, в
      яких більше 5 слів (слова розділені одним
      пропуском).
Кінець фільму

More Related Content

What's hot

масиви презентация
масиви презентациямасиви презентация
масиви презентацияAnna Kalinichenko
 
Опрацювання одновимірних масивів
Опрацювання одновимірних масивівОпрацювання одновимірних масивів
Опрацювання одновимірних масивівinnaivy
 
квадратична функція 9 клас
квадратична функція 9 класквадратична функція 9 клас
квадратична функція 9 класvalia55
 
Завдання олімпіади
Завдання олімпіадиЗавдання олімпіади
Завдання олімпіадиoksana oksana
 
степенева функція
степенева функціястепенева функція
степенева функціяnatali7441
 
Визначений інтеграл та його геометричний зміст
Визначений інтеграл та його геометричний змістВизначений інтеграл та його геометричний зміст
Визначений інтеграл та його геометричний змістFormula.co.ua
 
Границя і неперервність функції
Границя і неперервність функціїГраниця і неперервність функції
Границя і неперервність функціїFormula.co.ua
 
похідна та її застосування
похідна та її застосуванняпохідна та її застосування
похідна та її застосуванняЮра Марчук
 
інтеграл та його застосування
інтеграл та його застосуванняінтеграл та його застосування
інтеграл та його застосуванняЮра Марчук
 
Урок ділова гра
Урок ділова граУрок ділова гра
Урок ділова граmetodist_selid
 
функція урок 1
функція   урок 1функція   урок 1
функція урок 1valia55
 
фкз лекція 9
фкз лекція 9фкз лекція 9
фкз лекція 9cit-cit
 

What's hot (20)

масиви презентация
масиви презентациямасиви презентация
масиви презентация
 
Опрацювання одновимірних масивів
Опрацювання одновимірних масивівОпрацювання одновимірних масивів
Опрацювання одновимірних масивів
 
квадратична функція 9 клас
квадратична функція 9 класквадратична функція 9 клас
квадратична функція 9 клас
 
урок 10
урок 10урок 10
урок 10
 
Завдання олімпіади
Завдання олімпіадиЗавдання олімпіади
Завдання олімпіади
 
степенева функція
степенева функціястепенева функція
степенева функція
 
урок 11
урок 11урок 11
урок 11
 
урок 3
урок 3урок 3
урок 3
 
Визначений інтеграл та його геометричний зміст
Визначений інтеграл та його геометричний змістВизначений інтеграл та його геометричний зміст
Визначений інтеграл та його геометричний зміст
 
урок 4
урок 4урок 4
урок 4
 
Первісна
ПервіснаПервісна
Первісна
 
Границя і неперервність функції
Границя і неперервність функціїГраниця і неперервність функції
Границя і неперервність функції
 
урок 2
урок 2урок 2
урок 2
 
похідна та її застосування
похідна та її застосуванняпохідна та її застосування
похідна та її застосування
 
інтеграл та його застосування
інтеграл та його застосуванняінтеграл та його застосування
інтеграл та його застосування
 
Функція
ФункціяФункція
Функція
 
Функции
ФункцииФункции
Функции
 
Урок ділова гра
Урок ділова граУрок ділова гра
Урок ділова гра
 
функція урок 1
функція   урок 1функція   урок 1
функція урок 1
 
фкз лекція 9
фкз лекція 9фкз лекція 9
фкз лекція 9
 

Similar to Pascal osnovu2

Масиви Структури даних (1).ppt
Масиви Структури даних (1).pptМасиви Структури даних (1).ppt
Масиви Структури даних (1).pptDarkUmaru
 
Учень, як вчений
Учень, як вченийУчень, як вчений
Учень, як вченийCveldulf
 
урок 1.Упорядковані множини. Перестановки
урок 1.Упорядковані множини. Перестановкиурок 1.Упорядковані множини. Перестановки
урок 1.Упорядковані множини. Перестановкивіта майданник
 
лекції 7
лекції 7лекції 7
лекції 7cit-cit
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascalAnn Eres
 
Konspekt uroky
Konspekt urokyKonspekt uroky
Konspekt urokyVasiliy66
 
8056 математика 5 клас
8056 математика 5 клас8056 математика 5 клас
8056 математика 5 класurvlan
 
Степінь з цілим показником
Степінь з цілим показникомСтепінь з цілим показником
Степінь з цілим показникомasdfghj7
 
програмування на мові паскаль
програмування на мові паскаль програмування на мові паскаль
програмування на мові паскаль Helen Pata
 
Урок 45. Складання циклічних алгоритмів опрацювання величин
Урок 45. Складання циклічних алгоритмів опрацювання величинУрок 45. Складання циклічних алгоритмів опрацювання величин
Урок 45. Складання циклічних алгоритмів опрацювання величинВасиль Тереховський
 
Pascal osnovu
Pascal osnovuPascal osnovu
Pascal osnovuEscuela
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal1cana1
 
зиза
зизазиза
зизаurvlan
 

Similar to Pascal osnovu2 (20)

Масиви Структури даних (1).ppt
Масиви Структури даних (1).pptМасиви Структури даних (1).ppt
Масиви Структури даних (1).ppt
 
Учень, як вчений
Учень, як вченийУчень, як вчений
Учень, як вчений
 
урок 1.Упорядковані множини. Перестановки
урок 1.Упорядковані множини. Перестановкиурок 1.Упорядковані множини. Перестановки
урок 1.Упорядковані множини. Перестановки
 
лекції 7
лекції 7лекції 7
лекції 7
 
масиви
масивимасиви
масиви
 
масиви
масивимасиви
масиви
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
 
Konspekt uroky
Konspekt urokyKonspekt uroky
Konspekt uroky
 
8056 математика 5 клас
8056 математика 5 клас8056 математика 5 клас
8056 математика 5 клас
 
Степінь з цілим показником
Степінь з цілим показникомСтепінь з цілим показником
Степінь з цілим показником
 
програмування на мові паскаль
програмування на мові паскаль програмування на мові паскаль
програмування на мові паскаль
 
Pascal основи програмування частина 1
Pascal основи програмування частина 1Pascal основи програмування частина 1
Pascal основи програмування частина 1
 
На допомогу учням.pdf
На допомогу учням.pdfНа допомогу учням.pdf
На допомогу учням.pdf
 
Урок 45. Складання циклічних алгоритмів опрацювання величин
Урок 45. Складання циклічних алгоритмів опрацювання величинУрок 45. Складання циклічних алгоритмів опрацювання величин
Урок 45. Складання циклічних алгоритмів опрацювання величин
 
Pascal osnovu
Pascal osnovuPascal osnovu
Pascal osnovu
 
Programuvanna na movi_pascal
Programuvanna na movi_pascalProgramuvanna na movi_pascal
Programuvanna na movi_pascal
 
зиза
зизазиза
зиза
 
5 ___
5  ___5  ___
5 ___
 
для
длядля
для
 
Div mod for_7kl
Div mod for_7klDiv mod for_7kl
Div mod for_7kl
 

More from Escuela

Фізика - ЗНО 2020 (пробне)
Фізика - ЗНО 2020 (пробне)Фізика - ЗНО 2020 (пробне)
Фізика - ЗНО 2020 (пробне)Escuela
 
Рух тіла під дією кількох сил
Рух тіла під дією кількох сил Рух тіла під дією кількох сил
Рух тіла під дією кількох сил Escuela
 
пIсок давно минувших днiв
пIсок давно минувших днiвпIсок давно минувших днiв
пIсок давно минувших днiвEscuela
 
майбутні цифрові технології
майбутні цифрові технологіїмайбутні цифрові технології
майбутні цифрові технологіїEscuela
 
ЗНО-2016
ЗНО-2016ЗНО-2016
ЗНО-2016Escuela
 
системи числення
системи численнясистеми числення
системи численняEscuela
 
Основи мови Ci
Основи мови CiОснови мови Ci
Основи мови CiEscuela
 
Iнтернет
IнтернетIнтернет
IнтернетEscuela
 
Comp net
Comp netComp net
Comp netEscuela
 
Information
InformationInformation
InformationEscuela
 
Kod infor
Kod inforKod infor
Kod inforEscuela
 
Gcompris
GcomprisGcompris
GcomprisEscuela
 
Power Point 2007
Power Point 2007Power Point 2007
Power Point 2007Escuela
 
бази даних
бази данихбази даних
бази данихEscuela
 
Світло і звук
Світло і звукСвітло і звук
Світло і звукEscuela
 

More from Escuela (20)

Фізика - ЗНО 2020 (пробне)
Фізика - ЗНО 2020 (пробне)Фізика - ЗНО 2020 (пробне)
Фізика - ЗНО 2020 (пробне)
 
Рух тіла під дією кількох сил
Рух тіла під дією кількох сил Рух тіла під дією кількох сил
Рух тіла під дією кількох сил
 
пIсок давно минувших днiв
пIсок давно минувших днiвпIсок давно минувших днiв
пIсок давно минувших днiв
 
майбутні цифрові технології
майбутні цифрові технологіїмайбутні цифрові технології
майбутні цифрові технології
 
ЗНО-2016
ЗНО-2016ЗНО-2016
ЗНО-2016
 
системи числення
системи численнясистеми числення
системи числення
 
Основи мови Ci
Основи мови CiОснови мови Ci
Основи мови Ci
 
Files
FilesFiles
Files
 
Iнтернет
IнтернетIнтернет
Iнтернет
 
Excel
ExcelExcel
Excel
 
Comp net
Comp netComp net
Comp net
 
Information
InformationInformation
Information
 
Lytva
LytvaLytva
Lytva
 
Kod infor
Kod inforKod infor
Kod infor
 
Gcompris
GcomprisGcompris
Gcompris
 
Web 2 0
Web 2 0Web 2 0
Web 2 0
 
Power Point 2007
Power Point 2007Power Point 2007
Power Point 2007
 
MKT
MKTMKT
MKT
 
бази даних
бази данихбази даних
бази даних
 
Світло і звук
Світло і звукСвітло і звук
Світло і звук
 

Recently uploaded

Критерії самоцінювання Іноземні мови.pdf
Критерії самоцінювання  Іноземні мови.pdfКритерії самоцінювання  Іноземні мови.pdf
Критерії самоцінювання Іноземні мови.pdfolha1koval
 
Автомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxАвтомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxvitalina6709
 
Kryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnenKryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnenolha1koval
 
Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»tetiana1958
 
критерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdfкритерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdfolha1koval
 
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptxПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptxAlexanderSholk
 
освітня програма 2023-2024 .
освітня програма  2023-2024                    .освітня програма  2023-2024                    .
освітня програма 2023-2024 .zaskalko111
 
Черкаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверейЧеркаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверейvitaliyinformatik
 
Луцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptxЛуцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptxhome
 
Роберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантастаРоберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантастаAdriana Himinets
 
Презентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptxПрезентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptxssuserc6cee7
 

Recently uploaded (15)

Критерії самоцінювання Іноземні мови.pdf
Критерії самоцінювання  Іноземні мови.pdfКритерії самоцінювання  Іноземні мови.pdf
Критерії самоцінювання Іноземні мови.pdf
 
Автомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptxАвтомат.звука с.інтегровані ігри для дітейpptx
Автомат.звука с.інтегровані ігри для дітейpptx
 
Kryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnenKryterii otciniuvannia navchalnykh dosiahnen
Kryterii otciniuvannia navchalnykh dosiahnen
 
Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»Відкрита лекція на тему «Біологічний захист рослин у теплицях»
Відкрита лекція на тему «Біологічний захист рослин у теплицях»
 
критерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdfкритерії сооцінювання і взаємооцінюваннятехнології.pdf
критерії сооцінювання і взаємооцінюваннятехнології.pdf
 
Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»
Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»
Віртуальна виставка «Аграрна наука України у виданнях: історичний аспект»
 
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptxПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
ПОРТУГАЛІЯ ТА ІСПАНІЯ В ПЕРШІЙ ТРЕТИНІ хх СТ.pptx
 
освітня програма 2023-2024 .
освітня програма  2023-2024                    .освітня програма  2023-2024                    .
освітня програма 2023-2024 .
 
Черкаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверейЧеркаський художньо-технічний коледж оголошує про день відкритих дверей
Черкаський художньо-технічний коледж оголошує про день відкритих дверей
 
17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx
17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx
17.04.2024.1.docx17.04.2024.1.docx17.04.2024.1.docx
 
Луцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptxЛуцький центр ПТО соціальний проєкт .pptx
Луцький центр ПТО соціальний проєкт .pptx
 
Її величність - українська книга презентація-огляд 2024.pptx
Її величність - українська книга презентація-огляд 2024.pptxЇї величність - українська книга презентація-огляд 2024.pptx
Її величність - українська книга презентація-огляд 2024.pptx
 
Роберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантастаРоберт Шеклі. Біографія письменника-фантаста
Роберт Шеклі. Біографія письменника-фантаста
 
Презентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptxПрезентація роботи Осипенківської ЗОШ 2023-2024.pptx
Презентація роботи Осипенківської ЗОШ 2023-2024.pptx
 
17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx
17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx
17.04.2024.2.docx17.04.2024.2.docx17.04.2024.2.docx
 

Pascal osnovu2

  • 1. Програмування на мові Паскаль Частина II Тема 1. Масиви © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 2. Масиви Масив – це група однотипних елементів, які мають спільне ім’я і розміщені в пам’яті поряд. Особливості: • всі елементи мають один тип • весь масив має одне ім’я • всі елементи розміщені в пам’яті поряд Приклади: • список учнів в класі • квартири в будинку • школи в місті • дані про температуру повітря за рік
  • 3. Масиви НОМЕР елемента масиву (ІНДЕКС) A масив 1 2 33 4 5 5 10 15 15 20 25 A[1] A[2] A[3] A[4] ЗНАЧЕННЯ A[5] елемента масиву НОМЕР (ІНДЕКС) елемента масиву: 2 A[2] ЗНАЧЕННЯ елемента масиву: 10
  • 4. Оголошення масивів Для чого оголошувати? • визначити ім’я масиву • визначити тип масиву • визначити кількість елементів • виділити місце в пам’яті Масив цілих чисел: початковий кінцевий тип ім’я індекс індекс елементів var A : array[ 1 .. 5 ] of integer ; Розмір через константу: const N=5; var A: array[1.. N ] of integer;
  • 5. Оголошення масивів Масиви інших типів: var X, Y: array [1..10] of real; C: array [1..20] of char; Інший діапазон індексів: var Q: array [0..9] of real; C: array [-5..13] of char; Індекси інших типів: var A: array ['A'..'Z'] of real; B: array [False..True] of integer; ... A['C'] := 3.14259*A['B']; B[False] := B[False] + 1;
  • 6. Що неправильно? var a: array[10..1] of integer; [1..10] ... A[5] := 4.5; var a: array ['a'..'z'] of integer; ['z'..'a'] ... A['b'] := 15; A['B'] var a: array [0..9] of integer; ... A[10] := 'X';
  • 7. Масиви Оголошення: const N = 5; var a: array[1..N] of integer; i: integer; Введення з клавіатури: a[1] = 5 for i:=1 to N do begin write('a[', i, ']='); a[2] = a[3] = 12 34 ? Чому read ( a[i] ); write? a[4] = 56 end; a[5] = 13 Поелементні операції: for i:=1 to N do a[i]:=a[i]*2; Виведення на екран: writeln('Масив A:'); Масив A: for i:=1 to N do 10 24 68 112 26 write(a[i]:4);
  • 8. Завдання "4": Ввести з клавіатури масив з 5 елементів, знайти середнє арифметичне всіх елементів масиву. Приклад: Введіть п’ять чисел: 4 15 3 10 14 середнє арифметичне 9.200 "5": Ввести з клавіатури масив з 5 елементів, знайти мінімальний з них. Приклад: Введіть п’ять чисел: 4 15 3 10 14 мінімальний елемент 3 ! При зміні N решта програми не повинна змінюватися!
  • 9. Програмування на мові Паскаль Частина II Тема 2. Максимальний елемент масиву © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 10. Максимальний елемент Задача: знайти в масиві максимальний елемент. Алгоритм: Псевдокод: { вважаємо, що перший елемент – максимальний } for i:=2 to N do if a[i] > { максимального } then { запам’ятати новий максимальний елемент a[i] } ? Чому цикл від i=2?
  • 11. Максимальний елемент Додатково: як знайти номер максимального елемента? max := a[1]; { вважаємо, що перший – максимальний } iMax := 1; for i:=2 to N do { перевіряємо всі решта } if a[i] > a[iMax] then { знайшли новий максимальний } max begin max := a[i]; { запам’ятати a[i] } iMax := i; { запам’ятати i } ? end; Як спростити? По номеру елемента iMax завжди можна знайти його значення a[iMax]. Тому всюди замінюємо max на a[iMax] і забираємо змінну max.
  • 12. Програма program qq; const N = 5; var a: array [1..N] of integer; i, iMax: integer; begin writeln(‘Вихідний масив:'); випадкові числа в for i:=1 to N do begin інтервалі [50,150) a[i] := random(100) + 50; пошук write(a[i]:4); максимального end; iMax := 1; { вважаємо, що перший – максимальний } for i:=2 to N do { перевіряємо всі решта } if a[i] > a[iMax] then { новий максимальний } iMax := i; { запам’ятати i } writeln; {перейти на новий рядок} writeln('Максимальний елемент a[', iMax, ']=', a[iMax]); end;
  • 13. Завдання "4": Заповнити масив з 10 елементів випадковими числами з інтервалу [-10..10] і знайти в ньому максимальний і мінімальний елементи та їх номери. Приклад: Вихідний масив: 4 -5 3 10 -4 -6 8 -10 1 0 максимальний a[4]=10 мінімальний a[8]=-10 "5": Заповнити масив з 10 елементів випадковими числами з інтервалу [-10..10] і знайти в ньому два максимальних елементи та їх номери. Пример: Вихідний масив: 4 -5 3 10 -4 -6 8 -10 1 0 максимальний a[4]=10, a[7]=8
  • 14. Програмування на мові Паскаль Частина II Тема 3. Опрацювання масивів © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 15. Інверсія масиву Задача: переставити елементи масиву в зворотному порядку. 1 2 … N-1 N 1 2 … N-1 N 3 5 … 9 7 7 9 … 5 3 сума індексів N+1 Алгоритм: поміняти місцями A[1] і A[N], A[2] і A[N-1], … Псевдокод: for i:=1 to N do 2 do N div { поміняти місцями A[i] і A[N+1-i] } ? Що неправильно?
  • 16. Як переставити елементи? Задача: поміняти місцями 2 вміст двох чашок. 1 3 Задача: поміняти місцями вміст двох комірок пам’яті. x y c := x; 4 6 2 6 4 x := y; x := y; y := x; y := c; 3 1 ? Чи можна обійтися без c? ? 4 c
  • 17. Програма program qq; const N = 10; var A: array[1..N] of integer; i, c: integer; begin { заповнити масив } { вивести вихідний масив } for i:=1 to N div 2 do begin c:=A[i]; A[i]:=A[N+1-i]; A[N+1-i]:=c; end; { вивести одержаний масив } end;
  • 18. Завдання "4": Заповнити масив з 10 елементів випадковими числами з інтервалу [-10..10] і виконати інверсію окремо для 1-ї і 2-ї половини масиву. Приклад: Вихідний масив: 4 -5 3 10 -4 -6 8 -10 1 0 Результат: -4 10 3 -5 4 0 1 -10 8 -6 "5": Заповнити масив з 12 елементів випадковими числами з інтервалу [-12..12] і виконати інверсію для кожної третини масиву. Приклад: Вихідний масив: 4 -5 3 10 -4 -6 8 -10 1 0 5 7 Результат: 10 3 -5 4 -10 8 -6 -4 7 5 0 1
  • 19. Циклічний зсув Задача: зсунути елементи масиву на 1 комірку, перший елемент стає на місце останнього. 1 2 3 4 … N-1 N 3 5 8 1 … 9 7 5 8 1 … 9 7 3 Алгоритм: A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N]; Цикл: чому не N? for i:=1 to N-1 do A[i]:=A[i+1]; ? Що неправильно?
  • 20. Програма program qq; const N = 10; var A: array[1..N] of integer; i, c: integer; begin { заповнити масив } { вивести вихідний масив } c := A[1]; for i:=1 to N-1 do A[i]:=A[i+1]; A[N] := c; { вивести одержаний масив } end;
  • 21. Завдання "4": Заповнити масив з 10 елементів випадковими числами з інтервалу [-10..10] і виконати циклічний зсув ВПРАВО. Приклад: Вихідний масив: 4 -5 3 10 -4 -6 8 -10 1 0 Результат: 0 4 -5 3 10 -4 -6 8 -10 1 "5": Заповнити масив з 12 елементів випадковими числами з інтервалу [-12..12] і виконати циклічний зсув ВПРАВО на 4 елементи. Приклад: Вихідний масив: 4 -5 3 10 -4 -6 8 -10 1 0 5 7 Результат: -4 -6 8 -10 1 0 5 7 4 -5 3 10
  • 22. Програмування на мові Паскаль Частина II Тема 4. Сортування масивів © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 23. Сортування Сортування – це розстановка елементів масиву в заданому порядку ( по зростанню, спаданню, останній цифрі, сумі дільників, …). Задача: переставити елементи масиву в порядку зростання. складність O(N2) Алгоритми: • прості і зрозумілі, проте неефективні для переважної більшості масивів  метод бульбашки складність O(N·logN)  метод вибору час O(N2) • складні, проте ефективні  “швидке сортування" (Quick Sort) O(N·logN)  сортування “купою" (Heap Sort)  сортування злиттям  пірамідальне сортування N
  • 24. Метод бульбашки Ідея – бульбашка повітря в стакані води піднімається з дна вверх. Для масивів – самий маленький ("легкий") елемент переміщується вверх ("спливає"). 1-ий прохід • починаємо знизу, порівнюємо два 5 5 5 1 сусідніх елементи; вони стоять “неправильно”, міняємо їх місцями 2 2 1 5 1 1 2 2 • за 1 прохід по масиву один елемент (самий маленький) стає на своє 3 3 3 3 місце 2-ий прохід 3-ій прохід 1 1 1 1 1 Для сортування масиву з N 5 2 2 елементів потрібен 5 2 N-1 прохід (достатньо 2 2 5 5 3 поставить на свої місця 3 3 3 3 5 N-1 елемент).
  • 25. Програма 1-ий прохід: порівнюються пари 1 5 A[N-1] і A[N], A[N-2] і A[N-1] A[j] і A[j+1] … 2 2 A[1] і A[2] … … for j:=N-1 downto 1 do N-1 6 if A[j] > A[j+1] then begin N 3 c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c; end; 2-ий прохід 1 1 ! A[1] вже на своєму місці! 2 5 2 for j:=N-1 downto 2 do … … if A[j] > A[j+1] then begin c:=A[j]; A[j]:=A[j+1]; A[j+1]:=c; N-1 3 end; N 6 i-ий прохід for j:=N-1 downto i do i ...
  • 26. Програма program qq; const N = 10; var A: array[1..N] of integer; i, j, c: integer; begin { заповнити масив } ? Чому цикл по i до N-1? { вивести вихідний масив } елементи вище A[i] for i:=1 to N-1 do begin вже поставлені for j:=N-1 downto i do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; end; end; { вивести одержаний масив } end;
  • 27. Метод бульбашки з прапором Ідея – якщо при виконанні методу бульбашки не 2 1 було обмінів, масив вже посортований і решта 1 2 проходів не потрібні. 4 3 Реалізація: змінна-прапор, показує, був чи ні обмін; 3 4 якщо вона дорівнює False, то вихід. repeat var flag: boolean; flag := False; { скинути прапор } for j:=N-1 downto 1 do if A[j] > A[j+1] then begin с := A[j]; ? Як покращити? A[j] := A[j+1]; A[j+1] := с; flag := True; { підняти прапор } end; until not flag; { вихід при flag=False }
  • 28. Метод бульбашки з прапором i := 0; repeat i := i + 1; flag := False; { скинути прапор } i for j:=N-1 downto 1 do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; flag := True; { підняти прапор } end; until not flag; { вихід при flag=False }
  • 29. Метод вибору Ідея: • знайти мінімальний елемент і поставити на місце першого (помінять місцями з A[1]) • із решти знайти мінімальний елемент і поставити на друге місце (поміняти місцями з A[2]), і т.д. 4 1 1 1 3 3 2 2 1 4 4 4 2 2 3 3
  • 30. Метод вибору потрібен N-1 прохід for i := 1 to N-1 do begin пошук мінімального nMin = i ; від A[i] до A[N] for j:= i+1 to N do if A[j] < A[nMin] then nMin:=j; if nMin <> i then begin c:=A[i]; якщо потрібно, переставляємо A[i]:=A[nMin]; A[nMin]:=c; end; ?Чи можна забрати if? end;
  • 31. Завдання "4": Заповнити масив з 10 елементів випадковими числами з інтервалу [0..100] і відсортувати його за останньою цифрою. Приклад: Вихідний масив: 14 25 13 30 76 58 32 11 41 97 Результат: 30 11 41 32 13 14 25 76 97 58 "5": Заповнити масив з 10 елементів випадковими числами з інтервалу [0..100] і відсортувати першу половину по зростанню, а другу – по спаданню. Приклад: Вихідний масив: 14 25 13 30 76 58 32 11 41 97 Результат: 13 14 25 30 76 97 58 41 32 11
  • 32. Програмування на мові Паскаль Частина II Тема 5. Пошук в масиві © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 33. Пошук в масиві Задача – знайти в масиві елемент, рівний X, або встановити, що його немає. Розв’язання: для довільного масиву: лінійний пошук (перебір) недостаток: низька швидкість Як спростити? – завчасно підготувати масив для пошуку • як саме підготувати? • як використовувати “підготовлений масив"?
  • 34. Лінійний пошук nX – номер потрібного елемента в масиві nX := 0; { поки не знайшли ...} for i:=1 to N do { цикл по всіх елементах } if A[i] = X then { якщо знайшли, то ... } nX := i; { ... запам’ятати номер} if nX < 1 then writeln('Не нашли...') else writeln('A[', nX, ']=', X); Покращення: після того, як знайшли X, виходимо з циклу. ? Що погано? nX := 0; nX := 0; i := 1; for i:=1 to N do while i <= N do begin if A[i] = X then begin if A[i] = X then begin nX := i; nX := i; i := N; break; {вихід з циклу} end; end; i := i + 1; end;
  • 35. Двійковий пошук 1 1 1 X=7 2 2 2 3 3 3 4 4 4 X>4 5 5 5 6 6 X>6 6 7 7 7 X<8 8 8 8 9 9 9 10 10 10 • Вибрати середній елемент A[c] і 11 11 11 порівняти з X. 12 12 12 • Якщо X = A[c], знайшли (вихід). • 13 13 13 Якщо X < A[c], шукати дальше в першій половині. 14 14 14 • Якщо X > A[c], шукати дальше в 15 15 15 другій половині. 16 16 16
  • 36. Двійковий пошук 1 L c R N nX := 0; L := 1; R := N; {межі: шукаємо від A[1] до A[N] } while R >= L do begin номер середнього c := (R + L) div 2; елемента if X = A[c] then begin nX := c; знайшли R := L - 1; { break; } вийти з end; циклу if x < A[c] then R := c - 1; if x > A[c] then L := c + 1; зсуваємо end; межі if nX < 1 then writeln(‘Не знайшли...') else writeln('A[', nX, ']=', X); ? Чому не можна while R > L do begin … end; ?
  • 37. Порівняння методів пошуку Лінійний Двійковий підготовка ні відсортувати кількість кроків N=2 2 2 N = 16 16 5 N = 1024 1024 11 N= 1048576 1048576 21 N ≤N ≤ log2N+1
  • 38. Завдання "4": Написати програму, яка сортує масив ПО СПАДАННЮ і шукає в ньому елемент, рівний X (це число вводиться з клавіатури). Використати двійковий пошук. "5": Написати програму, яка рахує середню кількість кроків в двійковому пошуку для масиву з 32 елементів з інтервалу [0,100]. Для пошуку використати 1000 випадкових чисел в цьому ж інтервалі.
  • 39. Програмування на мові Паскаль Частина II Тема 6. Символьні рядки © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 40. Чим поганий масив символів? Це масив символів: var B: array[1..N] of char; • кожен символ – окремий об’єкт; • масив має довжину N, яка задана при оголошенні Що потрібно: • опрацьовувати послідовність символів як єдине ціле • рядок повинен мати змінну довжину
  • 41. Символьні рядки var s: string; ! В Delphi це обмеження знято! довжина рядка s[3] s[4] 1 255 6 П р и в і т ! ¤ ¤ ¤ … ¤ ¤ ¤ робоча частина s[1] s[2] 1 20 var s: string[20]; Довжина рядка: var i: integer; n := length ( s );
  • 42. Символьні рядки Задача: ввести рядок з клавіатури і замінити всі букви "а" на букви "б". program qq; var s: string; введення рядка i: integer; begin довжина рядка writeln(‘Введіть рядок'); readln(s); for i:=1 to Length(s) do if s[i] = 'а' then s[i] := 'б'; writeln(s); end. виведення рядка
  • 43. Завдання "4": Ввести символьний рядок і замінити всі букви "а" на букви "б" і навпаки, як великі, так і маленькі. Приклад: Ввести рядок: ааббссААББСС Результат: ббаассББААСС "5": Ввести символьний рядок і перевірити, чи є він паліндромом (паліндром читається однаково в обох напрямках). Приклад: Приклад: Введіть рядок: Введіть рядок: АБВГДЕ КОРОК Результат: Результат: Не паліндром. Паліндром.
  • 44. Операції з рядками var s, s1, s2: string; Запис нового значення: s := 'Вася'; Об’єднання: додати один рядок в кінець другого. s1 := 'Привіт'; s2 := 'Вася'; s := s1 + ', ' + s2 + '!'; 'Привіт, Вася!' Підрядок: повернути частину рядка з іншого рядка. з 3-го символу s := '123456789'; 6 штук s1 := Copy ( s, 3, 6 ); '345678' s2 := Copy ( s1, 2, 3 ); '456'
  • 45. Знищення і вставка Знищення частини рядка: 6 штук s := '123456789'; '123456789' Delete ( s, 3, 6 ); '129' рядок міняється! з 3-го символу Вставка в рядок: починаючи з 3-го символу s := '123456789'; Insert ( 'ABC', s, 3 ); '12ABC3456789' куди що вставляєм вставляємо о Insert ( 'Q', s, 5 ); '12ABQC3456789'
  • 46. Пошук в рядку Пошук в рядку: s[3] var n: integer; s := ‘Тут був Вася.'; n := Pos ( ‘у', s ); 3 if n > 0 then writeln(‘Буква у - це s[', n, ']') else writeln(‘Не знайшли'); n = 11 n := Pos ( 'Вася', s ); s1 := Copy ( s, n, 4 ); Особливості: • функція повертає номер символу, з якого починається зразок в рядку • якщо слова немає, повертається 0 • пошук з початку (знаходиться перше слово)
  • 47. Приклади s := 'Вася Петя Мітя'; n := Pos ( 'Петя', s ); 6 Delete ( s, n, 4 ); 'Вася Мiтя' Insert ( ‘Катя', s, n ); 'Вася Катя Мiтя' s := 'Вася Петя Мітя'; n := length ( s ); 14 s1 := Copy ( s, 1, 4 ); 'Вася' s2 := Copy ( s, 11, 4 ); 'Мітя' s3 := Copy ( s, 6, 4 ); 'Петя' s := s3 + s1 + s2; 'ПетяВасяМітя' n := length ( s ); 12
  • 48. Приклад розв’язання задачі Задача: Ввести ім’я, по батькові і прізвище. Перетворити їх до формату “прізвище-ініціали". Приклад: Введіть ім’я, по батькові і прізвище: Василь Алібабаєвич Хрюндіков Результат: Хрюндіков В.А. Алгоритм: • знайти перший пропуск і виділити ім’я • знищити ім’я з пропуском із основного рядка • знайти перший пропуск і виділити по батькові • знищити по батькові з пропуском із основного рядка • “склеїти" прізвище, перші букви імені і фамілії, крапки, пропуски…
  • 49. Програма program qq; var s, name, otch: string; n: integer; begin writeln(‘Введіть ім’я, по батькові і прізвище'); readln(s); n := Pos(' ', s); name := Copy(s, 1, n-1); { вирізати ім’я } Delete(s, 1, n); n := Pos(' ', s); otch := Copy(s, 1, n-1); { вирізати по батькові } Delete(s, 1, n); { залишилось прізвище } s := s + ' ' + name[1] + '.' + otch[1] + '.'; writeln(s); end.
  • 50. Завдання "4": Ввести ім’я файлу (можливо, без розширення) і змінити його розширення на ".exe". Приклад: Ввести ім’я файлу: Ввести ім’я файлу: qqq qqq.com Результат: Результат: qqq.exe qqq.exe "5": Ввести шлях до файлу і "розібрати" його, виводячи кожну вкладену папку з нового рядка Приклад: Ввести шлях до файлу: C:Мої документи10-БВасяqq.exe Результат: C: Мої документи 10-Б Вася qq.exe
  • 51. Програмування на мові Паскаль Частина II Тема 7. Рекурсивний перебір © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 52. Рекурсивний перебір Задача: Алфавіт мови племені "тумба-юмба" складається з букв И, Ц, Щ і О. Вивести на екран всі слова із К букв, які можна скласти в цій мові, і підрахувати їх кількість. Число K вводиться з клавіатури. в кожній комірці може бути будь-яка з 4-х букв 1 K 4 варіанти 4 варіанти 4 варіанти 4 варіанти Кількість варіантів: N = 4 ⋅ 4 ⋅ 4 ⋅ ⋅ 4 = 4 K
  • 53. Рекурсивний перебір Рекурсія: Розв’язання задачі для слів з К букв зводиться до 4-х задач для слів з K-1 букви. перебираємо 1 K всі варіанти И перебираємо 1 K всі варіанти Ц перебираємо 1 K всі варіанти Щ перебираємо 1 K всі варіанти О
  • 54. Процедура 1 p p+1 K s ● ● ● ? ? ? ? Глобальні змінні: var s: string; procedure Rec(p: integer); count, K: begin integer; if p > K then begin writeln(s); закінчення рекурсії count := count+1; end рекурсивні виклики else begin s[p]:='Ы'; Rec ( p+1 ); s[p]:='Ц'; Rec ( p+1 ); s[p]:='Щ'; Rec ( p+1 ); s[p]:='О'; Rec ( p+1 ); end; ? end; А якщо букв багато?
  • 55. Процедура procedure Rec(p: integer); всі букви const letters = 'ЫЦЩО'; ‘ИЦЩО'; var i: integer; begin локальна змінна if p > k then begin writeln(s); count := count+1; цикл по всіх буквах end else begin for i:=1 to length(letters) do begin s[p] := letters[i]; Rec(p+1); end; end; end;
  • 56. Програма program qq; var s: string; глобальні змінні K, i, count: integer; procedure Rec(p: integer); процедура ... end; begin writeln(‘Введіть довжину слова:'); рядок з K пропусків read ( K ); s := ''; s := ''; for i:=1 to K do s := s + ' '; for i:=1 to K do s := s + ' '; count := 0; Rec ( 1 ); writeln(‘Всього ', count, ' слів'); end.
  • 57. Завдання Алфавіт мови племені "тумба-юмба" складається з букв И, Ц, Щ і О. Число K вводиться з клавіатури. "4": Вивести на екран всі слова з К букв, в яких буква И зустрічається більше 1 разу, і підрахувати їх кількість. "5": Вивести на екран всі слова з К букв, в яких є однакові букви, що стоять поряд (наприклад, ИЩЩО), і підрахувати їх кількість.
  • 58. Програмування на мові Паскаль Частина II Тема 8. Матриці © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 59. Матриці Задача: запам’ятати розміщення фігур на шаховій дошці. 1 2 3 4 5 6 a b c d e f g h 1 2 3 4 5 6 7 8 8 8 0 0 0 0 2 0 0 0 7 7 0 0 0 0 0 0 0 0 6 6 0 0 3 0 0 0 0 0 5 5 0 0 0 0 0 0 0 0 4 c6 4 0 A[6,3] 0 0 0 0 0 4 0 3 3 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
  • 60. Матриці Матриця – це прямокутна таблиця чисел. Матриця – це масив, в якому кожний елемент має два індекси (номер рядка і номер стовпця). стовбець 3 A 1 2 3 4 5 1 1 4 7 3 6 рядок 2 2 2 -5 0 15 10 3 8 9 11 12 20 комірка A[3,4]
  • 61. Матриці Оголошення: const N = 3; M = 4; var A: array[1..N,1..M] of integer; B: array[-3..0,-8..M] of integer; Q: array['a'..'d',False..True] of real; Введення з клавіатури: ? Якщо переставити цикли? for i:=1 to N do j:=1 M i j for j:=1 to M do begin i:=1 N A[1,1]= 25 write('A[',i,',',j,']='); A[1,2]= 14 read ( A[i,j] ); A[1,3]= 14 end; ... A[3,4]= 54
  • 62. Матриці Заповнення випадковими числами for i:=1 to N do ? цикл по рядках Який інтервал? цикл по стовпцях for j:=1 to M do A[i,j] := random(25) - 10; Вывод на экран виведення рядка for i:=1 to N do begin for j:=1 to M do 12 25 1 13 write ( A[i,j]:5 ); 156 1 12 447 writeln; end; 1 456 222 23 в тому ж рядку ? перейти на новий рядок Якщо переставити цикли?
  • 63. Опрацювання всіх елементів матриці Задача: заповнити матрицю з 3 рядків і 4 стовпців випадковими числами і вивести її на екран. Знайти суму елементів матриці. program qq; const N = 3; M = 4; var A: array[1..N,1..M] of integer; i, j, S: integer; begin ... { заповнення матриці і виведення на екран} S := 0; for i:=1 to N do for j:=1 to M do S := S + A[i,j]; writeln(‘Сума елементів матриці ', S); end;
  • 64. Завдання Заповнити матрицю з 8 рядків і 5 стовпців випадковими числами з інтервалу [-10,10] і вивести її на екран. "4": Знайти мінімальний і максимальний елемент в матриці і їх номера. Формат виведення: Мінімальний елемент A[3,4]=-6 Максимальний елемент A[2,2]=10 "5": Вивести на екран рядок, сума елементів якого максимальна. Формат виведення: Рядок 2: 3 5 8 9 8
  • 65. Операції з матрицями Задача 1. Вивести на екран головну діагональ квадратної матриці з N рядків і N стовпців. A[1,1] A[2,2] A[3,3] for i:=1 to N do write ( A[i,i]:5 ); A[N,N] Задача 2. Вивести на екран другу діагональ. A[1,N] сума номерів рядка в стовпця N+1 A[2,N-1] for i:=1 to N do write ( A[i, N+1-i ]:5 ); A[N-1,2] A[N,1]
  • 66. Операції з матрицями Задача 3. Знайти суму елементів, які стоять на головній діагоналі і нижче її. ? Одиночний цикл чи вкладений? рядок 1: A[1,1] рядок 2: A[2,1]+A[2,2] ... рядок N: A[N,1]+A[N,2]+...+A[N,N] цикл по всіх рядках S := 0; for i:= 1 to N do додаємо потрібні for j:= 1 to i do елементи рядка i S := S + A[i,j];
  • 67. Операції з матрицями Задача 4. Перестановка рядків або стовпців. В матриці з N рядків і M стовпців переставити 2-й і 4-й рядок. j A[2,j] for j:=1 to M do begin 2 1 2 5 2 1 c := A[2,j]; A[2,j] := A[4,j]; 4 7 3 1 3 7 A[4,j] := c; end; A[4,j] Задача 5. До третього стовпця додати шостий. for i:=1 to N do A[i,3] := A[i,3] + A[i,6];
  • 68. Завдання Заповнити матрицю з 7 рядків і 7 стовпців випадковими числами з інтервалу [-10,10] і вивести її на екран. Обнулити елементи, відмічені зеленим фоном, і вивести одержану матрицю на екран. "4": "5":
  • 69. Програмування на мові Паскаль Частина II Тема 9. Файли © К.Ю. Поляков, 2006-2007 Переклад: Р. М. Васильчик
  • 70. Файли Файл – це область на диску, яка має ім’я. Файли Текстові Двійкові Папки тільки текст без оформлення, може містити будь-які (каталоги) не містить керівних символів (з символи кодової таблиці кодами < 32) *.doc, *.exe, ACSII (1 байт на символ) UNICODE (2 байта на символ) *.bmp, *.jpg, *.txt, *.log, *.wav, *.mp3, *.htm, *.html *.avi, *.mpg
  • 71. Принцип сендвіча Змінна типу «текстовий файл": var f: text; I етап. відкрити файл : • зв’язати змінну f з файлом assign(f, 'qq.dat'); • відкрити файл (зробити його активним, приготувати до роботи) reset(f); {для читання} rewrite(f); {для запису} II етап: робота з файлом read ( f, n ); { ввести значення n } write ( f, n ); { записати значення n } writeln ( f, n );{з переходом на новий рядок} III етап: закрити файл close(f);
  • 72. Робота з файлами Особливості: • ім’я файлу згадується тільки в команді assign, звернення до файлу іде через файлову змінну • файл, який відкривається для читання, повинен існувати • якщо файл, який відкривається на запис, існує, то старий вміст знищується • дані записуються в файл у текстовому вигляді • при завершенні програми всі файли закриваються автоматично • після закриття файлу змінну f можна використовувати ще раз для роботи з іншим файлом
  • 73. Послідовний доступ • при відкритті файлу курсор встановлюється в початок assign ( f, 'qq.dat' ); reset ( f ); кінець файлу (end of file, EOF) 12 5 45 67 56● • читання виконується з тієї позиції, де стоїть курсор • після читання курсор зміщується на перший непрочитаний символ read ( f, x ); 12 5 45 67 56●
  • 74. Послідовний доступ • читання до кінця рядка readln ( f, x ); кінець рядка (end of line, EOL) 12 5 45¤ 36 67¤ 56● • як повернутися назад? close ( f ); reset ( f ); { почати з початку }
  • 75. Приклад Задача: в файлі input.txt записані числа (в стовпчик), скільки їх – невідомо. Записати в файл output.txt їх суму. Алгоритм: ? Чи можна обійтися без масиву? • Відкрити файл input.txt для читання. • S := 0; • Якщо чисел не залишилося, перейти до кроку 7. • Прочитати наступне число в змінну x. • S := S + x; • Перейти до кроку 3. цикл з умовою «поки є дані" • Закрити файл input.txt. • Відкрити файл output.txt для запису. • Записати в файл значення S. • Закрити файл output.txt.
  • 76. Програма program qq; var s, x: integer; f: text; begin логічна функція, повертає True, якщо assign(f, 'input.txt'); досягнуто кінець файлу reset(f); s := 0; while not eof(f) do begin readln(f, x); s := s + x; запис результату у end; файл output.txt close(f); assign(f, 'output.txt'); rewrite(f); writeln(f, 'Сума чисел ', s); close(f); end.
  • 77. Завдання В файлі input.txt записані числа, скільки їх – невідомо. "4": Знайти середнє арифметичне всіх чисел і записати його в файл output.txt. "5": Знайти мінімальне і максимальне число і записати їх в файл output.txt.
  • 78. Опрацювання масивів Задача: в файлі input.txt записані числа (в стовпчик), скільки їх – невідомо, але не більше 100. Переставити їх в порядку зростання і записати в файл output.txt. ? Чи можна обійтися без масиву? Проблеми: 1. для сортування потрібно утримувати в пам’яті всі числа одночасно (масив); 2. скільки чисел – невідомо. Розв’язання: • виділяємо в пам’яті масив з 100 елементів; • записуємо прочитані числа в масив і рахуємо їх в змінній N; • сортуємо перші N елементів масиву; • записуємо їх в файл.
  • 79. Читання даних в масив Глобальні змінні: var A: array[1..100] of integer; f: text; Функція: вводить масив, повертає кількість елементів function ReadArray: integer; цикл закінчується, якщо var i: integer; досягнутий кінець файлу begin або прочитано 100 чисел assign(f, 'input.txt'); reset(f); i := 0; while (not eof(f)) and (i < 100) do begin i := i + 1; readln(f, A[i]); end; close(f); ReadArray := i; end;
  • 80. Програма program qq; var A: array[1..100] of integer; f: text; N: integer; function ReadArray: integer; ... end; Begin N := ReadArray; ... { сортування перших N елементів } assign(f, 'output.dat'); вивід відсортованого rewrite(f); масиву у файл for i:=1 to N do writeln(f, A[i]); close(f); end.
  • 81. Завдання В файлі input.txt записані числа (в стовпчик), відомо, що їх не більше 100. "4": Відсортувати масив по спаданню останньої цифри і записати його в файл output.txt. "5": Відсортувати масив по зростанню суми цифр і записати його в файл output.txt.
  • 82. Опрацювання текстових даних Задача: в файлі input.txt записані рядки, в яких є слово- паразит "коротше". Очистити текст від мусора і записати в файл output.txt. Файл input.txt : Мама, коротше, мила, коротше, раму. Декан, коротше, пропив, коротше, бутан. А роза, коротше, упала на лапу, коротше, Азора. Кожний, коротше, мисливець бажає, коротше, знати, де ... Результат - файл output.txt : Мама мила раму. Декан пропив бутан. А роза упала на лапу Азора. Кожний мисливець бажає знати, де сидить фазан.
  • 83. Обробка текстових даних поки не закінчилися дані Алгоритм: • Прочитати рядок з файлу (readln). • Знищити всі слова ", коротше," (Pos, Delete). • Перейти до кроку 1. Опрацювання рядка s: шукати ", коротше," repeat знищити 9 символів i := Pos(', коротше,', s); if i <> 0 then Delete(s, i, 9); until i = 0; Особливості: потрібно одночасно тримати відкритими два файли (один в режимі читання, другий – в режимі запису).
  • 84. Робота з файлами program qq; var s: string; файлові змінні i: integer; fIn, fOut: text; відкрити файл для читання begin assign(fIn, 'instr.txt'); reset(fIn); відкрити файл для запису assign(fOut, 'outstr.txt'); rewrite(fOut); ... { опрацювати файл } close(fIn); close(fOut); end.
  • 85. Повний цикл опрацювання файлів поки не досягнутий кінець файла while not eof(fIn) do begin readln(fIn, s); опрацювання рядка repeat i := Pos(', коротше,', s); if i <> 0 then Delete(s, i, 9); until i = 0; writeln(fOut, s); end; запис "очищеного" рядка
  • 86. Завдання В файлі input.txt записані рядки, скільки їх – невідомо. "4": Замінити всі слова "коротше" на "в загальному" і записати результат у файл output.txt. "5": Вивести в файл output.txt тільки ті рядки, в яких більше 5 слів (слова розділені одним пропуском).