При программировании на Паскале иногда можно столкнуться с ошибками, которые кажутся неочевидными и трудноуловимыми. Одна из таких ошибок связана с суммированием цифр в строке, когда цикл начинается не с правильной инициализации. Рассмотрим пример, который был представлен в контексте:
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;
В этом примере автор пытается пройтись по строке num и сложить все цифры, которые в ней содержатся. Однако, результатом является -12, а не ожидаемый 32.
Причина ошибки
Ошибка заключается в том, что цикл начинается с i := 0, а не с i := 1. В Паскале строки хранятся в виде массива байтов, где первый элемент содержит длину строки. Таким образом, num[0] содержит значение 4 (длина строки 8888), что приводит к неверному результату после вычитания 48.
Как исправить ошибку
Чтобы исправить ошибку, нужно начать цикл с i := 1, чтобы обойти первый элемент строки, который содержит длину.
for i := 1 to length(num) do
Также стоит обратить внимание на способ преобразования символа в число. Вместо преобразования в Integer, можно использовать функцию Ord(), которая возвращает числовое значение символа. Более того, можно использовать Ord() для вычитания значения '0', чтобы получить числовую стоимость символа.
value := Ord(num[i]) - Ord('0');
Пример правильного решения
Вот правильный вариант кода, который суммирует цифры в строке:
procedure subRoutine1(num : string);
var
i : integer;
value : integer;
sum : integer;
begin
sum := 0;
for i := 1 to length(num) do
begin
value := Ord(num[i]) - Ord('0');
sum := sum + value;
end;
writeln(sum);
end;
Заключение
При программировании на Паскале важно помнить о том, как хранятся строки и как работать с ними. Начало цикла с i := 1 поможет избежать ошибки, связанной с первым элементом строки, который содержит длину. Использование функции Ord() также упрощает преобразование символов в числа.
В контексте рассмотрена ошибка в цикле Паскаля, связанная с неправильной инициализацией для суммирования цифр в строке.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS