четвер, 11 січня 2018 р.

Алгоритми з числовими таблицями

Задачі на вивід чисел у вигляді таблиці

Приклад 1

Надрукувати в рядок числа 1 2 3 4 5. Ми вже писали такі програми:

Програма

 var j:byte;
begin
  for j:=1 to 5 do write(j,' ');
end.

Приклад 2

Надрукувати в числа у вигляді таблиці:
    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
Ясно, що фрагмент програми, який друкує числа від 1 до 5 (for j:=1 to 5 do write(j,' ')) потрібно повторити 3 рази. Для повторення використовується теж оператор циклу (for i:=1 to 3 do). Щоб кожний рядок починався від краю екрана використовується оператор writeln без параметрів.

Програма

Program a;
 var i,j:byte;
begin
 for i:=1 to 3 do
 begin
    writeln;
    for j:=1 to 5 do write(j,' ');
 end;
end.
У цій програмі параметр зовнішнього циклу i – номер рядку, який друкується, параметр внутрішнього циклу – число, яке виводиться на екран. Скільки потрібно рядків, стільки повинно бути витків зовнішнього циклу. Скільки потрібно чисел у кожному рядку, стільки повинно бути витків внутрішнього циклу.

Блок–схема програми

Термінологія та правила роботи вкладених циклів

  1. Цикл for i:=1 to 3 do називається зовнішнім циклом.
  2. Цикл for j:=1 to 5 do називається внутрішнім циклом, бо він вкладений у цикл for i:=1 to 3 do.
  3. Параметри зовнішнього та внутрішнього циклів – це змінні з різними іменами.
  4. Для кожного витку зовнішнього циклу виконуються всі витки внутрішнього циклу.

Трасування програми

У приведеній нижче таблиці для нашого прикладу проводиться „трасування” програми, тобто програма виконується по крокам, вказуються оператори, що виконуються, відповідні зміни значень змінних та вигляд екрану.
ОператорijЕкран
for i:=1 to 3 do 1
Writeln Перевод курсору на початок 1-го рядку
for j:=1 to 5 do write(j,' ') 11
for j:=1 to 5 do write(j,' ') 21 2
for j:=1 to 5 do write(j,' ') 31 2 3
for j:=1 to 5 do write(j,' ') 41 2 3 4
for j:=1 to 5 do write(j,' ') 51 2 3 4 5
for i:=1 to 3 do 2
Writeln Перевод курсору на початок 2-го рядку
for j:=1 to 5 do write(j,' ') 11 2 3 4 5
1
for j:=1 to 5 do write(j,' ') 21 2 3 4 5
1 2
for j:=1 to 5 do write(j,' ') 31 2 3 4 5
1 2 3
for j:=1 to 5 do write(j,' ') 41 2 3 4 5
1 2 3 4
for j:=1 to 5 do write(j,' ') 51 2 3 4 5
1 2 3 4 5
for i:=1 to 3 do 3 Останній виток зовнішнього циклу
Writeln Перевод курсору на початок 3-го рядку
for j:=1 to 5 do write(j,' ') 11 2 3 4 5
1 2 3 4 5
1
for j:=1 to 5 do write(j,' ') 21 2 3 4 5
1 2 3 4 5
1 2
for j:=1 to 5 do write(j,' ') 31 2 3 4 5
1 2 3 4 5
1 2 3
for j:=1 to 5 do write(j,' ') 41 2 3 4 5
1 2 3 4 5
1 2 3 4
for j:=1 to 5 do write(j,' ') 51 2 3 4 5
1 2 3 4 5
1 2 3 4 5

Приклад 3

Надрукувати в числа у вигляді таблиці:
    1
    1 2
    1 2 3
    1 2 3 4
    1 2 3 4 5
Ясно, що витків зовнішнього циклу повинно бути 5, бо потрібно надрукувати 5 рядків. Тобто схематично програма буде така:

Програма схематично

Program b;
 var i,j:byte;
begin
 for i:=1 to 5 do
 begin
   writeln;
   ...
 end;
