Обратная польская запись - Pascal ABC
Формулировка задачи:
Требуется преобразовать выражение в обратную польскую запись и посчитать.
Программа вроде как почти готова, но не считаются выражения с унарным минусом. Как это исправить?
Решение задачи: «Обратная польская запись»
textual
Листинг программы
uses crt; const n=50; type mas=array[1..n] of string; var mag,vixp:mas; f,fv:string; smv:char; rez:real; ch,L,i,j, k:integer; begin ch:=0; write('Введите формулу: '); readln(f); If Copy(f, 1, 1) ='-' Then f:=concat('0',f); L:=Length(f); j:=0; k:=0; For i:=1 To L do begin smv:=f[i]; If (smv >='0') And (smv <='9') Then begin ch:= ch * 10 +StrToInt(smv); If i = L Then begin k:= k + 1; vixp[k]:= IntToStr(ch); end; If (i < L) And ((Copy(f, i + 1, 1) < '0') Or (Copy(f, i + 1, 1) > '9')) Then begin k:= k + 1; vixp[k]:= IntToStr(ch); end; end Else If smv = '(' Then begin j:= j + 1; mag[j]:= smv; ch:= 0; end Else If smv = ')' Then begin while j=j Do begin If j = 0 Then begin Writeln(concat('Некорректная формула! ',f,' Нажмите Enter')); Readln; halt; End; If mag[j] = '(' Then begin j:= j - 1; ch:= 0; break; End; k:= k + 1; vixp[k]:= mag[j]; j:= j - 1; end; end Else If (smv = '+') Or (smv = '-') Then begin While j=j Do begin If j = 0 Then begin j:= j + 1; mag[j]:= smv; ch:= 0; break; End; If mag[j] = '(' Then begin j:= j + 1; mag[j]:= smv; ch:= 0; break; End; k:= k + 1; vixp[k]:= mag[j]; j:= j - 1; end; end Else If (smv = '*') Or (smv = '/') Then begin while j=j Do begin If j = 0 Then begin j:= j + 1; mag[j]:= smv; ch:= 0; break; End; If (mag[j] = '(') Or (mag[j] = '+') Or (mag[j] = '-') Then begin j:= j + 1; mag[j]:= smv; ch:= 0; break; End; k:= k + 1; vixp[k]:= mag[j]; j:= j - 1; end; end Else begin fv:=IntToStr(i); writeln(concat('Недопустимый символ ',fv,' в формуле! ',f,' Нажмите Enter')); readln; halt; End; End; If j <> 0 Then begin For i:= j Downto 1 Do begin k:= k + 1; vixp[k]:= mag[i]; end; End; fv:= ''; For i:= 1 To k do fv:= concat(fv,vixp[i],' '); j:= 0; For i:= 1 To k do Begin If (vixp[i] <> '+') And (vixp[i] <> '-') And (vixp[i] <> '*') And (vixp[i] <> '/') Then begin j:= j + 1; mag[j]:= vixp[i]; end Else begin If j = 1 Then begin Writeln(concat('Некорректная формула! ',f,' Нажмите Enter')); Readln; halt; End; End; If vixp[i] = '+' Then begin mag[j - 1]:= FloatToStr(StrToFloat(mag[j - 1]) + StrToFloat(mag[j])); j:= j - 1; End; If vixp[i] = '-' Then begin mag[j - 1]:= FloatToStr(StrToFloat(mag[j - 1]) - StrToFloat(mag[j])); j:= j - 1; End; If vixp[i] = '*' Then begin mag[j - 1]:= FloatToStr(StrToFloat(mag[j - 1]) * StrToFloat(mag[j])); j:= j - 1; End; If vixp[i] = '/' Then begin mag[j - 1]:= FloatToStr(StrToFloat(mag[j - 1]) / StrToFloat(mag[j])); j:= j - 1; End; If vixp[i] = '(' Then begin Writeln(concat('Некорректная формула! ',f,' Нажмите Enter')); Readln; halt; End; end; rez:= StrToFloat(mag[1]); Writeln('Обратная польская нотация: ',fv); Writeln('Результат: ', FloatToStr(rez)); writeln; Write('Нажмите Enter'); readln; end.
Объяснение кода листинга программы
Этот код написан на языке Pascal ABC и выполняет обратную польскую запись вводимой пользователем формулы. Переменные и их значения:
- ch: переменная типа char, которая представляет собой символ, введенный пользователем.
- L: переменная типа integer, которая содержит длину введенной формулы.
- i, j, k: переменные типа integer, которые используются для индексации массива mag и vixp.
- mag: массив типа mas, который содержит символы введенной формулы.
- vixp: массив типа mas, который содержит преобразованную в десятичное число обратную польскую запись введенной формулы.
- f, fv: переменные типа string, которые содержат введенную пользователем формулу и результат ее преобразования в обратную польскую запись соответственно.
- rez: переменная типа real, которая содержит результат преобразования введенной формулы в десятичное число. Код начинается с объявления переменных и ввода формулы от пользователя. Затем он проверяет, является ли введенный символ '-', и если это так, то преобразует его в десятичное число и добавляет его к предыдущему значению. Если введенный символ не равен '-', то он преобразуется в десятичное число и добавляется к предыдущему значению, если текущий символ больше предыдущего. Если текущий символ меньше предыдущего, то он преобразуется в десятичное число и вычитается из предыдущего значения. Если введенный символ равен '(', то код выводит сообщение об ошибке. Затем код преобразует введенную формулу в обратную польскую запись, используя массив mag и переменные i, j и k. Он также вычисляет результат преобразования введенной формулы в десятичное число и выводит его на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д