Процик Анатолій Петрович Колки 2006 Послідовність викладу матеріалу побудована так, щоб читач з першого ж урок

Вид материалаУрок

Содержание


Цикли. інструкція
For, while
BEGIN і END
Практична робота
Var i, N, Summa: integer; begin
Var i, N, s, Summa: integer; begin
Практична робота
VAR s: integer
Введiть ціле число –> 5
BEGIN s := 0; sum(s); writeln(‘Сума введених чисел: ’,s); END.
VAR n : integer; procedure
Практична робота
VAR i,j:integer; BEGIN
Практична робота
Оголошення масиву
Виведення масиву
Виведення масиву
Практична робота
END. Примітка
Практична робота
...
Полное содержание
Подобный материал:
1   2   3   4   5
§ 20: ЦИКЛИ. ІНСТРУКЦІЯ FOR

При розв'язанні багатьох задач деяку послідовність дій доводиться виконувати кілька разів. Наприклад, програма контролю знань виводить питання, приймає відповідь, додає оцінку за відповідь до суми балів і повторює цю дію ще раз, і ще до тих пір, поки не будуть вичерпані всі питання. Інший приклад. Щоб знайти прізвище людини в списку, треба перевірити перше прізвище списку, потім друге, третє і т.д. до тих пір, поки не буде знайдена потрібна або не буде досягнутий кінець списку. Такі дії, що повторюються, називаються циклами і реалізуються в програмі з використанням інструкцій (вказівок) циклів.

В мові Pascal циклічні обчислення реалізуються за допомогою інструкцій FOR, WHILE і REPEAT.

ІНСТРУКЦІЯ FOR

Інструкція FOR використовується, якщо треба виконати деяку послідовність дій кілька разів, причому число повторень наперед відоме. Наприклад, обчислити значення функції в декількох різних, віддалених на рівній відстані один від одного точках, тобто побудувати таблицю значень функції. Такі задачі розв'язуються з використанням циклу з фіксованим числом повторень, який в мові Pascal реалізується за допомогою інструкції FOR.

В загальному вигляді інструкція виглядає так:

for <лічильник циклу>:=поч. значення лічильника to кін. значення лічильника do

begin

{ послідовність вказівок }

end;

де <лічильник циклу> — ім'я змінної-лічильника циклів; поч. значення лічильника — арифметичний вираз, що визначає початкове значення змінної-лічильника циклів; кін. значення лічильника — арифметичний вираз, що визначає кінцеве значення змінної-лічильника циклів.

Приклади1:

for і:=1 to 10 do write ('*');

Примітка !!! Якщо між begin і end знаходиться тільки одна інструкція (як у нас write('*')), то begin і end можна не писати.

В результаті виконання даної інструкції на екран буде виведено 10 зірочок.

Для визначення значень початкового і кінцевого значення лічильника циклів використовують не лише літерали, а і константи та змінні.

Приклади 2:

j:=1;

N:=10;

for і:=j to N do write ('*');

В результаті виконання даних інструкцій на екран буде виведено також 10 зірочок.

Слід зауважити, що у випадку, якщо початкове значення лічильника перевищує кінцеве значення лічильника, то послідовність вказівок між BEGIN і END жодного разу не буде виконана.

Приклади 3:

j:=1;

N:=5;

for і:=N to j do write ('*');

В результаті виконання даних інструкцій на екран не буде виведено жодної зірочки.

Значення змінної-лічильника можна використовувати в послідовності операторів між BEGIN і END.


Приклади 4:

for і := 1 to 5 do writeln( і );

В результаті виконання даної інструкції на екран будуть виведені числа 1, 2, 3, 4 і 5 — кожне число на окремому рядку.


Приклад 5: Наступна підпрограма обчислює суму чисел 1+2+3+4+5+…+ n:

function summa(n:integer):integer;

var sum:integer;

і:integer; { лічильник циклу – він одночасно являється
елементом списка чисел, що сумуються}

begin

summ:=0; {ініціалізація локальних змінних}

for і:=1 to 5 do summ:=summ+i;

summa := summ;

end;

Якщо в інструкції FOR замість слова ТO записати DOWNTO, то після чергового циклу значення лічильника буде не збільшуватися, а зменшуватися.

Приклад 6

for j:=10 downto 0 do writeln (і) ;

В результаті виконання даних інструкцій виводяться на екран числа від 10 до 0.


ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Складіть програму виведення на екран заданого з клавіатури числа зірочок (‘*’).
  3. Наберіть програму на основі підпрограми до прикладу 5 та проекспериментуйте з нею.
  4. Змініть функції на процедуру.



§21. РОЗВ’ЯЗУВАННЯ ЗАДАЧ НА ЗНАХОДЖЕННЯ СУМ ТА ДОБУТКІВ РЯДІВ

Нехай нам необхідно знайти суму такого ряду: (1+2)+(1+2+3)+…+(1+2+…+N).

Складемо математичну модель для нашої задачі.

Наша сума (позначимо її через Summa) складається з доданків кількістю N-1, які в свою чергу також є сумами (позначимо їх через sumі).

Отже ми можемо записати таку математичну модель:



На початковому етапі конструювання алгоритму ми можемо написати таку програму:

