§ 15. Двухмерныя масівы
Сайт: | Профильное обучение |
Курс: | Інфарматыка. 10 клас (Павышаны ўзровень) |
Книга: | § 15. Двухмерныя масівы |
Напечатано:: | Гость |
Дата: | Среда, 8 Май 2024, 04:29 |
15.1. Апісанне двухмернага масіву
Колькасць індэксаў, па якіх звяртаюцца да элемента ў масіве, вызначае размернасць масіву. Акрамя аднамерных, могуць выкарыстоўвацца двухмерныя, трохмерныя і іншыя масівы. Двухмерны масіў — масіў, элементамі якога з’яўляюцца аднамерныя масівы. Яго можна выявіць як табліцу з данымі, у якой кожны радок — лінейны масіў. Зварот да элемента ажыццяўляецца па двух індэксах: a[3][5] — элемент, змешчаны ў радку, які мае індэкс тры, і слупку з індэксам пяць. Прыкладам выкарыстання двухмернага масіву з’яўляецца ліст электроннай табліцы. Двухмерны масіў апісваюць наступным чынам: vector <vector <тып элементаў>> імя_масіву Структура апісання здаецца дастаткова складанай, аднак яна цалкам адлюстроўвае сутнасць: двухмерны вектар — лінейны вектар, элементамі якога з’яўляюцца лінейныя вектары. Другі параметр у круглых дужках паказвае, якім значэннем трэба запоўніць кожны радок. У прыкладзе 15.1 паказана, як можна апісваць двухмерныя вектары. Па аналагічнай схеме можна апісваць масівы вялікіх размернасцяў. |
Шматмерныя масівы выкарыстоўваюцца ў вылічальнай матэматыцы. Пры мадэліраванні аб’ектаў, працэсаў і з’яў шматмерныя масівы дазваляюць захоўваць параметры мадэлі і дыяпазоны іх змянення. Для шматмерных масіваў выкарыстоўваюць наступныя назвы: аднамерны масіў — вектар, двухмерны масіў — матрыца (прамавугольная табліца), трохмерны масіў — куб (набор аднатыпных табліц). Для вызначэння шматмернага масіву большай размернасці выкарыстоўваюць паняцце тэнзар. Чатырохмерны, пяцімерны, шматмерны масіў — тэнзар. Прыклад 15.1. Апісанне двухмерных масіваў. Апісанне двухмернага масіву цэлых лікаў з 10 радкоў і 10 слупкоў. vector <vector <int>> d(10, vector <int> (10)); Апісанне двухмернага масіву, памеры якога ўводзяць з клавіятуры:
Выкарыстанне typedef (вызначэнне тыпу) для апісання двухмернага масіву:
|
15.2. Фарміраванне двухмерных масіваў
Значэнні элементаў двухмернага масіву можна задаваць тымі ж спосабамі, што і элементаў аднамернага масіву. Канстантныя значэнні элементам масіву можна задаць пры апісанні, запісаўшы іх у фігурныя дужкі (прыклад 15.2). Колькасць радкоў і слупкоў пры гэтым не паказваюць, памеры вызначаюцца аўтаматычна. Даныя ў масіў могуць быць прачытаны з клавіятуры (прыклад 15.3) ці з файла. Задаваць значэнні элементам можна выпадковым чынам (прыклад 15.4). Для таго каб звярнуцца да кожнага элемента двухмернага масіву, неабходна два ўкладзеныя цыклы: першы будзе па чарзе фіксаваць нумар радка, а другі перабіраць усе элементы дадзенага радка. Выводзяць элементы двухмернага масіву ў выглядзе табліцы, пераводзячы курсор пасля вываду чарговага радка (вывад элементаў рэалізаваны пры атрыманні выпадковых значэнняў у прыкладзе 15.4). Калі ў масіве ёсць лікі з рознай колькасцю лічбаў, то ў якасці раздзяляльніка паміж элементамі ў адным радку можна выкарыстоўваць сімвал табуляцыі (пыклад 15.5) ці задаць шырыню для вываду значэння з дапамогай каманды setw (прыклад 15.6) Прыклад 15.7. Зададзены лік n. Сфарміраваць двухмерны масіў з n радкоў і n слупкоў, які выглядае наступным чынам: Этапы выканання задання I. Зыходныя даныя: лік n. II. Вынік: двухмерны масіў d. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. 2.1. Пры апісанні ўсе элементы роўныя 0. 3. Вывад выніку. IV. Апісанне пераменных:n – int, d – vector<vector <int>>. |
Прыклад 15.2. Канстантныя значэнні ў двухмерным масіве:
Прыклад 15.3. Увод элементаў з клавіятуры:
Прыклад 15.4. Выпадковыя значэнні [—5, 5]:
Прыклад 15.5. Вывад элементаў праз табуляцыю:
Прыклад 15.6. Вывад элементаў з устаноўкай шырыні друку:
Вынік вываду з прыкладаў 15.5 і 15.6. Прыклад 15.7. V. Праграма:
VI. Тэсціраванне. |
15.3. Апрацоўка двухмерных масіваў
Апрацоўка двухмерных масіваў дазваляе атрымаць якія-небудзь вынікі шляхам аналізу даных у масіве. Сам масіў пры гэтым не змяняецца. Задачы пошуку элементаў, якія задавальняюць умову, падліку сумы, пошуку максімальнага і інш. шмат у чым рашаюцца аналагічна таму, як гэта адбывалася для лінейных масіваў. Прыклад 15.8. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Палічыць суму тых элементаў масіву, у якіх сума квадратаў нумара радка і нумара слупка роўная зададзенаму ліку x. Этапы выканання задання I. Зыходныя даныя: пераменныя m і n (колькасць радкоў і слупкоў у масіве), d — двухмерны масіў, x (лік). II. Вынік: пераменная s (сума шуканых элементаў). III. Алгарытм рашэння задачы.. 1. Увод зыходных даных. Масіў уводзіцца паэлементна. IV. Апісанне пераменных: n, x, s – int, d – vector<vector <int>> Прыклад 15.9. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Вызначыць, ці ёсць у масіве хоць бы адзін элемент, кратны x. Калі так, то вывесці індэксы яго месцазнаходжання. Этапы выканання задання I. Зыходныя даныя: пераменныя m і n (колькасць радкоў і слупкоў у масіве), d — двухмерны масіў, x (лік). II. Вынік: пераменныя r, с (нумары радка і слупка, у якіх знойдзены элемент) або паведамленне «не знойдзены». III. Алгарытм рашэння задач. 1. Увод зыходных даных. Масіў запаўняецца выпадковымі лікамі. IV. Апісанне пераменных: n, x, r, c – int, d – vector<vector <int>> Калі ў масіве некалькі элементаў, якія задавальняюць умову задачы, то будзе выведзены апошні знойдзены элемент. Калі патрэбны першы элемент, то можна ўвесці дадатковую пераменную-флаг, якая будзе роўная true, пакуль значэнні r і c не змяніліся. Пасля іх змянення яна стане false і значэнні r і c больш змяняцца не будуць (прыклад 15.10). Прыклад 15.11. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Знайсці мінімальны і максімальны элементы і вывесці індэксы іх месцазнаходжання. Этапы выканання задання I. Зыходныя даныя: пераменныя m і n — колькасць радкоў і слупкоў у масіве, d — двухмерны масіў, x — лік. II. Вынік: пераменныя r_min, c_min, r_max, c_max — нумары радка і слупка, у якіх знойдзены элемент. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. Масіў запаўняецца выпадковымі лікамі. IV. Апісанне пераменных: n, m, n_min, c_min, r_max, c_max – int, d – vector<vector <int>> Калі ў масіве некалькі элементаў, роўных максімальнаму (мінімальнаму), то будзе выводзіцца месцазнаходжанне першага з такіх элементаў. Калі трэба атрымаць месцазнаходжанне апошняга, то дастаткова замяніць знак «>» («<») на «>=» («<=»). |
Прыклад 15.8. V. Праграма:
VI. Тэсціраванне. VII. Аналіз вынікаў. Будуць падсумаваны элементы, якія маюць нумары [1][2] і [2][1] (яны вылучаны). У матэматыцы для матрыцы вызначаны паняцці галоўная дыяганаль і пабочная дыяганаль. На галоўнай дыяганалі знаходзяцца элементы матрыцы d[i][j], для якіх правільная ўмова i = j. Для элементаў пабочнай дыяганалі: i + j = n – 1 (n — число столбцов, нумерация с 0). Прыклад 15.9. V. Праграма:
VI. Тэсціраванне. Прыклад 15.10. Фрагмент праграмы:
Прыклад 15.11. V. Праграма:
VI. Тэсціраванне. |
15.4. Пераўтварэнне двухмерных масіваў
Сярод задач пераўтварэння двухмернага масіву можна вылучыць наступныя:
Рашэнне гэтых задач шмат у чым аналагічна рашэнню адпаведных задач для лінейнага масіву. Прыклад 15.12. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Памяняць радкі ў матрыцы: першы з апошнім, другі з перадапошнім і г. д. Напрыклад: Этапы выканання задання I. Зыходныя даныя: пераменныя m і n — колькасць радкоў і слупкоў у масіве, d — двухмерны масіў. II. Вынік: пераўтвораны масіў. III. Алгарытм рашэння задачы. 1. Увод зыходных даных (з файла). IV. Апісанне пераменных: n, m – int, d – vector<vector <int>> Прыклад 15.13. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Выдаліць у ім слупкі з нумарамі ад k1 да k2. Этапы выканання задання I. Зыходныя даныя: пераменныя m і n — (колькасць радкоў і слупкоў у масіве), d — двухмерны масіў, k1 і k2 — нумары слупкоў. II. Вынік: пераўтвораны масіў. III. Алгарытм рашэння задачы. 1. Увод зыходных даных (з файла). |
Пры захоўванні двухмернага вектара ў памяці камп’ютара яго радкі запісваюцца паслядоўна, адзін за адным. Такое захоўванне не дазваляе ў яўным выглядзе вылучыць слупок матрыцы. Калі ўзнікае неабходнасць апрацоўкі двухмернага масіву «па слупках», то можна ствараць і выкарыстоўваць транспаніраваную [1] матрыцу.
VI. Тэсціраванне. Прыклад 15.13. V. Праграма:
VI. Тэсціраванне. [1] Транспаніраванне матрыцы — аперацыя над матрыцай, калі яе слупкі становяцца радкамі з тымі ж нумарамі. |
Пытанні да параграфу
1. Што такое размернасць масіву? 2. Як апісваецца двухмерны масіў? 3. Як знайсці мінімальны (максімальны) элемент у двухмерным масіве? 4. Якія аперацыі пераўтварэння двухмернага масіву вы можаце назваць? |
Практыкаванні
1. Сфарміраваць двухмерныя масівы з n радкоў і n слупкоў, якія выглядаюць наступным чынам:
1. | 2. | ||
3. | 4. |
2. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Знайдзіце сумы тых элементаў з масіву, якія задавальняюць наступныя умовы.
- Рознасць нумара радка і нумара слупка роўна 1.
- Модуль рознасці нумара радка і нумара слупка роўны ліку x.
- Кратны ліку х.
- Размешчаны ніжэй за галоўную дыяганаль.
- Размешчаны вышэй за пабочную дыяганаль.
3. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Вызначыць, ці ёсць у масіве хоць бы адзін элемент, які задавальняе ўмову. Калі так, то вывесці індэксы яго месцазнаходжання.
- Роўны пяці элемент.
- Элемент, які з’яўляецца адмоўным лікам.
- Элемент, які дзеліцца на 3 і на 5.
- Элемент, які пры дзяленні на 3 і на 5 дае няцотныя астачы.
4. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Неабходна выканаць названыя дзеянні.
- Вывесці нумар радка, які змяшчае мінімальны элемент.
- Вывесці нумар слупка, які змяшчае максімальны элемент.
- Вывесці нумары ўсіх радкоў, у якіх ёсць элемент, роўны мінімальнаму.
- Вывесці нумары ўсіх слупкоў, у якіх ёсць элемент, роўны максімальнаму..
5. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Ажыццявіць абмены.
- Слупкі 0 (m – 1), 1 (m – 2), ... (першы з апошнім, другі з перадапошнім...).
- Радкі 0 1, 1 2, ..., (m – 1) 0 (цыклічна ўніз на адзін).
- Слупкі 1 0, 2 1, ... 0 (n – 1) (цыклічна ўлева на адзін).
- Радкі 2 0, 3 1, 4 2, ... (цыклічна ўверх на два).
6. Зададзены двухмерны масіў d з m радкоў і n слупкоў. Выдаліць названыя элементы.
- Радкі, у якіх ёсць лікі, што з’яўляюцца поўнымі квадратамі.
- Радкі, нумары якіх з’яўляюцца ступенню двойкі.
- Слупкі з нумарамі, кратнымі тром.
- Слупкі, у якіх ёсць простыя лікі.