Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МВ ЛСР СП КС 2012

.pdf
Скачиваний:
26
Добавлен:
09.02.2016
Размер:
10.5 Mб
Скачать

Таблиця 7.2 - Індивідуальні завдання високого рівня складності

Розмір

Тип

Індивідуальне завдання

вар.

масиву

даних

 

1

15

цілий

Обчислити суму Sпозитивних непарних елементів і замінити

 

 

 

парні елементи масиву на S

 

 

 

 

2

10

дійсн.

Поміняти місцями мінімальний елемент з передостаннім ел-том

 

 

 

 

3

12

цілий

Обчислити факторіал першого елемента масиву, значенняякого

 

 

 

менше 8-ми

 

 

 

 

4

8

дійсн.

Перевірити, чи є масив упорядкованим по зростанню, і видати про

 

 

 

це повідомлення

5

14

цілий

Обчислити новий масив як різницю елементів вихідного масиву і

 

 

 

їх середньоарифметичного

6

18

дійсн.

Обчислити максимальний елемент і поміняти його місцями з

 

 

 

останнім елементом

7

11

цілий

Упорядкувати масив за спаданням та визначити індекс елемента,

 

 

 

який дорівнює F. Число F ввести з клавіатури

8

14

дійсн.

Обчислити процентний вміст негативних, позитивних і нульових

 

 

 

елементів

9

7

цілий

Обчислити добуток непарних елементів і побудувати новий масив

 

 

 

різниці елементів вихідного масиву і обчисленого добутку

10

19

дійсн.

Обчислити кількість елементів, що перевищують

 

 

 

середньоарифметичне усіх елементів

11

17

цілий

З вихідного масиву побудувати новий, розташувавши спочатку всі

 

 

 

позитивні елементи і нулі, після чого - негативні, зберігаючи

 

 

 

порядок їх слідування

12

9

дійсн.

Замінити всі негативні елементи максимальним

13

15

цілий

Визначити мінімальний елемент і поміняти його місцями з

 

 

 

першим елементом

14

10

дійсн.

Обчислити макс. і мінім. елементи і поміняти їх місцями

 

 

 

 

15

8

цілий

Обчислити факторіал індексу максимального елемента

 

 

 

 

16

12

дійсн.

Обчислити суму всіх елементів від початку до першого

 

 

 

негативного. Якщо серед елементів немає негативних, видати про

 

 

 

це повідомлення і обчислити суму всіх елементів

17

20

цілий

Обчислити суму елементів з парними індексами і побудувати

 

 

 

новий масив різниці елементів вихідного масиву і обчисленої суми

18

18

дійсн.

Обчислити суму елементів масиву, значення яких перевищує

 

 

 

середнє арифметичне

19

11

цілий

Обчислити мінімальний елемент з парних позитивних елементів

20

9

дійсн.

Обчислити максимальний елемент з числа негативних елементів

21

16

цілий

Побудувати новий масив залишків від ділення націло елементів

 

 

 

масиву на 3

22

19

 

Замінити всі нульові елементи значенням мінімального елемента

23

17

цілий

Обчислити залишок від ділення суми елементів з непарними

 

 

 

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

 

 

 

 

24

8

дійсн.

Поміняти місцями першу половину масиву з другою

 

 

 

 

25

7

цілий

Замінити всі непарні елементи масиву одиницями (непарні за

 

 

 

значенням, а не за індексом)

 

 

 

 

26

18

дійсн.

Обчислити різницю між сумою елементів, індекси яких кратні 3, і

 

 

 

сумою елементів, індекси яких кратні 4

27

11

цілий

Замінити парні за значенням (а не за індексом) числа на нулі

28

10

дійсн.

Поміняти місцями елементи, які стоять в масиві поруч (1 і 2, 3 і 4 і

 

 

 

т. д.)

29

16

цілий

Визначити з непарних позитивних елементів найбільший

30

12

дійсн.

Визначити індекс першого негативного елементу. За відсутності

 

 

 

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

 

 

 

- 98 -

Таблиця 7.3 - Індивідуальні завдання підвищеного рівня складності

Розмір

Тип

Індивідуальне завдання

вар.

масиву

даних

 

1

до 9

цілий

Ввести два масиви і обчислити кількість однакових ел-тівв них

2

до 10

дійсн.

Ввести два масиви і побудувати третій з упорядкованих за зростанням

 

 

 

значень елементів обох масивів

3

до 12

цілий

Ввести масив, в якому кожен елемент є 0, 1 або 2, переставити ел-ти

 

 

 

масиву так, щоб спочатку були розташ. всі0, потім всі 1 і, врешті, всі 2

4

до 8

дійсн.

Ввести масиві число С. Переставити числа в масиві так, щоб спочатку

 

 

 

були розташованівсі ел-ти менше або рівнізначенню С, потім -

 

 

 

більше С, зберігаючи порядок їх розташування

5

до 14

цілий

Визначити перше число, присутнє в кожному з трьох масивів,

 

 

 

значення в цих масивах розташовані по зростанню

6

до 7

дійсн.

Ввести два масиви і побудувати третій із загальних ел-тівмасивів

7

до 11

цілий

Ввести масив, в якому тільки два однакових ел-та. Визн. їх індекси

8

до 14

дійсн.

Ввести масиві число L. Побудувати новий масив з елементів, менших

 

 

 

ніж L і упорядкувати новий масив за спаданням

9

до 19

цілий

Визначити пару сусідніх елементів масиву, значення яких є

 

 

 

найближчими один до одного, тобто значення|xi+1- xi|мінімально

10

до 12

дійсн.

Обчислити добуток Р негативних ел-тів з парними індексами, якіне

 

 

 

перевищ. заданого числа L, і поділити всі позитивні ел-ти на Р

11

до 17

цілий

Ввести масиві на його основі створити два нових масиви: перший з

 

 

 

ел-тів з непарними індексами, другий - з елементів, кратних 5

12

до 9

дійсн.

Ввести масиві число Р. Визначити елемент масиву, значення якого

 

 

 

найбільш близько до Р, тобто значення|xi+1- P| мінімально

13

до 15

цілий

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

 

 

 

спочатку за зростанням, а всінегативні - в кінціза спаданням

14

до 10

дійсн.

Ввести два масиви і визначити кількість неоднакових ел-тів в них

15

до 8

цілий

Ввести 2 масиви і замінити 0 ті ел-ти 1-го масиву, яких нема в 2-му

16

до 12

дійсн.

Обчислити суму Sнегативних елементів, які не перевищують заданого

 

 

 

числа L, і поділити останній позитивний елемент на S

17

до 20

цілий

Ввести масиві число K. Створити два нових масиви:перший-з

 

 

 

елементів, менших або рівних значеннюК, другий - з елементів,

 

 

 

більших ніж K, зберігаючи порядок їх розташування

18

до 18

дійсн.

Ввести масив, що містить багато нульових елементів. Замінити всі

 

 

 

групи підряд розташованих нулів на значеннякількості нулів

19

до 11

цілий

Обчислити суму Sпозитивних непарних елементіві замінити всі парні

 

 

 

елементи масиву на S

20

до 9

дійсн.

Ввести два масиви, визначити максимальні елементи кожного з них і

 

 

 

поміняти їх місцями

21

до 16

цілий

Ввести масиві на його основі створити новий з негативних і нульових

 

 

 

елементів з парними індексами

22

до 19

 

Ввести два масиви, визначити мінімальний елемент першого і

 

 

 

максимальний ел-т другого кожного з них і поміняти їх місцями

23

до 17

цілий

Ввести масиві на його основі створити два нових масиву: перший-з

 

 

 

парних елементів, другий - з елементів, кратних 3

24

до 8

дійсн.

Ввести два масиви і замінити 0 ті ел-ти 2-го масиву, які є в 1-му

 

 

 

 

25

до 7

цілий

Ввести два масиви і поміняти місцями максимальний елемент

 

 

 

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

26

до 18

дійсн.

Ввести масиві на його основі створити новий з позитивних елементів,

 

 

 

більших ніж середнє арифметичне всіх елементів

27

до 15

цілий

Ввести масиві число L. Побудувати новий масив з елементів, більших

 

 

 

ніж L, і упорядкувати новий масив по зростанню

28

до 10

дійсн.

Визначити пару сусідніх ел-тів масиву, значенняяких макс. різняться

 

 

 

один від одного, тобто значення |xi+1- xi| максимально

29

до 16

цілий

Ввести масив, що містить багато нульових елементів. Замінити всі

 

 

 

групи підряд розташованих нулів на один нуль

30

до 12

дійсн.

Ввести два масиви, визначити мінімальніелементи кожного з них і

 

 

 

поміняти їх місцями

 

 

 

- 99 -

Лабораторна робота № 8

Обробка двомірних масивів

Мета роботи: вивчити засоби використання багатовимірних масивів в програмах C++.

Теоретичні відомості

Багатовимірний масив оголошується в програмі таким чином:

тип ім'я [розмір 1] [розмір 2] ... [розмір n];

Кількість елементів масиву дорівнює добутку кількості елементів по кожному індексу. Наприклад, int А[4][5];

