Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Написание собственного класса String.convertStrToInt

9.9K
05 ноября 2008 года
maxxi
35 / / 20.06.2007
Пишу для лабы написать собственный класса String.
Нужно написать в нем методу convertStrToInt, то есть перевод String в integer.

В одной методичке наткнулся на такой код непонятного содержания :

Код:
int MyStr::convertStrToInt(char* p_str) {
  int res = 0;
  int a;
  int temp_power = 0;
  if (p_str != NULL) {
   [COLOR="Red"]for (int i=(getLength(p_str)-2); i >= 0; i--) {[/COLOR]
      if ((p_str >= '0') && (p_str <= '9')) {
       [COLOR="#ff0000"] a = (((int) p_str)- 48);[/COLOR]
        [COLOR="#ff0000"]if (temp_power == 9) {
          if (a == 2) {
            if (res<=147483647) {
              res+=( a * power(10, temp_power));
            }
            else {
                 return -1;[/COLOR]
            }
          }
          else {
              [COLOR="#ff0000"] if (a < 2) {
                     res+=( a * power(10, temp_power));[/COLOR]
               }
               else {
                    return -1;
               }
          }
        }
       [COLOR="#ff0000"] else {
          if (temp_power > 9) {
                         return -1;
          }
          else {
               res+=( a * power(10, temp_power));[/COLOR]
          }
        }        
      }
      else {
        return -1;
      }
      temp_power++;
    }
    return res;
  }
  else {
    return -1;
  }
}

int MyStr::power(int x, int n) {
  int res = 1;        
  for (int i=0; i<n; i++) {
    res*=x;
  }
  return res;
}



Обьясните ,пожайлуста, что выполняет выделенный в нем кусок.

Спасибо
41K
05 ноября 2008 года
phantomka
8 / / 22.09.2008
В этом примере перебор символов ведется с конца, чтобы начинать вычислять число с его последней цифры:

 
Код:
for (int i=(getLength(p_str)-2); i >= 0; i--)


строка

 
Код:
a = (((int) p_str)- 48);


переводит i-ый элемент строки из char в int:

 
Код:
((int) p_str)
- это код символа. коды символов цифр (0,1,2,...,9) соответственно (48,49, 50,...,57). Следовательно, чтобы получить цифру (перевести ее из формата символа в целый формат), нужно из кода символа вычесть 48.
Пересенная temp_power, обозначает степень числа 10. Результат вычисляется как :

 
Код:
res+=( a * power(10, temp_power));


(например: число 123 = 3*10^0 + 2*10^1 + 1*10^2, т.е. число в десятичной системе счисления - это сумма цифр числа, усможенных на 10 в степени разряда - 1)

Проверка
 
Код:
if (temp_power == 9)

нужна для того, чтобы не выйти за пределы значений числа типа int(от -214783648 до 214783647). Если цифру надо умножить на число 10^9, если цифра > 2, то мы выходим за этот предел, если равна 2 - то результат (к которому нужно прибавить цифру, умноженную на 10^9) не должен быть больше 147483647, иначе мы выходим за предел значений типа int, а вот если цифра > 1, то все в порядке, можем смело прибавлять :). Ну и, конечно, если степень числа 10 больше 9, то число, которое должно получиться выходит за тот самый предел, поэтому функция возвращает -1, что должно свидетельствовать об ошибке.
Я думаю, суть ты понял.
P.S. Прошу прощения, если написанное мной не слишком грамотно с точки зрения математики...:rolleyes:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог