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

9.6. Пераўтварэнне радкоў

Прыклад 9.14. Па правілах арфаграфіі новы сказ пачынаецца заўсёды з вялікай літары. Тэкставыя рэдактары аўтаматызуюць увод вялікай літары, г. зн. калі карыстальнік напісаў першае слова ў сказе з малой літары, то яна замяняецца на вялікую. Напісаць праграму, якая выконвае такую аўтазамену для тэксту, набранага лацінскімі літарамі. Лічыць, што тэкст набраны карэктна і пасля кожнага знака прыпынку, які азначае канец сказа («.», «!», «?»), стаіць прабел.

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

I. Зыходныя даныя: пераменная st (уведзены радок).

II. Вынік: пераўтвораны радок.

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

1. Увод зыходных даных. 
2. Вылічэнне даўжыні радка. 
3. Для захоўвання знакаў канца сказа створым радок z.
4. У цыкле for правяраем кожны сімвал радка st.

4.1. Калі бягучы сімвал з’яўляецца сімвалам канца сказа, то трэба замяніць сімвал, які стаіць на дзве пазіцыі далей, калі гэты сімвал — малая літара. 
4.2. Сімвал с з’яўляецца малой літарай тады, калі выканана ўмова ’a’ ≤ c ≤ ’z’ (для лацінскіх літар) і  ’a’ ≤ c ≤ ’я’ (для рускіх літар)
4.3. Для замены сімвалаў можна выкарыстаць той факт, што розніца ў кодах паміж вялікай і адпаведнай ёй малой літарай роўна 32. Для праверкі і замены сімвалаў створым функцыю up_char.

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

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

Ва ўсіх тэкставых рэдактарах рэалізавана функцыя Заменить. Пры выкананні гэтай каманды некаторыя сімвалы з радка выдаляюцца, а замест іх устаўляюцца іншыя сімвалы.

Прыклад 9.15. Напісаць праграму, якая заменіць у тэксце кожную лічбу 2 словам «two».

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

I. Зыходныя даныя: пераменная st (уведзены тэкст).

II. Вынік: пераўтвораны тэкст

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

1. Увод зыходных даных.
2. У цыкле 
 while правяраем кожны сімвал тэксту st.

2.1. Калі бягучы сімвал тэксту «2», то выдаляем яго і ўстаўляем падрадок «two». . 
2.2. Пераходзім да наступнага сімвала.

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

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

Пры правільным наборы камп’ютарнага тэксту паміж любымі двума словамі павінен быць роўна адзін прабел. Аднак часам выпадкова ўстаўляюць некалькі прабелаў. У гэтым выпадку Word падкрэслівае прабелы блакітнай хвалістай лініяй (прыклад 9.16).

Прыклад 9.17. Напісаць праграму, якая правярае правільнасць расстаноўкі прабелаў у тэксце і, калі паміж словамі больш за адзін прабел, — выдаляе лішнія.

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

I. Зыходныя даныя: пераменная st (уведзены тэкст).

II. Вынік: пераўтвораны тэкст.

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

1. Увод зыходных даных.
2. Паколькі даўжыня радка будзе змяняцца пры апрацоўцы радка, то колькасць паўтораў цыкла загадзя не вядомая. Будзем выкарыстоўваць цыкл while
3. У цыкле while правяраем суседнія сімвалы тэксту st.

3.1. Калі абодва суседнія сімвалы з’яўляюцца прабеламі, то выдалім адзін з іх. Суседнія сімвалы маюць індэксы, якія адрозніваюцца на адзін: i і i + 1.
3.2. Паколькі ў цыкле ёсць зварот да элемента з нумарам i + 1, то ўмовай выканання цыкла будзе няроўнасць i < length(st) — 1.
3.3. Пераходзім да наступнага сімвала толькі тады, калі выдаленне не праводзілі.

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

VI. Апісанне пераменных: st – string, i– int.

Прыклад 9.18. Напісаць праграму, якая правярае правільнасць расстаноўкі прабелаў вакол працяжніка. Калі прабелы прапушчаны, то ўстаўляе іх. Мяркуецца, што ў тэксце няма слоў, якія пішуцца праз злучок, двух знакаў «-» запар і лішніх прабелаў.

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

