C++ kalkulator

Det er god trening å prate matematikk. Her er det fritt fram for alle. Obs: Ikke spør om hjelp til oppgaver i dette underforumet.

Moderators: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Post Reply
Dinithion
Hilbert
Hilbert
Posts: 1025
Joined: 17/01-2008 13:46

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)?
Fry: Hey, professor. Which course do you teach?
Professor Hubert Farnsworth: Mathematics in quantum neutrino fields. I chose the name myself to scare away any students.
Gommle
Grothendieck
Grothendieck
Posts: 857
Joined: 21/05-2007 20:05

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.
Dinithion
Hilbert
Hilbert
Posts: 1025
Joined: 17/01-2008 13:46

Ah, sweet! Det var det jeg trodde. Da slipper jeg å legge inn unntaksregler i forhold til måten det løses på nå. Takker :)
Fry: Hey, professor. Which course do you teach?
Professor Hubert Farnsworth: Mathematics in quantum neutrino fields. I chose the name myself to scare away any students.
Markonan
Euclid
Euclid
Posts: 2136
Joined: 24/11-2006 19:26
Location: Oslo

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. :)
An ant on the move does more than a dozing ox.
Lao Tzu
Dinithion
Hilbert
Hilbert
Posts: 1025
Joined: 17/01-2008 13:46

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>
Fry: Hey, professor. Which course do you teach?
Professor Hubert Farnsworth: Mathematics in quantum neutrino fields. I chose the name myself to scare away any students.
Markonan
Euclid
Euclid
Posts: 2136
Joined: 24/11-2006 19:26
Location: Oslo

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.
An ant on the move does more than a dozing ox.
Lao Tzu
Dinithion
Hilbert
Hilbert
Posts: 1025
Joined: 17/01-2008 13:46

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 :)
Fry: Hey, professor. Which course do you teach?
Professor Hubert Farnsworth: Mathematics in quantum neutrino fields. I chose the name myself to scare away any students.
Post Reply