
Книга_мат_3_1
.pdfОскільки максимальний елемент уже стоїть на своїй останній пози-
ції, то другий прохід обмінів виконується до (n – 1) – |
го елемента. І так |
||
далі. Всього необхідно зробити (n – 1) прохід. |
|
||
Програма, |
що реалізує метод “бульбашок”, |
буде мати насту п- |
|
ний вигляд: |
|
|
|
Program BubbleSort; |
|
||
Const |
n=20; |
{ довжина масиву } |
|
Type |
Tvector = array [1. . n] of real; |
|
|
Var Vector : Tvector; |
|
b: real;
i,k: integer; Begin
Writeln(„ введіть елементи масиву:‟); for i:=1 to n do
Read( Vector[i] );
Readln;
{ - - - - - - - - - - - - } for k := n downto 2 do begin
{“випливання” чергового максимального елемента} {на к- у позицію}
for i := 1 to k - 1 do
if Vector[i]>Vector[i+1] then begin
b:=Vector[i]; Vector[ i] := Vector [i+1]; Vector [i+1] := b;
end; { - - - - - - - - - - }
writeln („відсортований масив:‟); for i :=1 to n do
write ( Vector [i]:8:2 ); writeln;
End.
Завдання
1.Перетворити масив Х за наступним правилом : всі від‟ємні елементи
масиву Х перенести на початок, а всі інші - в кінець. Всі від‟ємні елементи відсортувати за неспаданням.
2. Дано дійсні числа а1 , а2 , . . . , аn. Серед цих чисел усі від‟ємні числа збільшити на 0,25 , а всі невід‟ємні замінити на 0,2. Потім невід‟ємні числа відсортувати по незростанню.
3.Дано два масиви чисел А та В по 12 елементів в кожному. Впорядкувати масив Z по спаданню елементів, при умові, що елементи масиву Z утворюються по формулі zi = ai - bi sin i.
61

4.Обчислити компоненти вектора Z ={ z1 , z2 , . . . , z10} i впорядкувати їх за зростанням, якщо zk =xk + myk , де xk, yk - компоненти заданих векторів Х та Y, а m визначається умовою:
k |
при |
sin k |
0,3, |
|||
m |
|
|
|
|
|
|
k |
при |
|
sin k |
|
0,3. |
|
|
|
|
||||
|
|
|
|
|
|
|
5.Дано двовимірний масив, який містить 5 рядків і 3 стовпчика. Елементами масиву є цілі числа. Впорядкувати масив по неспаданню елеме н- тів першого стовпця.
6.Дано двовимірний масив , який містить 4 рядки і 4 стовпчика. Елеме н- тами масиву є дійсні числа. Впорядкувати масив по незростанню елементів другого стовпчика.
7.Дано двовимірний масив , який містить 3 рядка і 2 стовпчика. Елеме н- тами масиву є цілі числа. Впорядкувати масив по незростанню елем е- нтів третього рядка.
8.Дано двовимірний масив, який містить 5 рядків і 3 стовпчика. Елеме н- тами масиву є дійсні числа. Впорядкувати масив по неспаданню елементів першого рядка.
9.Дано цілі x1, . . . , xn. отримати в порядку зростання всі різні числа, що входять в x1, . . . , xn. в процесі сортування необхідно відкинути елем е-
нти , що вже зустрічалися раніше. Якщо в результаті пошуку місця хі у впорядкованій послідовності x1, . . . , xк (к<i) виявиться , що серед x1, . . . , xк є елемент , рівний хі , то слід перейти до розгляду хі+1 без
зміни x1, . . . , xк.
10. Дано |
дійсні |
с1, . |
. . , сn |
, d1, . . |
. , |
dk ( c1 |
c2 |
... cn , |
d1 |
d 2 ... |
d k ) |
. Внести |
єдину впорядкованість в с1, . . . , сn , d1, . |
||||
. . , dk, отримавши f1 |
, f2, . . . , fn+k такі , що |
f1 |
f 2 ... |
f n |
k . |
11.Дано цілі x1, . . . , xn . Знайти найбільше значення, що міститься в послідовності чисел x1, . . . , xn після вилучення з неї всіх членів зі значен-
ням max(x1, . . . , xn ).
12.Дано дійсна матриця (хij) розміру m n ; впорядкувати рядки матриці за неспаданням сум елементів рядків.
13.Дано дійсна матриця (хij) розміру m n ; впорядкувати рядки матриці за неспаданням найменших елементів рядків.
14.Дано дійсна матриця (хij) розміру m n ; впорядкувати стовпці матриці за зростанням найбільших елементів стовпців.
62

15. За допомогою дійсної матриці |
x |
... x1N |
задано N точок так, що |
11 |
|
||
|
x21 |
... x2 N |
|
Х1J , X2J - координати j – ої точки. |
Розташувати координати точок в |
матриці за зростанням довжин радіус |
- векторів заданих точок. |
Контрольні запитання
1.Що означає сортування даних?
2.В яких структурах даних можна проводити сортування?
3.Які методи сортування вам відомі?
4.Принцип методу вставки?
5.Принцип методу вибору?
6.Принцип методу обміну?
Лабораторна робота № 12 “Робота з рядками”
Мета: сформувати уміння використовувати при розв‟язанні задач рядкові та символьні змінні.
Питання для вивчення
1.Рядкові змінні.
2.Процедури та функції для роботи з рядками.
Теоретичні відомості
Рядкові змінні
Рядок - це скінчена послідовність символів кодової таблиці ASCII (розширеної). Рядок постійно містить у собі будь-які символи обмежені, апострофами. Довжина рядка не перевищує 255 символів.
Опис рядкової змінної відбувається наступним чином:
Type
<ім‟я типу>=String; найбільша довжина
<ім‟я типу>=String [50];
На зберігання рядка відводиться пам ‟яті: кількість символів плюс один. Це так звана біжуча довжина.
Var
<ім‟я змінної>:<ім‟я типу>; <ім‟я змінної>:string[n];
s[i] – це змінна складова.
63

