Печатать книгуПечатать книгу

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

Сайт: Профильное обучение
Курс: Інфарматыка. 10 клас (Павышаны ўзровень)
Книга: § 9. Радковыя велічыні
Напечатано:: Гость
Дата: Четверг, 2 Май 2024, 16:11

9.1. Увод, вывад, прысвойванне радковых велічынь

З радковым тыпам даных вы пазнаёміліся ў мінулым годзе. У мове С++ таксама ёсць тып даных, які дазваляе працаваць з радковымі велічынямі. Пераменныя радковага тыпу ў С++ апісваюцца тыпам string (гэтак жа, як і ў Pascal). Для работы з пераменнымі тыпу string патрабуецца падключыць бібліятэку, імя якой супадае з імем тыпу string.

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

string <імя радка>;

Калі радок не змяшчае службовых сімвалаў, то яго можна ўводзіць з дапамогай каманды cin. Калі ў радку змяшчаюцца прабелы, ці сімвалы табуляцыі, ці іншыя службовыя сімвалы, то ў радок будуць перададзены сімвалы да першага службовага, астатнія сімвалы будуць праігнараваны. Для ўводу радка са службовымі сімваламі выкарыстоўваюць каманду

getline(cin, s);

Першы параметр гэтай каманды — імя патоку для ўводу, а другі — імя пераменнай, у якую будзе запісаны радок. Увод заканчваецца націсканнем клавішы Enter. Сімвал, які адпавядае націсканню гэтай клавішы, счытваецца, але да радка не дабаўляецца. Для вываду радкоў выкарыстоўваецца каманда cout (прыклад 9.1).

З дапамогай каманды прысвойвання пераменнай радковага тыпу можна прысвоіць значэнне. Значэнне радковай велічыні запісваецца ў двайным двукоссі. Пусты радок задаецца наступным чынам:

s = "";

Запіс тлумачальнага тэксту пры вывадзе ў камандзе cout з’яўляецца радковай канстантай. Да сімвалаў у радку можна звяртацца, выкарыстоўваючы індэкс. Нумарацыя сімвалаў пачынаецца з нуля, s[i] адпавядае i-му сімвалу ў радку s.

Прыклад 9.1. Увядзём два радкі (з дапамогай розных каманд) і выведзем іх значэнні.

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

  string s1, s2;

  cout << "1 stroka" << endl;

  getline(cin, s1);

  cout << "2 stroka" << endl;

  cin >> s2;

  cout << "1 stroka - " << s1 << endl;

  cout << "2 stroka - " << s2 << endl;

  return 0;

}

Тэсціраванне:

У першым выпадку радок счытваецца з дапамогай каманды getline, таму прачыталіся і вывеліся ўсе сімвалы. У другім выпадку счыталіся і вывеліся сімвалы да прабелу.

Калі памяняць месцамі каманды вываду (спачатку cin, потым getline), то вынік будзе наступным:

У карыстальніка не будзе магчымасці ўвесці другі радок. У яго будуць счытаны сімвалы, якія засталіся ў буферы пасля ўводу першага радка.

Калі ўзнікае неабходнасць выкарыстаць каманду getline  адразу пасля каманды cin, то трэба папярэдне ачысціць буфер даных. Гэта можна зрабіць з дапамогай каманды cin.ignore(200,'\n'); Першы параметр паказвае, якую максімальную колькасць сімвалаў трэба праігнараваць, пакуль не сустрэнецца сімвал, вызначаны ў якасці другога параметру.

Каманда cin.ignore(); (без параметраў) ігнаруе сімвал  '\n'. Гэта можа быць трэба, калі спачатку з дапамогай   cin  уводзіцца лік, а затым з дапамогай getline  счытваюцца радкі.

  cin >> n;

  cin.ignore();

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

    getline(cin, s);

    

  }

Без cin.ignore() першы радок будзе пуст.

 

9.2. Параўнанне і складанне радковых велічынь

Гэтак жа, як і для іншых тыпаў даных, для радкоў вызначаны свае аперацыі — дзеянні, якія можна выконваць з данымі тыпу string. Для радковага тыпу такімі аперацыямі з’яўляюцца параўнанне і складанне.