Var

i, N, Summa: integer;

begin

write(‘n = ‘);

read(N);

for i:=1 to N-1 do Summa:=Summa+ sum(і+1);

writeln(‘Сума = ‘,Summa);

end.

Наша задача містить в собі під задачу, а саме задачу про знаходження sum(і+1) – суми натуральних чисел від 1 до і+1.

Отже задача про знаходження sum(i) може бути розв’язана так:

function sum(i:integer):integer;

var s,j:integer;

begin

s:=0; {ініціалізація лоуальних змінних}

for j:=1 to i do s:=s+j;

sum := s;

end;


Треба зауважити, що складена щойно нами програма не є раціональною. Адже при відшуканні кожної наступної суми s ми починаємо сумувати з 1, тоді, як кожна наступна сума s більша від попередньої на величину і+1.

Отже раціоналізована програма нашої задачі має вигляд:

Var

i, N, s, Summa: integer;

begin

write(‘n = ‘);

read(N);

s:=1;

for i:=1 to N-1 do

begin

s:=s+(i+1);

Summa:=Summa+ s;

end;

writeln(‘Сума = ‘,Summa);

end.


§22: ІНСТРУКЦІЯ WHILE

Інструкція WHILE використовується в програмі, якщо треба провести деякі повторні обчислення (цикл), проте число повторів наперед невідомо і визначається самим ходом обчислення. Типовими прикладами використовування циклу WHILE є обчислення із заданою точністю.

В загальному вигляді інструкція виглядає:

while <умова> do

begin

{ послідовність інструкцій }

end;

де <умова> — логічний вираз (аналогічний виразу, що стоїть після слова if у розгалужені).

Інструкції, що знаходяться між BEGIN і END, виконуються до тих пір, поки <умова> не стане істинною.

Зауваження:
  • для того щоб послідовність інструкцій між BEGIN і END була виконана хоча б один раз, необхідно, щоб перед виконанням інструкції WHILE умова була істинна;
  • для того щоб цикл завершився, необхідно, щоб послідовність інструкцій між BEGIN і END змінювала значення змінних, що входять у вираз умови.

Наступна програма (приклад 1) обчислює значення числа (пі) з точністю, що задається з клавіатури. Обчислення значення засновано на тому, що сума ряду 1-1/3+1/5-1/7+1/9+... наближається до значення /4 при достатньо великій кількості членів ряду. Кожний член ряду обчислюється по формулі 1/(2*n – 1) і домножаєтся на -1, якщо n парне (визначити, чи є n парним, можна перевіркою остачі від ділення n на 2). Обчислення закінчується тоді, коли значення чергового члена ряду стає менше ніж задана точність обчислення.

Приклад 1

Var

eps:real;

function pi(e:real):real;

var p,elem:real;

n:integer;

begin

elem := 1; n := 1; p := 0; {ініціалізація лоуальних змінних}

while elem>=e do

begin

elem:=1/(2*n-1);

if (n mod 2) = 0 then p := p – elem else p := p + elem;

n:=n+1;

end;

pi:=p*4;

end;

BEGIN

write(‘Введіть похибку обчислення числа pi -> ’);

readln(eps);

writeln(‘Значення числа Пі з точністю ‘, eps:9:6, ‘рівне ‘, pi(eps):9:5);

END.

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму прикладу 1 та проекспериментуйте з нею.
  3. Змініть функцію на еквівалентну їй процедуру.



§23: ІНСТРУКЦІЯ REPEAT

Інструкція REPEAT, як і інструкція WHILE, використовується в програмі, якщо треба провести деякі обчислення (цикл), що повторюються, і як для WHILE число повторів наперед не відоме і визначається самим ходом обчислення.

В загальному вигляді інструкція виглядає так:

repeat

{ послідовність інструкцій }

until <умова>

де <умова> — вираз логічного типу.

Приклад 1:

і:=1;

repeat

writeln (і);

i:= i + 1;

until і =10;

На екран виведуться числа від 1 до 10 кожне в наступному рядку.

Інструкція виконується таким чином:
  1. Виконуються інструкції наступні за словом REPEAT.
  2. Обчислюється значення умови. Якщо умова хибна (значення умови рівне FALSE), то повторно виконуються інструкції циклу. Якщо ж умова істина (значення умови рівне TRUE), то виконання циклу припиняється.

Таким чином, вказівки, що знаходяться між REPEAT і UNTIL виконуються, до тих пір, поки умова хибна (значення умови рівне FALSE).

