Вступ до програмування

Розв'язування задач з використанням комп'ютера. Поняття інформаційної моделі. Способи описування алгоритмів. Базові структури алгоритмів. Інтегровані середовища програмування. Створення лінійних програм. Алгоритми роботи з рядковими величинами.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык украинский
Дата добавления 03.03.2013
Размер файла 618,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

end;

readkey;

End.

Зверніть увагу учнів на те, що результат роботи програми теж можна було оформити підпрограмою. Тільки в даному випадку це зручніше було б зробити процедурою.

Наприклад, так:

Procedure Output(S1,S1:real);

Begin

if S1>S2

then

begin

writeln ('Більшу площу має перший трикутник.');

writeln ('Його площа дорівнює -> ',S1:8:2);

end

else

if S2>S1

then

begin

writeln ('Більшу площу має другий трикутник.');

writeln ('Його площа дорівнює -> ',S2:8:2);

end

else

begin

writeln ('Трикутники мають однакову площу.');

writeln ('Їх площа дорівнює -> ',S1:8:2);

end;

End;

Домашнє завдання:

· повторити теоретичний матеріал за попередні уроки;

· задачі з запропонованого підручника №421, №433, №438, №453.

Тема уроку: "Поняття рекурсії. Розв'язування задач на складання алгоритмів з використанням рекурсії."

Мета уроку: Дати поняття про рекурсію, оформлення підпрограм з рекурсією мовою програмування Паскаль.

Тип уроку: Практичний.

Теоретичний матеріал:

Чи траплялось Вам колись зазирнути у дзеркало, напроти якого стоїть таке саме дзеркало? Не правда дивна картина? В першому дзеркалі ми побачимо відображення із протилежного дзеркала, в якому, в свою чергу, видно зображення першого дзеркала і т.д. Коли скінчиться цей процес? А жартівливий віршик "У попа була собака..."?

В математиці часто зустрічаються такі розрахунки, коли наступне значення величини обчислюється через попереднє. Наприклад, для того, щоб обчислити значення степеню x^n необхідно знати значення x^(n-1), для чого в свою чергу необхідно знати значення x^(n-2) і т.д. Якщо спробувати запрограмувати цей процес, не порушуючи логіку міркувань та оформлюючи його підпрограмою (наприклад, функцією), нам прийдеться для обчислення значення xn викликати функцію обчислення степеню x^(n-1) і помножити це значення на величину х. Тобто ми приходимо до такого явища, як виклик підпрограми в середині самої підпрограми.

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

Типова конструкція рекурсивної процедури повинна мати наступний вигляд:

Procedure Rec (t:integer);

Begin

<Дії на початку рекурсії>

If <Перевірка умови> Then Rec(t+1);

<Дії на виході з рекурсії>

End;

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

Розглянемо приклад рекурсивного виклику на обчисленні степеня числа х^n, де х - будь-яке дійсне число, а n - ціле, додатне число. Очевидно, що

Постає питання, коли і як припинити цей процес? В даному випадку зупинкою для обчислень буде обчислення x0, так як відомо, що нульова степінь будь-якого числа дорівнює 1. Тобто рекурсивна функція для обчислення степеня числа буде мати наступний вигляд:

Function Step(x:real; n:integer):real:

Begin

If n = 0

then Step:=1

else Step:=Step(x,n-1)*x;

End;

Проаналізуємо роботу цієї функції на прикладі знаходження значення 23. При першому виклику функції значення змінних буде дорівнювати відповідно:

x = 2

n = 3.

Так як значення n не дорівнює 0 спрацює гілка else, тобто почне виконуватись такий оператор

Step:=Step(x,n-1)*x;

де x буде дорівнювати 2, і n - теж 2.

Цей оператор містить виклик функції step, тому виконання підпрограми перерветься і виконається виклик тієї ж самої функції step, але з параметрами x=2 та n=1. При виконанні повторного виклику функції ситуація повториться, так як n поки ще не дорівнює 0 і тільки на четвертому виклику функції step параметр n досягне нульового значення, після чого спрацює гілка then, яка присвоїть значення функції 1.

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

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

З чисто учбовою метою покажемо, як розв'язувати деякі задачі за допомогою рекурсії, хоча наполягаємо на тому, що більшість із запропонованих завдань можна виконати без використання рекурсії. Та... Щоб зрозуміти рекурсію, треба зрозуміти рекурсію...

Отже задачі.

Задача № 440.

Умова: Використовуючи підпрограму обчислення факторіалу, розробити програму обчислення суми факторіалів усіх цілих чисел від 1 до 10.

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

Очевидно, що

Тоді вихідна програма буде мати наступний вигляд:

Program Example_440;

Uses crt; {Підключення бібліотеки}

Function Factorial (n:integer):longint;

Begin

if n=0

then Factorial:=1

else Factorial:=Factorial(n-1)*n;

End;

Var Rez:longint;

i:byte;

Begin

Clrscr;

Rez:=0;

For i:=1 to 10 do

begin

Rez:=Rez+Factorial(i);

end;

writeln('Rezultat -> ',Rez);

Readkey;

End.

Задача № 495.

Умова: Знайти найбільший спільний дільник двох натуральних чисел n та m за алгоритмом Евкліда:

В даному випадку умовою виходу з рекурсії буде рівність двох чисел n=m. Написання самої програми, на наш погляд, являється тривіальним:

Program Example_495;

Uses crt; {Підключення бібліотеки}

Function Evklid (n,m:integer):integer;

begin

if n=m

then Evklid:=n

else

if n>m

then Evklid:=Evklid(n-m,m)

else Evklid:=Evklid(n,m-n);

end;

Var x,y:integer;

Begin

Clrscr;

writeln ('Введіть два числа: ');

readln (x,y);

writeln ('НОД -> ',Evklid(abs(x),abs(y)));

Readkey;

End.

Задача № 498.

Умова: Обчислити значення функції Аккермана для двох невід'ємних цілих чисел n та m, де:

На наш погляд, реалізація запропонованої рекурсивної функції являється тривіальною, тому наводимо текст програми без пояснень:

Program Example_498;

Uses crt; {Підключення бібліотеки}

Function A(n,m:word):word;

Begin

if n=0

then A:=m+1

else

if (n<>0) and (m=0)

then A:=A(n-1,1)

else A:=A(n-1,A(n,m-1));

End;

Var x,y:word;

Begin

Clrscr;

writeln ('введіть два числа: ');

readln (x,y);

writeln ('Результат обчислень -> ',A(x,y));

Readkey;

End.

Задача № 500.

Умова: Обчислити кількість комбінацій з n різних елементів по m, тобто кількість неупорядкованих підмножин з m елементів, що належать заданій множині з n елементів , скориставшись залежністю:

Програма, що виконує запропонований алгоритм, має наступний вигляд:

Program Example_500;

Uses crt; {Підключення бібліотеки}

Function C (n,m:word):longint;

Begin

if ((m=0) and (n>0)) or ((m=n) and (n>=0))

then C:=1

else

if (m>n) and (n>=0)

then C:=0

else C:=C(n-1,m-1)+C(n-1,m);

End;

Var x,y:word;

Begin

clrscr;

writeln ('Введіть два числа: ');

readln(x,y);

writeln ('Кількість комбінацій з ',x,' по',y,' -> ',C(x,y));

readkey;

End.

Домашнє завдання:

· сторінки 155 - 161 запропонованого підручника;

· задачі з запропонованого підручника №441, №496, №497, №499.

Тема уроку: "Складання та реалізація програм опрацювання рядкових величин."

Мета уроку: Навчити розробляти та реалізовувати програми на опрацювання рядкових величин.

Тип уроку: Практичний.

Цей урок можна побудувати таким чином: дати дітям одне із завдань, що були задані додому, для реалізації у середовищі Turbo Pascal. Рекомендується при цьому розбити ці завдання по рівню складності і більш складні запропонувати дітям на високий рівень, а простіші на достатній рівень досягнень.

Задача №378.

У даній формулі порахувати кількість входжень символів "+" та кількість символів "-".

Задача №380.

Дано текст. Визначити, які символи зустрічаються у тексті частіше: "а" чи "о". Якщо якійсь з символів відсутній - повідомити про це.

Задача №384(1).

Дано деякий текст, у якому є хоча б одна кома. Визначити порядковий номер першої коми в тексті.

Задача №385.

Роздрукувати даний текст у зворотному порядку.

Задача №388.

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

Задача №389(3).

Визначити, скільки разів у даному тексті зустрічається послідовність символів "аба".

Задача №389(4).

Визначити, скільки разів у даному тексті зустрічається послідовність символів "абаб".

Задача №390.

Нехай дано формулу, яка містить лише арифметичні операції +, -, *, / і не містить дужок та функцій. Визначити загальну кількість арифметичних дій, передбачених у цій формулі, та кількість чисел, над якими вони виконуються.

Задача №392.

Дано текст. Відредагувати його таким чином, щоб всі символи "." Були замінені на "...", символи ":" на "-", символи "-" на ":".

Задача №396.

Скласти програму, яка кожну літеру "а", що зустрічається в тексті, замінює на групу символів "ку" (наприклад "ади" - "куди").

Задача №399.

Нехай текст дано у вигляді одного слова, тобто в ньому відсутні пробіли. Скласти програму, яка перевіряє, чи є частиною заданого слова слово "рак". Відповіддю повинно бути "так" чи "ні" (наприклад, для слова "ракета" - "так", а для слова "карета" - "ні").

Задача №406(1).

Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містіть всередині пробілів, називатимемо словами. Вважатимемо, що текст завжди починається зі слова. Визначити кількість слів у тексті.

Задача №406(2).

Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містіть всередині пробілів, називатимемо словами. Вважатимемо, що текст завжди починається зі слова. Визначити кількість слів, які починаються з літер "а" або "А".

Задача №406(4).

Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містіть всередині пробілів, називатимемо словами. Вважатимемо, що текст завжди починається зі слова. Визначити кількість слів, довжина яких дорівнює k.

Задача №407.

У даному тексті обчислити найбільшу кількість пробілів, що розташовані підряд.

На мій погляд це розбиття можна зробити таким чином:

1) достатній рівень:

Задачі №378, №380, №384(1), №385, №389(3,4), №399, №406(1).

2) високий рівень:

Задачі №388, №390, №392, №396, №406(2,4), №407.

Таке розбиття не являється остаточним і кожен вчитель може запропонувати будь-яку з цих задач як на високий, так і на достатній рівень досягнень учня в залежності від загального рівня досягнень в класі.

Домашнє завдання:

? №402, №408, №409.

Тема уроку: "Алгоритми роботи з рядковими величинами"

Мета уроку: Навчити розв'язувати задачі з використанням рядкових величин.

Тип уроку: Практичний.

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

Задача №383.

Умова: У даному тексті всі послідовності крапок замінити на одну крапку.

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

Ми пропонуємо вилучати всі крапки, доки не зустрінеться символ, що не являється крапкою.

Program Example_383;

Uses crt;

Var i:word; {i - змінна циклу}

St:string; {St - даний текст}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (St);

i:=1;

While i<=length(St) do

Begin

While St[i]='.' do Delete(St,i,1);

Insert('.',St,i);

i:=i+1;

End;

Writeln ('Результуючий рядок: ');

Writeln (St);

Readkey; {Затримка зображення на екрані}

End.

Задача №384(2).

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

Для пошуку останньої коми в тексті необхідно організувати цикл перегляду рядка з кінця до початку, тобто від останнього символу рядка з номером length(St) до першого. В зв'язку з тим, що ми не знаємо, якою за номером буде кома, краще це зробити командою повторення з передумовою. Цикл завершить свою роботу при досягненні позиції, в якій знаходиться кома (за умовою вона обов'язково є в тексті). Значення змінної циклу і буде номером шуканої позиції.

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

Program Example_384_2;

Uses crt;

Var i:byte; {i - змінна циклу}

St:string; {St - даний текст}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln(St);

i:=length(St);

while St[i]<>',' do i:=i-1;

Writeln ('Номер позиції останньої коми в тексті ',i);

Readkey; {Затримка зображення на екрані}

End.

Задача №386.

Умова: Дано деякий текст. Створити новий текст, який утворено із даного читанням з кінця до початку.

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

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

Program Example_386;

Uses crt;

Var i:byte; {i - змінна циклу}

St,Rez:string; {St - даний текст, Rez -

результуючий (перегорнутий)

рядок}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (St);

Rez:=''; {Очищення рядка}

For i:=length(St) downto 1 do

Rez := Rez+St[i];

Writeln ('Результуючий рядок: ');

Writeln (St);

Readkey; {Затримка зображення на екрані}

End.

Задача №387.

Умова: Перевірити, чи однаково читається дане слово зліва направо і навпаки.
Для розв'язку цієї задачі можна використовувати попередню задачу, як підзадачу, тобто спочатку отримати новий рядок, який являється оберненим відносно даного, а потім порівняти даний та отриманий рядки. Якщо вони співпадають, слово являється паліндромом (читається в обох напрямках однаково, наприклад, "дід", "потоп", "Пилип" тощо), в протилежному випадку - ні.

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

Var i:byte; {i - змінна циклу}

St,Rez:string; {St - даний текст, Rez -

результуючий (перегорнутий)

рядок}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (St);

Rez:=''; {Очищення рядка}

For i:=length(St) downto 1 do

Rez := Rez+St[i]; {Перегортання рядка}

If Rez = St

Then Writeln ('Слово являється паліндромом.')

Else Writeln ('Слово не являється паліндромом.');

Readkey; {Затримка зображення на екрані}

End.

Задача №389(2).

Умова: Визначити, скільки разів у даному тексті зустрічається послідовність символів "абв".

Організовуємо прохід по рядку за допомогою циклу з параметром, причому враховуємо, що необхідно перевірити три послідовно розташованих символи (зверніть увагу на можливість виходу за межі рядка!). Один з методів вибору кількох послідовних символів вже розглядався раніше (і-ий, і+1-ий та і+2-ий елементи), тому розглянемо інший метод, що полягає у використанні функції копіювання Copy. Нагадуємо, що ця функція містить у якості параметрів вихідний рядок, номер початку копіювання (виділення) та кількість вибраних символів, тобто для вибору трьох символів з будь-якого місця рядка St ця функція буде мати вид:

Copy(St,і,3).

Порівнюючи виділені (скопійовані) символи з еталоном, нарощуємо лічильник при виконанні поставлених умов.

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

Var i:byte; {i - змінна циклу}

St:string; {St - даний текст}

Count:byte; {Count - лічильник

послідовностей}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (St);

Count:=0; {Початкове значення лічильника}

For i:=1 to length(St)-3 do

If Copy (St,i,3) = 'абв'

Then count:=count+1;

Writeln ('Кількість шуканих послідовностей: ',count);

Readkey; {Затримка зображення на екрані}

End.

Задача №394.

Умова: Нехай дано формулу. Визначити коректність формули щодо кількості відкритих та закритих дужок. Вважається, що закриті дужки не стоять перед відкритими. Якщо дужки у формулі відсутні - повідомити про це.

Для визначення коректності формули необхідно підрахувати кількість відкритих та кількість закритих дужок. Якщо ці значення дорівнюють одне одному, баланс дужок виконується, якщо ні - не виконується (дійсно, у правильній формулі кількість відкритих та закритих дужок повинні співпадати). Щоб визначити, чи є в формулі дужки взагалі, достатньо перевірити на нуль кількість одних чи других дужок. Визначимо змінні count_left та count_right, як кількість відповідно лівих (відкритих) та правих (закритих) дужок, тоді програма, що реалізує описаний алгоритм, має наступний вигляд:

Var i:byte; {i - змінна циклу}

St:string; {St - даний текст}

count_left, count_right:byte;

{count_left - лічильник кількості

лівих дужок, count_right -

лічильник кількості правих дужок}

Begin

Clrscr;

Write ('Введіть формулу: ');

Readln(St);

Count_left:=0; {Початкове значення лічильника}

Count_right:=0;

For i:=1 to length(St) do

Begin

If St[i] = '('

Then count_left:=count_left+1;

If St[i] = ')'

Then count_right:=count_right+1;

End;

Writeln ('Кількість лівих дужок: ',count_left);

Writeln ('Кількість правих дужок: ',count_right);

If (count_left=0) or (count_right=0)

Then writeln ('Формула не має дужок.')

Else

Begin

If count_left = count_right

then Writeln ('Формула коректна.')

else writeln ('Формула не коректна.');

end;

Readkey; {Затримка зображення на екрані}

End.

Задача №397.

Умова: Нехай дано текст S та значення символьних змінних x та y. Із тексту вилучити всі символи, що збігаються з x і повторити двічі всі символи, що збігаються з y.

Для розв'язання запропонованої задачі необхідно переглянути кожен символ рядка і, якщо він співпадає з символом x, вилучити його процедурою delete, а якщо збігається із символом y - вставити перед ним такий самий процедурою insert. Програма для реалізації цього алгоритму має наступний вигляд:

Var i:byte; {i - змінна циклу}

S:string; {S - даний текст}

x,y:char; {x,y - шукані символи}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (S);

Write ('Введіть шукані символи: ');

Readln (x,y);

For i:=1 to length(S) do

Begin

If S[i] = x

Then delete(S,i,1);

If S[i] = ')'

Then insert(y,S,i);

End;

Writeln ('Результуючий рядок після зміни: ',S);

Readkey; {Затримка зображення на екрані}

End.

Задача №401.

Умова: Розробити програму-шифрувальник тексту, що замінює кожну його літеру наступною по порядку в абетці. Останню літеру абетки необхідно замінити першою.

В даній задачі необхідно, по-перше, перевірити, чи є черговий символ рядка буквою. Відомо, що всі букви латиниці розташовані в таблиці ASCII-кодів двома групами великих та малих літер, а літери кирилиці - двома нерівномірними групами від 'А' до 'п' та від 'р' до 'я':

'A'.. 'Z' - коди 65 .. 90;

'a'..'z' - коди 97 .. 122;

'А'..'п' - коди 128 .. 175;

'р'..'ї' - коди 224 .. 245.

Якщо черговий символ рядка - буква, необхідно збільшити її код на 1, а потім перетворити отриманий код в букву. Для визначення коду за символом використовується процедура ord, а для визначення символу за ASCII-кодом - процедура char. Для останніх літер необхідно написати незалежні команди розгалуження для заміни їх на перші літери абетки, причому для символів латиниці можна скористатися однією формулою chr(ord(S[i])-25), тому що, кількість великих та малих літер в абетці однакові і відстань від першої літери до останньої дорівнює 25.

Програма для реалізації описаного алгоритму має наступний вигляд:

Var i:byte; {i - змінна циклу}

S:string; {S - даний текст}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (S);

For i:=1 to length(S) do

Begin

If (S[i]>=65) and (S[i]<90) or

(S[i]>=97) and (S[i]<122) or

(S[i]>=128) and (S[i]<159) or

(S[i]>=160) and (S[i]<=175) or

(S[i]>=224) and (S[i]<245) or

Then S[i]:=chr(ord(S[i]+1);

If (S[i] = 'Z') or (S[i] = 'z')

Then S[i]:=chr(ord(S[i])-25);

If (S[i] = 'Я')

Then S[і]:='А';

If (S[i] = 'я')

Then S[і]:='а';

End;

Writeln ('Результуючий рядок після зміни: ',S);

Readkey; {Затримка зображення на екрані}

End.

Задача №406(3).

Умова: Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять всередині себе пробілів, називатимемо словами. Вважатимемо, що текст завжди починається зі слова. Визначити кількість слів, у яких перша та остання літера однакові.
При виконанні розв'язку цієї задачі, очевидно, що початок першого слова буде співпадати з першою літерою рядка (дивись умову), а кінець слова можна визначити, знайшовши перший проміжок. Скопіювавши це слово в додатковий рядок, ми отримаємо нескладну задачу порівняти його перший та останній символи. Якщо ці символи співпадають, слово підраховується, і процес продовжується для наступного слова.

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

Var i:byte; {i - змінна циклу}

S,Slovo:string; {S - даний текст, Slovo -

вирізане з тексту слово}

count:byte; {count - лічильник шуканих

слів}

Begin

Clrscr;

Write ('Введіть текст: ');

Readln (S);

S:=' '+S+' '; {Дописування проміжку перед

першим словом та після

останнього}

Count:=0; {Початкове значення лічильника}

i:=1; {Початок перегляду рядка}

while i<=length(S)-1 do

Begin

If (S[i]=' ') and (S[i+1]<>' ')

Then

Begin

Slovo:=''; {Очищення рядка для

зберігання чергового слова}

While (S[i+1]<>' ') do

Begin

Slovo:=Slovo+S[i+1];

i:=i+1;

End;

If Slovo[1] = Slovo[length(Slovo)]

Then count:=count+1;

End;

i:=i+1;

End;

Writeln ('Кількість шуканих слів: ',count);

Readkey; {Затримка зображення на екрані}

End.

Домашнє завдання:

Повторити сторінки 120 - 123 запропонованого підручника;

Задачі №384(1), №388, №389(1,3,4), №390, №396, №399, №406(1,2,4).

Тема уроку: "Табличні величини та їх опис мовою програмування"

Мета уроку: Дати поняття табличних величин та їх опису мовою програмування. Поняття лінійних таблиць, введення елементів таблиць та виведення їх на екран.

Тип уроку: Лекційний.

Теоретичний матеріал:

Поняття таблиці виникло тоді, коли програмістам знадобилося запам'ятати та обробити великий набір однотипних даних. Наприклад, якщо ми хочемо знайти середній бал кожного учня класу з інформатики за чверть, нам необхідно знайти суму дуже великої кількості оцінок. Як зберігати всі ці оцінки? Зарезервувати для цього 40 (а може і більше змінних? Це дуже незручно. Ось тут і приходить на допомогу такий структурований тип даних, як таблиця або інакше масив.

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

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

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

Оскільки конфігурація елементів масиву фіксована, то до окремого елементу можна звертатися за допомогою одного або кількох індексів. У якості індексів можуть використовуватися константи або змінні порядкових типів. Елементами можуть бути як прості змінні будь-яких типів, так і змінні складених типів (масивів, рядків, тощо), тобто може існувати масив масивів, масив рядків і т.і. Глибина вкладеності цих типів - довільна, тому кількість індексів не обмежена, але сумарна довжина структури не повинна перевищувати дозволені Паскалем 64 Кбайти. В пам'яті ПК всі елементи масиву зберігаються послідовно, тому при переході від молодших до старших адрес першим змінюється самий правий індекс.

Порядок роботи з масивом:

1) оголосити про масив у розділі описів, вказавши його розмір і тип елементів, що в нього входять (тобто приготувати місце в пам'яті, де будуть зберігатися значення елементів);

2) заповнити необхідними значеннями масив для розв'язування задачі;

3) якщо треба, вивести масив на екран для зорової перевірки роботи з ним;

4) робота з даним масивом;

5) виведення отриманих результатів.

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

Одновимірний масив

Одновимірний масив інакше ще називають лінійним масивом або вектором. Кожному його елементу ставиться у відповідність один індекс.

Масив А

A[6] або A[i], якщо i=6

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

Формат опису (1 варіант):

Var

<ім'я масиву> : array [<розмірність>] of <базовий тип елементів>;

Для опису масиву можна використовувати попередньо визначену константу:

Const

G1=40;

Var

Mas:array[1..G1] of real;

Приклади опису:

Const n = 100;

Var А: аrrау[1..n] оf real;

В: аrrау[1..100] of integer;

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

Крім того масив можна описати за допомогою опису відповідного типу.

Формат опису (2 варіант):

Type

< ім'я типу > = array [<розмірність>] of < базовий тип елементів>;

Var

<ім'я масиву> : <ім'я типу>;

Приклад:

Type

Massiv = array [1..20] of longint;

Var

M : Massiv;

Зверніть увагу на те, що значень елементів у масиві не обов'язково буде стільки, скільки ми їх оголосили, але не може бути більше.

Звертання до елементу масиву:

<ІМ'Я_масиву>[<його_індекс>]

Приклад:

M[6] - шостий елемент масиву М;

A[10] - десятий елемент масиву А;

B[i] - і-тий елемент масиву В.

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

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

Методи заповнення одновимірного масиву:

1) за формулою:

for і:=1 to n do

М[і]:=i*i-10 {або будь-яка формула};

2) з клавіатури:

for і:=1 to n do

begin

write('Введіть М[',i,']: ');

readln(М[i]);

end;

3) випадковим чином (генератором випадкових чисел) із проміжку [А, В]:

for і:=1 to n do

М[і]:=random(B-A)+A;

Методи виведення елементів одновимірного масиву на екран

1) виведення у стовпчик:

for і:=1 to n do

writeln(М[i]);

2) виведення у рядок:

for і:=1 to n do

write(М[i]:5);

При виведенні елементів масиву у рядок бажано зазначити формат виведення, наприклад, write(М[і]:10:3) - для дійсних чисел або write (M[i]:5) - для цілих.

Дозволяється об'єднувати в одному циклі кілька етапів розв'язування задачі. Наприклад, очищення, заповнення масиву та виведення елементів масиву для контролю на екран.

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

Задача №293(1).

Умова: Записати наведені нижче послідовності змінних з індексами у вигляді послідовностей елементів масивів:

(mi), де (i = 1, 2, 3, …, 10).

Відповідь: m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9], m[10].

Задача №293(4).

Умова: Записати наведені нижче послідовності змінних з індексами у вигляді послідовностей елементів масивів:

(сj), де (j = -3, -2, …, 3).

Відповідь: c[-3], c[-2], c[-1], c[0], c[1], c[2], c[3].

Задача №293(8).

Умова: Записати наведені нижче послідовності змінних з індексами у вигляді послідовностей елементів масивів:

(Ql), де (l = n+1, n+2, …, n+5).

Відповідь: Q[n+1], Q[n+2], Q[n+3], Q[n+4], Q[n+5].

Задача №295.

Умова: Нехай нижня та верхня межі індексів одновимірного масиву В відповідно дорівнюють -5 та 10. Обчислити порядкові номери наступних елементів масиву:

№ варіанту

Завдання

Відповідь

1

B[-5]

1

2

B[8]

13

8

B[7]

12

9

B[-0]

6

Задача №297.

Умова: Нехай нижня та верхня межі індексів одновимірного масиву S відповідно дорівнюють -10 та 32. Визначити значення індексів елементів масиву S, порядковими номерами яких є:

№ варіанту

Завдання

Відповідь

1

1

S[-10]

5

3

S[-8]

10

10

S[-1]

13

12

S[1]

17

32

S[21]

Задача №299.

Умова: Нехай елементи одновимірного масиву A[1..10] набувають відповідно значень -5, -3, -1, 1, 3, 5, 7, 9, 11, 13. Які значення буде надруковано в результаті виконання таких операторів:

№ варіанта

Завдання

Відповідь

Примітка

3

For i:=1 to 5 do Writeln (A[i+5])

5

7

9

11

13

Друкується тільки п'ять останніх елементів масиву, тому що змінна циклу змінюється від 1 до 5, а індекс елементів масиву від 6 (1+5) до 10 (5+5)

5

i:=1;While A[i]<0 do Begin i:=i+1; Writeln(A[i]) End;

-5

-3

-1

Друкуються тільки від'ємні елементи масиву, тому що умова виходу з циклу така, що коли А[i]<=0, він припинить свою роботу.

7

i:=1;repeat i:=i+1; Writeln(A[i])

until A[i]>=0;

-3

-11

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

9

i:=10;While A[i]>0 do i:=i-1; Writeln (A[i])

-1

Цикл буде виконуватись до першого від'ємного елементу при проході по масиву справа наліво, але друкується тільки один елемент масиву, тому що оператор writeln стоїть зовні тіла циклу.

Задача №311(1).

Умова: Дано одновимірний масив цілих чисел А[i], де i = 1,2,…n. Вивести елементи масиву у зворотному порядку.

Program Example_311_1;

Uses crt;

Var N,i:word; {N - кількість елементів масиву, i -

змінна циклу}

А:array [1..100] of longint; {A - заданий масив}

Begin

Clrscr;

Write ('Введіть кількість елементів масиву (<100): ');

Readln(N);

For i:=1 to N do

Begin

A[i]:=random(300); {Заповнення масиву

випадковими числами}

Write(А[i]:5); {Виведення масиву на екран

для контролю правильності

роботи програми}

End;

Writeln; {Переведення курсору на наступний

рядок}

For i:=N downto 1 do

Begin

Write (A[i]:5);

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №311(2).

Умова: Дано одновимірний масив цілих чисел А[i], де i = 1,2,…n. Вивести елементи масиву з парними індексами.

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

Program Example_311_2;

Uses crt;

Var N,i : word; {N - кількість елементів масиву, i -

змінна циклу}

А : array [1..100] of longint; {A - заданий масив}

Begin

Clrscr;

Write ('Введіть кількість елементів масиву (<100): ');

Readln (N);

For i:=1 to N do

Begin

A[i]:=random(300); {Заповнення масиву

випадковими числами}

Write(А[i]:5); {Виведення масиву на екран

для контролю правильності

роботи програми}

End;

Writeln; {Переведення курсору на наступний

рядок}

i:=2;

while i<=N do

Begin

Write(A[i]:5);

i:=i+2; {Змінна циклу змінюється на 2, щоб

вибрати тільки парні елементи}

End;

Readkey; {Затримка зображення на екрані}

End.

Домашнє завдання:

· Вивчити матеріал, що прочитаний на лекції.

· Прочитати сторінки 117 - 119 запропонованого підручника.<.li>

· Задачі №292, №293(всі останні), №295 (всі останні), №297(всі останні), №299(всі останні), №310, №311(3).

Тема уроку: "Алгоритми і програми роботи з лінійними таблицями"

Мета уроку: Навчити розв'язувати типові задачі по обробці лінійних таблиць..

Тип уроку: Лекційний з практичними прикладами.

На початку уроку бажано зробити опитування (можна в письмовому або усному вигляді) за матеріалом попереднього уроку та повторити тему "Команда повторення", особливо різновид циклу - цикл з параметром.

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

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

Задача №300.

Умова: Барон Мюнхаузен, вийшовши на екологічно чисте полювання, зарядив свою рушницю кісточками вишень. Після того як він вдало влучив поміж роги оленям, в яких влучило відповідно k1, k2, …, kn кісточок, у них на головах виросли чудові молоді вишеньки. Скільки саджанців зміг подарувати барон Мюнхаузен садівникам-дослідникам?

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

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

Program Example_300;

Uses crt;

Var N:word; {N - кількість оленів, тобто

елементів масиву, у яких влучив

Мюнхаузен}

K:array[1..100] of longint; {K - зарезервований

масив для зберігання кількості

кісточок, що влучили в оленів}

i,Sum:longint; {i - змінна циклу, Sum - загальна

кількість кісточок, що влучили в

оленів}

Begin

Randomize; {Ця процедура запускається з метою

зробити числа генератора

випадкових чисел ще більш

"випадковими"}

Clrscr;

Sum:=0; {На початку роботи програми Мюнхаузен

ще ні в кого не влучив}