I. Зыходныя даныя: пераменная st (уведзены тэкст).

II. Вынік: словы-паліндромы

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

1. Увод зыходных даных.
2. У цыкле 
while правяраем кожны сімвал на супадзенне з «-». Пры супадзенні правяраем суседнія сімвалы.

2.1. Калі суседні справа сімвал (i + 1) не прабел, то ўстаўляем прабел. 
2.2. Калі сімвал злева (i1) не прабел, то ўстаўляем прабел і павялічваем i на 1. 
2.3. Паколькі ў цыкле ёсць зварот да элемента з нумарам i + 1, то ўмовай выканання цыкла будзе няроўнасць i < length(st)-1
2.4. Паколькі ў цыкле ёсць зварот да элемента з нумарам i – 1, то пачатковае значэнне i = 1.

3. Пераходзім да наступнага сімвала.
4. Вывад выніку.

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

Прыклад 9.19. Напісаць праграму, якая выведзе словы-паліндромы [3] (словы, якія аднолькава чытаюцца злева направа і справа налева), што ўваходзяць у зададзены тэкст. Словы ў тэксце могуць быць падзелены адным ці некалькімі прабеламі. Прабелы могуць быць у пачатку і ў канцы тэксту.

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

I. Зыходныя даныя: пераменная st (уведзены тэкст).

II. Вынік: словы-паліндромы.

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

1. Увод зыходных даных. 
2. Будзем вылучаць першае слова з зыходнага тэксту, правяраць яго і затым выдаляць. 
3. Лагічная пераменная p зменіць значэнне з false на true, калі будзе выведзены паліндром. 
4. У цыкле while, да таго часу пакуль радок не стане пустым, выконваем наступнае.

4.1. Выдалім прабелы ў пачатку радка. Вылучым першае слова з радка.
4.2. Праверым вылучанае слова і, калі яно з’яўляецца паліндромам, то выведзем яго. Слова можа вылучацца са знакамі прыпынку(«,.;:?!»), таму іх трэба выдаліць перад праверкай яго на паліндром. 
4.3. Выдалім слова з радка.

5. Апішам тры дадатковыя алгарытмы.

5.1. Функцыю DelSpace для выдалення прабелаў у пачатку радка. Прабелы выдаляюцца з радка толькі тады, калі ён не пусты. Калі прабелаў у пачатку радка няма, то функцыя не зменіць зыходны радок. 
5.2. Функцыю FirstWord, якая скапіруе з радка першае слова. Калі ў радку толькі адно слова (няма прабелаў), то яно ж і з’яўляецца першым. 
5.3. Функцыю CheckPalindrom для праверкі, ці з’яўляецца слова паліндромам. Для праверкі будзем параўноўваць першы сімвал з апошнім, другі — з перадапошнім і г. д. Сімвал з нумарам i будзе параўноўвацца з сімвалам з нумарам (n – i– 1), дзе n — даўжыня слова.

6. Вывад паведамлення «няма паліндромаў» у выпадку, калі значэнне p засталося false.

IV. Апісанне пераменных: st, sl – string, i, n – int, p - bool.


[3] В мире интересных слов. Палиндромы. http://www.tramvision.ru/words/pal.htm. (дата доступу: 28.07.2020)

Прыклад 9.14.

V. Праграма:

#include <iostream>

#include <string>

#include <windows.h>

 

using namespace std;

using namespace std::__cxx11;

 

char up_char(char c)

{

  bool u1 = 'a' <= c && c <= 'z';

  bool u2 = 'а' <= c && c <= 'я';

  if (u1 || u2)

    return (- 32);

}

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  string st, z = ".?!";

  cout << "Text" << endl;

  getline(cin, st);

  int n = st.length();

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

    if (z.find(st[i]) != -1)

      st[i + 2= up_char(st[i + 2]);

  cout << endl << "New text" << endl;

   cout << st << endl;

  return 0;

}

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