Для параўнання радкоў трэба ўмець параўноўваць сімвалы. Радкі параўноўваюцца пасімвальна. Спачатку параўноўваюцца першыя сімвалы двух радкоў. Калі сімвалы розныя, то большы той радок, сімвал якога мае большы нумар. Калі сімвалы аднолькавыя, то пераходзяць да параўнання наступных сімвалаў. Параўнанне заканчваецца, калі знойдзены розныя сімвалы ці ў адным з радкоў скончыліся сімвалы. У гэтым выпадку большы той радок, у якім сімвалы засталіся. Калі пры параўнанні сімвалаў адрозненні не знойдзены і радкі скончыліся адначасова, то яны роўныя (прыклад 9.2). Парадак, у якім меншы радок папярэднічае большаму, называюць лексікаграфічным. Гэту назву лексікаграфічны парадак атрымаў па аналогіі з сартаваннем па алфавіце ў слоўніку.

Пры параўнанні радкоў трэба памятаць, што вялікія і малыя літары — гэта розныя літары, паколькі маюць розныя нумары ў табліцы сімвалаў. Таму радкі "mama" і "Mama" будуць рознымі, а няроўнасць "mama" > "Mama" — правільнай (у літары 'm' код 109, а ў 'М' — 77). Для праверкі правільнасці параўнання радкоў можна выкарыстаць праграму з прыклада 9.3.

Для радкоў вызначана аперацыя складанне анкатэнацыя). Абзначаецца яна знакам «+». У выніку складання двух радкоў атрымліваецца новы радок, у якім пасля сімвалаў першага радка будуць запісаны сімвалы другога радка. Вынік дадзенай аперацыі залежыць ад парадку складаемых (прыклад 9.4).

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

Сталіца дзяржавы … — горад … .

Замест шматкропя павінны быць выведзены адпаведныя значэнні.

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

I. Зыходныя даныя: пераменныя str (назва дзяржавы) і gor (назва горада).

II. Вынік: пераменная s (выніковы радок).

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

1. Увод зыходных даных.
2. Стварэнне выніковага радка.
3. Вывад радка.

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

Прыклад 9.2. Прыклады параўнання радкоў.

s1 s2 Результат

"string"

"char"

s1 > s2

"строка"

"Строка"

s1 > s2

"book"

"Magazine"

s1 > s2

"book"

"magazine"

s1 < s2

"липа"

"лист"

s1 < s2

"леска"

"лес"

s1 > s2

"112"

"7"

s1 < s2

"123"

"11111111"

s1 > s2

"123"

"123"

s1 = s2

Прыклад 9.3. Параўнанне радкоў.

#include <iostream>

#include <string>

 

using namespace std;

 

int main()

{

  string s1, s2;

  cout << "1 stroka" << endl;

  getline(cin, s1);

  cout << "2 stroka" << endl;

  getline(cin, s2);

  if (s1 > s2)

    cout << "s1 > s2" << endl;

  else

    if (s1 < s2)

      cout << "s1 < s2" << endl;

    else

      cout << "s1 = s2" << endl;

  return 0;

}

Гэта праграма будзе карэктна працаваць як для лацінскіх сімвалаў, так і для рускіх, нягледзячы на тое, што каманды для работы з рускімі літарамі не падключаны. Гэта можна растлумачыць тым, што адносны парадак сімвалаў адпавядае алфавітнаму. Таму які б код не мела літара «Б», яна будзе пасля літары «А». Выключэннем з’яўляецца літара «ё». У розных кодавых табліцах яна можа размяшчацца або да ўсіх рускіх літар, або пасля іх.

Прыклад 9.4. Прыклады складання радкоў.

#include <iostream>

#include <string>

 

using namespace std;

 

int main()

{

  string s1 = "Pasha";

  string s2 = "Ivanov";

  string s3 = s1 + " " + s2;

  string s4 = s2 + " " + s1;

  cout << "s3 - " << s3 << endl;

  cout << "s4 - " << s4 << endl;

  return 0;

}

Тэсціраванне:

Прыклад 9.5.  

V. Праграма:

#include <iostream>

#include <string>

#include <windows.h>

 

using namespace std;

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  string str, gor;

  cout << "назва дзяржавы" << endl;

  cin >> str;

  cout << "назва сталіцы" << endl;

  cin >> gor;

  string s = "Сталіца дзяржавы "

         + str + " — горад " + gor;

  cout << s << endl;

   return 0;
}

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

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. Тэсціраванне.

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.

9.5. Аналіз тэксту на наяўнасць розных сімвалаў

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

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

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

I. Зыходныя даныя: радок тэксту st.

II. Вынік: колькасць слоў k.

III. Алгарытм рашэння задачы: st — string, n, k — int.

1. Уводзім зыходныя даныя. 
2. Вызначаем даўжыню радка
.
3. Пачатковае значэнне лічыльніка
 k = 1 (у тэксце ёсць хоць бы адно слова). 
4. З дапамогай цыкла
 for праглядаем кожны сімвал у радку. Калі бягучы сімвал — прабел, то павялічваем значэнне лічыльніка колькасці слоў. Вывад выніку. 

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

Прыклад 9.13. Напісаць праграму, якая вызначыць, якіх знакаў прыпынку ў тэксце больш: тых, якімі заканчваецца сказ («.», «?», «!»), ці тых, якія стаяць унутры сказа («,», «:», «;»).

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

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

II. Вынік: паведамленне пра тое, якіх знакаў больш.

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

1. Увядзём зыходныя даныя.
2. Вызначым даўжыню радка
.
3. Створым два дапаможныя радкі. У радок
 z1 запішам сімвалы «.!?» (знакі прыпынку «першага віду»), а ў радок z2 – «,:;» (знакі прыпынку «другога віду»). 
4. Ініцыялізуем два лічыльнікі
 k1 і k2 нулямі (для знакаў прыпынку «.!?» і «,:;» віду). 
5. У цыкле 
 for правяраем кожны сімвал радка st.

5.1. Калі сустрэўся знак прыпнку «.», «!» або «?», то павялічым значэнне лічыльніка k1 на 1.
5.2. Калі сустрэўся знак прыпынку «,», «:», «;», то павялічым значэнне лічыльніка k2 на 1. 
5.3. Для вызначэння, ці сустрэўся знак прыпынку, будзем выкарыстоўваць функцыю find, з дапамогай якой будзем шукаць бягучы сімвал у радку са знакамі прыпынку.

6. Параўноўваем атрыманыя значэнні лічыльнікаў і выводзім вынік.

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

 

Прыклад 9.12. Статыстыка ў дакуменце Word (адпаведная каманда на ўкладцы Рецензирование).

V. Праграма:

#include <iostream>

#include <string>

#include <windows.h>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  string st;

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

  getline(cin, st);

  int n = st.length();

  int k = 1;

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

    if (st[i] == ' ')

      k++;

  cout << "в тексте " << k;

  cout << " слов(-о,-а)" << endl;

  return 0;

}

VI. Тэсціраванне (для праверкі можна скапіраваць тэкст абзаца з дакумента Word).

VII. Аналіз выніку. Калі паглядзець статыстыку Word для гэтага абзаца, атрымаем:

Прыклад 9.13.

V. Праграма:

#include <iostream>

#include <string>

#include <windows.h>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  SetConsoleCP(1251);

  SetConsoleOutputCP(1251);

  string z1 = ".!?", z2 = ",:;";

  int k1 = 0, k2 = 0;

  string st;

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

  getline(cin, st);

  int n = st.length();

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

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

       k1++;

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

       k2++;

  }

  if (k1 > k2)

    cout << "Первого вида больше" << endl;

  else

    if (k1 < k2)

     cout << "Второго вида больше" << endl;

    else

     cout << "Одинаково" << endl;

  return 0;

}

VI. Тэсціраванне (для праверкі можна скапіраваць тэкст абзаца)[1].



[1Чехов, А. П. Человек в футляре // http:ilibrary.ru/text/438/p.1/index.html (дата доступу: 28.07.2020).

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).

9.7. Пераўтварэнне радкоў у лікі і лікаў у радкі

Лікавыя даныя выкарыстоўваюцца для выканання арыфметычных аперацый. Калі сімвалы лічбаў запісаны ў радковую пераменную, то выконваць вылічальныя дзеянні з імі нельга. Але можна ператвараць радкі, якія змяшчаюць сімвалы лічбаў, у лікі (прыклад 9.20).

У радковых пераменных лёгка выконваць такія аперацыі, як выдаленне, устаўка ці замена сімвала. Устаўка, замена ці выдаленне лічбы з ліку выконваюцца больш складана (задача пра вылучэнне лічбаў з ліку разглядалася ў § 8 — гл. прыклад 8.17). Пры неабходнасці лік можна пераўтварыць у радок, выканаць патрэбныя дзеянні і пераўтварыць радок назад у лік..

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

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

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

II. Вынік: сума лічбаў або паведамленне пра тое, што гэта не лік.

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

1. Увод зыходных даных.
2. Вылічэнне даўжыні радка
 (n).
3. У дачыненні да ўведзенага тэксту нельга ў відавочным выглядзе ўжыць функцыі пераўтварэння тыпу, паколькі даўжыня тэксту можа быць большай за 20, а простых лікавых тыпаў, якія змяшчаюць такую колькасць лічбаў, мова С++ не падтрымлівае. Таму будзем спрабаваць ператвараць у лік кожны ўведзены сімвал, лічыць суму і колькасць тых сімвалаў, якія атрымалася пераўтварыць
.
4. Ініцыялізацыя пераменных
: s = 0 (сума лічбаў ліку) і k = n (пераменная-флаг).
5. 
У цыкле for правяраем кожны сімвал радка  st.

5.1. Калі бягучы сімвал тэксту — лічба, то пераўтвараем яго ў лік, дабаўляем лік да сумы. Сімвал радка з’яўляецца лічбай, калі выконваецца ўмова(st[i] >= '0' && st[i] <= '9').
5.2. Калі сімвал не лічба, то запамінаем нумар гэтага сімвала ў пераменнай k і перапыняем выкананне цыкла.

6. Калі пасля цыкла k < n, то тэкст не з’яўляецца запісам ліку. Інакш выводзім суму лічбаў.

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

Прыклад 9.22*. Напісаць праграму, якая раскрывае дужкі ў лікавым выразе і вылічвае яго значэнне. Выраз мае выгляд a + b + c + і ўводзіцца як радок. Замест a, b і c — сімвалы лічбаў, якія ўтвараюць цэлы лік (колькасць лічбаў у кожным з іх не большая за дзевяць, колькасць складаемых — адвольная). Вывесці значэнне выразу. Напрыклад, для выразу 5 + 17 + 8 павінны атрымаць 30.

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

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

II. Вынік: лікавае значэнне выразу.

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

1. Увод зыходных даных 
2. 
У цыкле while, да таго часу пакуль радок не стане пустым, выконваем наступнае. 

2.1. Знойдзем сімвал «+», сімвалы да яго скапіруем у пераменную s1
2.2. Пераўтворым s1 у лік x
2.3. Дабавім лік да сумы.
2.4. Выдалім гэтыя сімвалы з радка разам са знакам «+».

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

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

Прыклад 9.20. У табліцы прыведзены каманды для пераўтварэння.

Каманда

Апісанне

stoi

stoll

Функцыі пераўтвараюць радковае ўяўленне цэлага ліку s да лікавага значэнню тыпу int або long long

stoul stoull

Функцыі пераўтвараюць радковае ўяўленне цэлага ліку s да беззнакавага лікавага значэння тыпу unsigned int  або unsigned long long

stof,

stod,

stold

Функцыі пераўтвараюць радковае ўяўленне рэчыўнага ліку s да лікавага значэння тыпу floa, doule або long double

to_string

Функцыя пераўтварае лік да радковага ўяўлення

Функцыі пераўтварэння радковых велічынь тыпу string у лікавыя з’явіліся толькі ў 11 стандарце C++. Аднак у Code:: Bloks яны падтрымліваюцца толькі з 14-й версіі стандарту. Для падключэння кампілятара з падтрымкай гэтага стандарту неабходна выканаць каманду Settings → Compiler

Прыклад 9.21.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string st;

  cout<<"Stroka"<<endl;

  getline(cin, st);

  int n = st.length();

  int s = 0;

  int k = n;

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

  {

    if (st[i] >= '0' && st[i] <= '9'){

      string z;

      z = st[i];

      s += stoi(z);

    }

    else {

      k = i;

      break;

    }

  }

  if (< n)

    cout << "ne chislo" << endl;

  else

    cout << "summa = " << s << endl;

  return 0;

}

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

