Задача 10 Урок 18
Primary tabs
Задача 10 Урок 18 На вход вашей программы подается строка вида:
5 + 6 -34 + 56 - 7 + 2
("сколько угодно" чисел с операциями суммы и разности в любом порядке). Вычислите результат (пробелов между символом операции и числом может и не быть)
var s, n : string; arifm : string; one,two,w,i : integer; x,y:integer; recor,otvet:integer; procedure searchone(s : string; var n : string; var x1 : integer; var y1 : integer; var w : integer); var intChislo, Code : Integer; i,i2:integer; flag:boolean; x1s,y1s:string; begin flag:=false; n:=''; y1s:=''; for i:=1 to length(s) do begin val(s[i], intChislo, Code); // в подпрог для поиска мат операции и для чисел if not (y1s='') and ((s[i]='+') or (s[i]='-')) then // если не пусто и есть + или -, то begin w:=i; // присваивание нужно для след подпрог чтобы знать с чего стартовать break; // выходим из цикла ( после сложения или вычитания первых двух чисел) end; if (s[i]='+') or (s[i]='-') and (flag=false) then // если +/- и флаг спущен, то begin n:=s[i]; // запись flag:= true; // флаг поднят end; if (code=0) and (flag=false) then // если код 0(цифра) и флаг спущен, то x1s:=x1s+s[i]; // запись в эту переменную if (code=0) and (flag=true) then // если код 0(цифра) и флаг поднят, то y1s:=y1s+s[i]; // запись в эту переменную end; val (x1s, intChislo, Code); // в подпрг для преобразования x1:=intChislo; // запись преобр числа val (y1s, intChislo, Code); // в подпрг для преобразования y1:=intChislo; // запись преобр числа end; procedure calcularest(s : string; var recor : integer; var w : integer); var intChislo, Code : Integer; x1s,y1s:string; n:string; x1,i:integer; begin n:=''; x1s:=''; for i:=w to length(s) do begin if i=0 then break; // если расчёт из двух чисел val(s[i], intChislo, Code); // в подпрог для поиска мат операции и для чисел if (n='') and ((s[i]='+') or (s[i]='-')) then // для первой мат операции n:=s[i]; if (code=0) then // если код 0(цифра) x1s:=x1s+s[i]; // запись в эту переменную if not (x1s='') and ((s[i]='+') or (s[i]='-')) or (i=length(s)) then // если не пусто и +/- или цикл завершается begin val(x1s, intChislo, Code); // в подпрог для преобраз для чисел x1:=intChislo; // запись в переменную if n='+' then begin recor:=recor+x1; x1s:=''; end; if n='-' then begin recor:=recor-x1; x1s:=''; end; if ((s[i]='+') or (s[i]='-')) then // для последующих поисков мат. операции n:=s[i]; end; end; end; begin n:=''; writeln('enter the line'); readln(s); searchone(s, n,x,y,w); // в подпрог для поиска первого арифм выражения и вычесления его arifm:=n; // после того как подпрог searchone прервалась по ссылки записываем в переменную one:=x; // после того как подпрог searchone прервалась по ссылки записываем в переменную two:=y; // после того как подпрог searchone прервалась по ссылки записываем в переменную i:=w; // после того как подпрог searchone прервалась по ссылки записываем в переменную if arifm='+' then recor:=one+two; if arifm='-' then recor:=one-two; calcularest(s,recor,i); // в подпрог для остального расчёта otvet:=recor; // после того как подпрог calcularest прервалась по ссылки записываем в переменную writeln('answer',' ',otvet); end.
Вывод консоли:
enter the line 5 + 6 -34 + 56 - 7 + 2 answer 28
- Log in to post comments
- 311 reads