§ 9. Радковыя велічыні

9.4. Капіраванне, устаўка, замена і выдаленне сімвалаў

Пры рабоце з тэкстам часта даводзіцца вылучаць і ператвараць часткі радкоў. Частку тэксту (падрадок) можна скапіраваць ці выразаць, а затым уставіць у іншае месца ў тэксце. Радок ці яго частка могуць быць заменены на іншы радок. Каманды для выканання аперацый па рабоце з фрагментам тэксту паказаны ў табліцы.

Каманда Апісанне
substr(n, k) Капіруе частку радка ў іншы радок
erase(n, k) Выдаляе сімвалы радка
insert(n, s1) Устаўляе падрадок s1 у радок  
replace(n, k, s1) Замяняе сімвалы радком s1
Empty() Вяртае true, калі радок пусты, false — калі не пусты
Push_back(c) Дабаўляе ў канец радка сімвал с
Pop_back() Выдаляе адзін сімвал у канцы радка

Ва ўсіх камандах пераменная n абазначае пазіцыю (нумар) сімвала, пачынаючы з якога выконваюць аперацыю, а пераменная — колькасць сімвалаў. Разбяром каманды падрабязней (прыклад 9.9).

У выніку выканання каманды substr радок s не змяняецца. Вынік работы функцыі прысвойваецца іншаму радку.

Каманды erase, insert і replace змяняюць зыходны радок s.

У прыкладзе 9.10 паказана, як выкарыстоўваюцца пералічаныя каманды.

Функцыі insert і replace маюць яшчэ адзін варыянт рэалізацыі. Гэты варыянт дазваляе выкарыстоўваць пры ўстаўцы не ўвесь радок s1, а толькі яго частку. У гэтым выпадку задаюцца два дадатковыя параметры: пазіцыя n1 і колькасць сімвалаў k1, якія належаць да радка s1. Параметры дазваляюць вылучыць падрадок у радку s1, які і ўстаўляецца ў зыходны радок:

insert(n, s1, n1, k1),

replace(n, k, s1, n1, k1).

Прыклад 9.11. Напісаць праграму, якая вызначыць, колькі разоў сустракаецца зададзены падрадок у радку. 

Этапы выканання задання

I. Зыходныя даныя: пераменная — зыходны радок, — зыходны падрадок.

II. Вынік: — шуканая колькасць.

III.  Алгарытм рашэння задачы.

1. Уводзім зыходныя даныя. 
2. Ініцыялізуем значэнне лічыльніка k = 0.
3. Вызначаем даўжыні n1 і n2 для радка s і падрадка p.
4. У цыкле for ад 1 да розніцы ў даўжынях радка s і падрадка p.

4.1. Вылучым з радка s падрадок t такой жа даўжыні, што і даўжыня p, пачынаючы з бягучага сімвала 
4.2. Параўнаем падрадкі. Калі яны роўныя, то павялічваем значэнне лічыльніка на 1.

5. Вывад выніку.

IV. Апісанне пераменных: s, p, t — string, n1, n2, k — int.

Прыклад 9.9. Каманды для пераўтварэння радкоў.

1. Запіс  s1 = s.substr(n, k); азначае, што ў радку s вылучаюць k сімвалаў, пачынаючы з сімвала, індэкс якога запісаны ў пераменнай n. Сімвалы капіруюцца ў пераменную s1 (дзеянне каманды можна параўнаць з капіраваннем фрагмента тэксту ў буфер абмену).

2. Запіс s.erase(n, k); азначае, што ў радку s вылучаюць k сімвалаў, пачынаючы з сімвала, індэкс якога запісаны ў пераменнай n. Вылучаныя сімвалы выдаляюцца з радка s. Астатнія сімвалы радка зрушваюцца ўлева (дзеянне каманды можна параўнаць з выдаленнем фрагмента тэксту).

3. Запіс s.insert(n, s1); азначае, што ў радок s устаўляюць сімвалы радка s1, устаўка адбываецца ў пазіцыі n. Астатнія сімвалы радка зрушваюцца ўправа (дзеянне каманды можна параўнаць з устаўкай фрагмента тэксту з буфера абмену ў пазіцыю курсора).

4. Запіс s.replace(n, k, s1); азначае, што сімвалы радка s замяняюць на сімвалы радка s1. Замяняюцца k сімвалаў, пачынаючы з сімвала, што стаіць у пазіцыі n. Астатнія сімвалы радка зрушваюцца (дзеянне каманды можна параўнаць з устаўкай фрагмента тэксту з буфера абмену на месца вылучанага фрагмента).

Прыклад 9.10. Прыклады выкарыстання каманд (каманды ўжываюцца паслядоўна).

Зыходны радок

 string s = "informatics";

Каманда

Вынік

 s1 = s.substr(2,5);

s1 = "forma"

 s.erase(2, 7);

s = "incs"

 s.replace(2, 2, "ion");

s = "inion"

 s1 = "format";

 s.insert(2, s1);

 s = "information"

Прыклад 9.11.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string s, p;

  cout << "stroka" << endl;

  getline(cin, s);

  cout << "podstroka" << endl;

  getline(cin, p);

  int n1 = s.length();

  int n2 = p.length();

  int k = 0;

  for (int i = 0; i < n1 - n2 + 1; i++){

    string t = s.substr(i, n2);

    if (== p)

      k++;

  }

  cout << k << " raz" << endl;

  return 0;

}

VI. Тэсціраванне.

 

Эфектыўнае рашэнне дадзенай задачы можна атрымаць з дапамогай алгарытму Кнута — Морыса — Прата (КНП-алгарытм)[1].


[1] Котаў У. М., Лапо А. І., Быкадораў Ю. А., Вайцеховіч А. М. Інфарматыка, 9 клас. Мінск: Народная асвета, 2019. С. 44.