Зауваження:
  • послідовність інструкцій між REPEAT і UNTIL завжди буде виконана хоча б один раз;
  • для того, щоб цикл завершився, необхідно, щоб послідовність операторів між REPEAT і UNTIL змінювала значення змінних, що входять у вираз умови.
  • інструкції, виконання яких повторюється не беруться в алгоритмічні дужки (їх роль виконують слова REPEAT (початок циклу) та UNTIL (кінець циклу)

Інструкція корисна при розробці програм, які оброблюють данні відразу при введенні з клавіатури.

Приклад 2: Обчислення суми додатних чисел, що вводяться з клавіатури.

VAR s: integer;

function summ(var summa:integer);

var

n
Програма завершує свою роботу, як тільки вводиться від’ємне число.

Ось приклад роботи програми:

Введiть ціле число –>12

Введiть ціле число –> 5

Введiть ціле число –>6

Введiть ціле число –>-3

Сума введених чисел: 23
: integer;

begin

repeat

write('Введiть ціле число –> ');

readln(n);

if n>0 then summa :=summa + n;

until n <= 0;

end;

BEGIN

s := 0;

sum(s);

writeln(‘Сума введених чисел: ’,s);

END.

Як відомо, число називається простим, якщо воно ділиться тільки на одиницю і на себе. Перевірити, чи є число n простим, можна поділивши його на два, на три і т.д. до n і перевіркою остачі після кожного ділення. Якщо остача рівна нулю, то отже знайдено число, на яке n ділиться без остачі. Порівнявши n і отримане таким чином число, можна визначити, чи є n простим (якщо ми „дійдемо” до n, то число просте).

Приклад 3: Програма, що перевіряє, чи є введене з клавіатури число простим.

VAR n : integer;

procedure simple(chislo:integer)

var r, d: integer;

begin

d:=2; { спочатку будемо ділити на два }

repeat

r:= chislo mod d;

if r<>0 {Якщо n не розділилося без остачі на d } then d:=d + 1;

until r = 0; { поки не знайшли число, на яке ділиться d}

if d = chislo then writeln( chislo ,' — просте число. '){число ділиться лише на саме себе}

else writeln(chislo ,' — не просте число.');

end;

B
Ось приклад роботи цієї програми:

Введiть ціле число –> 839

839 – просте число
EGIN


write('Введiть ціле число –> ');

readln(n);

simple(n);

END.

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму на основі підпрограми прикладу 2 та проекспериментуйте з нею.
  3. Видозмініть текст програми до вигляду прикладу 3 та проекспериментуйте з нею



§24. ПОКРОКОВЕ ВВЕДЕННЯ-ВИВЕДЕННЯ ДАНИХ
  1. Дано натуральне N число і дійсні а1, a2, a3,…,aN. Обчислити:
  1. а1+ a2 + a3 +…+ aN;
  2. |a1+ a2 + a3 +…+ aN|;
  3. |а1| + |a2| + |a3| +…+ |aN|;
  4. а1*a2*a3*…*aN;
  5. (а1+1)*(a2 + 2)*…*(aN +N);
  6. а1– a2 + a3 –…+ (-1)n+1*a;
  7. sin(a1 + a2 +…+aN)*cos(a1*a2*…aN);
  8. –a1, +a2, –a3,…, (–1)N*aN ;
  9. a1, a1*a2, …, a1*a2*a3*…*aN
  10. sin(a1), sin(a1+a2),…, sin(a1+a2+…+aN);
  11. a1+1!, a2+2!, …. , an+N!;

12) a12+1 + a22+2 +…+ aN2+N.



§ 25: ВКЛАДЕНІ ЦИКЛИ. РОЗВ’ЯЗУВАННЯ ЗАДАЧ ТА СКЛАДАННЯ ПРОГРАМ.

Розглянемо програму виведення на екран монітора таблиці множення (таблиці Піфагора).

Таблиця Піфагора





1

2

3

4

5

6

7

8

9

1

1

2

3

4

5

6

7

8

9

2

2

4

6

8

10

12

14

16

18

3

3

6

9

12

15

18

21

24

27

4

4

8

12

16

20

24

28

32

36

5

5

10

15

20

25

30

35

40

45

6

6

12

18

24

30

36

42

48

54

7

7

14

21

28

35

42

49

56

63

8

8

16

24

32

40

48

56

64

72

9

9

18

27

36

45

56

63

72

81
VAR i,j:integer;

BEGIN

writeln(‘ 1 2 3 4 5 6 7 8 9’);

for i:=1 to 9 do

begin

write(i:3);

for j:=1 to 9 do write(i*j:4);

writeln;

end;

END.

В даній програмі змінна і пробігає значення від 1 до 9 – вона визначає номер рядка таблиці Піфагора, j – визначає номер стовпця. Коли змінна і отримує чергове значення, це значення спочатку виводиться (номер рядка), а потім виводяться 9 значень виразу і*j, де j – пробігає значення від 1 до 9 . Таким чином у зовнішньому циклі виводиться цілий рядок, а у вкладеному – окремий елемент рядка.

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Н
    Таблиця квадратів

    1 2 3 4 5 6 7 8 9

    1 121 144 169 196 225 256 289 324 361

    2 441 484 529 576 625 676 729 7 84 841

    3 961 1024 1089 1156 1225 1296 1369 1444 1521

    4 1681 1764 1849 1936 2025 2116 2209 2304 2401

    5 2601 2704 2809 2916 3025 3136 3249 3364 3481

    6 3721 3844 3969 4096 4225 4356 4489 4624 4761

    7 5041 5184 5329 5476 5625 5776 5929 6084 6241

    8 6561 6724 6889 7056 7225 7396 7569 7744 7921

    9 8281 8464 8649 8836 9025 9216 9409 9604 9801
    аберіть текст програми виведення таблиці Піфагора. Запустіть програму на виконання. Проекспериментуйте з нею.
  3. Переробіть текст програми таким чином, щоб на екран монітора виводилась таблиця квадратів
  1. Складіть програми до запропонованих вчителем задач з додатка 3.
  2. Запустіть середовище програмування та наберіть одну з складених вами програм. Проекспериментуйте з нею



