Задача 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
- 546 reads