Pagini: 1 [2] 3   În jos
  Imprimă  
Ajutor Subiect: 006 Evaluarea unei expresii  (Citit de 33845 ori)
0 Utilizatori şi 2 Vizitatori pe acest subiect.
mimarcel
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #25 : Aprilie 05, 2009, 14:53:24 »

Cine imi poate spune, va rog, de ce nu imi compileaza corect sursa #294972  Read This!  Fighting? Acasa merge... si inca bine (cred).
http://infoarena.ro/job_detail/294972
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #26 : Aprilie 05, 2009, 16:40:55 »

Cred ca "operator" e cuvant rezervat, mai nou, in pascal. Incearca sa-i zici functiei "is_operator" sau ceva de genul.
Memorat
mimarcel
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 10



Vezi Profilul
« Răspunde #27 : Aprilie 06, 2009, 18:03:30 »

Cred ca "operator" e cuvant rezervat, mai nou, in pascal. Incearca sa-i zici functiei "is_operator" sau ceva de genul.
Da! Mersi pentru ajutor  Very Happy . Abia acum am  downloadat Free Pascalul si am observat; pana acum aveam un alt Pascal  Tongue. Acum mai ramane sa fac un program de 100 de pcte, am primit numai 90 deoarece am rezolvat problema fara sa ma uit peste rezolvarile date.
« Ultima modificare: Aprilie 26, 2009, 20:51:42 de către Moldovan Ilie Marcel » Memorat
vladtarniceru
De-al casei
***

Karma: 81
Deconectat Deconectat

Mesaje: 145



Vezi Profilul
« Răspunde #28 : Mai 01, 2010, 16:39:48 »

am si eu o intrebare:de cate ori se poate trece prin sir  Huh .sau mai exact care e complexitatea pentru aceasta problema
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #29 : Mai 01, 2010, 16:44:57 »

O(lungimea stringului). Poti sa parcurgi o singura data.
Memorat
barneystinson
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #30 : August 21, 2010, 13:59:01 »

foarte frumoasa sursa facuta de Lucian Boca Thumb up

LE:
intrebare:

y = eval( x, expr(lev+1), *p++ );

programul intra in
expr(lev+1) dupa ce ii trimite *p ca parametru lui eval (p ca parametru nu este incrementat si ca pointer (global) este incrementat)
sau
expr(lev+1) dupa ce ii trimite *p ca parametru lui eval (p ca parametru nu este incrementat  si nici ca variabila)
sau
expr(lev+1) inainte sa ii trimita *p ca parametru lui eval (deci p global nu este incrementat)

multumesc anticipat, sunt nou in ale pointerilor

LE2: mda nu imi dau seama deloc!... am facut niste surse in care sa testez si mai mult m am incurcat

LE3:
Cod:
int expr( int lev ){
char S[NN],*p=S,op[2][3]={"+-","*/"};

int eval( int a,int b, char op ){
switch ( op ) {
case '+' : return a+b;
case '-' : return a-b;
case '*' : return a*b;
case '/' : return a/b;
}
}

int expr( int lev ){
int x, y;

if( lev == LMAX ){
if( *p == '('){
++p, x = expr( 0 ) ,++p;
}
else {
for( x=0; *p>='0' && *p<='9'; p++ ){
x= x*10 + *p-'0';
}
}
}
else {
for( x=expr(lev+1) ; strchr(op[lev],*p) ; x=y){
y= eval(x , expr(lev+1), *p++);
}
}

return x;
}

pe linia unde y = eval(..) intra in expr fara ca *p sa fie incrementat. astfel in caz ca este  semn si paranteza ex (...+(...)  *p indica tot + si intra in eval unde ajunge dupa inca doua autochemari sa fie *p diferit de paranteza si sa intre in forul in care se creaza x dar acolo *p e diferit de [0,..,9] (pt ca a ramas la +) si x ramane  cu val 0 dupa care iese din toate si se termina programu fara sa termine de evaluat toata expresia

http://infoarena.ro/job_detail/479037?action=view-source


LE4: pentru testul 2
 "(296+(286+891+(82+179+358-(48)*(0/173))-(251)))"
programu meu returneaza 296, am mers cu debugu si am gasit problema (am scris mai sus) si nu stiu cum sa o rezolv...

si mai ciudat e ca imi da acelasi rezultat gresit si pe celalate surse care folosesc metoda recursiva. insa cand le trimit numai a mea e gresita...
si tot la solutiile care folosesc recursivitate (copiate din solutiile oficiale) primesc acest warring "evaluare.cpp:33: warning: control reaches end of non-void function" / are vreo legatura?

help va rog !
« Ultima modificare: August 22, 2010, 01:52:06 de către Barney » Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #31 : August 22, 2010, 00:37:40 »

Asta e sursa ta, am modificat doar citirea ( am folosit fgets in loc de gets , si am luat 100 ) : http://infoarena.ro/job_detail/479050?action=view-source, si faza cu warningul e ca programul nu "stie" ca acea functie ( int val ) o sa se "termine" vreodata, adica cum ai avea functia
Cod:
int abc ( int a ) {
    if ( a == 2 ) {
        return 0 ;
    }
}
Pe acest cod o sa primesti aceeasi eroare . De ce ? Pentru ca daca a este != 2 , programul nu returneaza nimic. Asa e si aici : Daca programul nu merge pe nici o ramura a lui case, atunci nu o sa returneze nimic, dar sigur o sa mearga pe o ramura, dar programul nu stie asta. Asa ca adaugi un return 0 la sfarsit si ar trebui sa mearga :
Cod:
int eval( int a,int b, char op ){
switch ( op ) {
case '+' : return a+b;
case '-' : return a-b;
case '*' : return a*b;
case '/' : return a/b;
}
       return 0 ;
}
« Ultima modificare: August 22, 2010, 01:17:30 de către Simoiu Robert » Memorat
barneystinson
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #32 : August 22, 2010, 01:27:10 »

ms frumos :hug:


2 chestii  daca ai poti sa la lamuresti..
care e diferenta dintre fgets (vad ca ii dai mai multi parametrii) si gets?
ce ar putea face ca sursa asta ( http://infoarena.ro/job_detail/185143?action=view-source ) sa dea reulztatul gresit pe calculatorul meu? 296 in loc de 1841 la testu 2 pe calculatoru meu...

Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #33 : August 22, 2010, 01:33:47 »

1. fgets ( S, MAX, stdin ) citeste primele MAX elemente din fisierul stdin ( sau fisier deschis cu FILE ) , in charul S. Fata de gets, el citeste si caracterul de sf. de linie , adica '\n'. S[strlen(S) - 1] o sa fie '\n', pe langa ce la gets acest caracter este ultimul caracter , adica acelasi cu S[strlen(S) - 2].
2. Nu prea inteleg exact ce vrei sa zici cu aia ...... [LE] Am observat si eu, ma uit sa vad ce are ....
« Ultima modificare: August 22, 2010, 01:39:10 de către Simoiu Robert » Memorat
barneystinson
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #34 : August 22, 2010, 01:48:36 »

si eu am updatat sursa mea cu modificarea pe care ai mentionat o si primesc acelasi rezutlat gresit... daca si tie iti face la fel inseamna ca e ceva dubios Smile

primesc acelasi rezultat gresit si pe sursele cu recurenta indirecta... ciudat nu?

1. fgets ( S, MAX, stdin ) citeste primele MAX elemente din fisierul stdin ( sau fisier deschis cu FILE ) , in charul S. Fata de gets, el citeste si caracterul de sf. de linie , adica '\n'. S[strlen(S) - 1] o sa fie '\n', pe langa ce la gets acest caracter este ultimul caracter , adica acelasi cu S[strlen(S) - 2].

greseala din programu meu nu avea legatura cu ultimu caracter... el se termina (ca si restu solutiilor cu recursivitate) dupa primu numar...
« Ultima modificare: August 22, 2010, 01:56:50 de către Barney » Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #35 : August 22, 2010, 01:57:25 »

Eu am luat 100 cu prima sursa oficiala ( ceva de genu am implementat si eu ) . Si aia imi merge si pe pc. In rest nu stiu ....
[LE] Toate sursele imi merg exceptand a doua sursa ( cea mai compacta ) a lui Cotizo. Si de aici rezulta si sursa data de tine, a lui Lucian. Cea cu arbore merge bine ....
« Ultima modificare: August 22, 2010, 16:31:21 de către Simoiu Robert » Memorat
barneystinson
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #36 : August 22, 2010, 20:19:28 »

mie continua sa imi dea gresit...  :/ chiar daca pe evaluator primeste 100
Memorat
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #37 : August 23, 2010, 07:27:54 »

mie continua sa imi dea gresit...  :/ chiar daca pe evaluator primeste 100
Ai pus enter dupa terminarea expresiei ?
App: citeste cu fgets, nu cu gets.
Citat din mesajul lui: SpiderMan
S[strlen(S) - 1] o sa fie '\n', pe langa ce la gets acest caracter este ultimul caracter , adica acelasi cu S[strlen(S) - 2].
Poate am inteles eu gresit, dar tu spui ca gets si fgets citesc caracterul '\n', dar il pun pe pozitii diferite ? Asta este gresit, gets nu concateneaza delimitatorul, pe cand fgets, da. Scuze daca am inteles eu prost.
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #38 : August 23, 2010, 09:20:53 »

Da, ai inteles gresit . Sa zicem ca avem stringul abcd, citit in S. Daca il citesti cu gets, o sa ai S[strlen(S)-1] = 'd' ( adica S[3] ) . Daca il citesti cu fgets, o sa ai S[strlen(S)-1] = '\n' ( adica S[4] ) . In rest, S[3] = S[3] ( dinainte ) si tot asa. Dar S[4] ( fgets ) != S[4] ( gets ) , adica '/0' != '\n' .
[LE] Am gasit o sursa pe ideea asta cu STL ( string ) si merge perfect. Nu stiu care poate fi problema , am tot cautat si nu am gasit nimic.
« Ultima modificare: August 23, 2010, 10:53:35 de către Simoiu Robert » Memorat
barneystinson
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #39 : August 23, 2010, 11:32:29 »

mie continua sa imi dea gresit...  :/ chiar daca pe evaluator primeste 100
Ai pus enter dupa terminarea expresiei ?
App: citeste cu fgets, nu cu gets.


pe sursa asta http://infoarena.ro/job_detail/479201?action=view-source iau 100 de puncte pentru ca am modificat citirea cu fgets. dar mie tot imi da gresit pe exemplu "(296+(286+891+(82+179+358-(48)*(0/173))-(251)))", poate si pe altele. nu inteleg, parca e zona crepusculara.... am pus si enter la sfarsitul expresiei (in fis de intrare) si da tot gresit. raman recunoscator daca imi emplica cineva misteru asta
Memorat
mathboy
Moderatori infoarena
Nu mai tace
*****

Karma: 150
Deconectat Deconectat

Mesaje: 259



Vezi Profilul
« Răspunde #40 : August 23, 2010, 11:41:59 »

Evaluarea se face sub linux. Pe windows compilatorul are bug-uri, etc. Tu ai linux ca sa iti dea cum e pe infoarena ? Smile
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #41 : August 23, 2010, 12:01:15 »

Nu are linux, dar nu pot sa inteleg cum de o sursa cu STL ( care e schimbat doar stringul, adica in loc de char e string ) merge ok ...
Memorat
barneystinson
Strain


Karma: -1
Deconectat Deconectat

Mesaje: 11



Vezi Profilul
« Răspunde #42 : August 23, 2010, 12:20:44 »

Evaluarea se face sub linux. Pe windows compilatorul are bug-uri, etc. Tu ai linux ca sa iti dea cum e pe infoarena ? Smile

nu am linux...
Memorat
SpiderMan
Nu mai tace
*****

Karma: -463
Deconectat Deconectat

Mesaje: 937



Vezi Profilul
« Răspunde #43 : August 23, 2010, 13:46:08 »

Nu exista compilator de linux pentru windows ?
Memorat
proxenetu
Strain


Karma: 6
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #44 : August 23, 2010, 15:32:23 »

Compilator de linux pt windows nu exista. Exista cel mult o portare a lui pe windows. Oricum, treaba nu tine de compilator ci de sistemul de operare. Pe windows newline este \r\n, pe linux e \n, de acolo problema.
Memorat
BitOne
Strain
*

Karma: -1
Deconectat Deconectat

Mesaje: 45



Vezi Profilul
« Răspunde #45 : August 23, 2010, 16:47:21 »

Pe windows compilatorul are bug-uri, etc.
Ai zis o prostie, compilatoarele sunt aceleasi pentru ambele os-uri gcc, respectiv g++. Se comporta la fel pe ambele os-uri.
Incearca citirea cu stream-uri Confused? mie imi merge perfect orice ii fac...
Folosesti cumva MinGW Developer Studio ?
« Ultima modificare: August 23, 2010, 17:05:57 de către SAlexandru » Memorat
proxenetu
Strain


Karma: 6
Deconectat Deconectat

Mesaje: 4



Vezi Profilul
« Răspunde #46 : August 23, 2010, 17:05:55 »

Tocmai ti-am explicat mai sus ca difera in functie de sistem. Incearca tu pe orice versiune a compilatorului mingw (portul gcc pe windows) sa afisezi cu %lld de exemplu. Plus ca difera chiar de la distributie de linux la distributie de linux.
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #47 : August 23, 2010, 17:22:54 »

Pe windows compilatorul are bug-uri, etc.
Ai zis o prostie, compilatoarele sunt aceleasi pentru ambele os-uri gcc, respectiv g++. Se comporta la fel pe ambele os-uri.
Incearca citirea cu stream-uri Confused? mie imi merge perfect orice ii fac...
Folosesti cumva MinGW Developer Studio ?

Mingw, din cate stiu e versiunea gcc pt windows. Teoretic ar trebui sa mearga exact ce merge si pe linux. Daca nu merge, inseamna ca e bug (presupun). Corect, cu streamuri folosesc si eu cand trebuie sa afisez long long sau alte chestii, si sunt pe windows (cam rar, ma rog). Vad ca deviaza rau topicu' in topic de compilatoare.
Memorat
tryfy
Strain


Karma: 0
Deconectat Deconectat

Mesaje: 1



Vezi Profilul
« Răspunde #48 : Martie 16, 2011, 23:21:42 »

daca trebuie sa introduc si functia sin   in expresie   de ex sa calculeze  sin(5)+1+5....
care ma poate ajuta?
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #49 : Martie 17, 2011, 02:10:50 »

Trebuie sa adaugi, cu o prioritate mai mare decat inmultirea, operatia de aplicare a unei functii asupra unei expresii. Incearca sa rezolvi problema apel mai intai.
Memorat
Pagini: 1 [2] 3   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines