SlideShare une entreprise Scribd logo
1  sur  159
Програмування на
  мові Паскаль
    Тема 1. Вступ
Алгоритм
Алгоритм – це чітко визначений план дій для
    виконавця.
Властивості алгоритму
 • дискретність: складається з окремих кроків
   (команд)
 • зрозумілість: повинен включати тільки команди
   відомі для виконавця (які містяться в СКВ)
 • визначеність: при однакових вхідних даних завжди
   видає один і той самий результат
 • скінченність: закінчується за скінчену кількість
   кроків
 • масовість: може застосовуватися багатократно при
   різних вихідних даних
 • коректність: видає правильне рішення при будь-
   яких допустимих вихідних даних
Програма

Програма – це
 • алгоритм, записаний на будь-якій мові
   програмування
 • набір команд для комп’ютера
Команда – це опис дій, які повинен
 виконати комп’ютер.
  • звідки отримати вихідні дані?
  • що потрібно з ними зробити?
Мови програмування
• Машинно-орієнтовані (низького рівня) – кожна
  команда відповідає одній команді процесора
  (асемблер)
• Мови високого рівня – наближені до реальної
  (англійської) мови, легше сприймаються
  людиною, не залежать від відповідного
  комп’ютера
    • для навчання: Бейсик, ЛОГО, Паскаль
    • професійні: Сі, Фортран, Паскаль
    • для задач штучного інтелекту: Пролог,
      ЛИСП
    • для Інтернету: JavaScript, Java, Perl, PHP,
      ASP
Мова Паскаль

1970 – Ніклаус Вірт (Швейцарія)
  • мова для навчання студентів
  • розробка програм “зверху-вниз”
                       Задача

     Підзадача1       Підзадача2           Підзадача3


   1.1   1.2   1.3   2.1   2.2     2.3   3.1   3.2   3.3


  • різноманітні структури даних (масиви,
   структури, множини)
З чого складається програма?

program <ім’я програми>;
const …;{константи}
var …; {змінні}
  { процедури і функції }
begin
 … {основна програма}
end.      коментарі у фігурних дужках не
                     опрацьовуються
З чого складається програма?

Константа – постійна величина, яка має
   ім’я.
Змінна – змінна величина, яка має ім’я
    (комірка пам’яті).
Процедура – додатковий алгоритм, який
   описує деякі дії (малювання кола).
Функція – додатковий алгоритм, для
   виконання обчислень (обчислення
   квадратного кореня, sin).
Імена програм, констант, змінних
Імена можуть містити
    • латинські букви (A-Z)
           великі і маленькі букви не розрізняються
    • цифри

            ім’я не може починатися з цифри
    • знак підкреслення _
Імена НЕ можуть містити
    • українські букви
    • пропуски
    • дужки, знаки +, =, !, ? та ін.
Які імена правильні?
AXby R&B 4Wheel Вася “PesBarbos”
 TU154 [QuQu] _ABBA A+B
Константи

const
    i2 = 45; { ціле число }
    pi = 3.14; { дійсне число }
        ціла і дробова частина відділяються крапкою

    qq = 'Вася'; { рядок символів }
            можна використовувати українські букви!

    L   = True; { логічна величина }
        Може приймати два значення:
          • True (істина, “так")
          • False (хибність, "ні")
Змінні
Змінна – це величина, яка має ім’я, тип і значення.
     Значення змінної величини під час виконання
     програми може змінюватися.
Типи змінних:
  • integer             { цілі }
  • real                { дійсні }
  • char                { один символ }
  • string              { рядок }
  • boolean             { логічні }
Оголошення змінних (виділення пам’яті):
var a, b: integer;
    Q: real;
    s1, s2: string;
Як змінюється значення змінної?
Оператор – це команда мови програмування високого
    рівня.
Оператор присвоєння служить для зміни значення
    змінної.
Приклад:
 program qq;           a
 var a, b: integer;    ?
                       5   5

 begin
                         b
   a := 5;               ?
                         7      5+2
   b := a + 2;
   a := (a + 2)*(b – 3);     a
                             28
                              5     7*4
 end.
Оператор присвоєння

Загальна структура:
<ім’я змінної> := <вираз>;
Арифметичні вирази можуть містити
 • константи
 • імена змінних
 • знаки арифметичних дій:
       + -     *  /       div   mod
      множення   ділення   ділення   остача від
                           націло     ділення
  • виклики функцій
  • круглі дужки ( )
Які оператори неправильні?

 program qq;
 var a, b: integer;
      x, y: real;
 begin               ім’я змінної повинно
                 знаходитися зліва від знака :=
   a := 5;
                                   ціла і дробова частина
   10 := x;                        відділяються крапкою
   y := 7,8;
   b := 2.5;                     неможливо записати дійсне
                                    значення в цілу змінну
   x := 2*(a + y);
   a := b + x;
 end.
Ручна прокрутка програми

program qq;                a    b
var a, b: integer;         ?    ?
begin
  a := 5;                  5
  b := a + 2;                   7
  a := (a + 2)*(b – 3);    28
  b := a div 5;                 5
  a := a mod b;            3
  a := a + 1;              4
  b := (a + 14) mod 7;          4
end.
Порядок виконання операцій
 • обчислення виразів у дужках
 • множення, ділення, div, mod зліва направо
 • додаванні і віднімання зліва направо
          2 3 5 4 1         7 8 6 9
  z := (5*a*c+3*(c-d))/a*(b-c)/ b;
                                  5ac + 3(c − d )
                               z=                 (b − c)
     a 2 + 5c 2 − d ( a + b)           ab
  x=
        (c + d )(d − 2a )

      2 6 3 4 7 5 1    12 8 11 10 9
 x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));
Додавання двох чисел
Задача. Ввести два цілих числа і вивести на
 екран їх суму.
Найпростіше розв’язання:
 program qq;
 var a, b, c: integer;
 begin
   read ( a, b );
   c := a + b;
   writeln ( c );
 end.
Оператор введення

read ( a );       { ввести значення
                  змінної a}
read ( a, b ); { ввести значення
               змінних a і b}

Як вводяться два числа?
 через пропуск:                  25 a
                  25 30          30 b
 через Enter:
                  25      25 a
                  30      30 b
Оператор виведення

write ( a );   { вивести значення
               змінної a}
writeln ( a ); { вивести значення
               змінної a і перейти на
               новий рядок}
writeln ( ‘Привіт!' ); { виведення
               тексту}
