Вычислить значение выражения в строке - Free Pascal
Формулировка задачи:
В заданной строке, представляющей собой выражение, содержащее числа и знаки "+" и "-", вычислить значение выражения.
Решил начать с того, чтобы во введенной строке все цифры до знака плюс или минус поместить в отдельную строку, но и тут FreePascal выдает ошибку SIGSEGV на 8 строке. Помогите, пожалуйста, разобраться хотя бы с ошибкой конкретно в самом начале.
var str1,str2,str3: string;
st1,st2,st3: integer;
i: byte;
begin
readln(str1);
i:=1;
repeat
str2[i]:=str1[i];
inc(i);
until (str1[i]='+') or (str1[i]='-');
delete(str1,1,i-1);
val(str2,st1);
writeln(st1);
readln
end.Решение задачи: «Вычислить значение выражения в строке»
textual
Листинг программы
var s:string; i,k,i1,z,code:integer; j:string; begin readln(s); s:='0'+s; i:=0; j:=''; z:=1; for k:=1 to length(s) do begin if (s[k]='+')or(s[k]='-') then begin val(j,i1,code); i:=i+z*i1; j:=''; if s[k]='+' then z:=1 else z:=-1; end else if k=length(s) then begin j:=j+s[k]; val(j,i1,code); i:=i+z*i1 end else j:=j+s[k] end; delete(s,1,1); writeln(s,'=',i) end.
Объяснение кода листинга программы
- Объявлены переменные: s (строка), i, k, i1, z, code (целое число), j (строка).
- Считывается строка s.
- К строке s добавляется ноль в начале.
- Устанавливаются начальные значения: i = 0, j = '', z = 1.
- Происходит цикл по символам строки s.
- Если текущий символ равен + или -, то выполняется следующее: а) считывается значение выражения в переменной j, а также значения i1 и code; б) к i прибавляется (z * i1); в) z меняется на 1 или -1 в зависимости от того, был ли знак + или -; г) j очищается.
- Если текущий символ не равен + или -, то выполняется следующее: а) если это последний символ в строке, то к j добавляется текущий символ, считывается значение выражения в переменной i1 и code, и к i прибавляется (z * i1); б) иначе j очищается, а к нему добавляется текущий символ.
- Из строки s удаляется первый символ.
- Выводится значение i и строка s.