Оголошено двовимірний масив з 4-х рядків і 5-ти стовпців (20 елементів) масиву цілого типу:

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

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

float Mas [4][4]; // квадратна матриця 4x4 з 16-ти елементів дійсного типу, char В[5][10]; // двовимірний масив з 5x10=50 елементів символьного типу; double W[4][5][4]; // тривимірний масив з 4x5x4=100 дійсних елементів.

Задача 1 Скласти схему алгоритму і розробити проект для введення матриці дійсних чисел розмірністю 3x4 і знаходження середнього арифметичного максимального і мінімального елементів матриці.

На формі розташовані компоненти StringGrid1, Edit1, Button1, Button2, Button3, Label1 та Label2, а їх нові властивості вказано в таблиці 8.1.

Таблиця 8.1 – Властивості компонентів

Компоненти

Властивості

Нові значення

StringGrid1

ColCount

5

StringGrid1

RowCount

4

StringGrid1

Options.GoEditing

True

StringGrid1

Options.GoTabs

True

Button1

Caption

Решение

Button2

Caption

Очистка

Button3

Caption

Выход

- 100 -

Текст програми:

- 101 -

На формі розташовані компоненти StringGrid1, StringGrid2, BitBtn1, а їх нові властивості вказані в таблиці 8.2. Компонент BitBtn являє собою різновидність стандартної кнопки Button, але з можливістю виведення на кнопку, окрім напису, піктографічних зображень за допомогою властивостей

Kind або Glyph.

Задача 2 З елементів матриці розмірністю 4x7 цілих чисел обчислити вектор середніх арифметичних парних елементів непарних (1, 3, 5 і 7) стовпців матриці.

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

 

непарних стовпців матриці, за якими формується вектор, то виникає

 

необхідність у використанні додаткової змінної, наприклад k для індексів

 

вектора.

 

 

 

 

Таблиця 8.2 - Властивості компонентів

 

 

 

 

 

 

 

 

 

 

Компоненти

Властивості

Нові значення

 

 

 

StringGrid1

ColCount

7

 

Текст програми:

 

StringGrid1

RowCount

4

 

 

 

StringGrid1

FixedCols

0

 

 

 

StringGrid1

FixedRows

0

 

 

 

StringGrid1

Options.GoEditing

True

 

 

 

StringGrid1

Options.GoTabs

True

 

 

 

StringGrid1

Name

SG1

 

 

 

StringGrid2

ColCount

4

 

 

 

StringGrid2

RowCount

1

 

 

 

StringGrid2

FixedCols

0

 

 

 

StringGrid2

FixedRows

0

 

 

 

StringGrid2

Name

SG2

 

 

 

BitBtn1

Kind

bkOK

 

 

 

BitBtn1

Caption

Вектор

 

 

 

 

- 102 -

 

 

- 103 -

Задача 3 З елементів матриці розмірністю 4x7 дійсних чисел обчислити вектор добутків ненульових елементів парних (2, 4 і 6) стовпців матриці.

Оскільки при формуванні вектора його індекси не збігаються з індексами парних стовпців матриці, за якими формується вектор, то виникає необхідність у використанні додаткової змінної, наприклад k для індексів вектора.

На формі розташовані компоненти StringGrid1, StringGrid2, BitBtn1, а їх нові властивості вказані в табл. 8.3.

Таблиця 8.3 – Нові властивості компонентів

Компоненти

Властивості

Нові значення

StringGrid1

ColCount

7

StringGrid1

RowCount

4

StringGrid1

FixedCols

0

StringGrid1

FixedRows

0

StringGrid1

Options.GoEditing

True

StringGrid1

Options.GoTabs

True

StringGrid1

Name

SG1

StringGrid2

ColCount

3

StringGrid2

RowCount

1

StringGrid2

FixedCols

0

StringGrid2

FixedRows

0

StringGrid2

Name

SG2

BitBtn1

Kind

bkOK

BitBtn1

Caption

Вектор

Form1

Caption

Задача 3

Текст програми:

- 104 -

Контрольні запитання

1Як визначити розмірність масиву?

2Які з наведених нижче оголошень двовимірних масивів неправильні і

чому?

3Матриця цілих чисел складається з 3-х рядків і 5-тн стовпців. Напишіть

фрагмент програми для введення її елементів з компонента StringGrid.

4 Матриця цілих чисел складається з 3-х рядків і 2-х стовпців. Привласнити значення елементам масиву при оголошенні.

5 Для матриці дійсних чисел з 3-х рядків і 5-тн стовпців напишіть фрагмент програми для виведення на форму її елементів в компонент StringGrid.

Лабораторне завдання

1

Дати відповіді на контрольні запитання.

2

Скласти схеми алгоритмів, розробити проект форми і програми

алгоритмічною мовою С++ для виконання індивідуального завдання відповідно до варіанту з таблиць 8.4 ... 8.6. У проекті передбачити введення елементів матриці з клавіатури через компонент StringGrid (значення довільні) і виведення отриманих результатів на форму.

3 Оформити протокол лабораторної роботи і записати результати роботи проекту програми.

 

Таблиця 8.4 - Індивідуальні завдання середнього рівня складності

 

 

 

 

Індивідуальне завдання

вар.

 

 

 

1

 

У матриці дійсних чисел з 5-тн рядків і 4-х стовпців визначити

 

 

кількість позитивних, негативних і нульових елементів

2

 

У матриці цілих чисел розмірністю 4x5 визначити номер рядка, який

 

 

містить найбільший елемент

3

 

Визначити мінімальний елемент головної діагоналі квадратної матриці

 

 

розмірністю 5x5 і номер рядка, в якому він знаходиться

4

 

Поміняти місцями елементи першого рядка матриці дійсних чисел

 

 

розмірністю 4x4 і елементи її неголовної діагоналі

5

 

У матриці цілих чисел розмірністю 3x5 замінити негативні елементи

 

 

нулями

6

 

Визначити максимальний і мінімальний елементи матриці дійсних

 

 

чисел розмірністю 6x6 і поміняти їх місцями

7

 

Визначити найбільший елемент з числа негативних елементів парних

 

 

стовпців матриці цілих чисел розмірністю 4x6

8

 

Обчислити суму елементів неголовної діагоналі матриці 5x5 цілих

 

 

чисел

9

 

Для матриці цілих чисел розмірністю 5x5 отримати транспоновану

 

 

матрицю

 

- 105 -

10

Визначити номер стовпця матриці дійсних чисел розмірністю 3x6 з

 

найменшим елементом

 

11

Визначити мінімальний елемент неголовної діагоналі матриці цілих

 

чисел розмірністю 5x5 і номер стовпця, в якому він знаходиться

12

Обчислити вектор сум елементів рядків матриці цілих чисел

 

розмірністю 7x3

 

13

Замінити в непарних рядках матриці дійсних чисел розмірністю 7x4

 

негативні елементи нулями, а позитивні елементи - одиницями

14

Обчислити різницю сум елементів головної і неголовної діагоналей

 

матриці дійсних чисел розмірністю

5x5

15

У матриці дійсних чисел розмірністю 7x5 обчислити суму всіх

 

негативних елементів чотирьох рядків

16

У матриці цілих чисел розмірністю

4x5 замінити всі від'ємні елементи

 

нулями

 

17

Обчислити добуток мінімального елемента матриці цілих чисел

 

розмірністю 4x5 на його середнє арифметичне

18

У матриці цілих чисел розмірністю

6x4 обчислити середнє

 

арифметичне позитивних елементів

 

19

У матриці цілих чисел розмірністю

5x4 замінити в непарних рядках

 

позитивні елементи на 1, а в парних - негативні на -1

20

У матриці дійсних чисел розмірністю 6x3 обчислити добуток всіх

 

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

21

У матриці цілих чисел розмірністю

3x5 визначити кількість елементів,

 

менших ніж середнє арифметичне

 

22

У матриці дійсних чисел розмірністю 5x3 замінити всі елементи, які

 

перевищують 2.5, на -1

 

23

Обчислити вектор модулів сум елементів рядків матриці дійсних чисел

 

розмірністю 4x5

 

24

Визначити в матриці цілих чисел розмірністю 7x4 найменший елемент

 

з числа позитивних і найбільший з числа негативних і поміняти їх

 

місцями

 

25

Обчислити вектор елементів головної діагоналі матриці дійсних чисел

 

розмірністю 5x5

 

26

Обчислити вектор сум квадратів елементів стовпців матриці дійсних

 

чисел розмірністю 3x5

 

27

У матриці цілих чисел розмірністю

5x5 поміняти місцями елементи

 

головних і неголовних діагоналей

 

28

У матриці цілих чисел розмірністю

5x5 замінити всі парні елементи на

 

нулі

 

29

Обчислити різницю сум елементів першого рядка і останнього стовпця

 

матриці дійсних чисел розмірністю

4x6

30

Отримати вектор сум елементів головної і неголовної діагоналей

 

матриці дійсних чисел розмірністю

6x6

- 106 -

Таблиця 8.5 - Індивідуальні завдання високого рівня складності

 

 

Індивідуальне завдання

вар.

 

 

 

 

 

 

 

1

Отримати вектор сум елементів непарних стовпців матриці 3x7 цілих

 