Write ('Введіть кількість оленів, в яких влучив

Мюнхаузен (<=100): ');

Readln(N);

For i:=1 to N do

Begin

K[i]:=random(50)+20; {Заповнення масиву

випадковими числами в

діапазоні від 20 до 70}

Write(K[i]:5); {Виведення масиву на екран

для контролю правильності

роботи програми}

Sum:=Sum+K[i];

End;

Writeln; {Переведення курсору на новий

рядок}

Writeln ('Кількість нових саджанців ',Sum);

Readkey; {Затримка зображення на екрані}

End.

Задача №302.

Умова: Середню групу дитячого садочка вивели на прогулянку. Скільки дівчаток і скільки хлопчиків видна з-за паркану, якщо зріст хлопчиків задається у сантиметрах від'ємними числами, а дівчаток - додатними у вигляді цілих значень a1, a2, …, an? Крім того, у всіх дівчаток на голівках зав'язані бантики заввишки 10 см, а висота паркану H см.

Задача майже нічим не відрізняється від попередньої, тільки при заповненні в масиві повинні з'являтись і додатні, і від'ємні числа. Для пошуку в масиві елементів з заданою властивістю (в даному випадку чисел, що по модулю більші ніж задане) використовується вже відома команда розгалуження.

Program Example_302;

Uses crt;

Var N,H:word; {N - кількість дітей в дитсадочку,

Н - висота паркану}

А:array[1..100] of longint; {А - зарезервований

масив для зберігання зростів

дітей}

i,Count_girl,Count_boy:longint;

{i - змінна циклу, Count_girl -

кількість дівчаток, Count_boy -

кількість хлопців}

Begin

Randomize;

Clrscr;

Count_girl:=0;

Count_boy:=0;

Write ('Введіть висоту паркану: ');

Readln(H);

Write ('Введіть кількість дітей в дитсадочку: ');

Readln(N);

For i:=1 to N do

Begin

A[i]:=random(300)-150; {Заповнення масиву

випадковими числами в

діапазоні від -150 до +150}

Write(А[i]:5); {Виведення масиву на екран

для контролю правильності

роботи програми}

if (A[I]<0) and (abs(A[I])>H)

then Count_Boy:=Count_Boy+1;

if (A[I]>0) and (A[I]+10>H)

then Count_Girl:=Count_Girl+1;

End;

Write ('Кількість хлопчиків, що видна з-за паркану ');

Writeln (Count_Boy);

Write ('Кількість дівчаток, що видна з-за паркану ,);

writelnCount_girl);

Readkey; {Затримка зображення на екрані}

End.

Задача №309.

Умова: Дано натуральне число А. Складіть програму, що представляє його у вигляді многочлена. Наприклад,

123 ==>1 * 10^2 + 2 * 10^1 + 3*10^0.

Ця задача фактично зводиться до пошуку окремих цифр числа. Так як ми не знаємо на початку роботи, скільки цифр має число, для їх зберігання можна використати масив цілих чисел, причому розмірність цього масиву можна задати не більше 10 елементів, тому що навіть найбільше ціле число типу longint має в своєму складі не більше 10 цифр.

Щоб вивести на екран отриманий многочлен, ми спочатку знаходимо кількість цифр в числі, а потім організовуємо цикл від найстаршої значущої (ненульової) цифри числа до молодшої з виведенням на екран самої цифри, помноженої на 10 в степені номер розряду -1 (тобто i-1).

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

Program Example_309;

Uses crt;

Var N,i,Count:longint; {N - задане ціле число, i -

змінна циклу, Count - кількість

цифр в числі}

Cifra:array [1..10] of byte; {Cifra - масив для

зберігання цифр числа}

Begin

Clrscr;

Count:=0;

Write ('Введіть ціле число: ');

Readln (N);

While N>0 do

Begin

Cifra[i]:=N mod 10;

N:=N div 10;

Count:=Count+1;

End;

Write('N = ');

For i:=N downto 1 do

Begin

Write(Cifra[i],'*10^',i-1);

If i>1

Then write(' + '); {Якщо доданок не останній,

то до нього дописується

знак "+"}

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №312.

Умова: Дано дійсні числа a1951, a1952, …, a2000 - кількість опадів (в мм), що випали у місті за останні 50 років минулого століття. Обчислити середню кількість опадів за цей період і щорічне відхилення від середнього значення.

В цій задачі прийдеться організовувати прохід по масиву двічі, так як першим проходом ми знайдемо тільки суму всіх опадів, що випали за останні 50 років, а потім поділивши отриманий результат на 50 знайдемо середню кількість опадів за вказаний період. Другим же проходом ми можемо вже визначити щорічне відхилення від середнього значення, причому для того, щоб не втратити вхідні дані, зарезервуємо в програмі ще один масив на 50 дійсних чисел для зберігання цих результатів.

Program Example_312;

Uses crt;

Var N,i:longint; {N - кількість елементів масиву, i

- змінна циклу}

A:array[1951..2000] of real; {A - масив для

зберігання кількості

опадів у відповідному році}

B:array[1951..2000] of real; {B - масив для

зберігання відхилення від

середнього значення}

Begin

Randomize;

Clrscr;

Sum:=0;

For i:=1951 to 2000 do

Begin

A[i]:=random(500)/7; {Заповнення масиву

випадковими дійсними числами}

Write(A[i]:8:2); {Виведення масиву на екран

для контролю правильності

роботи програми}

Sum:=Sum+K[i];

End;

Sum:=Sum/50; {Знаходження середньої кількості

опадів за рік}

Writeln;

Writeln ('Щорічні відхилення від середньої кількості опадів за період 1951 - 2000 р.р.');

For i:=1951 to 2000 do

Begin

B[i]:=Sum - A[i]; {Знаходження щорічного

відхилення}

Write(B[i]:8:2); {Виведення результатів на

екран}

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №315 (1).

Умова: Дано натуральне число n та цілі числа a1, a2, … an і b1, b2, … , bn. Визначити значення c1, c2, … , cn, якщо ci = ai + bi.

Program Example_315_1;

Uses crt;

Const N=100;

Type

Masiv = array[1..N] of integer;

Var A,B,C:Masiv; {A,B - масиви для зберігання

вхідних даних, С - вихідний

масив}

i:byte; {і - змінна циклу}

Begin

Randomize;

Clrscr;

For i:=1 to N do

Begin

A[i]:=random(200); {Заповнення масиву

випадковими цілими числами}

Write(A[i]:4); {Виведення масиву на екран

для контролю правильності

роботи програми}

End;

Writeln;

For i:=1 to N do

Begin

B[i]:=random(200);

Write(B[i]:4);

End;

Writeln;

For i:=1 to N-1 do

Begin

C[i]:=a[i]+b[i];

write(c[i]:4);

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №318 (1).

Умова: Дано дійсні числа a1, a2, …, a30, b1, b2, …, b30. Обчислити

(a1 + b30)(a2 + b29)…(a30 + b1).

Очевидно, що для обчислення даного виразу необхідно організувати цикл по тридцяти елементах масивів A та B, в якому індекси обох масивів будуть змінювати в протилежних напрямках. Для цього існує такий штучний прийом: зміну одного з індексів ми організовуємо за допомогою циклу з параметром, а зміну другого - за допомогою формули. Вочевидь, що в даному випадку ця формула має такий вигляд: j:=31 - і, де i та j - індекси відповідно масивів А та В. Програма, що реалізує запропонований алгоритм, маж наступний вигляд:

Program Example_318_1;

Uses crt;

Var A,B: array[1..30] of real;

{A,B - масиви для зберігання вхідних даних}

i:byte; {і - змінна циклу}

Rez:real; {Rez - результат обчислень}

Begin

Randomize;

Clrscr;

Writeln ('Масив А:');

For i:=1 to 30 do

Begin

A[i]:=random(200)/7-random*15;

Write(A[i]:8:2);

End;

Writeln ('Масив В:');

For i:=1 to 30 do

Begin

B[i]:=random*200-random*100;

Write(B[i]:8:2);

End;

Writeln;

Rez:=1;

{Початкове значення дорівнює 1, тому що результат

являється накопиченням добутку}

For i:=1 to 30 do

Begin

Rez:=Rez*(A[i]+B[31-i]);

End;

Writeln ('Результат обчислень = ',Rez:8:2);

Readkey; {Затримка зображення на екрані}

End.

Задача №318 (4).

Умова: Дано дійсні числа a1, a2, …, a30, b1, b2, …, b30. Обчислити

Очевидно, що для обчислення результату цієї задачі спочатку необхідно знайти чисельник та знаменник дробу. Причому зверніть увагу на те, що кількість доданків і в одному, і в другому випадках дорівнює 15, тільки в чисельнику вибираються елементи масивів з непарними індексами, а в знаменнику - з парними. Щоб організувати зміну індексів за заданим законом, можна скористатися таким штучним прийомом: якщо в циклі з параметром індекс i змінюється від 1 до n, то для отримання непарних чисел з проміжку [1..2n] використовується така формула: 2*i - 1.

Запропонуйте дітям подумати, яка формула дозволить отримати парні числа.

Використовуючи ці співвідношення, програма для розв'язку цієї задачі має наступний вигляд:

Program Example_318_4;

Uses crt;

Var A,B:array[1..30] of real;

{A,B - масиви для зберігання вхідних даних}

i:byte; {і - змінна циклу}

R1,R2:real; {R1 - чисельник дробу, R2 -

знаменник дробу}

Rez:real; {Rez - результат обчислень}

Begin

Randomize;

Clrscr;

Writeln ('Масив А:');

For i:=1 to 30 do

Begin

A[i]:=random(200)/7-random*15;

Write(A[i]:8:2);

End;

Writeln ('Масив В:');

For i:=1 to 30 do

Begin

B[i]:=random*200-random*100;

Write(B[i]:8:2);

End;

Writeln;

R1:=0;

R2:=0;

{Початкове значення дорівнює 0, тому що результат

являється накопиченням суми}

For i:=1 to 15 do

Begin

R1:=R1 + (A[2*i-1]+B[2*i-1]);

R2:=R2 + (A[2*i]+B[2*i]);

End;

Rez:=R1/R2;

Writeln ('Результат обчислень = ',Rez:8:2);

Readkey; {Затримка зображення на екрані}

End.

Домашнє завдання:

· Задачі №301, №303, №313, №315(2,3), №318(2,5).

комп'ютер програма алгоритм

Тема уроку: "Алгоритми і програми роботи з двовимірними таблицями"

Мета уроку: Дати поняття двовимірних таблиць. Навчити розв'язувати типові задачі по обробці двовимірних таблиць..

Тип уроку: Лекційний з практичними прикладами.

Двовимірний масив - це масив, де кожному елементу ставиться у відповідність два індекси.

Для початку роботи з масивом готуємо місце в пам'яті у вигляді прямокутника, що має задану кількість рядків і стовпчиків. Для цього описуємо його в розділі оголошень, використовуючи зарезервоване слово Аrray, після якого в квадратних дужках вказуємо розмірність масиву, причому враховуємо, що на першому місці вказуються індекси рядків, а на другому - стовпчиків, і обов'язково тип елементів.

Опис двовимірного масиву

<Ім'я_масиву> : array[<поч_інд_рядків>..<кін_інд_рядків>,

<поч_інд_стовп>. .<кін_інд_стовп>]

