Суммирование числовой символьной строки - PullRequest
2 голосов
/ 01 февраля 2010

У меня проблема с моим программным заданием, когда я циклически перебираю строку и суммирую целочисленное значение символа. Как гласит следующий код. Теперь я передаю строку в эту подпрограмму. Например, учитывая

num := '8888';

Ожидаемый результат будет

32

Результирующий вывод

-12

Я использую fpc pascal compiler в среде Linux. Любое понимание того, почему это происходит, будет высоко оценено

   procedure subRoutine1(num : string);
   var
     i : byte;
     value : integer;
     sum : integer;
   begin
     sum := 0;
     for i := 0 to length(num) do
     begin
       value := Integer(num[i]) - 48;
       sum := sum + value;
     end;
     writeln(sum);
   end; 

1 Ответ

3 голосов
/ 01 февраля 2010

Ошибка в том, что цикл должен начинаться с 1, а не с 0.

for i := 0 to length(num) do...
should be
for i := 1 to length(num) do

Строки Паскаля имеют первый байт, содержащий длину строки.
другими словами, num [0] содержит значение 4 (длина строки 4 символа), которое дает -44 после вычитания 48, отбрасывая ожидаемое значение суммы.

Итак, ваша программа выполняет итерации по следующим значениям

  4  -->  -48   =  -44
 56  -->  -48   =  8
 56  -->  -48   =  8
 56  -->  -48   =  8
 56  -->  -48   =  8
            sum = -12

Также, как предложено в других ответах, используйте функцию Ord (), а не приведение к Integer, то есть используйте

   value := Ord(num[i]) - 48;
or even better,
  value := Ord(num[i]) - Ord('0');
...