Преобразуем строки в числа с С++

newbie_

Опубликован:  2019-06-09T09:40:05.623996Z
Отредактирован:  2019-07-02T08:59:23.036025Z

Продолжаю свой любительский практикум программирования на C++, в этой презентации я покажу простое преобразование строк в целые числа с использованием стандартных процедур, но без использования соответствующих функций стандартной библиотеки.

Задача, решение которой я покажу в этом выпуске блога, была сформулирована на одном из собеседований, задача достаточно простая, но при этом довольно интересная для начинающих изучать программирование. Условия задачи следующие:

Даны две строки, содержащие только цифры: 54709879023 и 23450980912. Необходимо написать программу, которая выведет на экран монитора оба числа и их сумму. По условиям задачи для преобразования строк в числа не допускается использование соответствующих функций стандартной библиотеки.

Проще всего найти сумму двух чисел можно преобразовав строки, которыми заданы числа, в целые числа и сложив их. Таким образом вся задача сводится к разработке простой функции преобразования строк в числа. Что ж, запускаю Geany и создаю новый файл, в котором будет храниться исходный код программы.

MKr8k5Brie.png

Для решения задачи мне понадобятся три модуля стандартной библиотеки.

#include <iostream>
#include <string>
#include <cmath>

Для преобразования строки, содержащей только цифры, я разработаю специальную функцию to_integer, которая будет получать строку в качестве аргумента и возвращать целое число, декларирую эту функцию.

unsigned long to_integer(const std::string & s);

Кроме этого мне понадобится ещё одна вспомогательная функция, с помощью которой я буду находить целое число соответствующее заданной цифре, эта функция будет принимать в качестве аргумента символ и возвращать целое число. Декларирую функцию find_i.

int find_i(const char s);

Учитывая, что в арсенале программы есть преобразующая функция to_integer, решение задачи сводится к трём элементарным процедурам.

int main()
{
    std::string first = "54709879023";
    std::string second = "23450980912";
    std::cout << first << std::endl << " + " << std::endl << second
              << " = " << std::endl
              << to_integer(first) + to_integer(second) << std::endl;
    return 0;
}

Здесь я задал две исходные строки, содержащиеся в условии задачи, и при помощи функции to_integer и инструментов стандартной библиотеки вывел на экран заданные строки и сумму хранящихся в них целых чисел. Теперь мне необходимо разработать код функций find_i и to_integer. Начну с первой.

int find_i(const char s)
{
  const std::string digits = "0123456789";
  int r;
  for (int i = 0; i < 10; i++)
  {
    if (s == digits[i])
    {
      r = i;
      break;
    }
  }
  return r;
}

Функция при помощи константы digits и цикла for находит целое число, соответствующее переданному аргументом функции символу s, сохраняет его в переменной r и возвращает значение этой переменной после завершения цикла. Имея такую функцию, можно очень просто преобразовать строку с цифрами в целое число.

unsigned long to_integer(const std::string & s)
{
  const int L = s.length();
  unsigned long sum = 0;
  for (int i = 0; i < L; i++)
    sum += find_i(s[i]) * std::pow(10, L - i - 1);
  return sum;
}

Для преобразования было необходимо найти длину заданной аргументом функции строки, и при помощи простого цикла for найти сумму всех полученных в результате вычисления простого выражения в теле цикла целых чисел, эта сумма и является искомым числом. Сохраняю код программы в файле toint.cpp.

jTmRGA0727.png

Перехожу в терминал и пробую скомпилировать программу.

g++ toint.cpp -o exe

Компиляция завершилась успехом, ошибок и предупреждений не зафиксировано. Исполняю полученную программу.

./exe

YVtpLPCJ0C.png

Задача решена, сумма заданных строками чисел найдена и выведена на экран терминала. В следующем выпуске блога я покажу один из возможных вариантов обратного преобразования, то есть преобразую при помощи элементарных процедур целое число в строку. Будет интересно...

Updated later: оптимизация предложенного решения рассмотрена в другом выпуске блога - Поговорим о рефакторинге и оптимизации кода.

Комментарии: