Page 1 of 1

C++ kalkulator

Posted: 21/03-2009 16:02
by Dinithion
Dette semesteret har jeg blant annet C++ programmering og jeg bestemte meg derfor for å ta opp ett prosjekt jeg begynte på for en god tid tilbake. En standard komandolinje kalkulator.
Ikke veldig spennende, men artig nok å programmere. Litt mer givende en oppgavene vi får i lekse.

Anyway, nå har jeg kommet til ett lite dilemma, for jeg lurer litt på prioritering og slik. Jeg følger matematiske regler, men jeg kom til å tenke over dette stykket:

1/2(1+5)

Normalt står det jo gangetegn mellom 2 og parentes. Skal dette dermed tolkes slik:
(1/2)*(1+5)

Eller slik:

1/(2*(1+5))

Vil det være en praktisk forskjell på:

1/2(1+5) og 1/2*(1+5)?

Posted: 22/03-2009 15:31
by Gommle
1/2(1+5) skal alltid tolkes som [tex]\frac12(1+5)[/tex]

1/2(1+5) og 1/2*(1+5) er nøyaktig det samme.

Posted: 22/03-2009 15:47
by Dinithion
Ah, sweet! Det var det jeg trodde. Da slipper jeg å legge inn unntaksregler i forhold til måten det løses på nå. Takker :)

Posted: 22/03-2009 17:30
by Markonan
Er ikke så veldig ofte det problemet oppstår, siden man gjerne vet hva som ganges og deles og hva som er brøker, men hvis man får dette regnestykke.
1/2*3

Er det da
0.5*3 = 1.5
eller
1/6 [symbol:tilnaermet] 0.16667?

Multiplikasjon og divisjon er likestilte operasjoner, og det skal ikke ha noe å si hvilken rekkefølge man gjør dem i (som vanligvis stemmer). Dette tilfellet er egentlig en svakhet i notasjonen vi bruker.

Det som regnes som riktig er det første tilfellet, og hvis man sikter til det andre, skal det markeres med parenteser. Altså er
1/2*3 = (1/2)*3 = 3/2 og 1/(2*3) = 1/6

Litt verre blir det hvis vi står oppstilt med følgende:
1/2(3)

Slår du inn dette på en grafisk kalkulator, vil den utføre multiplikasjonen 2*3 siden parenteser regnes før multiplikasjon/divisjon. Da vil du altså få 1/6 som svar.

Slår du inn dette på maple derimot, får du igjen 3/2, antagelig fordi den tolker 1/2 som en brøk.

Den store moralen er at man alltid bør samle regneoperasjoner i nevnere (eller divisorere) i egne parenteser.

Men det blir et litt nytt problem for den stakkaren som skal lage en C++ kalkulator. :)

Posted: 22/03-2009 17:45
by Dinithion
Jeg trodde det var slik at hvis det var to med lik prioritet ved siden av hverandre, så praktiserte man venstre til høyre.

Min kalkulator regner ihvertfall 1/2(3) "riktig", altså 1.5 :)
</skryt>

Posted: 22/03-2009 17:56
by Markonan
Du kan godt ta det fra venstre til høyre, fordi vanligvis har det ingenting å si hvilken rekkefølge man tar det i.

3*8/2

24/2 = 12
eller
3*4 = 12

Du har forresten også matlab som krever at man skal ha med operasjoner. Du får m.a.o feilmelding på
1/2(3)
Men 1/2*(3) = 1.5 i matlab, som er vanlig konvensjon på så og si alle programmer.

Posted: 22/03-2009 18:21
by Dinithion
Markonan wrote: Du har forresten også matlab som krever at man skal ha med operasjoner. Du får m.a.o feilmelding på
1/2(3)
Men 1/2*(3) = 1.5 i matlab, som er vanlig konvensjon på så og si alle programmer.
Interessant. Det kunne jo være artig å legge inn syntaks-sjekk, i stedenfor å auto-fullføre slik programmet gjør nå. Den legger inn * tegn automatisk forran parentes hvis ikke annet er oppgitt, og legger til parenteser i slutten dersom ikke alle er avsluttet.

Takker for tips :)