Brøkregning

Tags:    c++

<< < 123 > >>
Opgaven jeg er gået igang med, lyder således:

- create a class called fraction, and the following numbers are to be used in the program: in main() : 3,4,7 og 20

Programmets output har jeg så selv bestemt til følgende:

3/4 // (Det er den første brøk).
7/20 // (Det er den anden brøk).
21/80 // (De to brøker ganget sammen).
88/80 // (De to brøker, hvor der er fundet en fællesnævner).
11/10 // (Tællesnævneren er forkortet mest muligt).

_________________________________

Min kode er indtil videre:
Fold kodeboks ind/udKode 


Mit problem opstår så når outputtet giver 0 når den skal gange de to brøker sammen. Hvorfor gør den det??? Er det fordi jeg også skal have "public" med hvor jeg har en multiply funktion??





26 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 7 karma
Sorter efter stemmer Sorter efter dato
Og et spørgsmål til omkring koden ovenover. Jeg er ikke lige helt med på hvad der sker i public, i class fration??


Der er tre linier:
Fraction(int num = 0, int denom = 0) : Num(num), Denom(denom) {}
Dette er en constructor, begge parametre er som default 0, den initialiserer objektet.

friend Fraction operator + (const Fraction& lhs, const Fraction& rhs);
friend std::ostream& operator << (std::ostream& os, const Fraction& fraction);

Dette er to operatorer, de erklæres "friends" for at de kan få adgang til class'ens private members.



Indlæg senest redigeret d. 02.11.2009 20:06 af Bruger #4996
Umiddelbart gør koden kun det at den finder fællesnævneren, nemlig 88/80. Men som du nævner er det måske fordi + operatoren kun finder fællesnævneren. Har prøvet at google noget omkring reducering af brøk, men der kommer ikke noget brugbart frem. Findes der ikke en helt konkret funktion der tager sig af reducering.

Du finder den største fælles dividens (Greatest Common Divisor). Det er det største tal som går op i begge tal. Så reducerer du brøken med dette tal, dvs. dividerer både tæller og nævner med denne. På wikipedia kan du se Euclids fremgangsmåde som er nemt at implementere i kode: http://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid.27s_algorithm




Fordi du bruger int, som er heltal. Prøv at lav det om til double i din fraction klasse.



Ja selvfølgelig. Det havde jeg slet ikke tænkt over. Men nu får jeg resultatet i decimaltal dvs. 0.2625. Hvordan kan man få det i brøk dvs. som 21/80??



Her er én måde at gøre det på:
Fold kodeboks ind/udKode 


Jeg er ikke sikker på at + operatoren er matematisk korrekt, og den bør nok forsøge at reducere resultatet, til mindst mulige fællesnævner.



Umiddelbart gør koden kun det at den finder fællesnævneren, nemlig 88/80. Men som du nævner er det måske fordi + operatoren kun finder fællesnævneren. Har prøvet at google noget omkring reducering af brøk, men der kommer ikke noget brugbart frem. Findes der ikke en helt konkret funktion der tager sig af reducering.

Og et spørgsmål til omkring koden ovenover. Jeg er ikke lige helt med på hvad der sker i public, i class fration??



Ok. Jeg har lige læst linket, og mange tak for hjælpen.

Bertel nu er jeg med på hvad der sker i de tre linjer. Her er midt bud på en GCD, men der er stadigvæk noget galt:

Fold kodeboks ind/udKode 






Du mangler nogle operatorer for at din kode kan oversætte, du skal bruge en operator for / og >

Det give ikke rigtig mening at assigne en Fraction til en int.

Jeg forstår ikke rigtig hvad du vil vise med koden, måske fordi jeg ikke har studeret Euclids algorime.



Ja kan godt se der er noget helt galt. Jeg har nu læst nærmere om GCD, og istedet lavet en gcd reduce funktion, men så ved jeg bare ikke hvad der skal stå som output (der hvor jeg har sat ???):
Fold kodeboks ind/udKode 






Jeg har hacket noget sammen der ser ud til at virke, det er absolut mere grimt end godt er:
Fold kodeboks ind/udKode 


Du bør lave gcd og reduce om til funktioner i classen, derved skulle du gerne kunne undgå den mærkelige kode i main. I C++ bruger man helst referecer i stedet for pointere, når det er muligt, det er det her.



<< < 123 > >>
t