Операції над рядками:
1. Поєднання або щеплення (контакція). Вона не комутативна. Тобто нехай дано два рядки a та b тоді a+b b+a.
2.Оператор присвоєння :=.
3.Операції відношення: =, <>, <=,>=.
Порівняння відбувається зліва направо до першого символу і порівнюються коди. Рядок вважається більшим, якщо в нього код більший. Крім операцій над рядковими змінними використовують стандартні процедури та функції.
Процедури та функції для роботи з рядками
Назва функції, про- |
Опис змінних |
Що робить |
Тип |
цедури |
|
|
|
Copy(St,Poz,N) |
St: string |
Копіює з рядка St із |
String |
|
Poz,N: word |
позиції Poz N символів. |
|
Concat(St1,St2,...,Stk) |
St1,St2,...,Stk: |
Рядок в якому |
String |
|
string |
St1+St2+...+Stk. |
|
Length(St) |
St: string |
Біжуча довжина рядка. |
Word |
Pos(St1,St2) |
St1,St2: string |
Позиція з якої St1 вхо- |
Word |
|
|
дить у St2. |
|
Upcase(Ch) |
Ch: char |
Перетворює рядкову |
Char |
|
|
букву в прописну. |
|
Delete(St,Poz,N) |
St: string |
Видаляє з рядка St з |
Процедура |
|
Poz,N: byte |
позиції Poz N символів. |
|
Insert(St1,St2,Poz) |
St1,St2: string |
Вставляє в рядок St1 із |
Процедура |
|
Poz: byte |
позиції Poz рядок St2. |
|
|
|
|
|
Str(IBR,St) |
IBR: числовий |
Перетворення числового |
Процедура |
|
тип |
значення величини IBR |
|
|
St: string |
в рядок. Результат по- |
|
|
|
міщається в рядок St. |
|
|
|
Числовий параметр може |
|
|
|
бути заданий по формату, |
|
|
|
якщо треба більше позицій, |
|
|
|
то зліва добавляють пробі- |
|
|
|
ли. |
|
Val(St,IBR,Cod) |
St:string |
Перетворення значення |
Процедура |
|
IBR,Cod:word |
St в числову величину |
|
|
|
цілочисельного типу або |
|
|
|
типу real. Результат помі- |
|
|
|
щається в IBR. При цьому |
|
|
|
значення St не повинно |
|
|
|
містити пробілів ні в кінці |
|
|
|
ні на початку. Якщо Cod=0, |
|
|
|
то помилки немає, якщо |
|
|
|
Cod>0, то він видає помил- |
|
|
|
ку і вказує позицію помил- |
|
|
|
ки, при цьому значенняIBR |
|
|
|
не визначається. |
|
64
Приклад 13. Дано рядок, що містить від 2 до 50 слів, у кожному з яких від 1 до 8 рядкових латинських букв; між сусідніми словами не менш одного пробілу, за останнім словом немає пробілів. Підрахувати кількість слів у
рядку.
Program slovo;
Var a:string; i,j:integer; t:boolean; Begin
writeln('Введіть рядок'); readln(a);
i:=1;
j:=0; {кількість слів} while i<=length(a) do begin
t:=false;
while (a[i]<>' ') and (i<=length(a)) do begin
t:=true;
i:=i+1
end;
if t then j:=j+1; i:=i+1
end;
writeln('У рядку кількість слів =', j); readln
End.
Завдання
1.Нехай дано текст, що складається з окремих речень і в якому використовуються розділові знаки «.», «?», «!». Обчислити кількість речень у заданому тексті.
2.Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять усередині себе пробілів, називатимемо словами. Вважатмемо, що текст завжди починається зі слова. Визначити кількість слів у тексті.
3.Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять усередині себе пробілів, називатимемо словами. Вважатмемо, що текст завжди починається зі слова. Визначити кількість слів, які починаються з літер «а» або «А» .
4.Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять усередині себе пробілів, називатимемо словами. Вважатмемо, що текст завжди починається зі слова. Визначити кількість слів, у яких перща й остання літери однакові.
5.Дано деякий текст. Групи символів, які розділені пробілами (одним або кількома) та не містять усередині себе пробілів, називатимемо
65
словами. Вважатмемо, що текст завжди починається зі слова. Визначити кількість слів, довжина яких дорівнює k.
6.У даному двійковому числі замінити всі цифри «0» на «1» і навпаки. Якщо старшими цифрами отриманого двійкового числа стануть цифри «0», то ними знехтувати.
7.Нехай текст дано у вигляді одного слова, тобто в ньому відсутні пр о- біли. Скласти програму, яка перевіряє, чи є частиною заданого сло ва слово «рак». Відповіддю має бути «так» чи «ні» (наприклад, для слова «ракета» - «так», а для слова «карета» - «ні»).
8.Дано текст S, в якому є хоча б одна крапка. Роздрукувати ту частину тексту, що розташована до першої крапки та після другої крапки.
9.Дано текст S, в якому є хоча б одна крапка. Роздрукувати ту частину тексту, що розташована між першою і другою крапками (якщо друга крапка відсутня, то до кінця тексту).
10.Нехай дано деякий текст S і значення символьних змінних х та у. Із тексту вилучити всі ситмволи, що збігаються з х, і повторити двічі всі символи, що збігаються з у.
11.Скласти програму, яка кожну літеру «а», що зустрічається в тексті, замінює на групу символів «ку» (наприклад, «ади» - «куди»).
12.Скласти програму, яка вилучає із заданого слова всі літери «а» (наприклад, «застава» - «зств»).
13.Нехай дано текст-формулу. Визначити коректність формули щодо кількості відкритих і закритих дужок. Вважається, що закриті дужки не стоять перед відкритими. Якщо дужки у формулі відсутні - повідомити про це.
14.Скласти алгоритм-шифрувальник, який заміняє кожний символ тексту його ASCII-кодом.
15.Розробити програму-шифрувальник тексту, що замінює кожну його літеру наступною по порядку в абетці. Останню літеру абетки нео б- хідно замінити першою.
Контрольні запитання
1.Дати означення рядка.
2.Яка максимальна довжина рядка?
3.Вказати методи опису рядкових змінних.
4.Які операції можна виконувати над рядками?
5.Вказати стандартні функції та процедури для роботи з рядками.
Лабораторна робота № 13 “Робота з множинами”
66
Мета: сформувати уміння використовувати множини.
Питання для вивчення
1.Множини.
2.Особливості роботи з множинами.
Теоретичні відомості
Множини
Поняття множини є одним із основних, фундаментальних понять математики. Існує і окремий розділ математики, який так і називається – теорія множин. У мові Паскаль множина – це довільна сукупність значень перерахованого типу. Тип множини описується наступним чином:
type < ім‟я типу > = set of < тип елементів >
Але одразу відмітимо, що кількість елементів множини у мові Паскаль не може бути більшою, ніж 256. Це пов‟язано з тим, що розробники компіляторів мови Паскаль наклали саме таке обмеження на дане поняття. Проте, навіть не зважаючи на це обмеження, основні властивості множин і операції над ними можна зручно використовувати при розв‟язуванні багатьох задач.
Вкажемо, що при виконанні операцій над множинами у Паскалі діють наступні операції:
in – належність елементу множині. Звичайно використовують при пер е- вірці умови належності множині, наприклад, нехай задано множину цифр:
cifra : set of char;
а в самій програмі на початку цю множину конкретно визначено: cifra := [„0‟..„9‟];
Тоді перевірку належності введеного символу ch типу char на предмет належності множині цифр можна оформити як:
….
ch := readkey;
if ch in cifra then write(„ Належить цифрам ‟);
...
+ – об‟єднання множин. Якщо, наприклад множина А={1,2,3,4,5}, a
B={4,5,6,7}, то в результаті виконання операції С=А+В ми отримаємо
С={1,2,3,4,5,6,7}.
– – різниця множин. Якщо, наприклад множина А={1,2,3,4,5}, a
B={4,5,6,7}, то в результаті виконання операції С=А–В ми отримаємо
С={1,2,3}.
* – переріз множин. Якщо, наприклад множина А={1,2,3,4,5}, a B={4,5,6,7}, то в результаті виконання операції С=А*В ми отримаємо
С={4,5}.
67
Особливості роботи з множинами
Приклад 14. Скласти програму, яка знаходить всі числа, що діляться на 6, а також всі числа що діляться на 2 або на 3.
Розв’язання: Одразу домовимось про обмеження, які ми накладемо на нашу програму. Оскільки метою є демонстрація можливостей роботи з множинами і кількість елементів обмежена типом byte, то ми і будемо ш у- кати всі числа згаданого типу. Звичайно, задачу можна розв‟язати іншим шляхом, не використовуючи поняття множин і в ній знаходити всі числа, що задовольняють умову задачі з заданого проміжку. Пропонуємо вам самостійно знайти інші способи розв‟язання. Ми ж продемонструємо м е-
тоди роботи з множинами.
Program p6_23; uses crt;
Const N = 255;
var N2,N3,N6,N23 : set of byte; { множини задали як змінні } k : integer;
begin clrscr;
N2 := []; { Задаємо пусту множину чисел, що діляться на 2} N3 := []; { і пусту множину чисел, що діляться на 3 }
for k :=1 to N do { в циклі розглядаємо всі числа проміжку } begin { і якщо вони діляться на 2 або на 3 то }
{ заносимо у множину N2, якщо діляться на 2 } if k mod 2 = 0 then N2 := N2 + [k];
{ заносимо у множину N3, якщо діляться на 3 } if k mod 3 = 0 then N3 := N3 + [k];
end;
N6 := N2 * N3; { перетин множин – діляться на 6 }
N23 := N2 + N3; { об‟єднання множин – діляться і на 2 і на 3 } writeln(' На 6 діляться: '); { ну а далі все зрозуміло... }
for k := 1 to N do if k in N6 then write(k:4); writeln;
writeln(' На 2 або на 3діляться: ');
for k := 1 to N do if k in N23 then write(k:4); writeln;
readln;
end.
Завдання
Словом вважають групу символів між двома пробілами.
1.Дано рядок. Вилучити з нього усі слова, в запису яких є букви “а”, “у”, “е”.
2.Дано рядок. Підрахувати кількість слів у рядку. Отримати та роздр у- кувати множину усіх символів, що зустрічаються у тексті.
68
3.Дано рядок. Підрахувати кількість слів у рядку. Отримати та роздрукувати усі розділові знаки, які є у тексті.
4.Дано рядок. Підрахувати кількість слів у рядку. Отримати та вивести на друк усі приголосні, що є у тексті.
5.Дано рядок. Підрахувати кількість слів у рядку. Отримати та роздр у- кувати усі голосні, що є у тексті.
6.Дано рядок. Вилучити усі слова, в яких зустрічається не більше двох різних літер.
7.Дано рядок. Підрахувати кількість слів у рядку. Обчислити суму цифр, які зустрічаються у тексті.
8.Дано рядок. Залишити у ньому лише ті слова, в яких літери не повторюються.
9.Дано рядок. Підрахувати кількість слів у рядку та кількість голосних літер, що зустрічаються у тексті.
10. Дано рядок. Підрахувати кількість слів у рядку та кількість приголо с- них літер і розділових знаків, що зустрічаються у тексті.
11.Дано рядок. Підрахувати кількість слів у рядку та кількість голосних літер і цифр, що зустрічаються у тексті.
12.Дано рядок. Підрахувати кількість слів у рядку та визначити, яких літер – голосних чи приголосних – більше зустрічається у тексті.
13.Дано рядок. Надрукувати голосні літери, які входять в кожне слово
рядка.
14. Дано рядок. Надрукувати всі приголосні літери, які не входять в жо д- не слово рядка.
15.Дано рядок. Надрукувати всі голосні літери, які входять більше ніж в одне слово рядка.
16.Дано рядок. Надрукувати приголосні літери, які входять тільки в одне слово рядка.
Контрольні запитання
1.Які є способи подання тексту? Охарактеризувати особливості опр а- цювання тексту в залежності від способу подання.
2.Особливості типу string.
3.Як працюють і які дії виконують процедури delete та insert? Охарактеризувати параметри цих процедур.
4.Яке призначення функцій pos, length, copy? Охарактеризувати параметри цих процедур.
5.*Охарактеризувати особливості подання рядків ASCIIZ (другий спосіб подання рядків).
6.*Охарактеризувати процедури та функції модуля Strings.
7.Що таке множина? В чому відмінності математичного уявлення про множини та уявлення про множини у TURBO PASCAL ?
69
8.Як задати множину у TURBO PASCAL ? Які операції можна виконувати над множинами?
9.Яким може бути базовий тип множини? Чому? Як представлені множини в пам‟яті комп‟ютера?
70