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

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