Jump to content
a4me

problema Pascal

Recommended Posts

Posted (edited)

care ma ajuta si pe mine cu o pb in pascla...imi tot bat capul cu ea si nu imi iese cum vreau io.....vreau sa imi spuneti daca aveti ceva idei de rezolvare in pascal

Fi?ierul expresie.in con?ine un ?ir de caractere format din cifre {0,1,2,3,4,5,6,7,8,9} ?i paranteze drepte deschise ?i închise. Se ?tie c? ?irul astfel citit reprezint? o codificare corect? a unei expresii aritmetice în care sunt utilizate doar opera?ia de adunare a numerelor ?i opera?ia de ridicare la p?trat (puterea a doua) a unui num?r. Un num?r scris între paranteze drepte reprezint? codificarea opera?iei de ridicare la p?trat, iar o secven?? de mai multe perechi de paranteze drepte reprezint? codificarea opera?iei de adunare a valorilor ob?inute în urma efectu?rii opera?iei de ridicare la p?trat a valorilor numerice dintre paranteze.

Scrie?i un program Pascal care:

a) con?ine defini?ia complet? a unui subprogram recursiv de calcul cu un singur parametru de tip ?ir de caractere ce memoreaz? codificarea corect? a unei expresii aritmetice ?i returneaz? valoarea expresiei;

B) cite?te ?irul de caractere din fi?ierul expresie.in, determin? valoarea numeric? ob?inut? în urma efectu?rii opera?iilor descrise mai sus ?i scrie aceast? valoare pe prima linie a fi?ierului expresie.out.

Date de intrare

Fi?ierul de intrare expresie.in con?ine o singur? linie pe care este scris? expresia.

Date de ie?ire

Fi?ierul de ie?ire expresie.out va con?ine pe prima linie valoarea numeric? ob?inut? în urma evalu?rii expresiei.

Restric?ii ?i preciz?ri

• expresia citit? este format? din cel mult 100 de caractere ;

• valorile numerice ce se vor ob?ine au cel mult 9 cifre ;

• fiecare cifr? este inclus? între paranteze drepte ;

• expresia este corect?.

Exemple:expresie.in...expresie.out....Explica?ie

[[2][4]][[3][2]]........569...............(2*2+4*4)2 +(3*3+2*2)2 = 400+169=569

[[[2]]]....................256...............((22)2)2

[[2][4]][3]..............409...............(2*2+4*4)2+32= 400+9=409

[3][2][5]................. 38 ...............3*3+2*2+5*5 = 9+4+25=38

Edited by a4me
Posted (edited)

Poti face usor cu forma poloneza, numai ca in cazul tau este mult mai simplu. Ca sa implementezi forma poloneza iti va trebui un arbore binar min-max heap. Sursa mea de pe infoarena. Numai ca ia doar 50 de puncte ca nu este rastrans, si atfel ia doar 50 de pct, astfel nu am operati in Log(N). E urat codul l-am scris anul trecut(eram intr-a a 8-a)

program Giga_software;
type rec = record
s:string[11];
v:longint;
end;

Type REF = ^NOD;
NOD = record
left,right:REF;
index:longint;
//s:string;
end;

var fin,fout:text;
nr1,nr2,i,j,n,m,vn,xn,paranteza:longint;
f:integer;
c:char;
root:REF;
x:array [1..1000000] of rec;
v:array [1..1000000] of string[11];
s:string;
{*-----------------------------------------*}
procedure introdu;
begin
inc(xn);
x[xn].s:=s;
x[xn].v:=paranteza+1000;
s:='';
end;
{*-----------------------------------------*}
procedure cauta(left,right:longint; var nod:ref);
var i,min,mini:longint;
begin
min:=maxint;
for i:=left to right do
if min >= x[i].v then
begin
min:=x[i].v;
mini:=i;
end;
if min = maxint then
begin
nod:=nil;
exit;
end;

new(NOD);
NOD^.index:=mini;
//NOD.s:=x[mini].s;
cauta(left,mini-1,NOD^.left);
cauta(mini+1,right,NOD^.Right);
end;
{*-----------------------------------------*}
procedure getNr(i:longint);
begin
dec(i);
while v[i] = '$' do dec(i);
val(v[i],nr2,f);
v[i]:='$';

dec(i);
while v[i] = '$' do dec(i);
val(v[i],nr1,f);
v[i]:='$';
end;
{*-----------------------------------------*}
procedure solutie(nod:ref);
begin
if nod^.left <> nil then solutie(nod^.left);
if nod^.right <> nil then solutie(nod^.right);
inc(vn);
v[vn]:=x[NOD^.index].s;
// write(fout,,' ');
end;
{*-----------------------------------------*}
begin
assign(fin,'evaluare.in'); reset(fin); assign(fout,'evaluare.out'); rewrite(fout);

vn:=0;
while not eoln(fin) do
begin
read(fin,c);
case c of
'+':begin
if s <> '' then introdu;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+1;
end;
'-':begin
if s <> '' then introdu
else
begin
s:='0';
introdu;
end;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+1;
end;
'*':begin
if s <> '' then introdu;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+10;
end;
'/':begin
if s <> '' then introdu;
inc(xn);
x[xn].s:=c;
x[xn].v:=paranteza+10;
end;
'(':begin
paranteza:=paranteza+100;
if s <> '' then introdu;
end;
')':begin
paranteza:=paranteza-100;
if s <> '' then introdu;
end;
else
begin
s:=s+c;
end;
end;
end;
if s <> '' then introdu;

cauta(1,xn,root);
vn:=0;
solutie(root);
for i:=1 to vn do
begin
if v[i] = '+' then
begin
getnr(i);
str(nr1+nr2,v[i]);
end;
if v[i] = '-' then
begin
getnr(i);
str(nr1-nr2,v[i]);
end;
if v[i] = '*' then
begin
getnr(i);
str(nr1*nr2,v[i]);
end;
if v[i] = '/' then
begin
getnr(i);
str(nr1 div nr2,v[i]);
end;
end;

writeln(fout,v[vn]);
close(fin); Close(fout);
end.

Trebuie doar sa stergi din cod(adica anumite operati, si sa adaugi ridicarea la patrat), si iti va functiona

Din pacate nu am putut sa il modific eu, sunt tare ocupat, sper ca ti-am fost de folos.

Edited by heezor

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...