§ 14. Пераўтварэнне элементаў масіву
Сайт: | Профильное обучение |
Курс: | Інфарматыка. 10 клас (Павышаны ўзровень) |
Книга: | § 14. Пераўтварэнне элементаў масіву |
Напечатано:: | Гость |
Дата: | Вторник, 7 Май 2024, 03:14 |
14.1. Асноўныя задачы
Сярод задач пераўтварэння элементаў масіву можна вылучыць задачы наступных тыпаў: 1. Змяненне элементаў масіву ў залежнасці ад умоў. Разгледзім падрабязней кожную з задач. |
Некаторыя з задач пераўтварэння масіваў сустракаюцца вельмі часта. Таму ў клас vector былі дабаўлены функцыі, якія дазваляюць ператвараць масівы. Шмат якія з функцый для пераўтварэння вектараў аналагічныя функцыям пераўтварэння радкоў як па сінтаксісе, так і выконваемым дзеянні. Спіс функцый можна паглядзець у Дадатку да главы 1. |
14.2. Змяненне элементаў масіву ў залежнасці ад умоў
Прыклад 14.1. Зададзены аднамерны масіў цэлых лікаў. Пераўтварыць яго элементы па наступным правіле: дадатныя элементы замяніць значэннем 2, а адмоўныя — павялічыць на 5. Этапы выканання задання I. Зыходныя даныя: аднамерны масіў а, колькасць элементаў n. II. Вынік: пераўтвораны масіў a. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. |
Прыклад 14.1. V. Праграма:
VI. Тэсціраванне. VII. Аналіз вынікаў. Элементы 3 і 5 заменены на 2, элементы —2 і —1 павялічаны на 5, элемент 0 застаўся нязменным, што адпавядае ўмове задачы.. |
14.3. Абмен месцамі элементаў у масіве
Для абмену месцамі двух элементаў масіву можна выкарыстоўваць дадатковую пераменную, якую называюць буферам. Буферу прысвойваюць значэнне аднаго з элементаў масіву, гэтаму элементу прысвойваюць значэнне іншага элемента масіву, затым другому элементу прысвойваюць значэнне буфера. buf := a[i]; a[i] := a[k]; a[k] := buf; Для абмену элементаў можна выкарыстоўваць убудаваную функцыю swap: swap(a[i], a[k]). Прыклад 14.2. Зададзены аднамерны масіў цэлых лікаў. Памяняць месцамі максімальны і мінімальны элементы масіву. Мяркуецца, што кожны з іх сустракаецца ў масіве толькі адзін раз. Этапы выканання задання I. Зыходныя даныя: аднамерны масіў а, колькасць элементаў n. II. Вынік: пераўтвораны масіў a. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. IV. Апісанне пераменных: n, n_min, n_max – int, а – vector <int>. Прыклад 14.3. Зададзены аднамерны масіў цэлых лікаў. Цыклічна зрушыць усе элементы масіву ўлева на 1, першы на апошняе месца. Напрыклад, масіў 1 2 3 4 5 будзе ператвораны ў 2 3 4 5 1. Этапы выканання задання I. Зыходныя даныя: аднамерны масіў а, колькасць элементаў n. II. Вынік: пераўтвораны масіў a. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. IV. Апісанне пераменных: n – int, а – vector <int>. Рашэннем задачы 14.3 можа быць таксама наступны алгарытм (прыклад 14.4): 1. Захаваем значэнне першага элемента ў буфернай пераменнай. Калі ў масіў дабавіць яшчэ адзін элемент у канцы, то яго можна выкарыстоўваць у якасці буфернай пераменнай. У гэтым выпадку ў цыкле трэба будзе зрабіць на 1 зрух больш. Затым выдаліць апошні элемент. Выдаліць апошні элемент можна з дапамогай каманды pop_back(). Фрагменты праграм у прыкладзе 14.5 паказваюць, як можна цыклічна зрушыць элементы масіву на 1 управа (апошні на першае месца). |
Ажыццявім абмен элементаў наступным чынам: a[i] = a[k]; a[k] = a[i]; Тады мы страцім значэнне элемента, які стаіць першапачаткова на месцы a[i], і атрымаем два элементы са значэннем, роўным a[k]. Прыклад 14.2. V. Праграма:
VI. Тэсціраванне. Прыклад 14.3. V. Праграма:
VI. Тэсціраванне. Прыклад 14.4. V. Праграма:
Прыклад 14.5. Цыклічны зрух управа на 1. Фрагменты праграм:
|
14.4. Паняцце ітэратара
Ітэратар — абагульнены паказальнік [1], які дазваляе карыстальніку перабіраць без неабходнасці ведаць, як рэалізаваны сам кантэйнер. Вектар з’яўляецца кантэйнерам, у якім рэалізаваны паслядоўны доступ да элементаў, ітэратар дазваляе абысці ўсе элементы вектара, перамяшчэнне адбываецца элемент за элементам. Ітэратары дазваляюць звяртацца да элементаў вектара без выкарыстання індэксаў. Для вектара вызначаны стандартныя ітэратары begin() і end(). Итэратар begin() паказвае на першы элемент у вектары. Ітэратар end() — на месца пасля апошняга элемента вектара. Для любога ітэратара (it) даступныя наступныя аперацыі (прыклад 14.6):
Для вектара ітэратар забяспечвае дадатковую функцыянальнасць:
Пачынаючы са стандарта C++11, абход вектара з дапамогай vector <int> a(n); for (auto i: a) cout << i << " "; [1] Паказальнік — пераменная, якая абазначае адрас памяці. Паказальнік прызначаны для прамога звароту па адрасе памяці да аб’екта, які размешчаны па гэтым адрасе. |
Для вектара вызначаны таксама рэверсіўныя (адваротныя) ітэратары, якія дазваляюць перабіраць элементы кантэйнера ў адваротным напрамку. Для атрымання рэверсіўнага ітэратара ўжываюцца функцыі rbegin() і rend(). Итэратар rbegin()паказвае на канец бягучага вектара, а ітэратар rend() — на пачатак вектара. Прыклад 14.6. Аперацыі з ітэратарам
Разгледзім аперацыю:
Ітэратар it паказвае на пачатак вектара. Значэнне пераменнай x — значэнне элемента вектара, на які паказвае ітэратар. Будзе выведзена значэнне 1.
Ітэратар зрушыўся на адзін элемент і цяпер паказвае на элемент з індэксам 1, будзе выведзена значэнне 2.
Ітэратар зрушыўся на 3 элементы ад пачатку і паказвае на элемент з індэксам 3, будзе выведзена значэнне 5.
Пасля папярэдняй аперацыі ітэратар паказвае на элемент з індэксам 3, таму будзе выведзена false.
Будуць выведзены значэнні 3 і 5. Значэнне 5 — колькасць элементаў у вектары. Цыклу foreach адпавядае наступны запіс цыкла for:
або
|
14.5. Выдаленне элемента з масіву
Для выдалення з масіву элемента, які стаіць на месцы k, трэба зрушыць на адну пазіцыю ўлева ўсе элементы, якія стаяць пасля яго. Колькасць элементаў пры гэтым памяншаецца на 1. Гэтыя дзеянні рэалізаваны ў функцыі erase, якая належыць класу vector. Даступныя два варыянты выкліку гэтай функцыі:
Параметрамі функцыі erase з’яўляюцца ітэратары. Калі трэба выдаліць, напрыклад, пяты элемент, то параметр функцыі можа быць запісаны так: a.begin() + 5. Прыклад 14.7. Зададзены аднамерны масіў цэлых лікаў. Выдаліць з яго ўсе лікі, кратныя 5. Колькі лікаў выдалілі? Этапы выканання задання I. Зыходныя даныя: аднамерны масіў а, колькасць элементаў n. II. Вынік: пераўтвораны масіў a і колькасць выдаленых лікаў k. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. IV. Апісанне пераменных: n, k – int, а – vector <int>. Паколькі элементы пры выдаленні зрушваюцца ўлева, абыходзіць масіў можна з канца (прыклад 14.8). |
Прыклад 14.7. V. Праграма:
VI. Тэсціраванне. VII. Аналіз вынікаў. Элементы 5, 15, 35, 10 і 30 кратныя 5, таму іх выдалілі з масіву. Элементы 3 і 4 не кратныя 5, таму яны засталіся ў масіве і зрушыліся ў пачатак. Прыклад 14.8. Фрагмент праграмы:
Лічыльнік k можна не выкарыстоўваць, колькасць выдаленых элементаў можна знайсці як рознасць паміж пачатковай колькасцю элементаў n і даўжынёй вектара пасля выдалення элементаў: n – a.size(). |
14.6. Устаўка элемента ў масіў
Для ўстаўкі элемента на месца k неабходна вызваліць гэта месца ў масіве. Для гэтага трэба зрушыць на адну пазіцыю ўправа ўсе элементы масіву, якія стаяць пасля k - 1. Зрух пачынаем з апошняга элемента. Колькасць элементаў у масіве павялічыцца на 1. Гэтыя дзеянні рэалізаваны ў функцыі insert. Маюцца наступныя магчымасці выкліку функцыі insert:
Параметры pos, first, last з’яўляюцца ітэратарамі. Прыклад 14.9. Зададзены масіў цэлых лікаў. Уставіць лік x а k-е месца, калі элемент a[k] кратны x. Этапы выканання задання I. Зыходныя даныя: аднамерны масіў а, колькасць элементаў n, лік, які трэба ўставіць у масіў x. II. Вынік: пераўтвораны масіў a. III. Алгарытм рашэння задачы. 1. Увод зыходных даных. |
Прыклад 14.9. V. Праграма:
VI. Тэсціраванне. VI. Аналіз вынікаў. Лік 5 устаўлены перад значэннямі 10, 15, 30, 20, 45. У праграме выкарыстоўваецца абход масіву з канца. Калі ў праграме запісаць такі цыкл:
|
Пытанні да параграфу
1. Якія тыпы задач пераўтварэння масіваў вы можаце назваць? 2. Як можна памяняць месцамі два элементы ў масіве? 3. Як выдаліць элемент з масіву? 4. Як уставіць элемент у масіў? |
Практыкаванні
1. Ці можна ў прыкладзе 14.1 замяніць каманды пад № 1 камандамі пад № 2?
1. if (a[i] > 0)
a[i] = 2;
if (a[i] < 0)
a[i] += 5 ;
2. if (a[i] < 0)
a[i] += 5 ;
if (a[i] > 0)
a[i] = 2;
У якіх выпадках праграма будзе даваць няправільны вынік?
2. Зададзены аднамерны масіў. Пераўтварыце яго элементы па наступным правіле: з усіх дадатных элементаў адняць элемент з нумарам k, да ўсіх адмоўных дадаць уведзены лік x. Нулявыя элементы пакіньце без змянення.
3. Зададзены аднамерны масіў з цотнай колькасці элементаў. Памяняйце месцамі яго «паловы»: 1 2 3 4 5 6 → 4 5 6 1 2 3.
4. У масіве запісана інфармацыя пра навучэнцаў класа (прозвішча і імя). З класа выбылі два навучэнцы. Вядомыя нумары гэтых навучэнцаў. Выключыце іх даныя з масіву.
5. Перастаўце першы элемент масіву на апошняе месца, другі — на першае, трэці — на другое і г. д. 1 2 3 4 5 6 → 6 5 4 3 2 1.
6. Выканайце цыклічныя зрухі элементаў у масіве.
1. На два элементы ўправа 1 2 3 4 5 6 → 5 6 1 2 3 4.
2. На два элементы ўлева 1 2 3 4 5 6 → 3 4 5 6 1 2.
3. На k элементаў управа. Лік k уводзіцца.
4. На k элементаў улева. Лік k уводзіцца.
7. Разбіць элементы масіву на групы по 4. У кожнай чацвёрцы выканаць цыклічны зрух улева на 1. Першы на 4-е месца. Калі колькасць элементаў у масіве не кратная 4, то для апошняй групы зрух ажыццяўляецца для той колькасці элементаў, якая засталася.
8. Выдаліць з масіву ўсе адмоўныя элементы. Вывесці пераўтвораны масіў.
9. Выдаліць з масіву ўсе элементы, якія з’яўляюцца поўнымі квадратамі (напрыклад, 9, 25, 64).
10. Выдаліць з масіву ўсе элементы, якія з’яўляюцца ступенню 2.
11. Зададзены лінейны масіў, элементамі якога з’яўляюцца словы. Выдаліце з яго названыя словы.
1. Словы, якія пачынаюцца на зычную літару.
2. Словы, у якіх менш за 5 зычных.
3. Словы, якія з’яўляюцца паліндромамі.
12. Уставіць элемент x у пазіцыю x. Калі x ≤ 0 або x ≥ n, уставіць яго на першае або апошняе месца адпаведна.
13. Прачытайце лікі з файла ў масіў. Калі два суседнія лікі маюць розныя знакі (адзін дадатны, а другі адмоўны), устаўце паміж імі лік 0. Запішыце атрыманы масіў у файл.