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

9.3. Пошук у радку

Сучасныя камп’ютарныя ўстройствы дазваляюць дастаткова хутка ажыццяўляць пошук у тэксце, выкарыстоўваючы для гэтага розныя алгарытмы. Мовы праграміравання даюць для алгарытмаў шырокі набор функцый для работы з тэкстам.

У класе string рэалізавана некалькі розных функцый, якія дазваляюць ажыццяўляць пошук сімвала ці падрадка (часткі радка) у радку. У якасці выніку атрымліваем нумар першага ўваходжання шуканага ўзору ці значэнне –1, калі ўзор не знойдзены. Значэнне –1 пошукавыя функцыі вяртаюць толькі для кампілятара MinGW. Універсальным значэннем, якое вяртаецца, з’яўляецца канстанта string::npos.

Функцыі могуць ажыццяўляць прагляд сімвалаў злева направа ці справа налева. Некаторыя з функцый прадстаўлены ў табліцы:

Функцыя

Апісанне
length() Вызначае даўжыню радка (колькасць сімвалаў у радку)
find(s1) Вызначае пазіцыю падрадка s1
rfind(s1) Вызначае пазіцыю апошняга (першага пры праглядзе справа налева) уваходжання падрадка s1
find(s1,from) Вызначае пазіцыю падрадка s1. Пошук пачынаеца з пазіцыі from

Больш падрабязна з функцыямі для работы з радкамі можна азнаёміцца ў дадатку.

У прыкладзе 9.6. паказана, як ужываць дадзеныя функцыі.

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

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

I. Зыходныя даныя: пераменная s — зыходнае слова.

II. Вынік: слова на экране, кожны сімвал у асобным радку.

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

1. Уводзім зыходныя даныя. 
2. Вызначаем даўжыню слова. Пераменнай length() 
3. У цыкле for выводзім па адным сімвале ўведзенага слова.

IV. Апісанне пераменных: s – string, n – int.

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

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

I. Зыходныя даныя: пераменная s — уведзенае слова.

II. Вынік: апошні сімвал у слове і адпаведнае паведамленне: сустракаецца ці не сустракаецца.

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

1. Увод зыходных даных.
2. Вызначым даўжыню слова. Пераменнай 
 n прысвойваем значэнне функцыі length.
3. У цыкле
 for выводзім па адным сімвале ўведзенага слова. 
4. Вызначым апошні сімвал
.
5. Вызначым пазіцыю апошняга сімвала ў слове. Пераменнай 
k1 прысвойваем значэнне функцыі find для пошуку апошняга сімвала. Пераменнай k2 прысвойваем значэнне функцыі rfind для апошняга сімвала. Калі k1 = k2, то сімвал у слове адзіны, інакш у слове ёсць іншы такі ж сімвал.
6. Вывад выніку.

 IV. Апісанне пераменных: s — string, n, k1, k2 — int.

Мова С++ з’яўляецца аб’ектна-арыентаванай мовай. Тып даных string не з’яўляецца часткай мовы С++, а рэалізаваны як шаблонны клас, які ўваходзіць у стандартную бібліятэку STL. З паняццем класа вы пазнаёміцеся пазней. Пры апісанні класа вызначаецца не толькі спосаб захоўвання даных, але і метады апрацоўкі гэтых даных. Метады рэалізаваны ў выглядзе функцый, доступ да якіх мае любая пераменная, якая з’яўляецца аб’ектам дадзенага класа. Для выкліку функцыі яе імя запісваюць пасля імя пераменнай, раздзяляючы іх кропкай. Напрыклад: s.length(), s.find('*') і інш. У акне рэдактара кода спіс функцый, якія належаць да пераменнай тыпу string, можа адкрывацца, калі пасля імя пераменнай паставілі кропку. Пасля чаго функцыю можна выбраць са спіса.

Для таго каб спіс функцый з’явіўся ў Code::Bloks, трэба прапісаць дадатковую прастору імёнаў:

   using namespace std::__cxx11;  

Прыклад 9.6. Прыклады выкарыстання функцый.

string s ="informatics";

int n = s.length();

n=11

 string s ="Не слово хозяин хозяину, 
            а хозяин слову хозяин"
;

 string s1 = "хозяин";

 int n = s.length();

 int p1 = s.find(s1);

 int p2 = s.rfind(s1);

 int p3 = s.find(s1, 14);

n=46

p1=9

p2=40

p3=16

 

Прыклад 9.7.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string s;

  cout << "slovo" << endl;

  cin >> s;

  int n = s.length();

  for (int i = 0; i< n; i++)

    cout << s[i] << endl;

  return 0;

}

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

Прыклад 9.8.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string s;

  cout << "slovo" << endl;

  cin >> s;

  int n = s.length();

  int k1 = s.find(s[n-1]);

  int k2 = s.rfind(s[n-1]);

  if (k1 ==k2)

    cout << " 1 raz" << endl;

  else

     cout << "est, pos - " << k1 << endl;

  return 0;

}

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