Праверку таго, ці з’яўляецца сімвал лічбай, можна выканаць некалькімі рознымі спосабамі. Гэта можна зрабіць аналагічна таму, як у прыкладзе 9.14 выконвалася праверка знакаў прыпынку. Для гэтага трэба стварыць радок і пералічыць у ім усе лічбы — z = ''0123456789'';

Функцыі пераўтварэння ў якасці параметра прымаюць толькі радок, таму ў праграме прыйшлося прысвоіць радку z значэнне бягучага сімвала. Для атрымання лікавага значэння сімвала лічбы можна паступіць па-іншаму:

   int z = st[i] - '0';

   s += z;

У дадзеным выпадку пераменная z — розніца  кодаў бягучай лічбы і лічбы 0. Паколькі лічбы ў табліцы размешчаны па парадку, то атрымаем лікавае значэнне сімвала лічбы.

Прыклад 9.22.

V. Праграма:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string st, s1;

  cout<<"Stroka"<<endl;

  getline(cin, st);

  int s = 0;

  while (!st.empty())

  {

    int n = st.find('+');

    if (!= -1){

      s1 = st.substr(0,n);

      st.erase(0, n + 1);

    }

    else

    {

      s1 = st;

      st.clear();

    }

    int x = stoi(s1);

    s += x;

  }

  cout << "summa = " << s << endl;

  return 0;

}

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

Пытанні да параграфу

1. Як апісваюцца радковыя пераменныя?

2. З чаго складаюцца радкі?

3. Якія аперацыі магчымыя над радкамі?

4. Як параўноўваюцца радкі?

5. Што з’яўляецца вынікам складання двух радкоў?

6. Што такое даўжыня радка? З дапамогай якой функцыі можна знайсці даўжыню радка?

7. Якія функцыі выкарыстоўваюцца для вызначэння пазіцыі падрадка ў радку?

8. Як скапіраваць сімвалы з аднаго радка ў іншы?

9. Якая функцыя выкарыстоўваецца для выдалення сімвалаў з радка?

10. Якая функцыя прызначана для ўстаўкі сімвалаў у радок?

Практыкаванні

    

1. Напішыце праграму для рашэння задачы. Карыстальнік уводзіць сваё прозвішча, клас і навучальную ўстанову, праграма павінна вывесці паведамленне «Навучэнец … вучыцца ў … класе ДУА "…"». Замест шматкроп’я павінны быць выведзены адпаведныя значэнні.

2. Змяніце праграму з прыкладу 9.8 так, каб на экран выводзіўся сімвал уведзенага слова, які стаіць пасярэдзіне. Выведзіце пазіцыі ўсіх сімвалаў, якія супадаюць з сярэднім сімвалам слова.

3. Змяніце праграму з прыкладу 9.8 так, каб малыя і вялікія літары аналізаваліся праграмай аднолькава (напрыклад, для рускага слова «Анна» адказ павінен быць наступным: «Апошні сімвал — а, сімвал сустрэўся на месцы 1»).

4. Дадзены два словы. Ці правільна, што адно са слоў пачынаецца на тую ж літару, на якую заканчваецца іншае? (Першая літара аднаго са слоў можа быць вялікай). Калі так, то вывесці літару, інакш адпаведнае паведамленне. *Калі адказ «правільна», вызначыць, ці належаць літары аднаму рэгістру.

5. Напішыце праграму, якая аналізуе тэкст на наяўнасць розных сімвалаў.

1. Напішыце праграму, якая вызначыць колькасць сказаў у тэксце. Сказ заканчваецца адным з трох сімвалаў: «.», «?», «!». Мяркуецца, што ў тэксце ёсць хоць бы адзін сказ (гл. прыклад 9.12).
2. Напішыце праграму, якая вызначыць колькасць слоў у тэксце, калі паміж любымі двума словамі можа быць больш за адзін прабел. Мяркуецца, што ў тэксце ёсць хоць бы адно слова.
3. Напішыце праграму, якая вызначыць, якіх літар у радку з рускім тэкстам больш: «о» ці «O».
4. Напішыце праграму, якая вызначыць, які працэнт складаюць літары «a» ва ўведзеным тэксце.
5. Напішыце праграму, якая вызначыць, колькі слоў у тэксце пачынаецца на літару «а».
6*. Напішыце праграму, якая вызначыць, які працэнт слоў у тэксце пачынаецца на літару «к». (Слова можа пачынацца як з вялікай, так і з малой літрары.))

