Pascal Урок 17 Задача 9
Primary tabs
Задана последовательность символов, имеющая следующий вид: p1q1p2q2p3...qn–1pn , где pi — цифра, а qi — знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики.
Входные данные: На вход программе подается строка указанного вида, состоящая не более чем из 9 цифр, разделенных символами арифметических операций.
Выходные данные: Выведите значение арифметического выражения.
Примеры:
Входные данные Результат
5+2 7
1-2*5+2 -7
5*6+7-3*2+11 42
5*6+7-3*2*3+11 30
program U17Z9; type a=array[1..7] of integer; b=array[1..6] of char; var l:a; t:b; i,d,f,c,m: integer; s:string; function Sieve(s:string; var t:b; var m:integer):a;// функция распределения чисел и знаков в массивы из string var p:integer; //счетчик массива знаков var w:string; begin d:=1; c:=1; p:=1; for i:= 1 to length(s) do begin if (s[i]>='0')and(s[i]<='9') then // выделяем цифры в массив begin w:=w+s[i]; val(w,f); // функция val преобразует и сразу записывает в масив integer l[d]:=f; c:=p; end else if (s[i]<>' ') then begin t[c]:=s[i]; d:=d+1; w:=''; inc(p); // счетчик массива знаков end; end; m:=d; // m количество чисел в массиве result:=l end; procedure MulNum(var l:a; var t:b); // процедура для умножения var h:integer; //положения знака в массиве с которого делаем сдвиг begin c:=0; while (c<(m)) do // цикл для поиска умножения begin c:=c+1; if (t[c]='*') then // если нашли умножение begin d:=c; h:=c; l[d]:=l[d]*l[d+1]; //умножаем текущее число с следующим for d:= (c+1) to m do //сдвиг в масииве чисел begin l[d]:=l[d+1]; end; for c:= h to (m-1) do //сдвиг в масиве знаков begin t[c]:=t[c+1]; end; c:=1; end; end; end; procedure AddSub(l:a); //процедура нахождения суммы/разности цифр var n:integer; //сумма/разность произведения begin d:=1; c:=1; if (t[c]='+') then //находим первую сумму/разность begin n:=l[d]+l[d+1]; d:=d+1; c:=c+1 end else begin n:=l[d]-l[d+1]; d:=d+1; c:=c+1; end; while (d<m) do //продолжение следующих операций с предыдущей суммой и цифрами begin if (t[c]='+') then //если не сумма, значит разность begin n:=n+l[d+1]; c:=c+1; d:=d+1; end else begin n:=n-l[d+1]; c:=c+1; d:=d+1; end; end; writeln(n); end; begin readln(s); Sieve(s,t,m); MulNum(l,t); AddSub(l); readln(); end.
- Log in to post comments
- 3589 reads
vedro-compota
Sat, 08/15/2020 - 20:34
Permalink
замечание:
замечание:
-- переделать на процедуру
_____________
матфак вгу и остальная классика =)
JimATI
Sat, 10/03/2020 - 20:23
Permalink
Доработка программы
vedro-compota
Sat, 09/12/2020 - 20:28
Permalink
Избавиться от использования
Избавиться от использования глобальных переменных в процедурах.
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 09/09/2020 - 19:50
Permalink
while (c<(m)) do // цикл для
-- вызывает сомнения сборс переменной "c"
_____________
матфак вгу и остальная классика =)
JimATI
Sat, 10/03/2020 - 20:21
Permalink
Добавлены комментарии и замер времени.