RuZleBIFf Skrevet 16. august 2007 Del Skrevet 16. august 2007 God dag. Har fått en oppgave på skolen om å lage en kalkulator som skal regne riktig med at 2+3*5 = 17 og ikke 25. sliter litt med oppstarten her så lurte egentlig bare om noen har noen forslag til hvordan jeg kan gjøre dette!? Å lage en kalkulator i seg selv er ikke noe problem, men det med at gang og dele, ifølge reglementet, skal gjøres først gjør ting litt vanskeligere. Man skal også ha mulighet til å gange og dele flere ganger forresten Er altså ikke på jakt etter en ferdig løsning bare et lite "spark bak" Mvh. Sindre Lenke til kommentar
dostojevski Skrevet 16. august 2007 Del Skrevet 16. august 2007 Hint: Operatorprioritet. Lenke til kommentar
Jaffe Skrevet 16. august 2007 Del Skrevet 16. august 2007 (endret) Hint: Operatorprioritet. 9295329[/snapback] Hvordan er dette et spark bak? EDIT: Trådstarter er jo klar over problemet, han sier det til og med indirekte når han sier "... skal regne riktig med at 2+3*5 = 17 og ikke 25." Han lurer vel på hvordan det kan gjøres. Endret 16. august 2007 av Jaffe Lenke til kommentar
RuZleBIFf Skrevet 16. august 2007 Forfatter Del Skrevet 16. august 2007 I topicen skriver jeg også det med vektighet, så jeg er klar over det ja Lurer altså på hvordan jeg skal gjøre dette med å få kalkulatoren til FØRST regne ut 3*5 og DERETTER svar+2 En kammerat vurderte noe sånnt som å putte alt inn i et array og deretter lese ut av dette og sette sammen regnestykket på riktig måte. Men jeg syntes det hørest forferdelig tungvindt ut og ikke at det blir helt riktig heller.. Jah.. Et tips i riktig retning eller et forslag på hvordan løse problemt hadde vært kjekt Lenke til kommentar
Dead_Rabbit Skrevet 16. august 2007 Del Skrevet 16. august 2007 Hvis du bare leser inn all input først og så regner det på vanlig måte bør da dette gå fint..? Multiplikasjon og divisjon har jo høyere prioritet enn addisjon og subtraksjon i C++ også. .. Mulig jeg misforstod litt. Lenke til kommentar
Jaffe Skrevet 16. august 2007 Del Skrevet 16. august 2007 Han skal jo skrive en kalkulator selv. Jeg ser ikke helt hvordan operatørpresedensen i C++ har noe å si da (med mindre C++ på mystisk vis kan kjøre noe som er list inn i et array? ...) Lenke til kommentar
Dead_Rabbit Skrevet 17. august 2007 Del Skrevet 17. august 2007 http://www.sgi.com/tech/stl/transform.html Lenke til kommentar
Jaffe Skrevet 18. august 2007 Del Skrevet 18. august 2007 http://www.sgi.com/tech/stl/transform.html 9301544[/snapback] Jeg ser ikke helt hvordan dette hjelper trådstarter? Kan du komme med et eksempel? Lenke til kommentar
Dead_Rabbit Skrevet 18. august 2007 Del Skrevet 18. august 2007 Den kan være nyttig hvis trådstarter velger å lese inn inputen til en array. Lenke til kommentar
Jaffe Skrevet 18. august 2007 Del Skrevet 18. august 2007 Jeg ser fortsatt ikke hvordan det skal gå. Hvordan skal dataene ligge i arrayet, og hvordan hjelper egentlig transform? Inndataene må fortsatt gjennomgås for å finne hva som skal gjøres først (* og /) osv., som egentlig bringer oss tilbake til utgangspunktet. transform hadde kanskje egnet seg bedre om det bare var én operasjon som skulle utføres på en rekke tall. Lenke til kommentar
Flin Skrevet 18. august 2007 Del Skrevet 18. august 2007 Jeg tenkte at det kunne vært fint for meg å prøve dette også, for å lære litt, men for meg funker det med en gang. Hvis du fortsatt sliter kan må du jo bare se på problemet rent matematisk da. y = a+(b*c) Bruk det formatet på formlen din og du får, med a = 2, b = 3 og c = 5, 17 som svar. Lenke til kommentar
Dead_Rabbit Skrevet 18. august 2007 Del Skrevet 18. august 2007 Jaffe: Jeg vet ikke helt hva du venter at jeg skal svare, men transform var et forslag -- ikke et svar. Trådstarter har gitt uttrykk for at han ønsker å løse oppgaven selv, så det var bare et tips til noe han muligens kunne bruke hvis han valgte å prøve å løse det med arrays. Lenke til kommentar
Manfred Skrevet 18. august 2007 Del Skrevet 18. august 2007 (endret) Den beste løsningen er vel strengt tatt å bygge opp et binært tre. Endret 18. august 2007 av Manfred Lenke til kommentar
Emancipate Skrevet 19. august 2007 Del Skrevet 19. august 2007 Hvis det er noe du IKKE trenger så er det å bedrive wrestling med trær. Søk på "recursive descent parser". Lenke til kommentar
Manfred Skrevet 19. august 2007 Del Skrevet 19. august 2007 Jeg mener den absolutt beste løsningen på et slikt problem er å opprette et binært tre over utregningen. Jeg mener dette er kjappest, og det "riktigste" måten å løse det på. Wrestling? Binære trær er da ingen heksekunst. Red/black og slikt er værre, men de binære er da ikke noe hokus pokus. Lenke til kommentar
Frysning Skrevet 19. august 2007 Del Skrevet 19. august 2007 Binary_tree@Wikipedia! Lenke til kommentar
Emancipate Skrevet 19. august 2007 Del Skrevet 19. august 2007 Jeg mener den absolutt beste løsningen på et slikt problem er å opprette et binært tre over utregningen.Javel, jeg mener ikke det. Jeg mener dette er kjappest, og det "riktigste" måten å løse det på. 9313190[/snapback] Det vel ikke noen "riktig" måte? Og mener du at det er kjappest og skrive, eller at programmet blir kjappest? Dette virker ihvertfall, og hvis du klarer og lage et program der du bruker et tre som er både kortere og raskere blir jeg mektig imponert. #include <iostream> using namespace std; string input; char look; int pos; void next_char() { look = input[pos]; pos += 1; } double number() { double value = 0; while (look >= '0' && look <= '9') { value = 10*value + (look-'0'); next_char(); } return value; } double muldiv() { double value = number(); while ('*' == look) { next_char(); value *= muldiv(); } while ('/' == look) { next_char(); value /= muldiv(); } return value; } double addsub() { double value = muldiv(); while ('+' == look) { next_char(); value += addsub(); } while ('-' == look) { next_char(); value -= addsub(); } return value; } double eval(string expr) { input = expr; pos = 0; next_char(); return addsub(); } int main() { cout << eval("2+3*5") << endl; cout << eval("3*5+2") << endl; system("pause"); return EXIT_SUCCESS; } Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå