a4me Posted March 28, 2010 Report Posted March 28, 2010 (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 pascalFi?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; 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 intrareFi?ierul de intrare expresie.in con?ine o singur? linie pe care este scris? expresia.Date de ie?ireFi?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 March 28, 2010 by a4me Quote
heezor Posted March 30, 2010 Report Posted March 30, 2010 (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 functionaDin pacate nu am putut sa il modific eu, sunt tare ocupat, sper ca ti-am fost de folos. Edited March 30, 2010 by heezor Quote
AlStar Posted March 30, 2010 Report Posted March 30, 2010 Asta e problema de la evaluare-edu.roTot la ea am ramas si eu.. Numa ca am cateva probleme cu adminii..si nu pot sa ma loghez:-" ca sa termin testul. Quote
a4me Posted March 30, 2010 Author Report Posted March 30, 2010 incerc sa o fac cum trebuie....o sa ma mai ajute si profi...pana la urma tot o fac...merci Quote
a4me Posted March 30, 2010 Author Report Posted March 30, 2010 dak ati putea sa o modificati...ca nu prea inteleg nimic din ea....ca nu prea am facut recursivitate la scoala Quote
a4me Posted March 30, 2010 Author Report Posted March 30, 2010 (edited) da add la dinamo_to_me_1948 daca vrei si imi explici pe mess plz Edited March 30, 2010 by a4me Quote