end.
Тепер потрібно з’ясувати, як зв’язані номер рядку та числа, які в ньому друкуються, тобто потрібно з’ясувати, який внутрішній цикл буде замість трьох крапок. Для цього складемо таблицю:
Номер рядку iЧисла, які друкуються у цьому рядкуЦикл, який виводить ці числаЗначення параметра j у циклі
ПочатковеКінцеве
11for j:=1 to 1 do
write(j,' ')
11
21 2for j:=1 to 2 do
write(j,' ')
12
31 2 3for j:=1 to 3 do
write(j,' ')
13
41 2 3 4for j:=1 to 4 do
write(j,' ')
14
51 2 3 4 5for j:=1 to 5 do
write(j,' ')
15
ВисновокЗавжди 1Співпадає з номером рядку
Із цієї таблиці ясно, що для i–го рядку, щоб надрукувати числа 1, 2,..., i, потрібен цикл for j:=1 to i do write(j,' '). Остаточно програма має вигляд:

Програма остаточно

Program b;
 var i,j:byte;
begin
 for i:=1 to 5 do
 begin
   writeln;
   for j:=1 to i do write(j,' ')
 end;
end.

Приклад 4

Надрукувати в числа у вигляді таблиці:
    5 4 3 2 1
    5 4 3 2
    5 4 3
    5 4
    5
Ясно, що витків зовнішнього циклу повинно бути 5, бо потрібно надрукувати 5 рядків. Тобто схематично програма буде така ж сама, як і у попередньому прикладі.
Тепер потрібно з’ясувати, як зв’язані номер рядку та числа, які в ньому друкуються, тобто потрібно з’ясувати, який внутрішній цикл буде замість трьох крапок. Для цього складемо таблицю:
Номер рядку iЧисла, які друкуються у цьому рядкуЗначення параметра j у циклі
ПочатковеКінцеве
15 4 3 2 151
25 4 3 252
35 4 353
45 454
5555
ВисновокЗавжди 5Співпадає з номером рядку
Із цієї таблиці ясно, що для i–го рядку, щоб надрукувати числа, потрібен зворотній цикл for j:=5 downto i do write(j,' '). Остаточно програма має вигляд:

Програма остаточно

Program c;
 var i,j:byte;
begin
 for i:=1 to 5 do
 begin
   writeln;
   for j:=5 downto i do write(j,' ')
 end;
end.

Приклад 5

Надрукувати в числа у вигляді таблиці:
    3 3 3 3 3
    4 4 4 4
    5 5 5
    6 6
    7
Ясно, що витків зовнішнього циклу повинно бути 5, бо потрібно надрукувати 5 рядків. Тобто схематично програма буде така ж сама, як і у першому прикладі.
Тепер потрібно з’ясувати, як зв’язані номер рядку та числа, які в ньому друкуються, тобто потрібно з’ясувати, який внутрішній цикл буде замість трьох крапок. Ясно, що раз у кожному рядку друкуються однакові числа, то повинен виводитись на екран не вираз, що містить змінну j, а вираз, що містить змінну i. Щоб з’ясувати, який це буде вираз складемо таблицю:
Номер рядку iЧисла, які друкуються у цьому рядкуЗначення параметра j у циклі (кількість чисел)
ПочатковеКінцеве
13 3 3 3 315
24 4 4 414
35 5 513
46 612
5711
ВисновокНа кожному рядку друкуються числа i+2Завжди 16-i
Із цієї таблиці ясно, що у i–му рядку, друкуються числа i+2. Кількість чисел у i–му рядку 6-i. Тобто внутрішній цикл буде таким: for j:=1 to 6-i do write(i+2,' '). Остаточно програма має вигляд:

Програма остаточно

Program d;
 var i,j:byte;
begin
 for i:=1 to 5 do
 begin
   writeln;
   for j:=1 to 6-i do write(i+2,' ')
 end;
end.

Приклад 6

Надрукувати в числа у вигляді таблиці:
    0 1 2 3 4
    0 0 0 0
    9 0 1 2
    0 0 0
    8 9 0
    0 0
    7 8
    0
    6
У цій задачі за кожний виток зовнішнього циклу виводиться на екран не один, а два рядки:
Номер витку
зовнішнього циклу
Числа, що виводяться
10 1 2 3 4
0 0 0 0
29 0 1 2
0 0 0
38 9 0
0 0
47 8
0
56
Серед цих чисел є рядки з нулями і з числами. Ці рядки друкуються різними циклами, кожний починається з початку екрана.
Тобто схематично програма буде така:

Програма схематично

Program f;
 var i,j:byte;
begin
 for i:=1 to 5 do
 begin
    writeln;
    for j:= ...рядок з числами
    writeln;
    for j:=...рядок з нулями
 end;
end.
Розіб’ємо нашу таблицю на дві:
Номер витку
зовнішнього циклу
Перший внутрішній циклДругий внутрішній цикл
10 1 2 3 40 0 0 0
29 0 1 20 0 0
38 9 00 0
47 80
56
Тепер потрібно з’ясувати, як зв’язані параметр зовнішнього циклу та числа, які друкуються першим та другим внутрішніми циклами, тобто потрібно з’ясувати, які внутрішні цикли будуть замість трьох крапок.
Спочатку запишемо цикл, який друкує рядки з нулями. Для цього складемо таблицю:
Номер рядку iЧисла, які друкуються у цьому рядкуЦикл, який виводить ці числаЗначення параметра j у циклі
ПочатковеКінцеве
10 0 0 0for j:=1 to 4 do
write(0,' ')
14
20 0 0for j:=1 to 3 do
write(0,' ')
13
30 0for j:=1 to 2 do
write(0,' ')
12
40for j:=1 to 1 do
write(0,' ')
11
5for j:=1 to 0 do
write(0,' ')
10
ВисновокЗавжди 15 – i
Добавимо виведення нулів, і схематично програма буде така:

Програма схематично

Program f;
 var i,j:byte;
begin
  for i:=1 to 5 do
  begin
    writeln;
    for j:= ...рядок з числами
    writeln;
    for j:=1 to 5-i do write(0,' ')
 end;
end.
Залишилось написати цикл, який виводить інші числа. Для цього складемо таблицю:
iЧисла, які друкуютьсяДля цих чисел друкується остання цифраЗначення параметра у внутрішньому циклі
ПочатковеКінцеве
10 1 2 3 410 11 12 13 141010+1=111416-2*1=14
29 0 1 29 10 11 1299+2=111216-2*2=12
38 9 08 9 1088+3=111016-2*3=10
47 87 877+4=11816-2*4=8
56666+5=11616-2*5=6
ВисновокДрукується j mod 1011-i16-2*i
Остаточно програма має вигляд:

Програма остаточно

Program f;
 var i,j:byte;
begin
 for i:=1 to 5 do
 begin
   writeln;
   for j:=11-i to 16-2*i do write(j mod 10,’ ‘);
   writeln;
   for j:=1 to 5-i do write(0,' ')
 end;
end.

Варіанти задач

№ варіантуТаблиця№ варіантуТаблиця
12 2 2 2 2
2 2 2 2
2 2 2
2 2
2
20
0 0
0 0 0
0 0 0 0
0 0 0 0 0
31
2 2
3 3 3
4 4 4 4
5 5 5 5 5
41 1 1 1 1
2 2 2 2
3 3 3
4 4
5
55 5 5 5 5
4 4 4 4
3 3 3
2 2
1
65
6 6
7 7 7
8 8 8 8
9 9 9 9 9
71 2 3 4 5
1 2 3 4
1 2 3
1 2
1
85
4 5
3 4 5
2 3 4 5
1 2 3 4 5
90
1 0
2 1 0
3 2 1 0
4 3 2 1 0
106 5 4 3 2
5 4 3 2
4 3 2
3 2
2
111
0
2 2
0 0
3 3 3
0 0 0
4 4 4 4
0 0 0 0
5 5 5 5 5
0 0 0 0 0
125 4 3 2 1
0 0 0 0
5 4 3 2
0 0 0
5 4 3
0 0
5 4
0
138 9 0 1 2
8 9 0 1
8 9 0
8 9
8
143
2 3
1 2 3
0 1 2 3
9 0 1 2 3
150
1 0 9
2 1 0 9 8
3 2 1 0 9 8 7
4 3 2 1 0 9 8 7 6
165
3 4 5
1 2 3 4 5
9 0 1 2 3 4 5
7 8 9 0 1 2 3 4 5

Немає коментарів:

Дописати коментар