1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Добрый день!!! Помогите пожалуйста решить такую задачу: Допустим дана такая строка (13121123123-123123123). Как извлечь из нее число до первого знака опереции (*,-,/,+) b и поместить его в другую строку. Конечно если знать что посли числа идет знак - то можно ипользовать эту реализацию.
function QWERTY(s : string):string;
var
i,p : byte;
sum : string;
begin
sum :='';
p := pos('-',s);
for i :=1to p-1do
sum := sum + s[i];
QWERTY := sum;
end;
begin
Writeln(Qwerty('100528749-300'));
end.
. А если я не знаю, какой знак операции идет после числа. Как поступать в такой ситуации?????!!
Malice, спасибо!!!Разобрался....Осталасась последняя ошибка..Она помойму связана с неправильным переводом числа (из стринг в реал).
Вот код программы. Проблемное место показано комментарием....Помогите пожалуйста. Мне во вторник нужно сдавать эту задачу!!!!!! (это калькулятор на базе польской записи);
const
max=1000;
type
STACK = record
top:integer;
elem:array [1..max] of char;
end;
STACK2 = record
top:integer;
elem:array [1..max] of real;
end;
var
s,s2:stack;
symv:char;
{---------------------------------------}procedure MakeNull (var S:STACK);
begin
S.top:=max + 1;
end;
{---------------------------------------}procedure MakeNullR (var S:STACK2);
begin
S.top:=max + 1;
end;
{---------------------------------------}function Empty (S:Stack):boolean;
beginif S.top > max then
Empty:=true
else
Empty:=false;
end;
{----------------------------------------}function Top(s : stack) : char;
beginif Empty(s) then exit
else
Top := s.elem[s.top];
end;
{---------------------------------------}procedure OutStack (var s:stack; var symv:char);
beginif Empty (s) then exit
elsebegin
symv:= s.elem[s.top];
s.top:=S.top + 1;
end;
end;
{--------------------------------------}procedure OutStackR (var s:stack2; var x:real);
beginif Empty (s2) then exit
elsebegin
x:= s.elem[s.top];
s.top:=S.top + 1;
end;
end;
{---------------------------------------}procedure Instack (var S:Stack;x:char);
beginif S.top = 1then exit
elsebegin
s.top:=s.top-1;
s.elem[s.top]:=x;
end;
end;
{---------------------------------------}procedure InstackR (var S:Stack2;x:real);
beginif S.top = 1then exit
elsebegin
s.top:=s.top-1;
s.elem[s.top]:=x;
end;
end;
{----------------------------------------}function Prior(f : char) : Byte;
begincase f of'+','-' : prior := 2;
'*','/' : prior := 3;
'(' , ')' : prior := 1;
else
prior := 0;
end;
end;
{----------------------------------------}procedure Dell(var s : stack);
beginif Empty(s) then exit
else
s.top := s.top + 1;
end;
{----------------------------------------}procedure opz (varout:string);
var
i: integer; inp:string;
t: boolean; out2:string;
begin
Makenull(s);
write ('INP = ');
readln (inp);
for i:=1to length (inp) docase inp[i] of'0'..'9': beginif (inp[i]>='0') and (inp[i]<='9') thenout:=out+inp[i];
end;
'+','-','*','/': beginout:=out+' ';
while Prior(Top(s))>= Prior(inp[i]) dobegin
outstack(s,symv);
out:=out+symv+' ';
end;
instack (s,inp[i]);
end;
'(' : InStack(s,inp[i]);
')' : beginwhile Prior(Top(s)) <> 1dobegin
OutStack(s,symv);
out:=out+' '+symv;
end;
Dell(s);
end;
end;
for i:=max downto s.top doout:=out+' '+s.elem[i];
writeln ('OPZ = ',out);
end;
{-----------------------------------------------------}procedure Result (out:string;var res:real);
var
error:integer;
num,x,y:real;
s3:stack2;
estr:string;
i:integer;
begin
MakeNullR(s3);
for i := 1to Length(out) docaseout[i] of'0'..'9' : beginif (out[i]>='0') and (out[i]<='9') thenbeginout:=out+out[i];
val(out,num,error);
InstackR(s3,num); {<--- TUTA GEMOROY}end;
end;
' ': begin estr:=estr+out[i]; end;
'+': begin
OutStackR(s3,y);
OutStackR(s3,x);
res:=x+y;
end;
end;
writeln('mass:');
for i:=max downto s3.top do
writeln(s3.elem[i]);
writeln('----------');
writeln('RES = ',res);
writeln('----------');
end;
var
outp,inp:string; res:real;
begin
OPZ (outp);
Result(outp,res);
readln;
end.
Maximka, ты опять неверно пытаешься делать... Смотри внимательно:
for i := 1to Length(out) docaseout[i] of'0'..'9' : beginif (out[i]>='0') and (out[i]<='9') thenbeginout:=out+out[i];
val(out,num,error);
InstackR(s3,num); { <--- Здесь ! }end;
end;
...
Если строка будет '123+234', сколько чисел у тебя будут занесены в стек? У тебя заносятся ЦИФРЫ! А это не нужно, надо занести именно числа... Я тебе уже говорил об этом. Кстати, зачем новую тему создал? Это же продолжение твоей предыдущей темы про "Польскую запись"...
Я считываю строку до первого пробела и заношу результат в другую строку(out).В этой строке находятся только цифры, соответственно всю строку можно перевести в целое число (real),что я и делаю.В переменной num хранится число, я его переношу в стек S3. И так далее... Я никак не пойму почему в стек попадает несколько раз, только первое число?..Мне очень нужна ваша помощь...Помогите пожалуйста. Это последняя задача, которую мне осталось сдать...
Вроде исправил...Но один баг остался...Выражения вида (235674234-2565677) считаются на ура. А стоит ввести (235674234-2565677)-234. Результат почемуто неправильный. Помогите ПОЖАЛУЙСТА!!!!!!!!!
const
max=1000;
type
STACK = record
top:integer;
elem:array [1..max] of char;
end;
STACK2 = record
top:integer;
elem:array [1..max] of real;
end;
var
s,s2:stack;
symv:char;
{---------------------------------------}procedure MakeNull (var S:STACK);
begin
S.top:=max + 1;
end;
{---------------------------------------}procedure MakeNullR (var S:STACK2);
begin
S.top:=max + 1;
end;
{---------------------------------------}function Empty (S:Stack):boolean;
beginif S.top > max then
Empty:=true
else
Empty:=false;
end;
{----------------------------------------}function Top(s : stack) : char;
beginif Empty(s) then exit
else
Top := s.elem[s.top];
end;
{---------------------------------------}procedure OutStack (var s:stack; var symv:char);
beginif Empty (s) then exit
elsebegin
symv:= s.elem[s.top];
s.top:=S.top + 1;
end;
end;
{--------------------------------------}procedure OutStackR (var s:stack2; var x:real);
beginif Empty (s2) then exit
elsebegin
x:= s.elem[s.top];
s.top:=S.top + 1;
end;
end;
{---------------------------------------}procedure Instack (var S:Stack;x:char);
beginif S.top = 1then exit
elsebegin
s.top:=s.top-1;
s.elem[s.top]:=x;
end ;
end;
{---------------------------------------}procedure InstackR (var S:Stack2;x:real);
beginif S.top = 1then exit
elsebegin
s.top:=s.top-1;
s.elem[s.top]:=x;
end ;
end;
{----------------------------------------}function Prior(f : char) : Byte;
begincase f of'+','-' : prior := 2;
'*','/' : prior := 3;
'(' , ')' : prior := 1;
else
prior := 0;
end;
end;
{----------------------------------------}procedure Dell(var s : stack);
beginif Empty(s) then exit
else
s.top := s.top + 1;
end;
{----------------------------------------}procedure opz (varout:string);
var
i: integer; inp:string;
t: boolean; out2:string;
begin
Makenull(s);
write ('INP = ');
readln (inp);
for i:=1to length (inp) docase inp[i] of'0'..'9': beginif (inp[i]>='0') and (inp[i]<='9') thenout:=out+inp[i];
end;
'+','-','*','/': beginout:=out+' ';
while Prior(Top(s))>= Prior(inp[i]) dobegin
outstack(s,symv);
out:=out+symv+' ';
end;
instack (s,inp[i]);
end;
'(' : InStack(s,inp[i]);
')' : beginwhile Prior(Top(s)) <> 1dobegin
OutStack(s,symv);
out:=out+' '+symv;
end;
Dell(s);
end;
end;
for i:=max downto s.top doout:=out+' '+s.elem[i];
writeln ('OPZ = ',out);
end;
{-----------------------------------------------------}procedure Result (out:string ;var res:real);
var
error:integer;
num,x,y:real;
s3:stack2;
estr,out2:string;
i:integer;
begin
MakeNullR(s3);
for i := 1to Length(out) docaseout[i] of'0'..'9' : beginif (out[i]>='0') and (out[i]<='9') thenbegin
out2:=out2+out[i];
end;
end;
' ': begin
val(out2,num,error);
InstackR(s3,num);
out2:='';
end;
'+': begin
OutStackR(s3,y);
OutStackR(s3,x);
res:=x+y;
InStackR(s3,res);
end;
'-': begin
OutStackR(s3,y);
OutStackR(s3,x);
res:=x-y;
InStackR(s3,res);
end;
'*': begin
OutStackR(s3,y);
OutStackR(s3,x);
res:=x*y;
InStackR(s3,res);
end;
'/': begin
OutStackR(s3,y);
OutStackR(s3,x);
res:=x/y;
InStackR(s3,res);
end;
end;
writeln('mass:');
for i:=max downto s3.top do
writeln(s3.elem[i]);
writeln('----------');
writeln('RES = ',res);
writeln('----------');
end;
var
outp,inp:string; res:real;
begin
OPZ (outp);
Result(outp,res);
readln;
end.
Чего кричишь? Сам виноват. Ошибки то простые: В процедуре Result ты при встрече в строке пробела пытаешься засунуть в стек число. Это было бы логично, если бы пробелы стояли только после чисел, а ты их лепишь и после знаков и после скобок. Всязи с этим проще всего заменить блок в case out[i]
'0'..'9' : beginif (out[i]>='0') and (out[i]<='9') thenbegin
out2:=out2+out[i];
end;
end;
на
'0'..'9' : begin out2:='';
while (out[i] in ['0'..'9']) and (i<length(out)) dobegin
out2:=out2+out[i]; inc(i);
end; val(out2,num,error); dec(i);
InstackR(s3,num);
end;
Немного не корректно, но пойдет. ps: case с пробелом убрать вообще.