of <базовий_тип_елементів> ;

Приклад опису:

Const n:=100;

m:=100;

Var A:array[1..n,1..m] of real;

D:array[1..10,1.100] of integer;

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

Звертання до елементу двовимірного масиву:

Ім'я_масиву[<індекс_рядка>, <інд_стовпчика>]

Заповнення масиву:

· з клавіатури:

· for і:=1 to n do

· for j:=1 to m do

· begin

· write ('введіть А[',i,',',j,']: ');

· readln (А[i,j]);

· end;

· за формулою:

· for і:=1 to n do

· for j:=1 to m do

· А[і,j]:=i*i-10 {або будь-яка формула};

· випадковим чином із проміжку [K,L]:

· for і:=1 to n do

· for j:=1 to m do

· А[і,j]:=random(L-K)+K;

Виведення двовимірного масиву на екран

for і:=1 to n do

begin

for j:=1 to m do

write(A[i,j]:8); {виведення в рядок}

writeln; {перехід на новий рядок}

end;

Виведення в рядку необхідно обов'язково форматувати, щоб не трапилось "злипання" елементів (дивись приклад вище).

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

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

Елементи, що стоять на головній діагоналі, мають індекси (1, 1), (2, 2), (3, 3), ... (і, і). ..., (n, n), тобто номер рядка дорівнює номеру стовпчика! Елементи, що стоять на бічній діагоналі, мають такі індекси (1, n), (2, n-1), (3, n-2), ..., (і, n+1-і), (n,1), тобто індекси елементів взаємозалежні за формулою j= n+1 - i.

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

Задача №343(2).

Умова: Дано натуральні числа n, m та випадкові дійсні числа, що утворюють таблицю A[i,j], де i = 1,2,…, n; j = 1, 2, …, m. Роздрукувати у рядок елементи, що розташовані в першому стовпчику.

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

Program Example_343_2;

Uses crt;

Const

n = 10;

m = 8;

Var A: array[1..n,1..m] of real;

i,j: integer; {і,j - змінні циклу}

Begin

Randomize; {Ця процедура запускається з метою

зробити числа генератора

випадкових чисел ще більш

"випадковими"}

Clrscr;

For i:=1 to n do

Begin

For j:=1 to m do

begin

A[i,j]:=random*50-random*30;

{Заповнення масиву

випадковими числами}

Write(A[i,j]:8:2); {Виведення масиву на

екран для контролю

правильності роботи програми}

end;

writeln;

End;

Writeln ('Перший стовпчик масиву:');

For i:=1 to n do

begin

Write (A[i,1]:8:2);

end;

Readkey; {Затримка зображення на екрані}

End.

Задача №343(5).

Умова: Дано натуральні числа n, m та випадкові дійсні числа, що утворюють таблицю A[i,j], де i = 1,2,…, n; j = 1, 2, …, m. Роздрукувати у рядок елементи, що розташовані на бічній діагоналі.

Нагадуємо, що на бічній діагоналі елементи мають таку властивість: сума номера рядка та номера стовпчика дорівнюють розмірності масиву +1, тобто номер стовпчика обчислюється за наступною формулою: j = n-1+i.

Тоді програма для розв'язання даної задачі має наступний вигляд:

Program Example_343_5;

Uses crt;

Const

n = 10;

Var A: array[1..n,1..n] of real;

i,j: integer; {і,j - змінні циклу}

Begin

Randomize;

Clrscr;

{Заповнення масиву випадковими числами та виведення

його на екран}

For i:=1 to n do

Begin

For j:=1 to m do

begin

A[i,j]:=random(500)/11-random*30;

Write (A[i,j]:8:2);

end;

writeln;

End;

Readln; {Затримка зображення на екрані}

Writeln ('Бічна діагональ масиву:');

For i:=1 to n do

begin

Write (A[i,n-i+1]:8:2);

end;

Readkey; {Затримка зображення на екрані}

End.

Задача №344(2).

Умова: Дано натуральні числа n, m та матриці цілих чисел Aij, Bij, де i = 1, 2, …, n, j = 1, 2, …,m. Обчислити значення елементів матриці Cij, якщо Cij = Aij (I+j) - Bij(i2+j2).

Program Example_344_2;

Uses crt;

Const

n = 8;

m = 15;

Var A,B,C: array[1..n,1..m] of integer;

i,j:word; {і,j - змінні циклу}

Begin

Randomize;

Clrscr;

Writeln ('Масив А:');

For i:=1 to n do

Begin

For j:=1 to m do

begin

A[i,j]:=random(50)-random(20);

Write (A[i,j]:5);

end;

writeln;

End;

Writeln ('Масив В:');

For i:=1 to n do

Begin

For j:=1 to m do

begin

B[i,j]:=random(120)-random(80);

Write (B[i,j]:5);

end;

writeln;

End;

Writeln ('Результуючий масив С:');

For i:=1 to n do

Begin

For j:=1 to m do

begin

С[i,j]:=A[i,j]*(i+j)-B[i,j]*(i*i+j*j);

Write (С[i,j]:5);

end;

writeln;

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №345(1).

Умова: Дано натуральні числа n, m. Обчислити значення елементів матриці Cij, (i = 1,2,…n, j=1,2,…,m), якщо:

Program Example_345_1;

Uses crt;

Const

n = 20;

m = 15;

Var C: array[1..n,1..m] of integer;

i,j:integer; {і,j - змінні циклу}

Begin

Clrscr;

For i:=1 to n do

Begin

For j:=1 to m do

begin

if i < j

