Печатать эту главуПечатать эту главу

§ 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. Тестирование.