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
- 4201 reads
vedro-compota
Sat, 08/15/2020 - 20:34
Permalink
замечание:
замечание:
-- переделать на процедуру
_____________
матфак вгу и остальная классика =)
JimATI
Sat, 10/03/2020 - 20:23
Permalink
Доработка программы
program U17Z9; type a=array[1..7] of integer; b=array[1..6] of char; var l:a; t:b; m:integer; s:string; procedure Sieve(s:string; var t:b; var m:integer);// процедура распределения чисел и знаков в массивы из string var p,c,d,f,i:integer; //счетчик массива знаков 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 количество чисел в массиве end; procedure MulNum(var l:a; var t:b; m:integer); // процедура для умножения var h,c,d: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; function AddSub(l:a;t:b):integer; //функция нахождения суммы/разности цифр var n,d,c: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; result:=n; end; begin readln(s); Sieve(s,t,m); MulNum(l,t,m); writeln(AddSub(l,t)); readln(); end.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
Добавлены комментарии и замер времени.
uses DateUtils, sysutils; type a=array[1..30000] of integer; b=array[1..29999] of char; var FromTime, ToTime: TDateTime; MilliSecondsDiff: Integer; s:string; procedure Sieve(s:string);// процедура распределения чисел и знаков в массивы из string var p,c,d,f,i,n,h,m:integer; //счетчик массива знаков w:string; l:a; t:b; 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 количество чисел в массиве c:=0; // обнуляем индекс массива знаков while (c<(m)) do // цикл для поиска умножения begin c:=c+1; //счетчик while 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; //а в массиве чисел произведения чисел ************************** d:=1; //1 в индексе массива чисел c:=1; //1 в индексе массива знаков if (t[c]='+') then //находим первую сумму/разность begin // если сумма то плюсуем n:=l[d]+l[d+1];//n - сумма/разность d:=d+1; //увеличиваем индекс в массиве чисел c:=c+1 //увеличиваем индекс в массиве знаков end else //а если разность отнимаем begin n:=l[d]-l[d+1]; //n - сумма/разность d:=d+1; //увеличиваем индекс в массиве чисел c:=c+1; //увеличиваем индекс в массиве знаков end; while (d<m) do //продолжение следующих операций с предыдущей суммой и цифрами begin if (t[c]='+') then //если не сумма, значит разность begin n:=n+l[d+1];//n-значение + следующее число c:=c+1; //увеличиваем индекс в массиве знаков d:=d+1; //увеличиваем индекс в массиве чисел end else begin n:=n-l[d+1];//n-значение - следующее число c:=c+1; //увеличиваем индекс в массиве знаков d:=d+1; //увеличиваем индекс в массиве чисел end; end; writeln(n); //конечное число**************************************** end; begin s:='5+92-15+75*53+76-21+5+92-15+75*53+76-21+5+92-15+75*53+76-21-15+75*53+76-15+75*53+76-15+75*53+76-15+75*53+76'; FromTime := Now(); Sieve(s); readln(); ToTime := Now(); MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime); writeln('Vremya: ', MilliSecondsDiff); readln(); end.