1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Подскажите пожалуйста как реализовать калькулятор с числами произвольной разрядности????? например
var s:string; begin s:=(2000-353)*164-(2222/234);
Польская запись вроде не подходит....Можно сделать массив строк, и забивать каждый элемент в эти строки...Но как потом проверять приоритетность действий ??????
Может польская и подходит, но я что-то не пойму как ее применить.... Допустим дана строка (3567-123), то по идее на выходе должно получиться: 3567123- Вот здесь у меня ступор. Как разделить два числа, чтобы они не сливались в одно. |3567|123|- Помогите пожалуйста!!!! вот пример моей проги (но она считает с числами от 1 до 9).
"(Показать/Скрыть)
{ Польская запись} Program Qwerty; { S - T - A - C - K} const Max = 100; Type TStack = record top : byte; elem : array[1..Max] of Char; end; TIntStack = record top : byte; elem : array[1..Max] of Integer; end; var s,vs: Tstack; symb : Char; virazh, str : String; tmp : TIntStack; procedure MakeNull(var st : Tstack); begin st.Top := Max + 1; end;
function IsEmpty(st : Tstack) : boolean; begin isEmpty := st.top > max; end;
procedure Del(var st : Tstack); begin if isEmpty(st) then exit else st.top := st.top + 1; end;
procedure InStack( var st : TStack;x : Char); begin if st.top = 1 then exit else begin st.top := st.top - 1; st.elem[st.top] := x;
end; end;
procedure OutStack(var st : TStack;var elem : char); begin if IsEmpty(st) then exit else begin elem := st.elem[st.top]; st.top := st.top +1; end; end;
function Top( st : Tstack) : char; begin if IsEmpty(st) then exit else Top := st.elem[st.top]; end; {-----------------------------------------} function IsEmptyI(st : TIntstack) : boolean; begin isEmptyI := st.top > max; end;
function TopI( st : TIntstack) : Integer; begin if IsEmptyI(st) then exit else TopI := st.elem[st.top]; end;
procedure MakeNullI(var st : TIntstack); begin st.Top := Max + 1; end;
procedure OutStackI(var st : TIntStack;var elem : Integer); begin if IsEmptyI(st) then exit else begin elem := st.elem[st.top]; st.top := st.top +1; end; end;
procedure InStackI( var st : TIntStack;x : Integer); begin if st.top = 1 then exit else begin st.top := st.top - 1; st.elem[st.top] := x;
end; end;
{ END S - T - A - C - K}
function Prior(f : char) : Byte; begin case f of '+' : prior := 2; '-' : prior := 2; '*' : prior := 3; '/' : prior := 3; '(' , ')' : prior := 1; else prior := 0; end; end;
procedure Norm2OPZ( vir : string); var i : integer; begin for i := 1 to Length(vir) do begin case vir[i] of '0'..'9': InStack(vs,vir[i]); '+','-','/','*' : begin while Prior(Top(s))>= Prior(vir[i]) do begin OutStack(s,symb); InStack(vs,symb); end; InStack(s,vir[i]); end;
'(' : InStack(s,vir[i]);
')' : begin while Prior(Top(s)) <> 1 do begin OutStack(s,symb); InStack(vs,symb); end; Del(s); end; end; {case} end;{for} for i := max downto vs.top do str := str + vs.elem[i]; for i := max downto s.top do str := str + s.elem[i]; writeln('OPZ=',str); end;{Norm2OPZ}
Procedure OPZ2Result(l : string); var x,y,r,i : Integer; begin MakeNull(s); Makenull(vs); MakenullI(tmp); for i := 1 to Length(str) do begin case str[i] of '0'..'9' : InStackI(tmp,ChrToInt(str[i])); '+' : begin OutStackI(tmp,y); OutStackI(tmp,x); r := x + y; InStackI(tmp,r); end;
'-' : begin OutStackI(tmp,y); OutStackI(tmp,x); r := x - y; InStackI(tmp,r); end;
'*' : begin OutStackI(tmp,y); OutStackI(tmp,x); r := x * y; InStackI(tmp,r); end;
'/' : begin OutStackI(tmp,y); OutStackI(tmp,x); r := x div y; InStackI(tmp,r); end; end;{case} end; Writeln(TopI(tmp)); end;{OPZ2Result} begin MakeNull(s); MakeNull(vs); Writeln('Vvedite virazhenie :' ); Readln(virazh); Norm2OPZ(virazh); OPZ2Result(str); Readln; end.