writeln ( ‘Відповідь: ', c );
        {виведення тексту і значення
        змінної c}
writeln ( a, '+', b, '=', c );
Формати виведення

program qq;
var i: integer;
    x: real;
begin
  i := 15;            всього
                     символів
  writeln ( '>', i, '<' );       >15<
  writeln ( '>', i:5, '<' );     >    15<
  x := 12.345678;
  writeln ( '>', x, '<' );       >1.234568E+001<
  writeln ( '>', x:10, '<' );    > 1.23E+001<
  writeln ( '>', x:7:2, '<' );   > 12.35<
 end.       всього       в
           символів   дробовій
                       частині
Повний розв’язок
program qq;
var a, b, c: integer;
begin
  writeln(‘Ввести два цілих числа');
  read ( a, b );
  c := a + b;
  writeln ( a, '+', b, '=', c );
end.
                            це виводить комп'ютер
Протокол:
  Ввести два цілих числа
  25 30          це вводить користувач
  25+30=55
Блок-схема лінійного алгоритму

    початок           блок «початок»


   ввести a, b        блок «ввести»


  c := a + b;          блок «процес»


   вивести c        блок «вивести»



     кінець             блок «кінець»
Завдання
"4": Ввести три числа, знайти їх суму і добуток.
    Приклад:
     Ввести три числа:
     4   5    7
     4+5+7=16
     4*5*7=140

"5": Ввести три числа, знайти їх суму, добуток і
     середнє арифметичне.
    Приклад:
     Ввести три числа:
     4   5    7
     4+5+7=16
     4*5*7=140
     (4+5+7)/3=5.33
Програмування на
  мові Паскаль
 Тема 2. Розгалуження
Алгоритми розгалуження
Задача. Ввести два цілих числа і вивести на екран
 більше з них.
Ідея розв’язання: потрібно вивести на екран перше
 число, якщо воно більше другого, або друге, якщо воно
 більше першого.
Особливості: дії виконавця залежать від деяких умов
 (якщо … інакше …).

  Алгоритми, в яких послідовність кроків залежить від
   Алгоритми, в яких послідовність кроків залежить від
 виконання деяких умов, називаються розгалуженими.
 виконання деяких умов, називаються розгалуженими.
Варіант 1. Блок-схема
             початок
                           блок «логічний
                              вираз»
           ввести a,b

     так                  ні                повна форма
             a > b?                         розгалуження


max:= a;                 max:= b;




           вивести max


             кінець
                                 ?   Якщо a = b?
Варіант 1. Програма
program qq;
var a, b, max: integer;
begin
  writeln(‘Ввести два цілих числа');
  read ( a, b );
                               повна форма
  if a > b then begin
                                 умовного
     max := a;                  оператора
  end
  else begin
     max := b;
  end;
  writeln (‘Більше число ', max);
end.
Умовний оператор

 if <умова> then begin
   {що робити, якщо умова правильна}
 end
 else begin
   {що робити, якщо умова неправильна}
 end;

Особливості:
 • перед else НЕ ставиться крапка з комою
 • друга частина (else …) може бути відсутня (неповна
   форма)
 • якщо в блоці один оператор, можна забрати слова
   begin і end
Що неправильно?
if a > b then begin
                      if a > b then begin
  a := b;
                        a := b; end
end
                      else begin
else begin
                        b := a;
  b := a;
                      end;
end;

if a > b then begin   if a > b then begin
  a := b;               a := b;
end                   end;
                      end
     begin
else b > a begin      else begin
  b := a;               b := a;
end;                  end;
Варіант 2. Блок-схема
               початок

             ввести a,b

              max:= a;
                                неповна форма
      так
                                 розгалуження
                           ні
               b > a?

  max:= b;



             вивести max


               кінець
Варіант 2. Програма
program qq;
var a, b, max: integer;
begin
  writeln(‘Ввести два цілих числа');
  read ( a, b );
  max := a;              неповна форма
                            умовного
  if b > a then            оператора
    max := b;
  writeln (‘Більше число ', max);
end.
Варіант 2Б. Програма
program qq;
var a, b, max: integer;
begin
  writeln(‘Ввести два цілих числа');
  read ( a, b );
  max := b;
  if a ???b then
        >
       ???
      max := a;
  writeln (‘Більше число ', max);
end.
Що неправильно?


                      if a > b then begin
if a > b then begin
     a := b;            a := b;
          b
else b := a;          end;
                      end
                      else b := a;



if a > b then         if a > b then
          b
     a := b;          else beginthen
                      if b >= a
else b := a; end;       bb:= a;
                           := a;
                      end;
Завдання
"4": Ввести три числа і знайти найбільше з них.
    Приклад:
     Ввести три числа:
     4   15   9
     Найбільше число 15
"5": Ввести п’ять чисел і знайти найбільше з них.
    Приклад:
     Ввести п’ять чисел:
     4    15    9    56         4
     Найбільше число 56
Програмування на
  мові Паскаль
 Тема 3. Складені умови
Складені умови
Задача. Фірма набирає співробітників від 25 до 40 років
 включно. Ввести вік людини і визначити, чи підходить
 вона фірмі (вивести відповідь “підходить” або “не
 підходить”).
Особливості: потрібно перевірити, виконання двох умов
 одночасно.


    ?   Чи можна розв’язати відомими методами?
Варіант 1. Алгоритм

                           початок

                          ввести x

                  так                     ні
                          x >= 25?
     так                   ні
              x <= 40?

‘підходить'              ‘не підходить'   ‘не підходить'



                            кінець
Варіант 1. Програма
program qq;
var x: integer;
begin
  writeln(‘Ввести вік');
  read ( x );
  if x >= 25 then
     if x <= 40 then
          writeln (‘Підходить')
     else writeln (‘Не підходить')
  else
     writeln (‘Не підходить');
end.
Варіант 2. Алгоритм

                початок

                ввести x


        так     x >= 25        ні
                    і
                x <= 40?

  ‘підходить'              ‘не підходить'



                 кінець
Варіант 2. Програма

program qq;
var x: integer;
begin                           складена
  writeln(‘Ввести вік');         умова

  read ( x );
  if (x >= 25) and (x <= 40) then
       writeln (‘Підходить')
  else writeln (‘Не підходить')
end.
Складена умова
Складена умова – це умова, яка складається з декількох
 простих умов (відношень), зв’язаних з допомогою
 логічних операцій:
  • not – НІ (заперечення, інверсія)
  • and – І (логічне множення, кон'юнкція,
         одночасне виконання умов)
  • or – АБО (логічне додавання, диз'юнкція,
         виконання хоча б одної з умов)
  • xor – виключаюче АБО (виконання тільки одної з
    двох умов, але не обох)
Прості умови (відношення)          дорівнює    не дорівнює

     <       <=       >       >=        =      <>
Складена умова
Порядок виконання
  • вирази в дужках
  • not
  • and
  • or, xor
  • <, <=, >, >=, =, <>
Особливості – кожна з простих умов обов'язково
 береться в дужки.
Приклад
      4     1     6    2      5     3
  if not (a > b) or (c <> d) and (b <> a)
  then begin
    ...
  end
Складена умова
Істинне чи хибне при a := 2; b := 3; c := 4;
   not (a > b)                    True
                                       True
   (a < b) and (b < c)
                                            True
   not (a >= b) or (c = d)
   (a < c) or (b < c) and (b < a)                True

   (a < b) xor not (b > c)                       FALSE
Для яких значень x істинні умови:
  (x   <   6)   and (x < 10)       (-∞, 6)               x<6
  (x   <   6)   and (x > 10)          ∅
  (x   >   6)   and (x < 10)       (6, 10)
  (x   >   6)   and (x > 10)       (10, ∞)           x > 10
  (x   <   6)   or (x < 10)       (-∞, 10)           x < 10
  (x   <   6)   or (x > 10)    (-∞, 6) ∪ (10,∞)
  (x   >   6)   or (x < 10)        (-∞, ∞)
  (x   >   6)   or (x > 10)         (6, ∞)               x>6
Завдання
"4": Ввести номер місяця і вивести назву пори року.
    Приклад:
      Ввести номер місяця:
      4
      весна
"5": Ввести вік людини (від 1 до 150 років) и вивести
     його разом з наступним слово “рік”, “роки" або
     “років".
    Приклад:
      Ввести вік:               Ввести вік:
      24                        57
      Вам 24 роки               Вам 57 років
Програмування на
  мові Паскаль
    Тема 4. Цикли
Цикли
Цикл – це багатократне виконання однакової
 послідовності дій.
  • цикл з відомою кількістю кроків
  • цикл з невідомою кількістю кроків (цикл з умовою)
Задача. Вивести на екран квадрати і куби цілих чисел від
 1 до 8 (від a до b).
Особливості: однакові дії виконуються 8 раз.



   ?   Чи можна розв’язати відомими методами?
Алгоритм
       початок             задати початкове значення
                                 змінної циклу
        i := 1;
                           перевірити, чи все
                               виконали
                      ні
       i <= 8?                кінець
              так            обчислити квадрат і куб
       i2 := i * i;
      i3 := i2 * i;
                            вивести результат

       i, i2, i3
                              перейти до
                             наступного i
       i := i + 1;
Алгоритм (з блоком "цикл")

                                   блок "цикл"
           початок


           i := 1,8       кінець


          i2 := i * i;
          i3 := i2 * i;
                                   тіло циклу
           i, i2, i3
Програма

program qq;
var i, i2, i3: integer;
begin       початкове значення

  змінна циклу         кінцеве значення


  for i:=1 to 8 do begin
     i2 := i*i;
     i3 := i2*i;
     writeln(i:4, i2:4, i3:4);
  end;
end.
Цикл з зменшенням змінної
Задача. Вивести на екран квадрати і куби цілих чисел від
 8 до 1 (в зворотному порядку).
Особливості: змінна циклу повинна зменшуватися.
Розв’язання:
  ...
  for i:=8 downto 1 do begin
    i2 := i*i;
    i3 := i2*i;
    writeln(i:4, i2:4, i3:4);
  end;
  ...
Цикл з змінною
Збільшення змінної на 1:
  for <змінна> := <початкове значення> to
      <кінцеве значення> do begin
    {тіло циклу}
  end;

Зменшення змінної на 1:
 for <змінна> := <початкове значення>
           downto
     <кінцеве значення> do begin
   {тіло циклу}
 end;
Цикл з змінною
Особливості:
  • змінна повинна бути тільки цілою (integer)
  • крок зміни змінної циклу завжди рівний 1 (to) або -1
    (downto)
  • якщо в тілі циклу тільки один оператор, слова
    begin і end можна не писати:
        for i:=1 to 8 do
          writeln(‘Привіт');
  • якщо кінцеве значення менше початкового, цикл
    (to) не виконується ні разу (перевірка умови в
    початку циклу, цикл з передумовою)
Цикл з змінною
Особливості:
  • в тілі циклу не дозволяється змінювати змінну циклу
    (чому?)
  • при зміні початкового і кінцевого значення всередині
    циклу кількість кроків не змінюється:

          n := 8;
          for i:=1 to n do begin
            writeln('Привіт');
                                                немає
            n := n + 1;                     зациклювання
          end;
Цикл з змінною
Особливості:
  • після виконання циклу в багатьох системах
    встановлюється перше значення змінної циклу, при
    якому порушується умова:

       for i:=1 to 8 do                   i=9
                      НО
         writeln('Привіт');
                 О ВА
               НТ
       writeln('i=', i);
            УМЕ
          ОК
       НЕД
       for i:=8 downto 1 do
         writeln('Привіт');               i=0
       writeln('i=', i);
Скільки разів виконається цикл?

a := 1;                           a= 4
for i:=1 to 3 do a := a+1;

a := 1;
                                  a= 1
for i:=3 to 1 do a := a+1;

a := 1;
                                   a= 1
for i:=1 downto 3 do a := a+1;

a := 1;
for i:=3 downto 1 do a := a+1;     a= 4
Як змінюється крок?
Задача. Вивести на екран квадрати і куби непарних цілих
 чисел від 1 до 9.
Особливості: змінна циклу повинна збільшуватися на 2.
Проблема: в Паскалі крок може бути 1 або -1.
Розв’язання:
  ...
  for i:=1 to 9 do begin
    if i mod 2 = 1 then begin
             ???
       i2 := i*i;                      виконується
       i3 := i2*i;                      тільки для
                                       непарних i
       writeln(i:4, i2:4, i3:4);
    end;
  end;
  ...
                                ?
                               Що погано?
Як змінюється крок? – II
Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється
  від 1 до 5. Початкове значення i дорівнює 1, з кожним
  кроком циклу i збільшується на 2.
Розв’язання:
  ...
   ???
  i := 1;
  for k:=1 to 5 do begin
    i2 := i*i;
    i3 := i2*i;
    writeln(i:4, i2:4, i3:4);
      ???
     i := i + 2;
  end;
  ...
Як змінюється крок? – III
Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється
  від 1 до 5. Знаючи k, потрібно розрахувати i.
  k      1      2      3      4      5        i = 2k-1
  i      1      3      5      7      9
Розв’язання:
  ...
  for k:=1 to 5 do begin
    i ???2*k – 1;
       :=
    i2 := i*i;
    i3 := i2*i;
    writeln(i:4, i2:4, i3:4);
  end;
  ...
Завдання
"4": Ввести a і b і вивести квадрати і куби чисел від a до b.
      Приклад:
        Введіть границі інтервалу:
        4 6
          4 16       64
          5 25 125
          6 36 216
"5": Вивести квадрати і куби 10 чисел наступної
     послідовності: 1, 2, 4, 7, 11, 16, …
      Приклад:
          1       1       1
          2       4       8
          4     16      64
               ...
         46 2116 97336
Програмування на
  мові Паскаль
 Тема 5. Цикли з умовою
Цикл з невідомою кількістю кроків
Приклад: Відрізати поліно від колоди. Скільки разів потрібно
 зробити рух пилкою?
Задача: Ввести ціле число (<2000000) і визначити кількість
 цифр у ньому.
Ідея розв’язання: Відрізаємо послідовно останню цифру,
  збільшуємо лічильник.
                       n      count
                      123       0
                      12        1
                       1        2
                       0        3

Проблема: Невідомо, скільки кроків потрібно зробити.
Розв’язання: Потрібно зупинитися, коли n = 0, тобто
 потрібно робити “поки n <> 0".
Алгоритм

               початок

               ввести n
                                 обнулити лічильник цифр

              count := 0;
                                           виконувати
                                         "поки n <> 0"

                            ні
                n <> 0?

                      так
                                    count
           count := count + 1;
               n := n div 10;
                                    кінець
Програма
program qq;
            , n1: integer;
var n, count: integer;
begin
  writeln(‘Ввести ціле число');
  read(n); n1 := n;                 виконувати
                                  "поки n <> 0"
  count := 0;
  while n <> 0 do begin
     count := count + 1;
     n := n div 10;
  end;
  writeln('В числі ', n1, ' знайшли ',
                       n,
            count, ' цифр');
end.                           ?   Що погано?
Цикл с умовою
 while <умова> do begin
   {тіло циклу}
 end;
Особливості:
  • можна використовувати складені умови:
       while (a<b) and (b<c) do begin
         {тіло циклу}
       end;
  • якщо в тілі циклу тільки один оператор, слова
    begin і end можна не писати:
       while a < b do
           a := a + 1;
Цикл з умовою
Особливості:
  • умова перевіряється кожен раз при вході в цикл
  • якщо умова на вході в цикл хибна, цикл не
    виконується жодного разу
       a := 4; b := 6;
       while a > b do
          a := a – b;
  • якщо умова ніколи не стане хибною, програма
    зациклиться
       a := 4; b := 6;
       while a < b do
          d := a + b;
Скільки разів виконується цикл?
a := 4; b := 6;                   2 рази
                                   a=6
while a < b do a := a + 1;

a := 4; b := 6;                   1 раз
                                  a = 10
while a < b do a := a + b;

a := 4; b := 6;                   0 разів
                                   a=4
while a > b do a := a + 1;

a := 4; b := 6;                   1 раз
                                  b = -2
while a < b do b := a - b;
                              зациклюванн
a := 4; b := 6;                    я
while a < b do a := a - 1;
Заміна for на while і навпаки
                           i := 1;
 for i:=1 to 10 do begin
                           while i <= 10 do begin
   {тіло циклу}
                             {тіло циклу}
 end;
                             i := i + 1;
                           end;

                           i := a;
 for i:=a downto b do
                           while i >= b do begin
   begin
                             {тіло циклу}
   {тіло циклу}
                             i := i - 1;
 end;
                           end;

    Заміна циклу for на while можлива завжди.

Заміна while на for можлива тільки тоді, коли можна
     наперед розрахувати кількість кроків циклу.
Завдання

"4": Ввести ціле число і знайти суму його цифр.
     Приклад:
      Ввести ціле число:
      1234
      Сума цифр числа 1234 рівна 10.

"5": Ввести ціле число і визначити, чи правда, що в
    його записі є дві однакові цифри.
     Приклад:
 Ввести ціле число:        Ввести ціле число:
 1234                        1224
 Ні.                       Так.
Послідовності
Приклади:
  • 1, 2, 3, 4, 5, …             an = n      a1 = 1, an+1 = an+1

  • 1, 2, 4, 7, 11, 16, …                   a1 = 1, an+1 = an + n

  • 1, 2, 4, 8, 16, 32, …       an = 2n-1        a1 = 1, an+1 = 2an

    1 1 3 1 5                        1 2 3 4 5
  •  , , , ,   , ...                  , , , ,    , ...
    2 2 8 4 32                       2 4 8 16 32

               bn       b1 = 1, bn+1 = bn+1
          an =
               cn           c1 = 2, cn+1 = 2cn
Послідовності
Задача: знайти суму всіх елементів послідовності,
            1 2      3    4     5
        1, − ,   , − ,      , − , ...
            2 4      8 16      32
 які по модулю більші 0,001:

                   1 2 3 4 5
             S = 1− + − +  − + ...
                   2 4 8 16 32
Елемент послідовності (починаючи з №2):
                n   1    2     3    4    5    ...   b := b+1;
         b      b   1    2     3    4    5    ...
  a= z                                              c := 2*c;
         c      c   2    4     8    16   32   ...
                z   -1   1     -1   1    -1   ...   z := -z;
Алгоритм
                   початок                   початкове
                                             значення
                S := 0; b := 1;
                c := 2; z := -1;               перший елемент
                     a := 1;


                                   ні
                 |a| > 0.001?

                         так
                                               S
                  S := S + a;
новий елемент

                  a := z*b/c;
                                             кінець
                    b := b + 1;
    зміни       c := 2*c; z := -z;


                                        ?   Перестановка?
Програма
program qq;                      початкове
var b, c, z: integer;            значення
    S, a: real;
begin
   S := 0; z := -1;
   b := 1; c := 2; a := 1;
   while abs(a) > 0.001 do begin
                                     збільшення
      S := S + a;                        суми
      a := z * b / c;
      z := - z;                 розрахунок елемента
      b := b + 1;                  послідовності
      c := c * 2;
   end;                           перехід до
   writeln('S =', S:10:3);        наступного
                                   доданка
end.
Завдання
"4": Знайти суму елементів послідовності з
    точністю 0,001:
                  2     4       6     8
          S = 1+      −     +      −       + ...
                 3 ⋅ 3 5 ⋅ 9 7 ⋅ 27 9 ⋅ 81
     Відповідь:
      S = 1.157
"5": Знайти суму елементів послідовності з
    точністю 0,001:
               2     4       6     8      10
       S = 1+      −     +      −      +         − ...
              2 ⋅ 3 3 ⋅ 9 5 ⋅ 27 8 ⋅ 81 13 ⋅ 243
    Відповідь:
      S = 1.220
Цикл з післяумовою
Задача: Ввести ціле додатне число (<2000000) і
 визначити кількість цифр в ньому.
Проблема: Як не дати ввести від'ємне число або нуль?
Розв’язання: Якщо вводиться неправильне число,
 повернутися назад до введення даних (цикл!).
Особливості: Один раз тіло циклу потрібно виконати в
 будь-якому випадку => перевірку умови циклу потрібно
 виконувати в кінці циклу (цикл с післяумовою).



Цикл с післяумовою – це цикл, в якому перевірка умови
Цикл с післяумовою – це цикл, в якому перевірка умови
виконується в кінці циклу.
виконується в кінці циклу.
Цикл з післяумовою: алгоритм

              початок



              ввести n
                          тіло циклу
         ні
               n > 0?    умова ВИХОДУ
                   так


              основний
              алгоритм    блок "типовий
                             процес"

               кінець
Програма
program qq;
var n: integer;
begin
   repeat
     writeln(‘Ввести додатне число');
     read(n);         умова ВИХОДУ
   until n > 0;
   ... { основний алгоритм }
end.
Особливості:
  • тіло циклу завжди виконується хоча б один раз
  • після слова until ("до тих пір, поки не…")
    ставиться умова ВИХОДУ із циклу
Скільки разів виконується цикл?
a := 4; b := 6;                       3 рази
                                       a=7
repeat a := a + 1; until a > b;
                                      1 раз
a := 4; b := 6;
                                      a = 10
repeat a := a + b; until a > b;

a := 4; b := 6;                   зациклення
repeat a := a + b; until a < b;

a := 4; b := 6;                      2 рази
                                      b=6
repeat b := a - b; until a < b;

a := 4; b := 6;                   зациклення
repeat a := a + 2; until a < b;
Завдання (з захистом від неправильного введення)

"4": Ввести натуральне число і визначити, чи правда що
   сума його цифр дорівнює 10.
  Приклад:
    Ввести число >= 0:         Введіть число >= 0:
    -234                          1233
    Потрібно додатне число. Ні
    Ввести число >= 0:
    1234
    Так

"5": Ввести натуральне число і визначити, які цифри
   зустрічаються декілька разів.
    Приклад:
      Введіть число >= 0:        Введіть число >= 0:
      2323                       1234
      Повторяються: 2, 3         Немає повторів.
Програмування
на мові Паскаль
Тема 6. Оператор вибору
Оператор вибору
Задача: Ввести номер місяця і вивести кількість
        днів в цьому місяці.
Розв’язання: Кількість днів у місяцях:
 28 днів – 2 (лютий)
 30 днів – 4 (квітень), 6 (червень), 9 (вересень),
          11 (листопад)
 31 день – 1 (січень), 3 (березень), 5 (травень),
            7 (липень), 8 (серпень), 10 (жовтень),
           12 (грудень)
Особливості: Вибір не з двох, а з декількох варіантів в


   ?
              залежності від номера місяця.
        Чи можна розв’язати відомими методами?
Алгоритм
              початок

              ввести M

                         так
              M = 1?           D := 31;               оператор вибору
              ні
                         так
              M = 2?           D := 28;
              ні


                         так
              M = 12?          D := 31;
              ні
                                          вивести D
  жоден з     помилка
 варіантів
не підійшов
              кінець
Програма
program qq;
var M, D: integer;
begin
   writeln(‘Ввести номер місяця:');
   read ( M );
   case M of
    2:        begin D := 28; end;
    4,6,9,11: begin D := 30; end;
    1,3,5,7,8,10,12: D := 31;
    else             D := -1;            жоден варіант не
   end;                                     підійшов

   if D > 0 then
      writeln(‘В цьому місяці ', D, ' днів.')
   else
      writeln(‘Неправильний номер місяця');
end.
Оператор вибору
Особливості:
  • після case може бути ім’я змінної або арифметичний
    вираз цілого типу (integer)
             case i+3 of
              1: begin a := b; end;
              2: begin a := c; end;
             end;
   або символьного типу (char)

             var c: char;
             ...
             case c of
              'а': writeln('Антилопа');
              'б': writeln('Борсук');
              else writeln('Не знаю');
             end;
Оператор вибору
Особливості:
  • якщо потрібно виконати тільки один оператор,
    слова begin і end можна не писати
                 case i+3 of
                  1: a := b;
                  2: a := c;
                 end;

  • не можна ставити два однакових значення
                 case i+3 of
                  1: a := b;
                  1: a := c;
                 end;
Оператор вибору
Особливості:
  • значення, при яких виконуються однакові дії, можна
    групувати

                    case i of
 перечислення
                     1:            a := b;
                     2,4,6:        a := c;
    діапазон
                     10..15:       a := d;
                     20,21,25..30: a := e;
     суміш           else writeln(‘Помилка');

                    end;
Що неправильно?

 case a of              case a of
  2: begin a := b;       2: a := b ;
  4: a := c;             4: a := c
 end;                   end;

 case a of              case a of
  2..5: a := b;          0..2: a := b;
  4: a := c;             6..3: a := c;
                         3..6:
 end;                   end;
                        begin
 case a+c/2 of       case a of
  2: a := b;          2: a := b; d := 0; end;
  4: a := c;          4: a := c;
 end;                end;
Завдання (з захистом від неправильного введення)

"4": Ввести номер місяця і вивести кількість днів в ньому, а
   також кількість помилок при введенні.
  Приклад:
    Введіть номер місяця:      Введіть номер місяця:
    -2                         2
    Введіть номер місяця:      В цьому місяці 28 днів.
    11                         Ви вводили неправильно 0 раз.
    В цьому місяці 30 днів.
    Ви вводили неправильно 1   раз.

"5": Ввести номер місяця і номер дня, вивести кількість
   днів, які залишилися до Нового року.
    Приклад:
      Ввести номер місяця:
      12
      Ввести день:
      25
      До Нового року залишилося 6 днів.
Програмування на
  мові Паскаль
   Тема 7. Графіка
Система координат

                                X
   (0,0)


                    y


           x            (x,y)




    Y
Керування кольором
Колір і товщина ліній, колір точок:
        Pen ( 1, 255, 0, 0 );
     товщина     R(red)   G(green)             B(blue)
       лінії     0..255       0..255               0..255

Колір і стиль заливки:
        Brush ( 1, 0, 255, 0 );
      0 – виключити       R        G       B
      1 – включити

Колір тексту:
        TextColor ( 0, 0, 255 );
                              R        G       B
Точки, відрізки і ламані
           (x, y)
                                 Pen (1, 0, 0, 255);
                                 Point (x, y);
  (x1, y1)

                    (x2, y2)     Pen (1, 0, 255, 0);
                                 Line (x1, y1, x2, y2);

(x1, y1)        (x2, y2)
                                 Pen (1,   255,   0, 0);
                                 MoveTo    (x1,   y1);
                      (x3, y3)   LineTo    (x2,   y2);
(x5, y5)                         LineTo    (x3,   y3);
                                 LineTo    (x4,   y4);
                                 LineTo    (x5,   y5);
                (x4, y4)
Фігури з заливкою

 (x1, y1)
                                Pen (1, 0, 0, 255);
                                Brush (1, 255, 255, 0);
                                Rectangle (x1, y1, x2, y2);
                (x2, y2)
(x1, y1)
                                Pen (1, 255, 0, 0);
                                Brush (1, 0, 255, 0);
                                Ellipse (x1, y1, x2, y2);
                     (x2, y2)
                                  ?   Як відмінити заливку?

            (x, y)              Brush (1, 100, 200, 255);
                                Fill (x, y);
Текст

                         TextColor (0, 0, 255);
                         Brush (1, 255, 255, 0);

                т!
                         Font (20, 30, 600);
(x, y)        і
          р ив30       розмір         кут
                                   повороту
                                              насиченість:
                                               400 – нормальний
         П     о     10 пікселів
                                               600 – жирний
                         MoveTo (x, y);
                         writeln ('Привіт!');
Приклад

                                program qq;
                                begin
           (200, 50)               Pen(2, 255, 0, 255);
                                   Brush(1, 0, 0, 255);
(100, 100)                         Rectangle(100, 100, 300, 200);
                                   MoveTo(100, 100);
                                   LineTo(200, 50);
                                   LineTo(300, 100);
                                   Brush(1, 255, 255, 0);
                     (300, 200)    Fill(200, 75);
                                   Pen(2, 255, 255, 255);
                                   Brush(1, 0, 255, 0);
                                   Ellipse(150, 100, 250, 200);
                                end.
Завдання
"4": "Жабка"




"5": "Корона"
Штриховка
                                               x2 − x1
(x1, y1)
                  N ліній (N=5)             h=
                                                N +1

                                  Rectangle (x1,   y1,   x2, y2);
                                  Line( x1+h,      y1,   x1+h,   y2);
                                  Line( x1+2*h,    y1,   x1+2*h, y2);
                                  Line( x1+3*h,    y1,   x1+3*h, y2);
           h      (x2, y2)        ...         x              x

 h := (x2 – x1) / (N + 1);
 Rectangle (x1, y1, x2, y2);          var x, h: real;
 x := x1 + h;                          заокруглення до
 for i:=1 to N do begin               найближчого цілого
   Line( round(x), y1, round(x), y2);
   x := x + h;
 end;
Як міняти колір?
(x1, y1) x                                сірий: R = G = B


                               Brush ( 1, c, c, c );
             (x-1, y1+1)
                               Fill ( ???, ??? );
                                                           255
                               Крок зміни c:          hc =
                    (x2, y2)                               N +1
                                           var c, hc: integer;
 hc := 255 div (N + 1);
 c := 0;
 for i:=1 to N+1 do begin
   Line (round(x), y1, round(x), y2);
   Brush (1, c, c, c);
   Fill (round(x)-1, y1+1);
   x := x + h; c := c + hc;
 end;
Штриховка

           a                                                   x3 − x2
                                           a = x2 − x1    h=
               (x1, y1)      (x3+a, y1)                         N +1

                                     Line( x1+h,   y1, x1+h-a,   y2);
                                     Line( x1+2*h, y1, x1+2*h-a, y2);
(x2, y2)                  (x3, y2)   Line( x1+3*h, y1, x1+3*h-a, y2);
               h                     ...
                                                x           x-a
     h := (x3 – x2) / (N + 1);
     a := x2 – x1;
     x := x1 + h;
     for i:=1 to N do begin
       Line( round(x), y1, round(x-a), y2);
       x := x + h;
     end;
Штриховка
                                       x2 − x1          y2 − y1
(x1, y1)                        hx =             hy =
                                        N +1             N +1
           hx
                                Line( x1, y1+hy,   x1+hx,
                                y1+hy) ;
                                Line( x1, y1+2*hy, x1+2*hx,
                     hy         y1+2*hy);
                                Line( x1, y1+3*hy, x1+3*hx,
                                              y         x        y
                                y1+3*hy);
                                ...
                           hx := (x2 – x1) / (N + 1);
                (x2, y2)   hy := (y2 – y1) / (N + 1);
                           x := x1 + hx; y := y1 + hy;
                           for i:=1 to N do begin
                             Line( x1, round(y), round(x), round(y));
                             x := x + hx; y := y + hy;
                           end;
Завдання
"4": Ввести з клавіатури кількість ліній штриховки і
    побудувати фігуру, заливши всі області різним
    кольором.




"5": Ввести з клавіатури кількість кіл і побудувати фігуру,
    заливши всі області різними кольорами.
Програмування на
  мові Паскаль
 Тема 8. Графіки функцій
Побудова графіків функцій
Задача: побудувати графік функції y = 3 sin(x) на
  інтервалі від 0 до 2π.

Аналіз:
   максимальне значення ymax = 3   при x = π/2
   мінімальне значення ymin = -3 при x = 3π/2

Проблема: функція задана в математичній системі
  координат, будувати потрібно на екрані, вказуючи
  координати в пікселях.
Перетворення координат
          Математична                         Екранна система
        система координат                    координат (пікселі)
 Y                                      a
                                (0,0)
        x       (x,y)                               yе
                                b       xе
            y             X                         (xе,yе)
(0,0)




 k – масштаб (довжина
        зображення одиничного                xе = a + kx
        відрізка на екрані)
                                             yе = b - ky
Програма
              program qq;
                                                   2π
              const a = 50; b = 200; k = 50;
                     xmin = 0; xmax = 6.2832;
              var x, y, h: real;               h – крок зміни x
  на екрані       xe, ye, w: integer;
              begin                   w – довжина осі ОХ в пікселях
                w := round((xmax - xmin)*k);
                Line(a-10, b, a+w, b);
                                                осі координат
                Line(a, 0, a, 2*b);
                x := xmin; h := 0.05;
   цикл         while x <= xmax do begin
побудови          y := 3*sin(x);
 графіка
                  xe := a + round(k*x);
                  ye := b - round(k*y);
                  Point (xe, ye);
                  x := x + h;

                                             ?
                end;
              end.                              Що погано?
Як з’єднати точки?
Алгоритм:                   Програма:               логічна змінна

Якщо перша точка            var first: boolean;
 перейти в точку (xе,yе)         ...
                                            початкове значення
інакше                      begin
 відрізок в точку (xе,yе)     ...
                              first := True;
                              while x <= xmax do begin
                                 ...
               вибір             if first then begin
              варіанта               MoveTo(xe, ye);
                 дії                 first := False;
                                 end
                                 else LineTo(xe, ye);
                                 ...
                              end;
                            end.
Завдання
"4": Побудувати графік
   функції y = x2 на інтервалі
   [-3,3].




"5": Побудувати графік
   функції (еліпс)
       x2 y2
         +   =1
       16 9
Програмування на
  мові Паскаль
  Тема 9. Процедури
Процедури
Задача: Побудувати фігуру:




  ?   Чи можна розв’язати відомими методами?

Особливості: Три схожі фігури.
 подібності: розміри, кут повороту
 відмінності: координати, колір

  ?   Скільки координат потрібно задати?
Процедури
Процедура – це допоміжний алгоритм, який призначений
  для виконання деяких дій.
Примітка:
   • виконання однакових дій в різних місцях програми
   • розбивка програми (або іншої процедури) на
     підзадачі для кращого сприймання


                          Задача

        Підзадача1       Підзадача2           Підзадача3


      1.1   1.2   1.3   2.1   2.2     2.3   3.1   3.2   3.3
Процедури
Порядок розробки:
 • виділити однакові або схожі дії (три фігури)
 • знайти в них спільне (розміри, форма, кут повороту) і
   відмінності (координати, колір)
 • відмінності записати у вигляді невідомих змінних, вони будуть
   параметрами процедури
                                            параметри
                          заголовок
   (x, y-60)
                             procedure Tr( x, y, r, g, b: integer);
  60           (x+100, y)    begin
                                MoveTo(x, y);                  колір
                                LineTo(x, y-60);
(x, y)     100
                                LineTo(x+100, y);
                                                      координати
                                LineTo(x, y);
                                Brush(1, r, g, b);
                                Fill(x+20, y-20);
         тіло процедури
                             end;
Програма
                                   формальні параметри
60                   program qq;
                       procedure Tr( x, y, r, g, b: integer);
(100,100)              begin
                         ...
               100     end;
                     begin
                        Pen(1, 255, 0, 255);
          виклик        Tr(100, 100, 0, 0, 255);    процедура
        процедури       Tr(200, 100, 0, 255, 0);
                        Tr(200, 160, 255, 0, 0);
                     end.




                                 фактичні параметри
Процедури
Особливості:
• всі процедури розміщені вище основної програми
• в заголовку процедури перераховуються
  формальні параметри, вони позначаються
  іменами, оскільки можуть змінюватися
      procedure Tr( x, y, r, g, b: integer);

• при виклику процедури в дужках вказуються
  фактичні параметри (числа або арифметичні
  вирази) в тому ж порядку

              Tr (200, 100, 0, 255, 0);

          x       y        r   g   b
Процедури
Особливості:
• для кожного формального параметра після двокрапки
  вказується його тип
   procedure A (x: real; y: integer; z: real);

• якщо однотипні параметри стоять поряд, їх
  перераховують через кому
   procedure A (x, z: real; y, k, l: integer);

• всередині процедури параметри використовуються
  так само, як і змінні
Процедури
Особливості:
• в процедурі можна оголошувати додаткові локальні
  змінні, інші процедури не мають до них доступу


     program qq;
       procedure A(x, y: integer);
       var a, b: real;               локальні
                                      змінні
       begin
          a := (x + y)/6;
          ...
       end;
     begin
       ...
     end.
Параметри-змінні
Задача: скласти процедуру, яка міняє місцями значення
  двох змінних.
Особливості:
   потрібно, щоб зміни зроблені в процедурі, стали
   відомі програмі яка викликає
 program qq;
 var x, y: integer;
   procedure Exchange ( a, b: integer );
   var c: integer;                         ця процедура
   begin                                     працює з
     c := a; a := b; b := c;                 копіями
   end;                                     параметрів
 begin
   x := 1; y := 2;
   Exchange ( x, y );
   writeln ( ’x = ’, x, ’ y = ’, y );      x = 1 y = 2
 end;
Параметри-змінні
                            параметри можуть змінюватися

procedure Exchange ( var     a, b: integer );
var c: integer;
begin
  c := a; a := b; b := c;
end;

Примітка:
 таким чином процедура (і функція) можуть повертати
 декілька значень,
Заборонені варіанти виклику
  Exchange ( 2, 3 );           { числа }
  Exchange ( x+z, y+2 ); { вирази }
Задания
"4": Використовуючи процедуру, побудувати фігуру.




"5": Використовуючи процедуру, побудувати фігуру.
Програмування на
  мові Паскаль
   Тема 10. Рекурсія
Рекурсивні об’єкти
Приклади:              Казка про попа і собаку:
                  У попа була собака, він її любив.
                  У попа була собака, він її любив.
                  Вона з’їла кусок м’яса, він її убив.
                  Вона з’їла кусок м’яса, він її убив.
                  В ямку закопав, надпис написав:
                  В ямку закопав, надпис написав:
                        Казка про попа іі собаку
                         Казка про попа собаку

Малюнок з рекурсією:     Факторіал:
                                        1,       якщо N = 1,
                            N!= 
                                  N ⋅ ( N − 1)!, якщо N > 1.
                           1!= 1, 2!= 2 ⋅1!= 2 ⋅1, 3!= 3 ⋅ 2!= 3 ⋅ 2 ⋅1
                           4!= 4 ⋅ 3!= 4 ⋅ 3 ⋅ 2 ⋅1
                           N != N ⋅ ( N − 1) ⋅ ⋅ 2 ⋅1

Рекурсивний об’єкт – це об’єкт, визначений через один
    або декілька таких же об’єктів.
Дерево Піфагора
Дерево Піфагора з N рівнів – це стовбур і відходячі від нього
  симетрично два дерева Піфагора з N-1 рівнем, такі що довжина
  їх стовбурів в 2 рази менша і кут між ними рівний 90o.

6 рівнів:




   ?   Як довести, що це рекурсивна фігура?
Дерево Піфагора
Особливості:               коли кількість рівнів, що
• коли зупинитися?         залишилися стане рівним
                           нулю!
• дерева мають різний нахил

               α+45o                x1 = x0 + L·cos(α)
                       α-45o        y1 = y0 – L·sin(α)
    (x1, y1)

       L                       нахил "дочірніх" дерев
               α                        α + π/4
                                        α – π/4
   (x0, y0)
Процедура              кут α   довжина стовбура

procedure Pifagor(x0, y0, a, L: real;
                  N: integer);
const k = 0.6;    { зміна довжини }
var x1, y1: real; { локальні змінні }
begin                         завершити, якщо N=0
  if N > 0 then begin
     x1 := x0 + L*cos(a);
     y1 := y0 - L*sin(a);              рекурсивні
     Line (round(x0), round(y0),         виклики
           round(x1), round(y1));
     Pifagor (x1, y1, a+pi/4, L*k, N-1);
     Pifagor (x1, y1, a-pi/4, L*k, N-1);
  end;
end;           Рекурсивною називається процедура,
                      викликаюча сама себе.
Програма

program qq;
  procedure Pifagor(x0, y0, a, L: real;
                    N: integer);
  ...                      довжина стовбура
                    кут α
  end;
begin
  Pifagor (250, 400, pi/2, 150, 8);
end;
           x0   y0                    кількість рівнів



 ?   Як нахилити дерево вправо на 30o?

      Pifagor (250, 400, 2*pi/3, 150, 8);
Задания
"4": Використовуючи рекурсивну процедуру, побудувати фігуру:




"5": Використовуючи рекурсивну процедуру, побудувати фігуру :
Програмування на
  мові Паскаль
  Тема 11. Анімація
Анімація
Анімація (англ. animation) – оживлення
  зображення на екрані.
Задача: всередині синього квадрата 400 на
  400 пікселів зліва направо рухається жовтий
  квадрат 20 на 20 пікселів. Програма
  зупиняється, якщо натиснута клавіша Esc
  або квадрат дійшов до границі синьої
  області.
Проблема: як зобразити переміщення об’єкта на екрані?
Прив’язка: розміщення об’єкта задається координатами (x,y)
Принцип анімації:
   1. малюємо об’єкт в точці (x,y)
   2. затримка на декілька мілісекунд
   3. затираємо об’єкт
   4. змінюємо координати (x,y)
   5. переходимо до кроку 1
Як "зловити" натискуванням клавіші?
Подія – це зміна в стані якого-небудь об’єкта або дія
  користувача (натиснення на клавішу, клік мишкою).
IsEvent – логічна функція, яка визначає, чи були які-небудь
  дії користувача.
Event – процедура, яка визначає, які саме дії відбулися.



   if IsEvent then begin      var k, x, y: integer;
     Event(k, x, y);
     if k = 1 then
        writeln('Клавіша з кодом ', x)
     else { k = 2 }
        writeln('Мишка: x=', x, ' y=', y);
   end;
Як вийти з циклу при натисканні Esc?
                        True, якщо потрібно зупинитися
program qq;
var stop: boolean;
     k,code,i: integer;      запуск циклу
begin
  stop := False;              якщо що-небудь відбулося...
  repeat
     if IsEvent then begin
       Event(k, code, i);                 що відбулося?
       if (k = 1) and (code = 27) then
         stop := True;
     end;                    якщо натиснута клавіша
                               з кодом 27 (Esc), то
     ...
                                       стоп
  until stop;
end;
Процедура (малювання і стирання)
                          Ідея
  (x, y)                    • одна процедура малює і стирає
                            • стерти = намалювати кольором фону
                            • границю квадрата відключити (в
                              основній програмі)
           (x+20, y+20)
                             малювати (True) або ні (False)?


procedure Draw(x, y: integer; flag: boolean);
begin
                         малюємо: колір пензлика – жовтий
  if flag then
     Brush(1, 255, 255, 0)
  else                     стираємо: колір пензлика – синій
     Brush(1, 0, 0, 255);
  Rectangle(x, y, x+20, y+20);
end;
                                    тільки заливка!
Повна програма
program qq;
var x, y, k, code, i: integer;
     stop: boolean;                                    процедура
  procedure Draw(x,y: integer; flag: Boolean);
  begin
  ...
  end;
begin                                синій фон
  Brush(1, 0, 0, 255);
  Rectangle(10, 10, 400, 400);
                                    відключити границю
  Pen(0, 0, 0, 255);                                        початкова
  x := 10; y := 200; stop := false;                           умова
  repeat
     if IsEvent then begin                            вихід по
        ...                                         клавіші Esc
     end;
     Draw(x, y, True);
     Delay(10);          чекаємо 10 мс
     Draw(x, y, False);
     x := x + 1;                                    вихід при
     if x >= 400-20 then stop := true;          досягненні границі
  until stop;
end.
Завдання
"4": Два квадрати рухаються
   в протилежних напрямках:




"5": Два квадрати рухаються
   в протилежних напрямках
   і відбиваються від стінок
   синього квадрата:
Керування клавішами
Задача: жовтий квадрат всередині синього квадрата керується
   клавішами-стрілками. Коди клавіш:
         вліво – 37      вверх – 38       Esc – 27
         вправо – 39     вниз – 40
Проблема: як змінити напрям руху?
Розв’язання:                                   якщо було
          IsEvent
   if {була подія} then begin                 натиснуто на
     if {натиснута клавіша} then begin         клавішу, …
     Event ( k, code, i);
     if k = 1 then begin
        {отримати код клавіші - code}
      case code of then x := x – 1;
        if code = 37
        if code := 38 – 1; 38: y y – y – 1;
         37: x = x then y := := 1;
        if code := 39 + 1; 40: y x + y + 1;
         39: x = x then x := := 1;
         27: stop := True;
        if code = 40 then y := y + 1;
      end;
        if code = 27 then stop := True;
     end;
   end;
Програма
program qq;
var x, y, k, code, i: integer;          процедура
     stop: boolean;
   procedure Draw(x,y: integer; flag: Boolean);
   begin
      ...
   end;
begin
  ...                               основний цикл
  repeat
     Draw(x, y, True);
     Delay(20);
     Draw(x, y, False);
                                  опрацювання
     if IsEvent then begin            подій
       ...
     end;

                                      ?
  until stop;
end.                                        Що погано?
Як забрати блимання?
Проблема: навіть якщо не натиснута жодна клавіша,
  квадрат перемальовується через кожні 20 мс
  (блимання!)
Що бажається: не перемальовувати квадрат, якщо
  не було ніяких подій
Розв’язання: намалювати квадрат і чекати подію
Нова проблема: як чекати подію?
Розв’язання нової проблеми: пустий цикл "поки не
  трапилася подія, нічого не робити":
            while not IsEvent do;
Програма
program qq;
var x, y, k, code, i: integer;           процедура
    stop: boolean;
   procedure Draw(x,y: integer; flag: Boolean);
   begin
     ...
   end;
begin
  ...                   малюємо квадрат
  repeat                              чекаємо подію
    Draw(x, y, True);
    while not IsEvent do;         тільки тепер стираємо
     Draw(x, y, False);
     Event(k, code, i);
     ...
  until stop;
end.                           ?   Що можна покращити?
Завдання
"4": Квадрат рухається при
   натисненні стрілок, проте
   не може вийти за границі
   синього квадрата:




"5": Квадрат неперервно
   рухається, при натисненні
   стрілок міняє напрям і
   відбивається від стінок
   синього квадрата:
Обертання
Задача: зобразити модель обертання Землі навколо
  Сонця.
Проблема: рух по колу, як змінюються координати?
Розв’язання: використовувати в якості незалежної
  змінної (змінювати в циклі) кут повороту α


                     (x, y)
             L                   x = x0 + L·cos(α)
                 α
                                  y = y0 – L·sin(α)


  (x0, y0)
Процедура                     малювати (True) або ні (False)?

procedure Draw(x, y: integer; flag: boolean);
const r = 10;
                  радіус Землі
begin
                               малюємо: колір пензлика – голубий
  if flag then
     Brush(1, 100, 100, 255)
  else
     Brush(1, 0, 0, 0);        стираємо: колір пензлика – чорний
  Ellipse(x-r, y-r, x+r, y+r);
end;
                                           тільки заливка!

                     (x-r, y-r)

                            (x,y)


                                  (x+r, y+r)
Константи і змінні
program qq;
const rSun = 60;    { радіус Сонця}
       L = 150;     { радіус орбіти Землі }
       x0 = 200;    { координати центра Сонця}
       y0 = 200;
var x, y,           { координати Землі }
     k, code, i: integer; { для Event }
     a, ha: real;       { кут повороту, крок }
     stop: boolean; { признак зупинки програми }
    procedure Draw(x, y: integer; flag: Boolean);
    begin
       ...
    end;
begin
  ...
end.
Основна програма
program qq;
...                                        залити фон чорним
begin
  Brush(1, 0, 0, 0); Fill(1,1);                малюємо Сонце
  Brush(1, 255, 255, 0);
  Ellipse(x0-rSun, y0-rSun, x0+rSun, y0+rSun);
  a := 0; ha := 1*pi/180; { початковий кут, крок 1o за 100 мс}
  stop := false;
  Pen(0,0,0,0);            { відключаємо контури }
  repeat
    x := round(x0 + L*cos(a));           нові координати
    y := round(y0 - L*sin(a));
    Draw(x, y, True);
    Delay(100);              чекаємо 100 мс
    Draw(x, y, False);
     if IsEvent then begin
       Event(k, code, i);
       if (k = 1) and (code = 27) then stop := true;
     end;
    a := a + ha;
                       поворот на ha
  until stop;
end.
Завдання
"4": Зобразити модель Сонця
   з двома планетами, які
   обертаються в
   протилежних напрямках:




"5": Зобразити модель
   системи Сонце-Земля-
   Місяць:
Програмування на
  мові Паскаль
Тема 12. Випадкові числа
Випадкові числа
Випадкові події: всюди…
  • підкидання монети (“герб" або “копійка")
  • падіння снігу
  • броунівський рух
  • перешкоди при телефонному зв’язку
  • шум радіоефіру
Випадкові числа – це така послідовність чисел, для якої
 неможливо передбачити наступне число, якщо навіть
 відомі попередні.
Проблема: як одержати на комп’ютері?
Можливі розв’язання:
  • використовувати зовнішнє джерело шумових перешкод
  • з допомогою математичних перетворень
Псевдовипадкові числа
Псевдовипадкові числа – це така послідовність чисел, яка має
  властивості випадкових чисел, проте кожне наступне число
  обчислюється по заданій формулі.
Приклади:
  1. Випадкові цілі числа [0,m) (лінійний конгруентний метод)
         xn = (a ⋅ xn −1 + c) mod m           a, c, m – цілі числа

         xn = (16807 ⋅ xn −1 + 12345) mod 1073741823
       просте число                                              230-1

  2. Випадкові дійсні числа [0,1]
                                        наприклад, k = 5
                   {
              xn = (π + xn −1 ) k   }
                                          дробова частина числа
Література:
  Д. Кнут, Мистецтво програмування для ЕОМ, т.2.
Розподіл випадкових чисел
Модель: сніжинки падають на відрізок [a,b]
                             розподіл
           рівномірний                  нерівномірний




       a                 b              a           b


     ?      Скільки може бути різних розподілів ?
Розподіл випадкових чисел
Особливості:
  • розподіл – це характеристика всієї послідовності, а не одного
    числа
  • рівномірний розподіл один, комп’ютерні датчики
    (псевдо)випадкових чисел дають рівномірний розподіл
  • нерівномірних – багато
  • будь-яке нерівномірне можна отримати з допомогою
    рівномірного




         a            b                  a             b
                x1 + x2                   x1 + x2 +  + x12
             x=                        x=
                   2                              12
        рівномірний розподіл
                                          рівномірний розподіл
Генератор випадкових чисел в Паскалі
Цілі числа в інтервалі [0,N]:
  var x: integer;
  ...
  x := random ( 100 );      { інтервал [0,99] }

Дійсні числа в інтервалі [0,1]
  var x: real;
  ...
  x := random;            { інтервал [0,1] }
Випадкові числа
Задача: заповнити прямокутник
 400 на 300 пікселів рівномірно
 точками випадкового кольору
Як отримати випадкові координати точки?
  x := random ( 400 );
  y := random ( 300 );

Як досягти рівномірності?
  забезпечується автоматично при використанні
  функції random
Як отримати випадковий колір?
  Pen (1, random(256), random(256), random(256));
  Point ( x, y );
Програма
program qq;
var x, y, k, code, i: integer;
    stop: boolean;
begin
                            випадкові координати
  stop := False;
  repeat
     x := random(400);
                                       випадковий колір
     y := random(300);
     Pen(1, random(256), random(256), random(256));
     Point(x, y );
                              вихід по клавіші Esc
     if IsEvent then begin
       Event(k, code, i);
       if (k = 1) and (code = 27) then stop := True;
     end;
  until stop;
end.
Завдання
"4": Ввести з клавіатури
   координати кутів
   прямокутника і заповнити     (100,100)
   його точками випадкового
   кольору.


                                            (300,200)



"5": Заповнити трикутник
    точками випадкового
    кольору (рівномірно або
    нерівномірно).
Підказка: візьміть
    рівнобедрений трикутник з
    кутом 45о.
Програмування на
  мові Паскаль
   Тема 13. Функції
Функції
Функція – це допоміжний алгоритм (підпрограма),
 результатом роботи якої є деяке значення.


Приклади:
  • обчислення sin x , cos x , x
  • розрахунок значення по складених формулах
  • відповідь на запитання (просте число або ні?)

Для чого?
  • для обчислення однакових розрахунків в різних
    місцях програми
  • для створення загальнодоступних бібліотек функцій

        ?   В чому відмінність від процедури?
Функції
Задача: скласти функцію, яка обчислює більше з
 двох значень, і навести приклад її використання
Функція:
                   формальні параметри


 function Max (a, b: integer): integer;
 begin
   if a > b then Max := a
   else         Max := b;
 end.                         це результат
                                 функції
Функції
Особливості:
 • заголовок починається словом function
         function Max (a, b: integer): integer;

 • формальні параметри описуються так само, як і для
   процедур
     function qq( a, b: integer; x: real ): real;

 • можна використовувати параметри-змінні
      function Max ( var a, b: integer): integer;

 • в кінці заголовка через двокрапку вказується тип
   результату
        function Max (a, b: integer): integer ;

 • функції розміщуються ВИЩЕ основної програми
Функції
Особливості:
 • можна оголошувати і використовувати локальні змінні
        function qq (a, b: integer): float;
         var x, y: float;
        begin
          ...
        end;

 • значення, яке є результатом, записується в змінну, ім’я
   якої співпадає з назвою функції; оголошувати НЕ
   ПОТРІБНО:
        function Max (a, b: integer): integer;
        begin
          ...
           Max := a;

                             !
        end;
                                 В Delphi:    Result := a;
Програма

program qq;
            c
var a, b, max: integer;
    function Max (a, b: integer): integer;
    begin
      ...
    end;
begin
                                    фактичні параметри
  writeln(‘Введіть два числа');
  read(a, b);
                                   виклик функції
   c := Max ( a, b );
  max
                                c
  writeln(‘Найбільше число ', max );
end.


      ! не повинні співпадати! і процедур
         Імена змінних, функцій
Логічні функції
Задача: скласти функцію, яка визначає, чи дійсно, що
  задане число – просте.
Особливості:
   • відповідь – логічне значення (True або False)
   • результат функції можна використовувати як
     логічну величину в умовах (if, while)
Алгоритм: рахуємо кількість дільників в інтервалі від 2 до
 N-1, якщо воно не дорівнює нулю – число складене.
       count := 0;
       for i := 2 to N-1 do
         if N mod i = 0 then
           count := count + 1;
                                    ?   Як краще?

       if count = 0 then
            { число N просте}
       else { число N складене }
Логічні функції
program qq;                    результат – логічне значення
var N: integer;
  function Prime (N: integer): boolean;
  var count, i: integer;
  begin                      перебір тільки до    N
    i := 2; count := 0;
    while i*i <= N do
       if N mod i = 0 then count := count + 1;
       i := i + 1;
    end;
    Prime := (count = 0);
  end;
                             умова – це логічне значення
begin
  writeln(‘Ввести ціле число');
  read(N);
                                  виклик функції
  if Prime(N) then
       writeln(N, ' – просте число')
  else writeln(N, ' – складене число');
end.
Завдання
"4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і
     навести приклад її використання.
     Приклад:
      Ввести число:
      100
      сума = 5050

"5": Скласти функцію, яка визначає, скільки зерен попросив
     положити на N-ту клітку винахідник шахмат (на 1-шу – 1
     зерно, на 2-у – 2 зерна, на 3-ю – 4 зерна, …)

     Приклад:
      Ввести номер клітки:
      28
      На 28-ой клітці 134217728 зерен.
Завдання (варіант 2)
"4": Скласти функцію, яка визначає найбільший спільний
     дільник двох натуральних чисел і навести приклад її
     використання.
     Приклад:
      Ввести два числа:
      14 21
      НСД(14,21)=7

"5": Скласти функцію, яка обчислює синус як суму ряду (с
     точністю 0.001)
                     x3 x5 x7
          sin x = x − + − +             x в радіанах!
                     3! 5! 7!
     Приклад:
      Ввести кут в градусах:
      45
      sin(45) = 0.707

Contenu connexe

Tendances

урок 12 вирази мова Паскаль
урок 12 вирази  мова Паскальурок 12 вирази  мова Паскаль
урок 12 вирази мова ПаскальHelen Pata
 
урок 19 цикли Складання програм
урок 19 цикли Складання програмурок 19 цикли Складання програм
урок 19 цикли Складання програмHelen Pat
 
урок 15 умова паскаль
урок 15 умова паскальурок 15 умова паскаль
урок 15 умова паскальHelen Pat
 
урок 17 поліваріантне розгалуження
урок 17 поліваріантне розгалуженняурок 17 поліваріантне розгалуження
урок 17 поліваріантне розгалуженняHelen Pata
 
урок 11 виведення значень мова Паскаль
урок 11 виведення значень мова Паскальурок 11 виведення значень мова Паскаль
урок 11 виведення значень мова ПаскальHelen Pata
 
09 Static Polymorphism
09 Static Polymorphism09 Static Polymorphism
09 Static Polymorphismolegapster
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilitiesolegapster
 
First function
First functionFirst function
First functionAlex Moroz
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objectsolegapster
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulationolegapster
 

Tendances (20)

урок 12 вирази мова Паскаль
урок 12 вирази  мова Паскальурок 12 вирази  мова Паскаль
урок 12 вирази мова Паскаль
 
Pascal (динамічні структури даних)
Pascal (динамічні структури даних)Pascal (динамічні структури даних)
Pascal (динамічні структури даних)
 
урок 19 цикли Складання програм
урок 19 цикли Складання програмурок 19 цикли Складання програм
урок 19 цикли Складання програм
 
урок 15 умова паскаль
урок 15 умова паскальурок 15 умова паскаль
урок 15 умова паскаль
 
урок 17 поліваріантне розгалуження
урок 17 поліваріантне розгалуженняурок 17 поліваріантне розгалуження
урок 17 поліваріантне розгалуження
 
урок 11 виведення значень мова Паскаль
урок 11 виведення значень мова Паскальурок 11 виведення значень мова Паскаль
урок 11 виведення значень мова Паскаль
 
Pascal основи програмування частина 2
Pascal основи програмування частина 2Pascal основи програмування частина 2
Pascal основи програмування частина 2
 
09 Static Polymorphism
09 Static Polymorphism09 Static Polymorphism
09 Static Polymorphism
 
Povtor 7 8kl
Povtor 7 8klPovtor 7 8kl
Povtor 7 8kl
 
05 Operations And Utilities
05 Operations And Utilities05 Operations And Utilities
05 Operations And Utilities
 
First function
First functionFirst function
First function
 
08 Functions
08 Functions08 Functions
08 Functions
 
+6 for
+6 for+6 for
+6 for
 
Funkciji1
Funkciji1Funkciji1
Funkciji1
 
Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6Coding for Future in Lutsk. JavaScript. Part 6
Coding for Future in Lutsk. JavaScript. Part 6
 
JavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basisJavaScript. Lectures. part 1. basis
JavaScript. Lectures. part 1. basis
 
02 Copying Objects
02 Copying Objects02 Copying Objects
02 Copying Objects
 
+5 розгал в с++
+5 розгал в с+++5 розгал в с++
+5 розгал в с++
 
Operator prisvoy
Operator prisvoyOperator prisvoy
Operator prisvoy
 
01 Incapsulation
01 Incapsulation01 Incapsulation
01 Incapsulation
 

Similaire à Programuvanna na movi_pascal

програмування
програмуванняпрограмування
програмуванняOlga Lyulchik
 
програмування мовою паскаль функції
програмування мовою паскаль функціїпрограмування мовою паскаль функції
програмування мовою паскаль функціїOlga Lyulchik
 
Знайомство з програмуванням на мові C++
Знайомство з програмуванням на мові C++Знайомство з програмуванням на мові C++
Знайомство з програмуванням на мові C++Alexander Kuzmenko
 
Учень, як вчений
Учень, як вченийУчень, як вчений
Учень, як вченийCveldulf
 
підпрограми (процедури і функції) 7
підпрограми (процедури і функції) 7підпрограми (процедури і функції) 7
підпрограми (процедури і функції) 7zero1996
 
Konspekt uroky
Konspekt urokyKonspekt uroky
Konspekt urokyVasiliy66
 
Konspekt uroku
Konspekt urokuKonspekt uroku
Konspekt urokuVasiliy66
 
Konspekt uroku
Konspekt urokuKonspekt uroku
Konspekt urokuVasiliy66
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Dmitry Chabanenko
 
тема 7
тема 7тема 7
тема 7cit-cit
 
самостійна робота
самостійна роботасамостійна робота
самостійна роботаslavinskiy
 
розгалуження в циклі
розгалуження в циклірозгалуження в циклі
розгалуження в цикліOlena Dmytruk
 

Similaire à Programuvanna na movi_pascal (20)

програмування
програмуванняпрограмування
програмування
 
програмування мовою паскаль функції
програмування мовою паскаль функціїпрограмування мовою паскаль функції
програмування мовою паскаль функції
 
Знайомство з програмуванням на мові C++
Знайомство з програмуванням на мові C++Знайомство з програмуванням на мові C++
Знайомство з програмуванням на мові C++
 
Lr4
Lr4Lr4
Lr4
 
Учень, як вчений
Учень, як вченийУчень, як вчений
Учень, як вчений
 
підпрограми (процедури і функції) 7
підпрограми (процедури і функції) 7підпрограми (процедури і функції) 7
підпрограми (процедури і функції) 7
 
Konspekt uroky
Konspekt urokyKonspekt uroky
Konspekt uroky
 
Konspekt uroku
Konspekt urokuKonspekt uroku
Konspekt uroku
 
Konspekt uroku
Konspekt urokuKonspekt uroku
Konspekt uroku
 
алгоритм урок 3
алгоритм урок 3алгоритм урок 3
алгоритм урок 3
 
оператори розгалуження
оператори розгалуженняоператори розгалуження
оператори розгалуження
 
Урок 38. Алгоритми з розгалуженням
Урок 38. Алгоритми з розгалуженнямУрок 38. Алгоритми з розгалуженням
Урок 38. Алгоритми з розгалуженням
 
Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1Основи алгоритмізації та програмування. Лекція 1
Основи алгоритмізації та програмування. Лекція 1
 
базовI структури алгоритму урок 4
базовI структури алгоритму урок 4базовI структури алгоритму урок 4
базовI структури алгоритму урок 4
 
графік
графікграфік
графік
 
тема 7
тема 7тема 7
тема 7
 
розділ 3 алгоритми 1
розділ 3 алгоритми 1розділ 3 алгоритми 1
розділ 3 алгоритми 1
 
алгоритми
алгоритмиалгоритми
алгоритми
 
самостійна робота
самостійна роботасамостійна робота
самостійна робота
 
розгалуження в циклі
розгалуження в циклірозгалуження в циклі
розгалуження в циклі
 

Plus de 1cana1

6 клас урок 11
6 клас урок 116 клас урок 11
6 клас урок 111cana1
 
текстовий процесор, його призначення
текстовий процесор, його призначеннятекстовий процесор, його призначення
текстовий процесор, його призначення1cana1
 
13 strum v-napivprovidnikakh
13 strum v-napivprovidnikakh13 strum v-napivprovidnikakh
13 strum v-napivprovidnikakh1cana1
 
12 strum v-gazakh_i_vakuumi
12 strum v-gazakh_i_vakuumi12 strum v-gazakh_i_vakuumi
12 strum v-gazakh_i_vakuumi1cana1
 
11.providnist metaliv elektroliz
11.providnist metaliv elektroliz11.providnist metaliv elektroliz
11.providnist metaliv elektroliz1cana1
 
10.robota potuzhnist-zakon dzhoulja-lenca
10.robota potuzhnist-zakon dzhoulja-lenca10.robota potuzhnist-zakon dzhoulja-lenca
10.robota potuzhnist-zakon dzhoulja-lenca1cana1
 
9 zakoni kirkhgofa
9 zakoni kirkhgofa9 zakoni kirkhgofa
9 zakoni kirkhgofa1cana1
 
8 zakon oma-dlja_zamknutogo_kola
8 zakon oma-dlja_zamknutogo_kola8 zakon oma-dlja_zamknutogo_kola
8 zakon oma-dlja_zamknutogo_kola1cana1
 
6 sila strumu-zakon-oma-opir
6 sila strumu-zakon-oma-opir6 sila strumu-zakon-oma-opir
6 sila strumu-zakon-oma-opir1cana1
 
3 robota v-elektrichnomu_poli-potencial
3 robota v-elektrichnomu_poli-potencial3 robota v-elektrichnomu_poli-potencial
3 robota v-elektrichnomu_poli-potencial1cana1
 
2 napruzhenist elektrichnogo-polja
2 napruzhenist elektrichnogo-polja2 napruzhenist elektrichnogo-polja
2 napruzhenist elektrichnogo-polja1cana1
 
1 zakon zberezhennja-zarjadu
1 zakon zberezhennja-zarjadu1 zakon zberezhennja-zarjadu
1 zakon zberezhennja-zarjadu1cana1
 
Sila arkhimeda atmosfernij-tisk-zakon_bernulli
Sila arkhimeda atmosfernij-tisk-zakon_bernulliSila arkhimeda atmosfernij-tisk-zakon_bernulli
Sila arkhimeda atmosfernij-tisk-zakon_bernulli1cana1
 
Zakon paskalja gidrostatichnij-tisk
Zakon paskalja gidrostatichnij-tiskZakon paskalja gidrostatichnij-tisk
Zakon paskalja gidrostatichnij-tisk1cana1
 
Ii zakon termodinamiki
Ii zakon termodinamikiIi zakon termodinamiki
Ii zakon termodinamiki1cana1
 
Kristalichni ta amorfni_tila
Kristalichni ta amorfni_tilaKristalichni ta amorfni_tila
Kristalichni ta amorfni_tila1cana1
 
Molekuljarna fizika osnovi-mkt
Molekuljarna fizika osnovi-mktMolekuljarna fizika osnovi-mkt
Molekuljarna fizika osnovi-mkt1cana1
 
Osnovne rivnjannja mkt
Osnovne rivnjannja mktOsnovne rivnjannja mkt
Osnovne rivnjannja mkt1cana1
 
Pobota v termodinamici
Pobota v termodinamiciPobota v termodinamici
Pobota v termodinamici1cana1
 
Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.
Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.
Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.1cana1
 

Plus de 1cana1 (20)

6 клас урок 11
6 клас урок 116 клас урок 11
6 клас урок 11
 
текстовий процесор, його призначення
текстовий процесор, його призначеннятекстовий процесор, його призначення
текстовий процесор, його призначення
 
13 strum v-napivprovidnikakh
13 strum v-napivprovidnikakh13 strum v-napivprovidnikakh
13 strum v-napivprovidnikakh
 
12 strum v-gazakh_i_vakuumi
12 strum v-gazakh_i_vakuumi12 strum v-gazakh_i_vakuumi
12 strum v-gazakh_i_vakuumi
 
11.providnist metaliv elektroliz
11.providnist metaliv elektroliz11.providnist metaliv elektroliz
11.providnist metaliv elektroliz
 
10.robota potuzhnist-zakon dzhoulja-lenca
10.robota potuzhnist-zakon dzhoulja-lenca10.robota potuzhnist-zakon dzhoulja-lenca
10.robota potuzhnist-zakon dzhoulja-lenca
 
9 zakoni kirkhgofa
9 zakoni kirkhgofa9 zakoni kirkhgofa
9 zakoni kirkhgofa
 
8 zakon oma-dlja_zamknutogo_kola
8 zakon oma-dlja_zamknutogo_kola8 zakon oma-dlja_zamknutogo_kola
8 zakon oma-dlja_zamknutogo_kola
 
6 sila strumu-zakon-oma-opir
6 sila strumu-zakon-oma-opir6 sila strumu-zakon-oma-opir
6 sila strumu-zakon-oma-opir
 
3 robota v-elektrichnomu_poli-potencial
3 robota v-elektrichnomu_poli-potencial3 robota v-elektrichnomu_poli-potencial
3 robota v-elektrichnomu_poli-potencial
 
2 napruzhenist elektrichnogo-polja
2 napruzhenist elektrichnogo-polja2 napruzhenist elektrichnogo-polja
2 napruzhenist elektrichnogo-polja
 
1 zakon zberezhennja-zarjadu
1 zakon zberezhennja-zarjadu1 zakon zberezhennja-zarjadu
1 zakon zberezhennja-zarjadu
 
Sila arkhimeda atmosfernij-tisk-zakon_bernulli
Sila arkhimeda atmosfernij-tisk-zakon_bernulliSila arkhimeda atmosfernij-tisk-zakon_bernulli
Sila arkhimeda atmosfernij-tisk-zakon_bernulli
 
Zakon paskalja gidrostatichnij-tisk
Zakon paskalja gidrostatichnij-tiskZakon paskalja gidrostatichnij-tisk
Zakon paskalja gidrostatichnij-tisk
 
Ii zakon termodinamiki
Ii zakon termodinamikiIi zakon termodinamiki
Ii zakon termodinamiki
 
Kristalichni ta amorfni_tila
Kristalichni ta amorfni_tilaKristalichni ta amorfni_tila
Kristalichni ta amorfni_tila
 
Molekuljarna fizika osnovi-mkt
Molekuljarna fizika osnovi-mktMolekuljarna fizika osnovi-mkt
Molekuljarna fizika osnovi-mkt
 
Osnovne rivnjannja mkt
Osnovne rivnjannja mktOsnovne rivnjannja mkt
Osnovne rivnjannja mkt
 
Pobota v termodinamici
Pobota v termodinamiciPobota v termodinamici
Pobota v termodinamici
 
Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.
Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.
Rivnjannja stanu idealnogo_gazu-gazovi_zakoni.
 

Programuvanna na movi_pascal

  • 1. Програмування на мові Паскаль Тема 1. Вступ
  • 2. Алгоритм Алгоритм – це чітко визначений план дій для виконавця. Властивості алгоритму • дискретність: складається з окремих кроків (команд) • зрозумілість: повинен включати тільки команди відомі для виконавця (які містяться в СКВ) • визначеність: при однакових вхідних даних завжди видає один і той самий результат • скінченність: закінчується за скінчену кількість кроків • масовість: може застосовуватися багатократно при різних вихідних даних • коректність: видає правильне рішення при будь- яких допустимих вихідних даних
  • 3. Програма Програма – це • алгоритм, записаний на будь-якій мові програмування • набір команд для комп’ютера Команда – це опис дій, які повинен виконати комп’ютер. • звідки отримати вихідні дані? • що потрібно з ними зробити?
  • 4. Мови програмування • Машинно-орієнтовані (низького рівня) – кожна команда відповідає одній команді процесора (асемблер) • Мови високого рівня – наближені до реальної (англійської) мови, легше сприймаються людиною, не залежать від відповідного комп’ютера • для навчання: Бейсик, ЛОГО, Паскаль • професійні: Сі, Фортран, Паскаль • для задач штучного інтелекту: Пролог, ЛИСП • для Інтернету: JavaScript, Java, Perl, PHP, ASP
  • 5. Мова Паскаль 1970 – Ніклаус Вірт (Швейцарія) • мова для навчання студентів • розробка програм “зверху-вниз” Задача Підзадача1 Підзадача2 Підзадача3 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3 • різноманітні структури даних (масиви, структури, множини)
  • 6. З чого складається програма? program <ім’я програми>; const …;{константи} var …; {змінні} { процедури і функції } begin … {основна програма} end. коментарі у фігурних дужках не опрацьовуються
  • 7. З чого складається програма? Константа – постійна величина, яка має ім’я. Змінна – змінна величина, яка має ім’я (комірка пам’яті). Процедура – додатковий алгоритм, який описує деякі дії (малювання кола). Функція – додатковий алгоритм, для виконання обчислень (обчислення квадратного кореня, sin).
  • 8. Імена програм, констант, змінних Імена можуть містити • латинські букви (A-Z) великі і маленькі букви не розрізняються • цифри ім’я не може починатися з цифри • знак підкреслення _ Імена НЕ можуть містити • українські букви • пропуски • дужки, знаки +, =, !, ? та ін. Які імена правильні? AXby R&B 4Wheel Вася “PesBarbos” TU154 [QuQu] _ABBA A+B
  • 9. Константи const i2 = 45; { ціле число } pi = 3.14; { дійсне число } ціла і дробова частина відділяються крапкою qq = 'Вася'; { рядок символів } можна використовувати українські букви! L = True; { логічна величина } Може приймати два значення: • True (істина, “так") • False (хибність, "ні")
  • 10. Змінні Змінна – це величина, яка має ім’я, тип і значення. Значення змінної величини під час виконання програми може змінюватися. Типи змінних: • integer { цілі } • real { дійсні } • char { один символ } • string { рядок } • boolean { логічні } Оголошення змінних (виділення пам’яті): var a, b: integer; Q: real; s1, s2: string;
  • 11. Як змінюється значення змінної? Оператор – це команда мови програмування високого рівня. Оператор присвоєння служить для зміни значення змінної. Приклад: program qq; a var a, b: integer; ? 5 5 begin b a := 5; ? 7 5+2 b := a + 2; a := (a + 2)*(b – 3); a 28 5 7*4 end.
  • 12. Оператор присвоєння Загальна структура: <ім’я змінної> := <вираз>; Арифметичні вирази можуть містити • константи • імена змінних • знаки арифметичних дій: + - * / div mod множення ділення ділення остача від націло ділення • виклики функцій • круглі дужки ( )
  • 13. Які оператори неправильні? program qq; var a, b: integer; x, y: real; begin ім’я змінної повинно знаходитися зліва від знака := a := 5; ціла і дробова частина 10 := x; відділяються крапкою y := 7,8; b := 2.5; неможливо записати дійсне значення в цілу змінну x := 2*(a + y); a := b + x; end.
  • 14. Ручна прокрутка програми program qq; a b var a, b: integer; ? ? begin a := 5; 5 b := a + 2; 7 a := (a + 2)*(b – 3); 28 b := a div 5; 5 a := a mod b; 3 a := a + 1; 4 b := (a + 14) mod 7; 4 end.
  • 15. Порядок виконання операцій • обчислення виразів у дужках • множення, ділення, div, mod зліва направо • додаванні і віднімання зліва направо 2 3 5 4 1 7 8 6 9 z := (5*a*c+3*(c-d))/a*(b-c)/ b; 5ac + 3(c − d ) z= (b − c) a 2 + 5c 2 − d ( a + b) ab x= (c + d )(d − 2a ) 2 6 3 4 7 5 1 12 8 11 10 9 x:=(a*a+5*c*c-d*(a+b))/((c+d)*(d-2*a));
  • 16. Додавання двох чисел Задача. Ввести два цілих числа і вивести на екран їх суму. Найпростіше розв’язання: program qq; var a, b, c: integer; begin read ( a, b ); c := a + b; writeln ( c ); end.
  • 17. Оператор введення read ( a ); { ввести значення змінної a} read ( a, b ); { ввести значення змінних a і b} Як вводяться два числа? через пропуск: 25 a 25 30 30 b через Enter: 25 25 a 30 30 b
  • 18. Оператор виведення write ( a ); { вивести значення змінної a} writeln ( a ); { вивести значення змінної a і перейти на новий рядок} writeln ( ‘Привіт!' ); { виведення тексту} writeln ( ‘Відповідь: ', c ); {виведення тексту і значення змінної c} writeln ( a, '+', b, '=', c );
  • 19. Формати виведення program qq; var i: integer; x: real; begin i := 15; всього символів writeln ( '>', i, '<' ); >15< writeln ( '>', i:5, '<' ); > 15< x := 12.345678; writeln ( '>', x, '<' ); >1.234568E+001< writeln ( '>', x:10, '<' ); > 1.23E+001< writeln ( '>', x:7:2, '<' ); > 12.35< end. всього в символів дробовій частині
  • 20. Повний розв’язок program qq; var a, b, c: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); c := a + b; writeln ( a, '+', b, '=', c ); end. це виводить комп'ютер Протокол: Ввести два цілих числа 25 30 це вводить користувач 25+30=55
  • 21. Блок-схема лінійного алгоритму початок блок «початок» ввести a, b блок «ввести» c := a + b; блок «процес» вивести c блок «вивести» кінець блок «кінець»
  • 22. Завдання "4": Ввести три числа, знайти їх суму і добуток. Приклад: Ввести три числа: 4 5 7 4+5+7=16 4*5*7=140 "5": Ввести три числа, знайти їх суму, добуток і середнє арифметичне. Приклад: Ввести три числа: 4 5 7 4+5+7=16 4*5*7=140 (4+5+7)/3=5.33
  • 23. Програмування на мові Паскаль Тема 2. Розгалуження
  • 24. Алгоритми розгалуження Задача. Ввести два цілих числа і вивести на екран більше з них. Ідея розв’язання: потрібно вивести на екран перше число, якщо воно більше другого, або друге, якщо воно більше першого. Особливості: дії виконавця залежать від деяких умов (якщо … інакше …). Алгоритми, в яких послідовність кроків залежить від Алгоритми, в яких послідовність кроків залежить від виконання деяких умов, називаються розгалуженими. виконання деяких умов, називаються розгалуженими.
  • 25. Варіант 1. Блок-схема початок блок «логічний вираз» ввести a,b так ні повна форма a > b? розгалуження max:= a; max:= b; вивести max кінець ? Якщо a = b?
  • 26. Варіант 1. Програма program qq; var a, b, max: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); повна форма if a > b then begin умовного max := a; оператора end else begin max := b; end; writeln (‘Більше число ', max); end.
  • 27. Умовний оператор if <умова> then begin {що робити, якщо умова правильна} end else begin {що робити, якщо умова неправильна} end; Особливості: • перед else НЕ ставиться крапка з комою • друга частина (else …) може бути відсутня (неповна форма) • якщо в блоці один оператор, можна забрати слова begin і end
  • 28. Що неправильно? if a > b then begin if a > b then begin a := b; a := b; end end else begin else begin b := a; b := a; end; end; if a > b then begin if a > b then begin a := b; a := b; end end; end begin else b > a begin else begin b := a; b := a; end; end;
  • 29. Варіант 2. Блок-схема початок ввести a,b max:= a; неповна форма так розгалуження ні b > a? max:= b; вивести max кінець
  • 30. Варіант 2. Програма program qq; var a, b, max: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); max := a; неповна форма умовного if b > a then оператора max := b; writeln (‘Більше число ', max); end.
  • 31. Варіант 2Б. Програма program qq; var a, b, max: integer; begin writeln(‘Ввести два цілих числа'); read ( a, b ); max := b; if a ???b then > ??? max := a; writeln (‘Більше число ', max); end.
  • 32. Що неправильно? if a > b then begin if a > b then begin a := b; a := b; b else b := a; end; end else b := a; if a > b then if a > b then b a := b; else beginthen if b >= a else b := a; end; bb:= a; := a; end;
  • 33. Завдання "4": Ввести три числа і знайти найбільше з них. Приклад: Ввести три числа: 4 15 9 Найбільше число 15 "5": Ввести п’ять чисел і знайти найбільше з них. Приклад: Ввести п’ять чисел: 4 15 9 56 4 Найбільше число 56
  • 34. Програмування на мові Паскаль Тема 3. Складені умови
  • 35. Складені умови Задача. Фірма набирає співробітників від 25 до 40 років включно. Ввести вік людини і визначити, чи підходить вона фірмі (вивести відповідь “підходить” або “не підходить”). Особливості: потрібно перевірити, виконання двох умов одночасно. ? Чи можна розв’язати відомими методами?
  • 36. Варіант 1. Алгоритм початок ввести x так ні x >= 25? так ні x <= 40? ‘підходить' ‘не підходить' ‘не підходить' кінець
  • 37. Варіант 1. Програма program qq; var x: integer; begin writeln(‘Ввести вік'); read ( x ); if x >= 25 then if x <= 40 then writeln (‘Підходить') else writeln (‘Не підходить') else writeln (‘Не підходить'); end.
  • 38. Варіант 2. Алгоритм початок ввести x так x >= 25 ні і x <= 40? ‘підходить' ‘не підходить' кінець
  • 39. Варіант 2. Програма program qq; var x: integer; begin складена writeln(‘Ввести вік'); умова read ( x ); if (x >= 25) and (x <= 40) then writeln (‘Підходить') else writeln (‘Не підходить') end.
  • 40. Складена умова Складена умова – це умова, яка складається з декількох простих умов (відношень), зв’язаних з допомогою логічних операцій: • not – НІ (заперечення, інверсія) • and – І (логічне множення, кон'юнкція, одночасне виконання умов) • or – АБО (логічне додавання, диз'юнкція, виконання хоча б одної з умов) • xor – виключаюче АБО (виконання тільки одної з двох умов, але не обох) Прості умови (відношення) дорівнює не дорівнює < <= > >= = <>
  • 41. Складена умова Порядок виконання • вирази в дужках • not • and • or, xor • <, <=, >, >=, =, <> Особливості – кожна з простих умов обов'язково береться в дужки. Приклад 4 1 6 2 5 3 if not (a > b) or (c <> d) and (b <> a) then begin ... end
  • 42. Складена умова Істинне чи хибне при a := 2; b := 3; c := 4; not (a > b) True True (a < b) and (b < c) True not (a >= b) or (c = d) (a < c) or (b < c) and (b < a) True (a < b) xor not (b > c) FALSE Для яких значень x істинні умови: (x < 6) and (x < 10) (-∞, 6) x<6 (x < 6) and (x > 10) ∅ (x > 6) and (x < 10) (6, 10) (x > 6) and (x > 10) (10, ∞) x > 10 (x < 6) or (x < 10) (-∞, 10) x < 10 (x < 6) or (x > 10) (-∞, 6) ∪ (10,∞) (x > 6) or (x < 10) (-∞, ∞) (x > 6) or (x > 10) (6, ∞) x>6
  • 43. Завдання "4": Ввести номер місяця і вивести назву пори року. Приклад: Ввести номер місяця: 4 весна "5": Ввести вік людини (від 1 до 150 років) и вивести його разом з наступним слово “рік”, “роки" або “років". Приклад: Ввести вік: Ввести вік: 24 57 Вам 24 роки Вам 57 років
  • 44. Програмування на мові Паскаль Тема 4. Цикли
  • 45. Цикли Цикл – це багатократне виконання однакової послідовності дій. • цикл з відомою кількістю кроків • цикл з невідомою кількістю кроків (цикл з умовою) Задача. Вивести на екран квадрати і куби цілих чисел від 1 до 8 (від a до b). Особливості: однакові дії виконуються 8 раз. ? Чи можна розв’язати відомими методами?
  • 46. Алгоритм початок задати початкове значення змінної циклу i := 1; перевірити, чи все виконали ні i <= 8? кінець так обчислити квадрат і куб i2 := i * i; i3 := i2 * i; вивести результат i, i2, i3 перейти до наступного i i := i + 1;
  • 47. Алгоритм (з блоком "цикл") блок "цикл" початок i := 1,8 кінець i2 := i * i; i3 := i2 * i; тіло циклу i, i2, i3
  • 48. Програма program qq; var i, i2, i3: integer; begin початкове значення змінна циклу кінцеве значення for i:=1 to 8 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; end.
  • 49. Цикл з зменшенням змінної Задача. Вивести на екран квадрати і куби цілих чисел від 8 до 1 (в зворотному порядку). Особливості: змінна циклу повинна зменшуватися. Розв’язання: ... for i:=8 downto 1 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; ...
  • 50. Цикл з змінною Збільшення змінної на 1: for <змінна> := <початкове значення> to <кінцеве значення> do begin {тіло циклу} end; Зменшення змінної на 1: for <змінна> := <початкове значення> downto <кінцеве значення> do begin {тіло циклу} end;
  • 51. Цикл з змінною Особливості: • змінна повинна бути тільки цілою (integer) • крок зміни змінної циклу завжди рівний 1 (to) або -1 (downto) • якщо в тілі циклу тільки один оператор, слова begin і end можна не писати: for i:=1 to 8 do writeln(‘Привіт'); • якщо кінцеве значення менше початкового, цикл (to) не виконується ні разу (перевірка умови в початку циклу, цикл з передумовою)
  • 52. Цикл з змінною Особливості: • в тілі циклу не дозволяється змінювати змінну циклу (чому?) • при зміні початкового і кінцевого значення всередині циклу кількість кроків не змінюється: n := 8; for i:=1 to n do begin writeln('Привіт'); немає n := n + 1; зациклювання end;
  • 53. Цикл з змінною Особливості: • після виконання циклу в багатьох системах встановлюється перше значення змінної циклу, при якому порушується умова: for i:=1 to 8 do i=9 НО writeln('Привіт'); О ВА НТ writeln('i=', i); УМЕ ОК НЕД for i:=8 downto 1 do writeln('Привіт'); i=0 writeln('i=', i);
  • 54. Скільки разів виконається цикл? a := 1; a= 4 for i:=1 to 3 do a := a+1; a := 1; a= 1 for i:=3 to 1 do a := a+1; a := 1; a= 1 for i:=1 downto 3 do a := a+1; a := 1; for i:=3 downto 1 do a := a+1; a= 4
  • 55. Як змінюється крок? Задача. Вивести на екран квадрати і куби непарних цілих чисел від 1 до 9. Особливості: змінна циклу повинна збільшуватися на 2. Проблема: в Паскалі крок може бути 1 або -1. Розв’язання: ... for i:=1 to 9 do begin if i mod 2 = 1 then begin ??? i2 := i*i; виконується i3 := i2*i; тільки для непарних i writeln(i:4, i2:4, i3:4); end; end; ... ? Що погано?
  • 56. Як змінюється крок? – II Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється від 1 до 5. Початкове значення i дорівнює 1, з кожним кроком циклу i збільшується на 2. Розв’язання: ... ??? i := 1; for k:=1 to 5 do begin i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); ??? i := i + 2; end; ...
  • 57. Як змінюється крок? – III Ідея: Потрібно вивести всього 5 чисел, змінна k змінюється від 1 до 5. Знаючи k, потрібно розрахувати i. k 1 2 3 4 5 i = 2k-1 i 1 3 5 7 9 Розв’язання: ... for k:=1 to 5 do begin i ???2*k – 1; := i2 := i*i; i3 := i2*i; writeln(i:4, i2:4, i3:4); end; ...
  • 58. Завдання "4": Ввести a і b і вивести квадрати і куби чисел від a до b. Приклад: Введіть границі інтервалу: 4 6 4 16 64 5 25 125 6 36 216 "5": Вивести квадрати і куби 10 чисел наступної послідовності: 1, 2, 4, 7, 11, 16, … Приклад: 1 1 1 2 4 8 4 16 64 ... 46 2116 97336
  • 59. Програмування на мові Паскаль Тема 5. Цикли з умовою
  • 60. Цикл з невідомою кількістю кроків Приклад: Відрізати поліно від колоди. Скільки разів потрібно зробити рух пилкою? Задача: Ввести ціле число (<2000000) і визначити кількість цифр у ньому. Ідея розв’язання: Відрізаємо послідовно останню цифру, збільшуємо лічильник. n count 123 0 12 1 1 2 0 3 Проблема: Невідомо, скільки кроків потрібно зробити. Розв’язання: Потрібно зупинитися, коли n = 0, тобто потрібно робити “поки n <> 0".
  • 61. Алгоритм початок ввести n обнулити лічильник цифр count := 0; виконувати "поки n <> 0" ні n <> 0? так count count := count + 1; n := n div 10; кінець
  • 62. Програма program qq; , n1: integer; var n, count: integer; begin writeln(‘Ввести ціле число'); read(n); n1 := n; виконувати "поки n <> 0" count := 0; while n <> 0 do begin count := count + 1; n := n div 10; end; writeln('В числі ', n1, ' знайшли ', n, count, ' цифр'); end. ? Що погано?
  • 63. Цикл с умовою while <умова> do begin {тіло циклу} end; Особливості: • можна використовувати складені умови: while (a<b) and (b<c) do begin {тіло циклу} end; • якщо в тілі циклу тільки один оператор, слова begin і end можна не писати: while a < b do a := a + 1;
  • 64. Цикл з умовою Особливості: • умова перевіряється кожен раз при вході в цикл • якщо умова на вході в цикл хибна, цикл не виконується жодного разу a := 4; b := 6; while a > b do a := a – b; • якщо умова ніколи не стане хибною, програма зациклиться a := 4; b := 6; while a < b do d := a + b;
  • 65. Скільки разів виконується цикл? a := 4; b := 6; 2 рази a=6 while a < b do a := a + 1; a := 4; b := 6; 1 раз a = 10 while a < b do a := a + b; a := 4; b := 6; 0 разів a=4 while a > b do a := a + 1; a := 4; b := 6; 1 раз b = -2 while a < b do b := a - b; зациклюванн a := 4; b := 6; я while a < b do a := a - 1;
  • 66. Заміна for на while і навпаки i := 1; for i:=1 to 10 do begin while i <= 10 do begin {тіло циклу} {тіло циклу} end; i := i + 1; end; i := a; for i:=a downto b do while i >= b do begin begin {тіло циклу} {тіло циклу} i := i - 1; end; end; Заміна циклу for на while можлива завжди. Заміна while на for можлива тільки тоді, коли можна наперед розрахувати кількість кроків циклу.
  • 67. Завдання "4": Ввести ціле число і знайти суму його цифр. Приклад: Ввести ціле число: 1234 Сума цифр числа 1234 рівна 10. "5": Ввести ціле число і визначити, чи правда, що в його записі є дві однакові цифри. Приклад: Ввести ціле число: Ввести ціле число: 1234 1224 Ні. Так.
  • 68. Послідовності Приклади: • 1, 2, 3, 4, 5, … an = n a1 = 1, an+1 = an+1 • 1, 2, 4, 7, 11, 16, … a1 = 1, an+1 = an + n • 1, 2, 4, 8, 16, 32, … an = 2n-1 a1 = 1, an+1 = 2an 1 1 3 1 5 1 2 3 4 5 • , , , , , ... , , , , , ... 2 2 8 4 32 2 4 8 16 32 bn b1 = 1, bn+1 = bn+1 an = cn c1 = 2, cn+1 = 2cn
  • 69. Послідовності Задача: знайти суму всіх елементів послідовності, 1 2 3 4 5 1, − , , − , , − , ... 2 4 8 16 32 які по модулю більші 0,001: 1 2 3 4 5 S = 1− + − + − + ... 2 4 8 16 32 Елемент послідовності (починаючи з №2): n 1 2 3 4 5 ... b := b+1; b b 1 2 3 4 5 ... a= z c := 2*c; c c 2 4 8 16 32 ... z -1 1 -1 1 -1 ... z := -z;
  • 70. Алгоритм початок початкове значення S := 0; b := 1; c := 2; z := -1; перший елемент a := 1; ні |a| > 0.001? так S S := S + a; новий елемент a := z*b/c; кінець b := b + 1; зміни c := 2*c; z := -z; ? Перестановка?
  • 71. Програма program qq; початкове var b, c, z: integer; значення S, a: real; begin S := 0; z := -1; b := 1; c := 2; a := 1; while abs(a) > 0.001 do begin збільшення S := S + a; суми a := z * b / c; z := - z; розрахунок елемента b := b + 1; послідовності c := c * 2; end; перехід до writeln('S =', S:10:3); наступного доданка end.
  • 72. Завдання "4": Знайти суму елементів послідовності з точністю 0,001: 2 4 6 8 S = 1+ − + − + ... 3 ⋅ 3 5 ⋅ 9 7 ⋅ 27 9 ⋅ 81 Відповідь: S = 1.157 "5": Знайти суму елементів послідовності з точністю 0,001: 2 4 6 8 10 S = 1+ − + − + − ... 2 ⋅ 3 3 ⋅ 9 5 ⋅ 27 8 ⋅ 81 13 ⋅ 243 Відповідь: S = 1.220
  • 73. Цикл з післяумовою Задача: Ввести ціле додатне число (<2000000) і визначити кількість цифр в ньому. Проблема: Як не дати ввести від'ємне число або нуль? Розв’язання: Якщо вводиться неправильне число, повернутися назад до введення даних (цикл!). Особливості: Один раз тіло циклу потрібно виконати в будь-якому випадку => перевірку умови циклу потрібно виконувати в кінці циклу (цикл с післяумовою). Цикл с післяумовою – це цикл, в якому перевірка умови Цикл с післяумовою – це цикл, в якому перевірка умови виконується в кінці циклу. виконується в кінці циклу.
  • 74. Цикл з післяумовою: алгоритм початок ввести n тіло циклу ні n > 0? умова ВИХОДУ так основний алгоритм блок "типовий процес" кінець
  • 75. Програма program qq; var n: integer; begin repeat writeln(‘Ввести додатне число'); read(n); умова ВИХОДУ until n > 0; ... { основний алгоритм } end. Особливості: • тіло циклу завжди виконується хоча б один раз • після слова until ("до тих пір, поки не…") ставиться умова ВИХОДУ із циклу
  • 76. Скільки разів виконується цикл? a := 4; b := 6; 3 рази a=7 repeat a := a + 1; until a > b; 1 раз a := 4; b := 6; a = 10 repeat a := a + b; until a > b; a := 4; b := 6; зациклення repeat a := a + b; until a < b; a := 4; b := 6; 2 рази b=6 repeat b := a - b; until a < b; a := 4; b := 6; зациклення repeat a := a + 2; until a < b;
  • 77. Завдання (з захистом від неправильного введення) "4": Ввести натуральне число і визначити, чи правда що сума його цифр дорівнює 10. Приклад: Ввести число >= 0: Введіть число >= 0: -234 1233 Потрібно додатне число. Ні Ввести число >= 0: 1234 Так "5": Ввести натуральне число і визначити, які цифри зустрічаються декілька разів. Приклад: Введіть число >= 0: Введіть число >= 0: 2323 1234 Повторяються: 2, 3 Немає повторів.
  • 79. Оператор вибору Задача: Ввести номер місяця і вивести кількість днів в цьому місяці. Розв’язання: Кількість днів у місяцях: 28 днів – 2 (лютий) 30 днів – 4 (квітень), 6 (червень), 9 (вересень), 11 (листопад) 31 день – 1 (січень), 3 (березень), 5 (травень), 7 (липень), 8 (серпень), 10 (жовтень), 12 (грудень) Особливості: Вибір не з двох, а з декількох варіантів в ? залежності від номера місяця. Чи можна розв’язати відомими методами?
  • 80. Алгоритм початок ввести M так M = 1? D := 31; оператор вибору ні так M = 2? D := 28; ні так M = 12? D := 31; ні вивести D жоден з помилка варіантів не підійшов кінець
  • 81. Програма program qq; var M, D: integer; begin writeln(‘Ввести номер місяця:'); read ( M ); case M of 2: begin D := 28; end; 4,6,9,11: begin D := 30; end; 1,3,5,7,8,10,12: D := 31; else D := -1; жоден варіант не end; підійшов if D > 0 then writeln(‘В цьому місяці ', D, ' днів.') else writeln(‘Неправильний номер місяця'); end.
  • 82. Оператор вибору Особливості: • після case може бути ім’я змінної або арифметичний вираз цілого типу (integer) case i+3 of 1: begin a := b; end; 2: begin a := c; end; end; або символьного типу (char) var c: char; ... case c of 'а': writeln('Антилопа'); 'б': writeln('Борсук'); else writeln('Не знаю'); end;
  • 83. Оператор вибору Особливості: • якщо потрібно виконати тільки один оператор, слова begin і end можна не писати case i+3 of 1: a := b; 2: a := c; end; • не можна ставити два однакових значення case i+3 of 1: a := b; 1: a := c; end;
  • 84. Оператор вибору Особливості: • значення, при яких виконуються однакові дії, можна групувати case i of перечислення 1: a := b; 2,4,6: a := c; діапазон 10..15: a := d; 20,21,25..30: a := e; суміш else writeln(‘Помилка'); end;
  • 85. Що неправильно? case a of case a of 2: begin a := b; 2: a := b ; 4: a := c; 4: a := c end; end; case a of case a of 2..5: a := b; 0..2: a := b; 4: a := c; 6..3: a := c; 3..6: end; end; begin case a+c/2 of case a of 2: a := b; 2: a := b; d := 0; end; 4: a := c; 4: a := c; end; end;
  • 86. Завдання (з захистом від неправильного введення) "4": Ввести номер місяця і вивести кількість днів в ньому, а також кількість помилок при введенні. Приклад: Введіть номер місяця: Введіть номер місяця: -2 2 Введіть номер місяця: В цьому місяці 28 днів. 11 Ви вводили неправильно 0 раз. В цьому місяці 30 днів. Ви вводили неправильно 1 раз. "5": Ввести номер місяця і номер дня, вивести кількість днів, які залишилися до Нового року. Приклад: Ввести номер місяця: 12 Ввести день: 25 До Нового року залишилося 6 днів.
  • 87. Програмування на мові Паскаль Тема 7. Графіка
  • 88. Система координат X (0,0) y x (x,y) Y
  • 89. Керування кольором Колір і товщина ліній, колір точок: Pen ( 1, 255, 0, 0 ); товщина R(red) G(green) B(blue) лінії 0..255 0..255 0..255 Колір і стиль заливки: Brush ( 1, 0, 255, 0 ); 0 – виключити R G B 1 – включити Колір тексту: TextColor ( 0, 0, 255 ); R G B
  • 90. Точки, відрізки і ламані (x, y) Pen (1, 0, 0, 255); Point (x, y); (x1, y1) (x2, y2) Pen (1, 0, 255, 0); Line (x1, y1, x2, y2); (x1, y1) (x2, y2) Pen (1, 255, 0, 0); MoveTo (x1, y1); (x3, y3) LineTo (x2, y2); (x5, y5) LineTo (x3, y3); LineTo (x4, y4); LineTo (x5, y5); (x4, y4)
  • 91. Фігури з заливкою (x1, y1) Pen (1, 0, 0, 255); Brush (1, 255, 255, 0); Rectangle (x1, y1, x2, y2); (x2, y2) (x1, y1) Pen (1, 255, 0, 0); Brush (1, 0, 255, 0); Ellipse (x1, y1, x2, y2); (x2, y2) ? Як відмінити заливку? (x, y) Brush (1, 100, 200, 255); Fill (x, y);
  • 92. Текст TextColor (0, 0, 255); Brush (1, 255, 255, 0); т! Font (20, 30, 600); (x, y) і р ив30 розмір кут повороту насиченість: 400 – нормальний П о 10 пікселів 600 – жирний MoveTo (x, y); writeln ('Привіт!');
  • 93. Приклад program qq; begin (200, 50) Pen(2, 255, 0, 255); Brush(1, 0, 0, 255); (100, 100) Rectangle(100, 100, 300, 200); MoveTo(100, 100); LineTo(200, 50); LineTo(300, 100); Brush(1, 255, 255, 0); (300, 200) Fill(200, 75); Pen(2, 255, 255, 255); Brush(1, 0, 255, 0); Ellipse(150, 100, 250, 200); end.
  • 95. Штриховка x2 − x1 (x1, y1) N ліній (N=5) h= N +1 Rectangle (x1, y1, x2, y2); Line( x1+h, y1, x1+h, y2); Line( x1+2*h, y1, x1+2*h, y2); Line( x1+3*h, y1, x1+3*h, y2); h (x2, y2) ... x x h := (x2 – x1) / (N + 1); Rectangle (x1, y1, x2, y2); var x, h: real; x := x1 + h; заокруглення до for i:=1 to N do begin найближчого цілого Line( round(x), y1, round(x), y2); x := x + h; end;
  • 96. Як міняти колір? (x1, y1) x сірий: R = G = B Brush ( 1, c, c, c ); (x-1, y1+1) Fill ( ???, ??? ); 255 Крок зміни c: hc = (x2, y2) N +1 var c, hc: integer; hc := 255 div (N + 1); c := 0; for i:=1 to N+1 do begin Line (round(x), y1, round(x), y2); Brush (1, c, c, c); Fill (round(x)-1, y1+1); x := x + h; c := c + hc; end;
  • 97. Штриховка a x3 − x2 a = x2 − x1 h= (x1, y1) (x3+a, y1) N +1 Line( x1+h, y1, x1+h-a, y2); Line( x1+2*h, y1, x1+2*h-a, y2); (x2, y2) (x3, y2) Line( x1+3*h, y1, x1+3*h-a, y2); h ... x x-a h := (x3 – x2) / (N + 1); a := x2 – x1; x := x1 + h; for i:=1 to N do begin Line( round(x), y1, round(x-a), y2); x := x + h; end;
  • 98. Штриховка x2 − x1 y2 − y1 (x1, y1) hx = hy = N +1 N +1 hx Line( x1, y1+hy, x1+hx, y1+hy) ; Line( x1, y1+2*hy, x1+2*hx, hy y1+2*hy); Line( x1, y1+3*hy, x1+3*hx, y x y y1+3*hy); ... hx := (x2 – x1) / (N + 1); (x2, y2) hy := (y2 – y1) / (N + 1); x := x1 + hx; y := y1 + hy; for i:=1 to N do begin Line( x1, round(y), round(x), round(y)); x := x + hx; y := y + hy; end;
  • 99. Завдання "4": Ввести з клавіатури кількість ліній штриховки і побудувати фігуру, заливши всі області різним кольором. "5": Ввести з клавіатури кількість кіл і побудувати фігуру, заливши всі області різними кольорами.
  • 100. Програмування на мові Паскаль Тема 8. Графіки функцій
  • 101. Побудова графіків функцій Задача: побудувати графік функції y = 3 sin(x) на інтервалі від 0 до 2π. Аналіз: максимальне значення ymax = 3 при x = π/2 мінімальне значення ymin = -3 при x = 3π/2 Проблема: функція задана в математичній системі координат, будувати потрібно на екрані, вказуючи координати в пікселях.
  • 102. Перетворення координат Математична Екранна система система координат координат (пікселі) Y a (0,0) x (x,y) yе b xе y X (xе,yе) (0,0) k – масштаб (довжина зображення одиничного xе = a + kx відрізка на екрані) yе = b - ky
  • 103. Програма program qq; 2π const a = 50; b = 200; k = 50; xmin = 0; xmax = 6.2832; var x, y, h: real; h – крок зміни x на екрані xe, ye, w: integer; begin w – довжина осі ОХ в пікселях w := round((xmax - xmin)*k); Line(a-10, b, a+w, b); осі координат Line(a, 0, a, 2*b); x := xmin; h := 0.05; цикл while x <= xmax do begin побудови y := 3*sin(x); графіка xe := a + round(k*x); ye := b - round(k*y); Point (xe, ye); x := x + h; ? end; end. Що погано?
  • 104. Як з’єднати точки? Алгоритм: Програма: логічна змінна Якщо перша точка var first: boolean; перейти в точку (xе,yе) ... початкове значення інакше begin відрізок в точку (xе,yе) ... first := True; while x <= xmax do begin ... вибір if first then begin варіанта MoveTo(xe, ye); дії first := False; end else LineTo(xe, ye); ... end; end.
  • 105. Завдання "4": Побудувати графік функції y = x2 на інтервалі [-3,3]. "5": Побудувати графік функції (еліпс) x2 y2 + =1 16 9
  • 106. Програмування на мові Паскаль Тема 9. Процедури
  • 107. Процедури Задача: Побудувати фігуру: ? Чи можна розв’язати відомими методами? Особливості: Три схожі фігури. подібності: розміри, кут повороту відмінності: координати, колір ? Скільки координат потрібно задати?
  • 108. Процедури Процедура – це допоміжний алгоритм, який призначений для виконання деяких дій. Примітка: • виконання однакових дій в різних місцях програми • розбивка програми (або іншої процедури) на підзадачі для кращого сприймання Задача Підзадача1 Підзадача2 Підзадача3 1.1 1.2 1.3 2.1 2.2 2.3 3.1 3.2 3.3
  • 109. Процедури Порядок розробки: • виділити однакові або схожі дії (три фігури) • знайти в них спільне (розміри, форма, кут повороту) і відмінності (координати, колір) • відмінності записати у вигляді невідомих змінних, вони будуть параметрами процедури параметри заголовок (x, y-60) procedure Tr( x, y, r, g, b: integer); 60 (x+100, y) begin MoveTo(x, y); колір LineTo(x, y-60); (x, y) 100 LineTo(x+100, y); координати LineTo(x, y); Brush(1, r, g, b); Fill(x+20, y-20); тіло процедури end;
  • 110. Програма формальні параметри 60 program qq; procedure Tr( x, y, r, g, b: integer); (100,100) begin ... 100 end; begin Pen(1, 255, 0, 255); виклик Tr(100, 100, 0, 0, 255); процедура процедури Tr(200, 100, 0, 255, 0); Tr(200, 160, 255, 0, 0); end. фактичні параметри
  • 111. Процедури Особливості: • всі процедури розміщені вище основної програми • в заголовку процедури перераховуються формальні параметри, вони позначаються іменами, оскільки можуть змінюватися procedure Tr( x, y, r, g, b: integer); • при виклику процедури в дужках вказуються фактичні параметри (числа або арифметичні вирази) в тому ж порядку Tr (200, 100, 0, 255, 0); x y r g b
  • 112. Процедури Особливості: • для кожного формального параметра після двокрапки вказується його тип procedure A (x: real; y: integer; z: real); • якщо однотипні параметри стоять поряд, їх перераховують через кому procedure A (x, z: real; y, k, l: integer); • всередині процедури параметри використовуються так само, як і змінні
  • 113. Процедури Особливості: • в процедурі можна оголошувати додаткові локальні змінні, інші процедури не мають до них доступу program qq; procedure A(x, y: integer); var a, b: real; локальні змінні begin a := (x + y)/6; ... end; begin ... end.
  • 114. Параметри-змінні Задача: скласти процедуру, яка міняє місцями значення двох змінних. Особливості: потрібно, щоб зміни зроблені в процедурі, стали відомі програмі яка викликає program qq; var x, y: integer; procedure Exchange ( a, b: integer ); var c: integer; ця процедура begin працює з c := a; a := b; b := c; копіями end; параметрів begin x := 1; y := 2; Exchange ( x, y ); writeln ( ’x = ’, x, ’ y = ’, y ); x = 1 y = 2 end;
  • 115. Параметри-змінні параметри можуть змінюватися procedure Exchange ( var a, b: integer ); var c: integer; begin c := a; a := b; b := c; end; Примітка: таким чином процедура (і функція) можуть повертати декілька значень, Заборонені варіанти виклику Exchange ( 2, 3 ); { числа } Exchange ( x+z, y+2 ); { вирази }
  • 116. Задания "4": Використовуючи процедуру, побудувати фігуру. "5": Використовуючи процедуру, побудувати фігуру.
  • 117. Програмування на мові Паскаль Тема 10. Рекурсія
  • 118. Рекурсивні об’єкти Приклади: Казка про попа і собаку: У попа була собака, він її любив. У попа була собака, він її любив. Вона з’їла кусок м’яса, він її убив. Вона з’їла кусок м’яса, він її убив. В ямку закопав, надпис написав: В ямку закопав, надпис написав: Казка про попа іі собаку Казка про попа собаку Малюнок з рекурсією: Факторіал:  1, якщо N = 1, N!=   N ⋅ ( N − 1)!, якщо N > 1. 1!= 1, 2!= 2 ⋅1!= 2 ⋅1, 3!= 3 ⋅ 2!= 3 ⋅ 2 ⋅1 4!= 4 ⋅ 3!= 4 ⋅ 3 ⋅ 2 ⋅1 N != N ⋅ ( N − 1) ⋅ ⋅ 2 ⋅1 Рекурсивний об’єкт – це об’єкт, визначений через один або декілька таких же об’єктів.
  • 119. Дерево Піфагора Дерево Піфагора з N рівнів – це стовбур і відходячі від нього симетрично два дерева Піфагора з N-1 рівнем, такі що довжина їх стовбурів в 2 рази менша і кут між ними рівний 90o. 6 рівнів: ? Як довести, що це рекурсивна фігура?
  • 120. Дерево Піфагора Особливості: коли кількість рівнів, що • коли зупинитися? залишилися стане рівним нулю! • дерева мають різний нахил α+45o x1 = x0 + L·cos(α) α-45o y1 = y0 – L·sin(α) (x1, y1) L нахил "дочірніх" дерев α α + π/4 α – π/4 (x0, y0)
  • 121. Процедура кут α довжина стовбура procedure Pifagor(x0, y0, a, L: real; N: integer); const k = 0.6; { зміна довжини } var x1, y1: real; { локальні змінні } begin завершити, якщо N=0 if N > 0 then begin x1 := x0 + L*cos(a); y1 := y0 - L*sin(a); рекурсивні Line (round(x0), round(y0), виклики round(x1), round(y1)); Pifagor (x1, y1, a+pi/4, L*k, N-1); Pifagor (x1, y1, a-pi/4, L*k, N-1); end; end; Рекурсивною називається процедура, викликаюча сама себе.
  • 122. Програма program qq; procedure Pifagor(x0, y0, a, L: real; N: integer); ... довжина стовбура кут α end; begin Pifagor (250, 400, pi/2, 150, 8); end; x0 y0 кількість рівнів ? Як нахилити дерево вправо на 30o? Pifagor (250, 400, 2*pi/3, 150, 8);
  • 123. Задания "4": Використовуючи рекурсивну процедуру, побудувати фігуру: "5": Використовуючи рекурсивну процедуру, побудувати фігуру :
  • 124. Програмування на мові Паскаль Тема 11. Анімація
  • 125. Анімація Анімація (англ. animation) – оживлення зображення на екрані. Задача: всередині синього квадрата 400 на 400 пікселів зліва направо рухається жовтий квадрат 20 на 20 пікселів. Програма зупиняється, якщо натиснута клавіша Esc або квадрат дійшов до границі синьої області. Проблема: як зобразити переміщення об’єкта на екрані? Прив’язка: розміщення об’єкта задається координатами (x,y) Принцип анімації: 1. малюємо об’єкт в точці (x,y) 2. затримка на декілька мілісекунд 3. затираємо об’єкт 4. змінюємо координати (x,y) 5. переходимо до кроку 1
  • 126. Як "зловити" натискуванням клавіші? Подія – це зміна в стані якого-небудь об’єкта або дія користувача (натиснення на клавішу, клік мишкою). IsEvent – логічна функція, яка визначає, чи були які-небудь дії користувача. Event – процедура, яка визначає, які саме дії відбулися. if IsEvent then begin var k, x, y: integer; Event(k, x, y); if k = 1 then writeln('Клавіша з кодом ', x) else { k = 2 } writeln('Мишка: x=', x, ' y=', y); end;
  • 127. Як вийти з циклу при натисканні Esc? True, якщо потрібно зупинитися program qq; var stop: boolean; k,code,i: integer; запуск циклу begin stop := False; якщо що-небудь відбулося... repeat if IsEvent then begin Event(k, code, i); що відбулося? if (k = 1) and (code = 27) then stop := True; end; якщо натиснута клавіша з кодом 27 (Esc), то ... стоп until stop; end;
  • 128. Процедура (малювання і стирання) Ідея (x, y) • одна процедура малює і стирає • стерти = намалювати кольором фону • границю квадрата відключити (в основній програмі) (x+20, y+20) малювати (True) або ні (False)? procedure Draw(x, y: integer; flag: boolean); begin малюємо: колір пензлика – жовтий if flag then Brush(1, 255, 255, 0) else стираємо: колір пензлика – синій Brush(1, 0, 0, 255); Rectangle(x, y, x+20, y+20); end; тільки заливка!
  • 129. Повна програма program qq; var x, y, k, code, i: integer; stop: boolean; процедура procedure Draw(x,y: integer; flag: Boolean); begin ... end; begin синій фон Brush(1, 0, 0, 255); Rectangle(10, 10, 400, 400); відключити границю Pen(0, 0, 0, 255); початкова x := 10; y := 200; stop := false; умова repeat if IsEvent then begin вихід по ... клавіші Esc end; Draw(x, y, True); Delay(10); чекаємо 10 мс Draw(x, y, False); x := x + 1; вихід при if x >= 400-20 then stop := true; досягненні границі until stop; end.
  • 130. Завдання "4": Два квадрати рухаються в протилежних напрямках: "5": Два квадрати рухаються в протилежних напрямках і відбиваються від стінок синього квадрата:
  • 131. Керування клавішами Задача: жовтий квадрат всередині синього квадрата керується клавішами-стрілками. Коди клавіш: вліво – 37 вверх – 38 Esc – 27 вправо – 39 вниз – 40 Проблема: як змінити напрям руху? Розв’язання: якщо було IsEvent if {була подія} then begin натиснуто на if {натиснута клавіша} then begin клавішу, … Event ( k, code, i); if k = 1 then begin {отримати код клавіші - code} case code of then x := x – 1; if code = 37 if code := 38 – 1; 38: y y – y – 1; 37: x = x then y := := 1; if code := 39 + 1; 40: y x + y + 1; 39: x = x then x := := 1; 27: stop := True; if code = 40 then y := y + 1; end; if code = 27 then stop := True; end; end;
  • 132. Програма program qq; var x, y, k, code, i: integer; процедура stop: boolean; procedure Draw(x,y: integer; flag: Boolean); begin ... end; begin ... основний цикл repeat Draw(x, y, True); Delay(20); Draw(x, y, False); опрацювання if IsEvent then begin подій ... end; ? until stop; end. Що погано?
  • 133. Як забрати блимання? Проблема: навіть якщо не натиснута жодна клавіша, квадрат перемальовується через кожні 20 мс (блимання!) Що бажається: не перемальовувати квадрат, якщо не було ніяких подій Розв’язання: намалювати квадрат і чекати подію Нова проблема: як чекати подію? Розв’язання нової проблеми: пустий цикл "поки не трапилася подія, нічого не робити": while not IsEvent do;
  • 134. Програма program qq; var x, y, k, code, i: integer; процедура stop: boolean; procedure Draw(x,y: integer; flag: Boolean); begin ... end; begin ... малюємо квадрат repeat чекаємо подію Draw(x, y, True); while not IsEvent do; тільки тепер стираємо Draw(x, y, False); Event(k, code, i); ... until stop; end. ? Що можна покращити?
  • 135. Завдання "4": Квадрат рухається при натисненні стрілок, проте не може вийти за границі синього квадрата: "5": Квадрат неперервно рухається, при натисненні стрілок міняє напрям і відбивається від стінок синього квадрата:
  • 136. Обертання Задача: зобразити модель обертання Землі навколо Сонця. Проблема: рух по колу, як змінюються координати? Розв’язання: використовувати в якості незалежної змінної (змінювати в циклі) кут повороту α (x, y) L x = x0 + L·cos(α) α y = y0 – L·sin(α) (x0, y0)
  • 137. Процедура малювати (True) або ні (False)? procedure Draw(x, y: integer; flag: boolean); const r = 10; радіус Землі begin малюємо: колір пензлика – голубий if flag then Brush(1, 100, 100, 255) else Brush(1, 0, 0, 0); стираємо: колір пензлика – чорний Ellipse(x-r, y-r, x+r, y+r); end; тільки заливка! (x-r, y-r) (x,y) (x+r, y+r)
  • 138. Константи і змінні program qq; const rSun = 60; { радіус Сонця} L = 150; { радіус орбіти Землі } x0 = 200; { координати центра Сонця} y0 = 200; var x, y, { координати Землі } k, code, i: integer; { для Event } a, ha: real; { кут повороту, крок } stop: boolean; { признак зупинки програми } procedure Draw(x, y: integer; flag: Boolean); begin ... end; begin ... end.
  • 139. Основна програма program qq; ... залити фон чорним begin Brush(1, 0, 0, 0); Fill(1,1); малюємо Сонце Brush(1, 255, 255, 0); Ellipse(x0-rSun, y0-rSun, x0+rSun, y0+rSun); a := 0; ha := 1*pi/180; { початковий кут, крок 1o за 100 мс} stop := false; Pen(0,0,0,0); { відключаємо контури } repeat x := round(x0 + L*cos(a)); нові координати y := round(y0 - L*sin(a)); Draw(x, y, True); Delay(100); чекаємо 100 мс Draw(x, y, False); if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := true; end; a := a + ha; поворот на ha until stop; end.
  • 140. Завдання "4": Зобразити модель Сонця з двома планетами, які обертаються в протилежних напрямках: "5": Зобразити модель системи Сонце-Земля- Місяць:
  • 141. Програмування на мові Паскаль Тема 12. Випадкові числа
  • 142. Випадкові числа Випадкові події: всюди… • підкидання монети (“герб" або “копійка") • падіння снігу • броунівський рух • перешкоди при телефонному зв’язку • шум радіоефіру Випадкові числа – це така послідовність чисел, для якої неможливо передбачити наступне число, якщо навіть відомі попередні. Проблема: як одержати на комп’ютері? Можливі розв’язання: • використовувати зовнішнє джерело шумових перешкод • з допомогою математичних перетворень
  • 143. Псевдовипадкові числа Псевдовипадкові числа – це така послідовність чисел, яка має властивості випадкових чисел, проте кожне наступне число обчислюється по заданій формулі. Приклади: 1. Випадкові цілі числа [0,m) (лінійний конгруентний метод) xn = (a ⋅ xn −1 + c) mod m a, c, m – цілі числа xn = (16807 ⋅ xn −1 + 12345) mod 1073741823 просте число 230-1 2. Випадкові дійсні числа [0,1] наприклад, k = 5 { xn = (π + xn −1 ) k } дробова частина числа Література: Д. Кнут, Мистецтво програмування для ЕОМ, т.2.
  • 144. Розподіл випадкових чисел Модель: сніжинки падають на відрізок [a,b] розподіл рівномірний нерівномірний a b a b ? Скільки може бути різних розподілів ?
  • 145. Розподіл випадкових чисел Особливості: • розподіл – це характеристика всієї послідовності, а не одного числа • рівномірний розподіл один, комп’ютерні датчики (псевдо)випадкових чисел дають рівномірний розподіл • нерівномірних – багато • будь-яке нерівномірне можна отримати з допомогою рівномірного a b a b x1 + x2 x1 + x2 +  + x12 x= x= 2 12 рівномірний розподіл рівномірний розподіл
  • 146. Генератор випадкових чисел в Паскалі Цілі числа в інтервалі [0,N]: var x: integer; ... x := random ( 100 ); { інтервал [0,99] } Дійсні числа в інтервалі [0,1] var x: real; ... x := random; { інтервал [0,1] }
  • 147. Випадкові числа Задача: заповнити прямокутник 400 на 300 пікселів рівномірно точками випадкового кольору Як отримати випадкові координати точки? x := random ( 400 ); y := random ( 300 ); Як досягти рівномірності? забезпечується автоматично при використанні функції random Як отримати випадковий колір? Pen (1, random(256), random(256), random(256)); Point ( x, y );
  • 148. Програма program qq; var x, y, k, code, i: integer; stop: boolean; begin випадкові координати stop := False; repeat x := random(400); випадковий колір y := random(300); Pen(1, random(256), random(256), random(256)); Point(x, y ); вихід по клавіші Esc if IsEvent then begin Event(k, code, i); if (k = 1) and (code = 27) then stop := True; end; until stop; end.
  • 149. Завдання "4": Ввести з клавіатури координати кутів прямокутника і заповнити (100,100) його точками випадкового кольору. (300,200) "5": Заповнити трикутник точками випадкового кольору (рівномірно або нерівномірно). Підказка: візьміть рівнобедрений трикутник з кутом 45о.
  • 150. Програмування на мові Паскаль Тема 13. Функції
  • 151. Функції Функція – це допоміжний алгоритм (підпрограма), результатом роботи якої є деяке значення. Приклади: • обчислення sin x , cos x , x • розрахунок значення по складених формулах • відповідь на запитання (просте число або ні?) Для чого? • для обчислення однакових розрахунків в різних місцях програми • для створення загальнодоступних бібліотек функцій ? В чому відмінність від процедури?
  • 152. Функції Задача: скласти функцію, яка обчислює більше з двох значень, і навести приклад її використання Функція: формальні параметри function Max (a, b: integer): integer; begin if a > b then Max := a else Max := b; end. це результат функції
  • 153. Функції Особливості: • заголовок починається словом function function Max (a, b: integer): integer; • формальні параметри описуються так само, як і для процедур function qq( a, b: integer; x: real ): real; • можна використовувати параметри-змінні function Max ( var a, b: integer): integer; • в кінці заголовка через двокрапку вказується тип результату function Max (a, b: integer): integer ; • функції розміщуються ВИЩЕ основної програми
  • 154. Функції Особливості: • можна оголошувати і використовувати локальні змінні function qq (a, b: integer): float; var x, y: float; begin ... end; • значення, яке є результатом, записується в змінну, ім’я якої співпадає з назвою функції; оголошувати НЕ ПОТРІБНО: function Max (a, b: integer): integer; begin ... Max := a; ! end; В Delphi: Result := a;
  • 155. Програма program qq; c var a, b, max: integer; function Max (a, b: integer): integer; begin ... end; begin фактичні параметри writeln(‘Введіть два числа'); read(a, b); виклик функції c := Max ( a, b ); max c writeln(‘Найбільше число ', max ); end. ! не повинні співпадати! і процедур Імена змінних, функцій
  • 156. Логічні функції Задача: скласти функцію, яка визначає, чи дійсно, що задане число – просте. Особливості: • відповідь – логічне значення (True або False) • результат функції можна використовувати як логічну величину в умовах (if, while) Алгоритм: рахуємо кількість дільників в інтервалі від 2 до N-1, якщо воно не дорівнює нулю – число складене. count := 0; for i := 2 to N-1 do if N mod i = 0 then count := count + 1; ? Як краще? if count = 0 then { число N просте} else { число N складене }
  • 157. Логічні функції program qq; результат – логічне значення var N: integer; function Prime (N: integer): boolean; var count, i: integer; begin перебір тільки до N i := 2; count := 0; while i*i <= N do if N mod i = 0 then count := count + 1; i := i + 1; end; Prime := (count = 0); end; умова – це логічне значення begin writeln(‘Ввести ціле число'); read(N); виклик функції if Prime(N) then writeln(N, ' – просте число') else writeln(N, ' – складене число'); end.
  • 158. Завдання "4": Скласти функцію, яка визначає суму всіх чисел від 1 до N і навести приклад її використання. Приклад: Ввести число: 100 сума = 5050 "5": Скласти функцію, яка визначає, скільки зерен попросив положити на N-ту клітку винахідник шахмат (на 1-шу – 1 зерно, на 2-у – 2 зерна, на 3-ю – 4 зерна, …) Приклад: Ввести номер клітки: 28 На 28-ой клітці 134217728 зерен.
  • 159. Завдання (варіант 2) "4": Скласти функцію, яка визначає найбільший спільний дільник двох натуральних чисел і навести приклад її використання. Приклад: Ввести два числа: 14 21 НСД(14,21)=7 "5": Скласти функцію, яка обчислює синус як суму ряду (с точністю 0.001) x3 x5 x7 sin x = x − + − +  x в радіанах! 3! 5! 7! Приклад: Ввести кут в градусах: 45 sin(45) = 0.707