Прыклад 9.15.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string st;

  cout << "Text" << endl;

  getline(cin, st);

  int i = 0;

  while (< st.length()){

    if (st[i] == '2'){

      st.erase(i,1);

      st.insert(i, "two");

    }

    i++;

  }

  cout << endl << "New text" << endl;

  cout << st << endl;

  return 0;

}

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

VII. Аналіз выніку.

Замест двух функцый erase і insert можна выкарыстаць функцыю replace.

   st.replace(i, 1, "two");   

Прыклад 9.16. Вылучэнне лішніх прабелаў у Word.

Прыклад 9.17.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string st;

  cout << "Text" << endl;

  getline (cin, st);

  int i = 0;

  while (< st.length() - 1){

    if (st[i] == ' ' &&

        st[i + 1== ' ')

          st.erase(i, 1);

    else

      i++;

  }

  cout << endl << "New text" << endl;

  cout << st << endl;

  return 0;

}

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

Разгледзім падрабязней сітуацыю, калі ў тэксце стаяць запар два ці больш прабелаў. У прыкладзе такая сітуацыя сустракаецца паміж словамі «правільным» і «наборы». Умова (st[i] == ' ' && st[i + 1== ') для i = 14 выканаецца, і прабел, які стаіць на 14-м месцы, выдаліцца. Тады прабел, які стаіць на месцы 15, зрушыцца ўлева і атрымае нумар 14. Пры наступным выкананні цела цыкла зноў выдаліцца прабел на месцы 14, а прабел на месцы 15 зрушыцца ўлева. Пераход на наступны сімвал ажыццявіцца толькі тады, калі ўмова (st[i] == ' ' && st[i + 1== ' ') будзе няправільнай — паміж словамі застанецца толькі адзін прабел.

Прыклад 9.18.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string st;

  cout << "Text" << endl;

  getline(cin, st);

  int i = 1;

  while (< st.length() -1){

    if (st[i] == '-'){

      if (st[i + 1!= ' ')

        st.insert(+ 1, " ");

      if (st[i - 1!= ' '){

        st.insert(i, " ");

        i++;

      }

    }

    i++;

  }

  cout << endl << "New text" << endl;

  cout << st << endl;

  return 0;

}

 VI. Тэсціраванне. Увядзіце тэкст

«Жизнь прожить — не поле перейти. Родимая сторона — мать, чужая — мачеха. Сделал дело — гуляй смело.»

Вынік:

VII. Аналіз выніку. У прыкладзе сустракаюцца ўсе чатыры магчымыя сітуацыі: прабелаў няма ні злева, ні справа ад працяжніка; прабел толькі злева; прабел толькі справа; прабелы з двух бакоў. У выніку выканання ўсе прабелы расстаўлены правільна.

Прыклад 9.19.

V. Праграма:

#include <iostream>

#include <string>

#include <windows.h>

 

using namespace std;

using namespace std::__cxx11;

 

string DelSpace (string s)

{

  while (!s.empty() && s[0]== ' ')

    s.erase(0, 1);

  return s;

}

 

string FirstWord (string s)

{

  int i = s.find(' ');

  if (!= 0)

    return s.substr(0, i);

  else

    return s;

}

 

bool CheckPalindrom(string s)

{

  int n = s.length();

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

    if (s[i] != s[- i - 1])

      return false;

  return true;

}

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  string st, z = ",.;:?!";

  cout << "Текст" << endl;

  getline(cin, st);

  bool p = false;

  while (!st.empty()){

    st = DelSpace(st);

    if (st.empty()) break;

    string sl = FirstWord(st);

    int n = sl.length();

    if (z.find(sl.back()) != -1)

      sl.pop_back();

    if (CheckPalindrom(sl)){

        cout << sl << endl;

        p = true;

    }

    st.erase(0, n);

  }

  if  (!p)

    cout << "нет палиндромов" << endl;

  return 0;

}

VI. Тэсціраванне. Увядзіце тэкст:

«На берегу стоит шалаш из камыша. Для трафаретной печати предназначен ротатор,  или мимеограф. Пшеничная лепёшка наан является блюдом индийской национальной кухни».

Вынік:



[2] Куприн, А. И. Гранатовый браслет http:ilibrary.ru/text/1022/p.7/index.html (дата доступу: 28.07.2020).