чисел

 

 

 

 

2

Отримати

вектор

скалярних

добутків

рядків матриці дійсних чисел

 

розмірністю 4x4 на її останній стовпець

 

3

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

 

цілих чисел розмірністю 6x4

 

 

4

Отримати вектор скалярних добутків елементів першого рядка матриці

 

цілих чисел розмірністю 4x4 на стовпці цієї матриці

5

Визначити номер стовпця матриці дійсних чисел розмірністю 4x5 з

 

найменшою сумою елементів

 

 

6

Отримати вектор добутків елементів стовпців матриці цілих чисел

 

розмірністю 3x6

 

 

 

7

Обчислити

вектор

добутків

парних

елементів непарних стовпців

 

матриці цілих чисел розмірністю 4x5

 

8

Визначити номер рядка матриці цілих чисел розмірністю 4x5 з

 

найбільшою сумою елементів

 

 

9

Отримати вектор сум непарних елементів парних рядків матриці цілих

 

чисел розмірністю 6x6

 

 

10

Отримати вектор скалярних добутків елементів стовпців матриці

 

дійсних чисел розмірністю 3x3 на її головну діагональ

11

Сформувати вектор з найменших елементів стовпців матриці дійсних

 

чисел розмірністю 4x6

 

 

12

У матриці дійсних чисел розмірністю 7x3 визначити номер рядка з

 

найменшою сумою модулів елементів

 

13

Замінити елементи головної діагоналі матриці цілих чисел розмірністю

 

5x5 сумами елементів стовпців

 

 

14

Отримати вектор середньоарифметичних позитивних елементів парних

 

рядків матриці цілих чисел розмірністю 7x8

15

Сформувати вектор з найбільших елементів рядків матриці дійсних

 

чисел розмірністю 7x6

 

 

16

Замінити елементи неголовної діагоналі матриці цілих чисел

 

розмірністю 4x4 сумами елементів її рядків

17

Отримати вектор скалярних добутків рядків матриці цілих чисел

 

розмірністю 5x5 на її неголовну діагональ

18

Отримати вектор з рядка матриці, що містить найбільший елемент

 

матриці цілих чисел розмірністю 5x6

 

19

Замінити елементи головної діагоналі матриці цілих чисел розмірністю

 

6x6 сумою максимального і мінімального елементів матриці

20

Замінити елементи неголовної діагоналі матриці дійсних чисел

 

розмірністю 4x4 значенням мінімального елемента матриці

21

Замінити нульові елементи матриці дійсних чисел розмірністю 5x5 її

 

максимальним елементом

 

 

 

 

 

- 107 -

 

22

 

У матриці дійсних чисел розмірністю 7x3 поміняти місцями перший і

 

 

останній негативні елементи

23

 

Отримати вектор сум позитивних елементів рядків матриці цілих чисел

 

 

розмірністю 6x5. Упорядкувати отриманий вектор за зростанням

24

 

Серед рядків матриці цілих чисел розмірністю 5x4 знайти той, для

 

 

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

 

 

рядка вектор

 

25

 

Якщо в матриці дійсних чисел 6x4 сума позитивних чисел більше

 

 

модуля суми негативних, то замінити кутові елементи більшою з сум .

 

 

Інакше видати повідомлення

26

 

Отримати вектор скалярних добутків стовпців матриці дійсних чисел

 

 

розмірністю 4x4 на її неголовну діагональ

27

 

Сформувати вектор з найбільших елементів рядків матриці дійсних

 

 

чисел розмірністю 5x6

28

 

Сформувати вектор з середньоарифметичних елементів рядків матриці

 

 

дійсних чисел розмірністю 5x4

29

 

Отримати вектор середньоарифметичного першого і останнього

 

 

елементів парних рядків матриці цілих чисел розмірністю 7x8

30

 

Отримати вектор квадратів елементів мінімальних елементів непарних

 

 

стовпців матриці дійсних чисел розмірністю 6x5

 

Таблиця 8.6 - Індивідуальні завдання підвищеного рівня складності

 

 

 

 

 

 

Індивідуальне завдання

вар.

 

 

 

1

 

З заданої матриці

дійсних чисел розмірністю 5x7 отримати нову

 

 

матрицю, в якій кожен елемент обчислюється як напівсума

 

 

середньоарифметичних відповідних рядка і стовпця

2

 

У матриці дійсних чисел розмірністю 7x7 обчислити визначник

3

 

Отримати вектор максимальних елементів рядків матриці дійсних

 

 

чисел розмірністю 5x5

4

 

Отримати добуток матриці цілих чисел розмірністю 5x5 на її

 

 

транспоновану матрицю

5

 

У матриці дійсних чисел розмірністю 7x3 визначити номер рядка,

 

 

довжина якого (як вектор) максимальна

6

 

Сформувати вектор з рядка матриці дійсних чисел розмірністю 8x3,

 

 

найменш віддаленого від другого рядка, якщо відстань між рядками

 

 

обчислюється за формулою

7

 

Упорядкувати за зростанням (зліва направо) елементи всіх рядків

 

 

матриці дійсних чисел розмірністю 4x4, а потім по зростанню (зверху

 

 

вниз) - елементи всіх стовпців

8

 

Найменший по довжині рядок матриці дійсних чисел розмірністю 5x4

 

 

замінити на найбільший по довжині

9

 

Сформувати вектор

з рядка матриці дійсних чисел розмірністю 5x5,

 

 

 

- 108 -

 

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

 

першого рядка матриці до i-го взяти величину

10

Сформувати вектор з рядка матриці дійсних чисел розмірністю 6x4 з

 

найменшою сумою

.

11

Сформувати вектор з стовпця матриці дійсних чисел розмірністю 3x7 з

 

найбільшою вагою, де вага стовпця матриці обчислюється так:

 

 

12

Сформувати вектор із стовпця матриці дійсних чисел розмірністю 8x6 з

 

найбільшою сумою

 

13

Кожен негативний елемент матриці дійсних чисел розмірністю 4x8

 

замінити сумою позитивних елементів того рядка, в якому

 

розташований цей елемент

14

Сформувати вектор з стовпця матриці дійсних чисел розмірністю 6x8,

 

найменш віддаленого від першого, причому за відстань між стовпцем j

 

і першим вважати величину

15

Сформувати вектор з рядка матриці дійсних чисел розмірністю 5x3 з

 

найменшою вагою, а вагу рядка матриці вважати рівною

16

Ввести дві матриці дійсних чисел 4x5. Якщо максимальний елемент

 

першої матриці менше ніж максимальний елемент другої матриці, то

 

поміняти місцями рядки матриць, що містять максимальні елементи.

 

Інакше видати повідомлення

17

З матриці цілих чисел розмірністю 4x5 сформувати вектор позитивних

 

елементів

 

18

У матриці цілих чисел розмірністю 6x6 визначити мінімальний елемент

 

в секторі над головною діагоналлю і мінімальний елемент в секторі під

 

головною діагоналлю.

Найбільшим з цих значень замінити елементи

 

головної діагоналі

 

19

Матриця цілих чисел розмірністю 5x5 складається з чисел від 0 до 9.

 

Якщо кількість повторень елемента матриці збігається з самим

 

елементом, то замінити його на нуль

20

Сформувати вектор з рядка матриці цілих чисел розмірністю 7x5,

 

найбільш віддаленого від третього рядка

21

Сформувати вектор з матриці дійсних чисел розмірністю 3x6 з

 

найменшою величиною

22

Матриця цілих чисел розмірністю 3x5 складається з чисел від 0 до 9.

 

Визначити процентний вміст кожного з цих чисел у матриці

23

Матриця цілих чисел розмірністю 6x4 складається з чисел від 0 до 9.

 

Сформувати вектор довжиною 10, елементами якого будуть числа

 

 

- 109 -

повторів цих констант в матриці

24Сформувати вектор з найбільш віддаленого від (n - 1)-го стовпця матриці дійсних чисел розмірністю 6x5, причому за відстань вважати величину

25У матриці цілих чисел розмірністю 6x7 визначити рядок з мінімальною сумою і поміняти місцями цей рядок з першим

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

27Вивести координати елемента матриці дійсних чисел розм ірністю 5x7 з

найменшою вагою, а вага розраховувати за формулою

28Якщо в матриці дійсних чисел 4x5 сума позитивних чисел більше модуля суми негативних, то замінити кутові елементи середнім арифметичним елементів матриці. Інакше видати повідомлення

29Якщо в матриці цілих чисел 5x6 міститься парна кількість негативних чисел, то замінити будь-яку половину з цих чисел на нуль. Інакше замінити всі від'ємні елементи на значення їх кількості

30Вивести елемент матриці з найбільшою відстанню до діагоналі.

Відстань обчислюється по формулі

- 110 -

Лабораторна робота № 9

Вказівники та динамічне управління пам’яттю

Мета роботи: вивчити засоби організації роботи з вказівниками та динамічним розподілом пам’яті алгоритмічною мовою C++.

Теоретичні відомості

Оперативна пам'ять ПК являє собою сукупність комірок для зберігання інформації, кожна з яких має власний номер. Ці номери називаються адресами, вони дозволяють звертатися до будь-якого байту пам'яті. Існує два способи закріплення оперативної пам'яті за величинами, які будуть викор истовуватися в програмах. Зазвичай застосовують так званий статичний спосіб закріплення оперативної пам'яті. При використанні цього способу пам'ять для кожної величини залишається зайнятою нею протягом всього часу роботи програми. При такому способі при оголошенні масиву треба враховувати максимально можливу кількість його елементів. А це призводить до нееф ективного використання пам'яті.

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

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

Вказівник - змінна, яка вказує на іншу змінну (містить місцеположення іншої змінної у формі адреси). У цьому сенсі ім'я змінної "відсилає" до її значення безпосередньо, а вказівник - непрямо. Посилання на значення вказівника називається непрямою адресацією.

Формат оголошення вказівника:

тип_даних *ім’я_вказівника

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

Приклади:

char *mes; // оголошується змінна-вказівник mes на величину типу char int (*p2)[10]; // оголошено вказівник р2 на масив з 10 елементів типу int

У С++Builder вказівники використовуються дуже широко. Зокрема, всі компоненти, форми і т. д. оголошуються саме як вказівники на відповідний об'єкт.

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

- 111 -

Операція адресації "&" (амперсанд) присвоює вказівнику адресу деякої змінної. Операцію "&" також часто використовують для передачі в функції параметрів за посиланням.

Операції розадресаціі (або розіменування, або непрямої адресації) (*) застосовується для звернення до змінної за вказівником, тобто для того, щоб отримати значення, на яке вказує вказівник, наприклад:

double у, *py =&у; // оголошеному вказівнику py привласнюється адреса у *py = 7.5; // еквівалентно у = 7.5

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

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

Приклад 1:

int і = 4, j; float x [15]; float * px;

 

 

 

px = &x [4]+i;

// px=адресі x[8]

елемента масиву

 

j = &x[i] - &x[i-2]; / / j = адреса x[4] - адреса x[2] = 2

Приклад 2:

int *ptr, a[10];

 

 

 

 

ptr = &a[5];

 

 

 

 

ptr++;

/* дорівнює адресі елемента а[6]

*/

 

ptr--;

/* дорівнює адресі елемента а [5]

*/

Значення

двох вказівників

на однакові

типи можна порівнювати в

операціях ==, !=, <, <=, >, >=. При цьому значення вказівників розглядаються просто як цілі числа, а результат порівняння дорівнює 0 (брехня) або 1 (істина). Порівняння покажчиків на рівність істинно, якщо вони посилаються на одну і ту ж адресу в пам'яті.

Приклад: int *ptr1, *ptr2, a[10]; ptr1 = a+5;

ptr2 = a+7;

if (ptr1>ptr2) a[3] = 4;

У цьому прикладі значення ptr1 менше значення ptr2 і тому оператор а[3]=4 не буде виконаний.

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

void sum(int *а, int *b); / / Заголовок функції

{*а += *b; } / / Зміна значення параметра

……………..

int х = 5, у = 10;

- 112 -

sum (&x, &у); // Виклик функції

Масиви та вказівники в С++ тісно пов'язані і можуть використовуватися майже еквівалентно. Наприклад, коли оголошується масив у вигляді int mass[25], то цим визначається виділення пам'яті не тільки для двадцяти п'яти елементів масиву, але і для вказівника з ім'ям mass, значення якого дорівнює адресі першого за рахунком (нульового) елемента масиву, тобто сам масив залишається безіменним, а доступ до елементів масиву здійснюється через вказівник з ім'ям mass. Оскільки ім'я масиву є вказівником, припустимо, наприклад, таке присвоєння:

int mass[25], *ptr = mass;

Тут вказівник ptr встановлюється на адресу першого елемента масиву, причому присвоювання ptr = mass можна записати в еквівалентній формі ptr=&mass[0]. Для того щоб отримати значення 16-го елемента масиву mass, можна записати mass[16] або *(mass +16). Результат один і той же. При реалізації на комп'ютері перший спосіб приводиться до другого, тобто індексний вираз перетвориться до адресного. Таким чином, операції над вказівниками обробляються швидше, тому, якщо елементи масиву обробляються по порядку, то вигідніше використовувати другий спосіб. Якщо ж вибір елементів випадковий, то, щоб уникнути помилок, краще перший спосіб. Крім того, перший спосіб більш наочний, що сприяє кращому читанню програм.

Для доступу до початкового елементу масиву (тобто до елементу з нульовим індексом) можна використовувати просто значення покажчика mass або ptr. Будь-яке з шести присвоювань

* mass = 2;

mass[0]

= 2;

*(mass +0)

= 2;

* Ptr = 2;

ptr[0] = 2;

*(ptr +0) = 2;

присвоює початковому елементу масиву значення 2, але швидше за все виконаються присвоювання * mas s = 2 і * ptr = 2, так як в них не потрібно виконувати операції додавання.

Вказівники на багатовимірні масиви в мові С++ - це масиви масивів, тобто такі масиви, елементами яких є масиви. При розміщенні елементи багатовимірних масивів розташовуються в пам'яті підряд по рядках, тобто швидше за все змінюється останній індекс, а повільніше - перший. Наприклад, для двовимірного масиву int matr[4,3]; звернення *(matr) посилається на елемент matr[0][0], звернення *(matr +2) - до елементу matr [0][2], звернення * (matr+2*3+1) – до елементу масиву matr [2][1]. Тобто, використовуючи оператори циклу, можна організувати почергове звернення до елементів цієї матриці, наприклад для введення всієї матриці з StringGrid1:

Задача 1 Ввести масив з 7-ми цілих чисел та визначити суму непарних елементів.

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

- 113 -

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

Задача 3 Ввести матрицю цілих чисел з 5-ти рядків та 4-хстовпців. Обчислити вектор сум мінімального та максимального елементів кожного стовпця.

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

- 114 -

Деякі функції для виділення і звільнення пам'яті:

malloc(s); - виділяє блок оперативної пам'яті довжиною s байт і повертає вказівник на цей блок пам'яті. При невдалому завершенні повертається значення

NULL;

calloc (n, m); - виділяє блок оперативної пам'яті для розміщення n елементів по m байт кожен і повертає вказівник на початок цієї області пам'яті. При невдалому завершенні повертається значення NULL;

free (p); - звільняє раніше виділений блок оперативної пам'яті, на який посилається вказівник р. Ця область стає вільною для подальшого використання в інших цілях, а вказівник р - невизначеним (NULL), тобто ні на що не посилається;

realloc (bl, ns); - змінити розмір раніше виділеної пам'яті з адресою початку bl на ns байт.

При динамічному розподілі пам'яті для масивів слід описати відповідний вказівник і привласнювати йому значення за допомогою функцій malloc або calloc. Два аналогічних приклади виділення пам’яті під одномірний масив a[10] з елементів типу:

Приклади створення двовимірного масиву a[n][m]:

Аналогічним чином можна розподілити пам'ять і для тривимірних масивів. Дня ілюстрування роботи функції realloc наведемо приклад зміни розміру раніше виділеної пам'яті під одновимірний масив з 10-ти дійсних елементів до 20-ти елементів:

а = (float *) realloc (a, 20);

Слід тільки пам'ятати, що непотрібну для подальшого виконання програми пам'ять слід звільняти за допомогою функції free, наприклад: free(a);

Використання вказівників спільно з вищеназваними функціями дасть можливість управляти розподілом динамічної пам'яті.

Задача 4 Розробити програму для введення елементів вектора до 10-ти цілих чисел і замінити в ньому всі парні елементи значенням максимального елемента.

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

- 115 -

Задача 5 Розробити програму для введення елементів матриці дійсних чисел розмірністю з 5-ти рядків та 5-ти стовпців і обчислення вектору скалярних добутків стовпців матриці на її неголовну діагональ.

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

Задача 6 Розробити програму для введення елементів матриці дійсних чисел розмірністю з 5-ти рядків і 3-х стовпців і обчислення процентного вмісту в ній позитивних, негативних та нульових елементів.

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

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

- 116 -

Контрольні запитання

1Яке призначення динамічного розподілу пам'яті?

2Що називають вказівником в програмуванні?

3Що називають операціями адресації і розадресації?

4Перелічіть відомі Вам операції над вказівниками.

5Яке значення змінної Q буде після виконання блоку операторів:

6Назвіть відомі Вам функції для роботи з динамічним розподілом пам'яті.

Лабораторне завдання

1Дати відповіді на контрольні запитання.

2Вказівники. Скласти схеми алгоритмів, розробити проект форми і

програми для виконання індивідуальних завдань, які вибираються з таблиць попередніх лабораторних робіт №7, №8, згідно рівню складності за вказівкою викладача. У проекті передбачити введення вихідних даних з клавіатури і виведення отриманих результатів на форму в компоненти в головній програмі, а обробку даних, тобто всі обчислення, організувати у функціях з використанням вказівників. Тобто завдання полягає в переробці вже існуючих проектів обробки одновимірних і двовимірних масивів таким чином, щоб у головній програмі залишилися оператори введення/виведення даних, а всі обчислення з виконання індивідуального завдання організувати у функціях з використанням вказівників.

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

- 117 -