6. Дадзены тэкст. Напішыце праграму, якая праверыць, ці правільна ў ім расстаўлены круглыя дужкі. Калі не, то вывесці адпаведнае паведамленне: «адкрывальных дужак больш (менш), чым закрывальных», «закрывальная дужка раней ідзе за адкрывальную дужку».

7. Напішыце праграму, якая ажыццявіць у тэксце замену сімвалаў.

1. Замяніць у зададзеным тэксце кожную літрау «a» сімвалам «*».
2. Замяніць у зададзеным тэксце кожную лічбу сімвалам «?».
3. Замяніць у зададзеным тэксце з лацінскіх літар усе ўваходжанні «x» на «ks».
4. Замяніць у зададзеным тэксце з лацінскіх літар усе ўваходжанні «ing» на «ed».
5. Замяніць усе словы А1 на словы А2 (словы ў тэксце падзелены прабеламі, словы А1 і А2 уводзяцца).

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

1. Выдаліць з тэксту ўсе галосныя літары
2. Выдаліць з тэксту ўсе знакі «+», непасрэдна за якімі стаіць не лічба..

9. Напішыце праграму, якая ўставіць у тэкст некаторыя сімвалы.

1. Пасля кожнай лацінскай літары «q» дабавіць літару «u». 
2. Пасля кожнага з пералічаных знакаў прыпынку («.», «,», «:», «;») уставіць прабел, калі яго там няма.

10. Выканайце для прыкладу 9.19.

1. Змяніце функцыю CheckPalindrom так, каб словы, якія пачынаюцца на вялікую літару, таксама лічыліся паліндромамі, напрыклад: рус. «Анна», бел. «Ала».
2. Дабаўце ў праграму падлік колькасці выведзеных паліндромаў.

11*. Фразы-паліндромы чытаюцца аднолькава злева направа і справа налева без уліку прабелаў і знакаў прыпынку. Напрыклад, у рускай мове: «Кулинар, храни лук» або «А роза упала на лапу Азора». Напішыце праграму, якая вызначыць, ці з’яўляецца фраза паліндромам.

12. Напішыце праграму, якая правярае, ці з’яўляецца дадзены тэкст запісам ліку. У непусты тэкст могуць уваходзіць толькі лічбы або літары. Калі так, то праверыць, ці дзеліцца дадзены лік на 4, інакш вывесці адпаведнае паведамленне. Для праверкі дзялімасці на 4 выкарыстоўваць прымету дзялімасці: лік дзеліцца на 4, калі двухзначны лік, састаўлены з апошніх двух лічбаў зыходнага ліку, дзеліцца на 4.

13. Змяніце праграму з практыкавання 12 так, каб правяралася дзялімасць на 2, 3, 5, 6, 8, 12 (выкарыстоўвайце адпаведныя прыметы дзялімасці).

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

15. Напішыце праграму для рашэння задачы. Радок уяўляе сабой запіс наступнага выгляду: «а ± b ±  с ±…». Знайсці значэнне выразу. Замест знака «±» можа быць знак «+» або знак «–». Лікі з’яўляюцца цэлымі (тып int).

16. Напішыце праграму для рашэння задачы. Радок уяўляе сабой запіс наступнага выгляду: «(a + b)c». Вылучыць  з запісу лікі і знайсці значэнне выразу. Лікі, якія ўваходзяць у выраз, з’яўляюцца цэлымі (тып int).

17*. Радок уяўляе сабой запіс наступнанга выгляду: «лік circled times лік ± лік circled times лік ± … ± лік circled times лік», дзе замест знака circled times можа быць * або /, а замест знака «±» — знакі «+» або «—». Напісаць праграму, якая выдзеліць з запісу радка лікі і знойдзе значэнне выразу. Значэнні лікаў змяшчаюцца ў тып double.

18. Напішыце праграму, якая вызначыць, які працэнт слоў у тэксце валодае наступнай уласцівасцю: першай літарай з’яўляецца галосная, а далей зычныя і галосныя літары чаргуюцца праз адну.