then С[i,j]:=i + j

else C[i,j]:=i*i + j*j;

Write (С[i,j]:5);

end;

writeln;

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №347(2).

Умова: Дано натуральні числа n, m та матриці дійсних чисел Aij, Bij, де i = 1, 2, …, n, j = 1, 2, …,m. Обчислити значення елементів матриці Cij, якщо:

Program Example_347_2;

Uses crt;

Const

n = 6;

m = 8;

Var A,B,C: array[1..n,1..m] of real;

i,j:integer; {і,j - змінні циклу}

Begin

Randomize;

Clrscr;

Writeln ('Масив А:');

For i:=1 to n do

Begin

For j:=1 to m do

begin

A[i,j]:=random*5-random(10)/3;

Write (A[i,j]:8:3);

end;

writeln;

End;

Writeln ('Масив В:');

For i:=1 to n do

Begin

For j:=1 to m do

begin

B[i,j]:=random(10)-random*8;

Write (B[i,j]:8:3);

end;

writeln;

End;

Writeln ('Результуючий масив С:');

For i:=1 to n do

Begin

For j:=1 to m do

begin

if i < j

then С[i,j]:=i*i + j*j + 2

else

if i = j

then C[i,j]:=1/(sqr(i+j)*(i+j))

else C[i,j]:=sqr(sin(A[i,j]))+sqr(sin(B[i,j]));

Write(С[i,j]:8:3);

end;

writeln;

End;

Readkey; {Затримка зображення на екрані}

End.

Задача №360.

Умова: Дано квадратну матрицю розмірності n. Надрукувати суму елементів бічної діагоналі.

Розв'язок задачі являється тривіальним, якщо згадати, яку залежність мають індекси бічної діагоналі (i+j=n+1). Перевіривши цю залежність в середині циклів, що організовують прохід по масиву, ми знайдемо бажану суму.

Program Example_360;

Uses crt;

Const

n = 10;

Var A: array[1..n,1..n] of real;

i,j:integer; {і,j - змінні циклу}

Sum:real; {Sum - сума елементів бічної діагоналі}

Begin

Randomize;

Clrscr;

{Заповнення масиву та виведення його на екран}

For i:=1 to n do

Begin

For j:=1 to n do

begin

A[i,j]:=random*50-random(80)/3;

Write(A[i,j]:8:3);

end;

writeln;

End;

Sum:=0; {Початкове значення суми}

For i:=1 to n do

Begin

For j:=1 to n do

begin

if i + j = n+1

then Sum:=Sum+A[i,j];

end;

End;

Writeln ('Сума елементів бічної діагоналі =',Sum:8:2);

Readkey; {Затримка зображення на екрані}

End.

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

Sum:=0; {Початкове значення суми}

For i:=1 to n do

Begin

Sum:=Sum+A[i,n+1-i];

End;

Домашнє завдання:

o Задачі №343(3,4), №344(3), №345(2), №347(3), №361.

Тема уроку: "Алгоритми пошуку в таблицях елементів із деякою властивістю"

Мета уроку: Навчити розробляти алгоритми пошуку в таблицях елементів із заданими властивостями.

Тип уроку: Лекційний з практичними прикладами.

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

Задача №314 (2).

Умова: Дано натуральне число n та послідовність дійсних чисел a1, a2, … an. Визначити в цій послідовності кількість сусідств двох чисел різного знаку.

Перш за все запропонуємо в цій задачі інший метод опису масиву з використанням константи, що задає розмір масиву, та вказівки Type. А, по-друге, звертаємо вашу увагу на те, що для визначення двох сусідніх елементів масиву використовується загальний опис індексів i та i+1 (можна і-1 та і), а це при організації циклу можне викликати ситуацію виходу за межі масиву. Дійсно, якщо організувати цикл з параметром для зміни індексу від 1 до N, де N - кількість елементів масиву, то при i=N значення і+1 буде виходити за межі масиву. Це являється синтаксичною помилкою, що призводить до неочікуваних результатів, тому цикл треба організовувати не для зміни індексу від 1 до N, а для зміни від 1 до N-1.


Подобные документы

  • Методика та порядок програмування алгоритмів циклічної структури із заданим числом повторень за допомогою мови програмування VAB. Алгоритм роботи з одновимірними масивами. Програмування алгоритмів із структурою вкладених циклів, обробка матриць.

    курсовая работа [27,7 K], добавлен 03.04.2009

  • Розв'язання задач мовою програмування VBA з використанням алгоритмів лінійної, розгалуженої та ітераційної циклічної структури. Розробка блок-схеми алгоритму, таблиці ідентифікаторів та тексту програми. Створення власної панелі інструментів користувача.

    практическая работа [1012,6 K], добавлен 19.02.2010

  • Визначення поняття "алгоритми", їх властивості, метод складання. Способи подання алгоритмів: письмовий, усний, схематичний, графічний, кодований. Навчальна алгоритмічна мова. Особливості створення блок-схеми. Алгоритм поданий мовою програмування.

    презентация [2,9 M], добавлен 06.05.2019

  • Алгоритми розв’язання задач у вигляді блок–схем. Використання мови програмування MS VisualBasic for Application для написання програм у ході вирішення задач на одномірний, двовимірний масив, порядок розв’язання задачі на використання символьних величин.

    контрольная работа [742,9 K], добавлен 27.04.2010

  • Огляд переваг та недоліків мови Пролог, історія її створення. Числення предикатів як математична основа її функціонування. Порівняльна характеристика середовищ програмування Prolog. Алгоритми розв’язування математичних задач за допомогою цієї мови.

    курсовая работа [504,5 K], добавлен 23.12.2014

  • Фундаментальні поняття об'єктно-орієнтованого програмування. Система лінійних нерівностей та опуклі багатогранники. Системи лінійних рівнянь лінійної алгебри як частковий випадок систем лінійних обмежень. Використання середовища програмування Delphi7.

    курсовая работа [222,7 K], добавлен 20.05.2015

  • Мoвa прoгрaмувaння як систeма пoзначень, що служить для точного опису програм або алгоритмів для ЕOM. Вимоги до мов програмування, класифікація за їх особливостям. Загальна характеристика найбільш поширених мов програмування: Сі, Паскаль, Delphi, Бейсік.

    реферат [24,4 K], добавлен 10.11.2012

  • Лінійне програмування як один з найбільш популярних апаратів математичної теорії оптимального управління рішень. Опис існуючих методів розв’язку задач лінійного програмування. Завдання, основні принципи, алгоритми і головна мета лінійного програмування.

    курсовая работа [363,8 K], добавлен 03.12.2009

  • Аналіз розроблення та програмування обчислювального процесу лінійної структури, налагодження програм. Вивчення правил запису констант, числових і символьних змінних, типів даних. Побудова алгоритму розв’язування завдання та креслення його блок-схеми.

    реферат [2,1 M], добавлен 22.04.2012

  • Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.

    курсовая работа [335,3 K], добавлен 11.01.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.