§26. ПОЄДНАННЯ ПОВТОРЕННЯ І РОЗГАЛУЖЕННЯ

1. Визначити яке значення одержить змінна l в результаті вико­нання послідовності операторів:

for і: = 1 to 5 do

begin

read(x);

if x > = 0 then l: = 2 * х

end;

де зміннa х послідовно набуватиме значень:
  1. 1, 4, -2, 5, 0;
  2. 1, 3, 5, 2, 4.
  1. Скласти програму, яка б допомогла працівникам ДАІ виз­начати кількість порушників перевищення швидкості на трасі, якщо відомо, що на даному проміжку траси встановлено обмеження на швидкість v(max), а прилад фіксує швидкість автомобілів v1, v2,...,vN,.
  2. Розробити алгоритм зараховування результатів учасників спор­тивних змагань за певними віковими категоріями, якщо відомо, що:

а) для учасників до 15 років результат повинен знаходитись у проміжку [ 10; 15];

6) для учасників від 16 до 20 років — у пром. [16;20];

в) від 21 до 35 років — у проміжку [21:25];

г) від 36 до 45 років — у проміжку [26;30];

д) старші 45 років — у проміжку [20;30].

Дані задаються парами чисел (аi;bi), де аi — вік i-го учасника, bi – результат i-го учасника, i = 1,2, ..., п.


§27. РОЗВ’ЯЗУВАННЯ ЗАДАЧ






§ 28: ПОНЯТТЯ МАСИВУ. ОПИС МАСИВУ. ВВЕДЕННЯ-ВИВЕДЕННЯ МАСИВУ.

Масив — це структура даних, яку можна розглядати як набір змінних однакового типу, що мають спільне ім'я. Масиви зручно використовувати для зберігання однотипної інформації, наприклад, елементів таблиць, коефіцієнтів громіздких лінійних рівнянь та систем рівнянь, прізвищ працівників деякої великої фірми, назв днів тижня, тощо.

ОГОЛОШЕННЯ МАСИВУ

Перед використанням масив, як і будь-яка змінна, повинен бути оголошений в розділі оголошення змінних.

В загальному вигляді оголошення масиву виглядає так:

<Ім'я>:array[Нижній_ індекс. . Верхній_ індекс] of <тип>;

Де <ім’я> — ім'я зміної-масиву;

array — ключове слово, яке вказує, що змінна є масивом.

нижній_індекс і верхній_індекс — цілі числа, що визначають діапазон зміни індексів (номерів) елементів масиву і вказують на кількість елементів (розмір) масиву;

а <тип> — тип елементів масиву.

Приклади оголошення масивів

1) temper:array[1..31] of real; 2) koef:array[1..2] оf integer; 3) name:array[1..30] of string;

Зауваження!!! Тип string — рядкова змінна. Змінна типу string може містити в собі до 255 символів (букви, цифри, розділові знаки), тобто будь-яке слово.

Деякі типові дії з масивами

До типових дій з масивами можна віднести наступні:
  • введення масиву;
  • виведення масиву;
  • пошук в масиві заданого елемента;



  • пошук в масиві максимального або мінімального елемента;
  • сортування масиву.

ВИВЕДЕННЯ МАСИВУ

Під виведенням масиву розуміється виведення на екран значень елементів масиву. Якщо в програмі необхідно вивести значення всіх елементів масиву, то для цього зручно використовувати інструкцію FOR, змінна-лічильник якої може бути використана як індекс елемента масиву.

Наприклад програма, що виводить на друк номера і назви днів тижня, що зберігаються в масиві day, може бути реалізована так: (окремий день тижня – наприклад, „Понеділок” – може зберігатися в змінній типу string)

Приклад 1

VAR day:array[1..7] of string;

і:integer;

BEGIN

day[1]:='Понеділок';

day[2]:='Вівторок';

day[3]:='Середа';


day[4]:='Четвер';

day[5]:='П’ятниця'; day[6]:='Субота';

day[7]:='Неділя';

for і:=l to 7 do writeln(і,’ ‘,day[і]);

END.



Результат роботи програми:

1 Понеділок

2 Вівторок

3 Середа

4 Четвер

5 П’ятниця

6 Субота

7 Неділя






ВВЕДЕННЯ- ВИВЕДЕННЯ МАСИВУ

П
Результат роботи програми:

1-й день тижня –> Понеділок

2-й день тижня –> Вівторок

3-й день тижня –> Середа

4-й день тижня –> Четвер

5-й день тижня –> П’ятниця

6-й день тижня –> Субота

7-й день тижня –> Неділя


Ви ввели такі дні тижня:

1 Понеділок

2 Вівторок

3 Середа

4 Четвер

5 П’ятниця

6 Субота

7 Неділя
ід введенням масиву розуміється введення значень елементів масиву. Як і виведення масиву, введення зручно реалізувати за допомогою інструкції FOR. Щоб користувач програми знав, введення якого елемента масиву чекає програма, слідує організувати виведенням підказок перед введенням чергового елемента масиву. В підказці звичайно указують індекс елемента масиву.

Приклад 2. Програма введення та виведення днів тижня.

type masiv = array[1.. 7] of string;

VAR day : masiv;

procedure InputMass(var mass : masiv);

var i:integer;

begin

for і:=l to 7 do

begin

write(і,’-й день тижня –> ‘);

readln(mass[i]);

end;

end;


procedure OutputMass(mass : masiv);

var i:integer;

begin

writeln(‘Ви ввели такі дні тижня:’);

for і:=l to 7 do writeln(і,’ ‘,mass[і]);

end;

BEGIN

InputMass(dey);

writeln;

OutputMass(dey);

END.



Для скорочення запису програми ми окремо описали тип masiv = array[1.. 7] of string. Це дає можливість при описі глобального масиву day, а також в описі формального параметра mass підпрограм InputMass та OutputMass вказувати замість типу array[1.. 7] of string, тип masiv.

Процедури введення та виведення елементів масиву дійсних чисел в загальному випадку.

Крім формального параметру mass процедури введення та виведення повинні містити ще й деякий параметр n – кількість елементів масиву:

type masiv = array[1.. 1000] of real;

procedure InputMass(n: integer; var mass : masiv);

var i:integer;

begin

for і:=l to n do

begin

write(і,’-й елемент –> ‘);

readln(mass[i]);

end;

end;


procedure OutputMass(n : integer; mass : masiv);

var i:integer;

begin

for і:=l to n do writeln(і,’ ‘,mass[і]:5:2);

end;



Зауваження! Паскаль не дозволяє описувати масиви як формальні параметри безпосередньо. Тому при використанні масиву як формального параметру процедури чи функції необхідно попередньо задати тип цього масиву у блоці type.

Наприклад. Якщо в попередньому прикладі замість

type masiv = array[1.. 1000] of real;

procedure InputMass(n: integer; var mass : masiv)

записати

procedure InputMass(n: integer; var mass : array[1.. 1000] of real;)

то компілятор видасть помилку


ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму прикладу 1 та проекспериментуйте з нею.
  3. Видозмініть текст програми до вигляду прикладу 2 та проекспериментуйте з нею



§ 29: НАЙПРОСТІШІ ОПЕРАЦІЇ НАД ЕЛЕМЕНТАМИ МАСИВУ.

Найпростішою операцією над елементами масиву є їх сумування. Розглянемо сумування елементів масиву на прикладі програми, яка запрошує температуру повітря протягом тижня і запам'ятовує введені значення в масиві temper, потім обчислюється середнє значення температури (щоб обчислити середнє значення температури, необхідно спочатку просумувати всі значення температури протягом тижня і зберегти в деякій змінній sum, а потім поділити її значення на 7 – кількість днів в тижні). Для організації підказок використовується масив рядків day.

П
Результат роботи програми:

Задайте температуру повітря за тиждень.

Понеділок –> 12

Вівторок –> 10

Середа –> 16

Четвер –> 18

П’ятниця –> 17

Субота –> 16

Неділя –> 14

Середня температура за тиждень: 14.71.
риклад 1


type T = array[1..7] of real;

VAR day:array[1..7] of string; { назви днів тижня }

temper: T; { температура }

sum:real; { сума температур за тиждень }

sеredn:real; { середня температура за тиждень }

і:integer;

BEGIN

day[1]:='Понеділок'; day[2]:='Вівторок';

day[3]:='Середа'; day[4]:='Четвер';

day[5]:='П’ятниця'; day[6]:='Субота';

day[7]:='Неділя';

writeln('Задайте температуру повітря за тиждень.');

InputTemp(temper); {Процедура введення температур на протязі тижня}

sum:=0;

for і:=1 to 7 do sum:=sum + temper [і]; {обчислення суми температури за тиждень }

sеredn: =sum/7 ;{обчислення середньої температури за тиждень }

writeln ('Средняя температура за тиждень:',sredn:6:2);

END.

Примітка Процедуру InputTemp(temper) запишіть самі.

Розглянемо ще одну програму, яка також запрошує температуру повітря протягом тижня і запам'ятовує введені значення в масиві temper, а потім виводить лише додатні значення температури та дні тижня, що цим температурам відповідають.

Приклад 2

VAR

day:array[1..7] of string; { назви днів тижня }

temper:array[1..7] of real; { температура }

і:integer;

BEGIN


Результат роботи програми:

Задайте температуру повітря за тиждень.

Понеділок –> 1

Вівторок –> 2

Середа –> -3

Четвер –> 0

П’ятниця –> 1

Субота –> -5

Неділя –> -4


Додатня температура спостерігалась в такі дні:

Понеділок –> 1

Вівторок –> 2

Четвер –> 0

П’ятниця –> 1

day[1]:='Понеділок'; day[2]:='Вівторок';

day[3]:='Середа'; day[4]:='Четвер';

day[5]:='П’ятниця'; day[6]:='Субота';

day[7]:='Неділя';

writeln('Задайте температуру повітря за тиждень.');

InputTemp(temper);

writeln(‘Додатня температура спостерігалась в такі дні:’);

for і:=1 to 7 do

if temper[і]>=0 then writeln(day [і],' –> ' ,temper[і]);

END.

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму прикладу 1 та проекспериментуйте з нею.
  3. Видозмініть текст програми до вигляду прикладу 2 та проекспериментуйте з нею



§30: ПОШУК ЗАДАНОГО ЕЛЕМЕНТА В МАСИВІ.

На практиці найчастіше зустрічаються пошукові задачі, тобто пошук заданого елемента в деякій послідовності значень. Але зрозуміло, що зручніше шукати необхідну інформацію там, де є певний порядок. Наприклад, пошук в бібліотечній картотеці, де формуляри упорядковані за алфавітом. Опираючись на це, можна сформулювати такі три класичні задачі.
  • Пошук заданого елемента в масиві
  • Пощук мінімального (максимального) елемента в масиві.
  • Впорядкування масиву за зростанням (спаданням


ПОШУК ЗАДАНОГО ЕЛЕМЕНТА В МАСИВІ.

Нехай дано деякий масив значень a[1], a[2], ...,а[n] і значення величини х. Необхідно визначити, чи містить вказаний масив величину х, і якщо так, то на якому місці.

Ця задача розв'язується послідовною лінійною перевіркою всіх елементів масиву a[1], a[2], ...,а[n] на збігання з величиною х.

Приклад 1

type masiv = array[1..100] of real;

VAR a: masiv;


Результат роботи програми:

Задайте кількість елементів масиву –> 5

Задайте елементи масиву:

a[1] –> 12.8

a[2] –> 1.08

a[3] –> 28

a[4] –> 15

a[5] –> 10

Задайте значення шуканої величини –> 10

Елемент 10 знаходиться в масиві на 5 місці
x:real;

i, n:integer;

function ok(x:real; a: masiv; n : integer; var i :integer):boolean;

begin

і:=1;

while (a[i]<>x) and (i<=n) do i:=i+1;

ok := (i<=n);

end;

BEGIN

write('Задайте кількість елементів масиву –> ');

read (n);

InputMass(n, a);

write('Задайте значення шуканої величини –> ');

readln (x);

if ok(x,a,n,i) then {Якщо елемент х присутній в масиві а}

writeln('Елемент ',x:5:2,' знаходиться в масиві на ',і,' місці');

else writeln(‘Елемент ',x:5:2,' в масиві відсутній');

END.

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму прикладу 1 та проекспериментуйте з нею.
  3. Розв’яжіть запропоновані вчителем задачі з додатка 4.



§ 31: ПОШУК МІНІМАЛЬНОГО (МАКСИМАЛЬНОГО) ЕЛЕМЕНТА В МАСИВІ.

Пошук найменшого елемента здійснюватимемо за таким алгоритмом. Від початку до кінця масиву відкриватимемо послідовно по одному елементу і на кожному кроці визначатимемо найменший елемент. На першому кроці найменшим буде саме цей перший елемент а[1]. На другому кроці порівняємо новий відкритий елемент а[2] з тим мінімумом, який ми вже маємо. Якщо новий елемент менший того мінімального, що визначений на попередньому кроці, то запам'ятаємо його, інакше залишимо старий результат. Таким чином, дійшовши до кінця масиву визначимо мінімальний елемент всього масиву.

Приклад 1
VAR


Результат роботи програми:

Задайте кількість елементів масиву –> 15

Задайте елементи масиву:

a[1] –> 12.8

a[2] –> 1.08

a[3] –> 28

a[4] –> 15

a[5] –> 11

a[6] –> 10

a[7] –> -98.8

a[8] –> 10

a[9] –> 65.07

a[10] –> -23.1

a[11] –> 15

a[12] –> -98.8

a[13] –> 13.8

a[14] –> 8.67

a[15] –> -98.8

Мінімальний елемент -98.8

знаходиться в масиві на 7 місці
a:array[1..100] of real;
min: real;

i, n, k:integer;

BEGIN

write('Задайте кількість елементів масиву –> ');

read (n);

writeln ('Задайте елементи масиву:');

for i:=1 to n do

begin

write(‘a[‘,i, ‘] –>’);

readln (a[i]);

end;

min:=a[1];

k:=1;

for i:=2 to n do

if a[i]then

begin

min:=a[i];

k:=i

end;

writeln('Мінімальний елемент ',min);

writeln('знаходиться в масиві на ',k,' місці');

end.

Запропонована програма не тільки знаходить найменший еле­мент, але ще й визначає, на якому місці в масиві він знаходиться.

Наведений приклад алгоритму визначає перший мінімальний елемент в масиві, хоча в ньому може бути і кілька таких елементів. Наприклад, якщо розглянути масив 1, 2, 2, 1,3, 1 – тут два мінімальні елементи, які рівні 1. Весь секрет полягає в умові a[i]
Якщо в алгоритмі поміняти умову a[i]
Щоб розглянутий алгоритм виконував пошук найбільшого елемента, достатньо умову a[i]mах.

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму прикладу 1 та проекспериментуйте з нею.



§32. РОЗВ’ЯЗУВАННЯ ЗАДАЧ. КОНСТРУЮВАННЯ АЛГОРИТМУ «ЗВЕРХУ ДОНИЗУ»

(Попередньо необхідно розв’язати задачі 216 та 217.)

Дано одновимірний масив a[п]. «Стиснути» його, перемістивши всі від'ємні елементи в деякий масив b.

Побудова математичної моделі

Розглянемо конкретний приклад:

А[6]: 3 -2 -1 0 5 4

Результатом нашої програми будуть наступні два масиви:

А[4]: 3 0 5 4

B[2]: -2 -1

В процесі перегляду елементів масиву А від першого по останній, зустрівши від’ємний елемент, ми повинні розв’язати такі під задачі:
  1. Перемістити від’ємний елемент масиву А в масив В
  2. Усі наступні за від’ємним елементом масиву А «підсунути» на 1 вліво. При цьому треба врахувати, що розмір масиву А (тобто N) зменшиться на 1


Якщо ж елемент, який переглядається додатній, то переходимо до наступного елемента.

Оскільки N буде зменшуватися, то перегляд елементів масиву будемо здійснювати не в циклі for, а в циклі while.

Описаний фрагмент програми (назвемо його фрагмент 1) буде виглядати так:

i:=1;

while i<=N do

if a[i]<0 then

begin

{Під задача 1: і-й елемент масиву А переміщаємо в масив В}

{Під задача 2: усі наступні за і-м елементом масиву А «підсовуємо» вліво

на одиницю. Загальну кількість елементів масиву А зменшуємо на одиницю}

end

else i:=i+1;


Під задача 1: Від’ємний елемент масиву А, що знаходиться на і-тій позиції переміщаємо в масив В

Нехай в масиві В на j-тій позиції вже знаходиться від’ємний елемент, переміщений з масиву А на попередньому етапі. Отже, під задача 1 реалізується так:

j:=j+1;

B[j]:=A[i];


Під задача 2: Усі наступні за від’ємним елементом масиву А, що знаходиться на і-тій позиції «підсовуємо» вліво на одиницю. Загальну кількість елементів масиву А зменшуємо на одиницю

Нехай лічильником усіх елементів наступних за і-тим елементом масиву А буде х. Тоді х буде пробігати значення від і+1 до N:

for x:=i+1 to N do A[x-1]:=A[x];

N:=N-1;{ Загальну кількість елементів масиву А зменшуємо на одиницю}


Деталізуючи фрагмент 1 підзадачами 1 та 2 отримаємо:

i:=1;

while i<=N do

if a[i]<0 then

begin

j:=j+1;

B[j]:=A[i];

for x:=i+1 to N do A[x-1]:=A[x];

N:=N-1;

end

else i:=i+1;

Залишилося задати початкове значення змінній-лічильнику j.

Щоб перший елемент масиву В знаходився під індексом 1, очевидно необхідно перед циклом while змінній j надати значення 0.

Результатом наших міркувань буде такий фрагмент програми:

i:=1;

j:=0;

while i<=N do

if a[i]<0 then

begin

j:=j+1;

B[j]:=A[i];

for x:=i+1 to N do A[x-1]:=A[x];

N:=N-1;

end

else i:=i+1;


§33: ВПОРЯДКУВАННЯ МАСИВУ ЗА ЗРОСТАННЯМ (СПАДАННЯМ).

Нехай дано деякий масив значень а[1], a[2],…, a[n]. Необхідно його елементи переставити місцями так, щоб вхідний масив перетворився в такий, для якого виконувалося б співвідношення а[1] < a[2] < … < a[n].

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

Приклад 1

VAR

a:array[1..100] of real;
min, c: real;

i, j, n, k: integer;

BEGIN

write('Задайте кількість елементів масиву –> '); read (n);

writeln ('Задайте елементи масиву:');

for i:=1 to n do

b
Результат роботи програми:

Задайте кількість елементів масиву –> 10

Задайте елементи масиву:

a[1] –> 12.8

a[2] –> 1.08

a[3] –> 28

a[4] –> 15

a[5] –> 11

a[6] –> 10

a[7] –> -98.8

a[8] –> 10

a[9] –> 65.07

a[10] –> -23.1


Упорядкований масив:

-98.80 -23.10 1.08 10.00 10.00 11.00 12.80 15.00 28.00 65.07
egin


write(‘a[‘,i, ‘] –>’);

readln (a[i]);

end;

for i:=1 to n-1 do

begin

min:=a[i];

k:=i;

for j:=i+1 to n do

if a[j]then

begin

min:=a[j];

k:=j

end

c:=a[i]; a[i]:=a[k]; a[k]:=c;

end;

writeln (‘Упорядкований масив:');

for i:=1 to n do write (a[i]:5:2,' ');

END.

Зрозуміло, щоб описаний алгоритм виконував упорядкування масиву за спаданням, необхідно логічний вираз a[j] < min замінити на a[j] > min, замінивши також при бажанні ім’я змінної min на max.

Наведений алгоритм упорядкування послідовності є далеко не єдиним. Існують алгоритми впорядкування вже частково впоряд­кованих послідовностей, алгоритми більш ефективні за часом ви­конання, але такі, що використовують більше пам'яті комп'ютера тощо.

Неважко здогадатись, що всі три класичні програми ( Пошук заданого елемента в масиві, Пощук мінімального (максимального) елемента в масиві та Впорядкування масиву за зростанням (спаданням)) можна використовувати і для рядкових величин. Необхідно лише створити масив із елементів типу string (Буква ‘А’ вважається найменшою, а ‘ь’ – найбільшою).

ПРАКТИЧНА РОБОТА
  1. Запустіть середовище програмування.
  2. Наберіть програму прикладу 1 та проекспериментуйте з нею.



§34: БАГАТОВИМІРНІ МАСИВИ

Вхідні дані для розв’язування багатьох задач можна представити в табличній формі:





Продукт 1

Продукт 2

Продукт 3

Продукт 4

Завод 1













Завод 2













Завод 3













Завод 4













…………













Завод N












В програмі для збереження і обробки табличних даних можна використати сукупність одновимірних масивів:

VAR

Zavod_1:array [1..4] of integer;

Zavod_2:array [1..4] of integer;

………………………………

Zavod_N:array [1..4] of integer;

Але це дуже незручно, бо в блоці VAR при великих значеннях N прийдеться зробити N описів, для кожного масиву (рядка таблиці) окремо. В самій же програмі прийдеться оперувати з N масивами.

Можна утворити масив, в якому кожен елемент буде іншим масивом, тобто окремий елемент масиву не є однією змінною. Цей елемент містить в собі цілу сукупність змінних, тобто інший масив.

VAR

Zavod: array [1..N] of array [1..4] of integer;

В даному прикладі масив Zavod містить N елементів (N заводів, тобто N рядків), кожен з яких містить чотири елементи (чотири продукти). Зрозуміло, що для того, щоб вказати положення елемента в такому масиві необхідно вказати два індекси.

Масив називається двовимірним, якщо для задання місцеположення елемента в масиві необхідно вказати два індекси: номер рядка та номер стовпця.

Двовимірні масиви можна описувати, вказавши не два службових слова array, а одне. Для нашої задачі двовимірний масив Zavod описується так:

VAR

Zavod: array [1..N,1..4] of integer;


В загальному вигляді оголошення масиву виглядає так:

<Ім'я>:array[Нижній_ індекс1. . Верхній_ індекс1, Нижній_ індекс2. . Верхній_ індекс2] of <тип>

Де <ім’я> — ім'я зміної-масиву;

array — ключове слово, яке вказує, що змінна є двовимірним масивом.

<нижній_індекс1 .. верхній_індекс1> — цілі числа, що визначають діапазон зміни рядків масиву;

<нижній_індекс2 .. верхній_індекс2> — цілі числа, що визначають діапазон зміни елементів в рядку (стовпців) масиву;

а <тип> — тип елементів масиву.

Запам’ятайте!!! У двовимірному масиві перший індекс вказує на номер рядка, другий – на номер стовпця.


Введення-виведення елементів масиву.

Значення елементів двовимірних масивів виводять на екран і вводять з клавіатури, як правило, по рядкам. Тобто спочатку всі елементи першого рядка, потім другого і т.д. Це зручно робити при допомозі вкладених циклів FOR.

Приклад 1. Введення та виведення на екран монітора даних про виготовлення 4-х видів продукції N заводами:

VAR

zavod:array [1..3,1..4] of integer;

i,j:integer;

BEGIN

{Виведення масиву}

for i:=1 to 3 do

begin

writeln('Завод ',i);

for j:=1 to 4 do


Результат роботи програми:

Завод 1

Продукт 1 -> 12

Продукт 2 -> 2345

Продукт 3 -> 9845

Продукт 4 -> 10975

Завод 2

Продукт 1 -> 23

Продукт 2 -> 65

Продукт 3 -> 42

Продукт 4 -> 87

Завод 3

Продукт 1 -> 1

Продукт 2 -> 3

Продукт 3 -> 2

Продукт 4 -> 6

Продукт1 Продукт2 Продукт3 Продукт4

Завод1 12 2345 9845 10975

Завод2 23 65 42 87

Завод3 1 3 2 6
begin

write('Продукт ',j,' -> ');

readln(zavod[i,j]);

end;

end;

writeln(' Продукт1 Продукт2 Продукт3 Продукт4');

{Виведення масиву}

for i:=1 to 3 do

begin

write('Завод',i,' ');

for j:=1 to 4 do write(zavod[i,j]:9);

writeln;

end;

END.

Кожен раз, коли внутрішній цикл завершується, зовнішній цикл збільшується на 1, і внутрішній цикл повторюється спочатку. Таким чином вводяться (а після введення і виводяться) всі елементи масиву. Зверніть увагу, що після виведенні окремого рядка для переведення курсора на наступний рядок ми використовуємо порожню вказівку writeln. Без вказівки writeln елементи масиву будуть виводитися в один рядок.

ПРАКТИЧНА РОБОТА
  1. Розв’яжіть запропоновані вчителем вправи з додатка 4
  2. Запустіть середовище програмування.
  3. Наберіть програму прикладу 1 та проекспериментуйте з нею.