Wie zu reduzieren/vereinfachen Fraktionen komplett (C++)
Kann ich nicht für das Leben von mir zu ergründen warum ich bin immer unendlich vielen Werte zurück, wenn ich Eingabe einen normalen Bruch in den code ein. Alles, aber der GCD (Greatest common divisor) scheint zu funktionieren.
Gibt es eine eklatant offensichtliche Logik Fehler irgendwo in dieser?
Ich habe meine Forschung getan und fand verschiedene Antworten auf die Frage, ich meine, die Wikipedia GIBT IHNEN auch code, es zu tun, aber ich würde gerne herausfinden, wie es funktioniert die Art und Weise habe ich codiert es so, wie es jetzt ist.
#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <math.h>
using namespace std;
class Fraction
{
private:
double num;
double den;
double fraction;
double temp;
public:
void setNum();
void setDen();
int getNum();
int getDen();
void lcdOutput();
void decOutput();
int gcd();
};
void Fraction::setNum(){
cout << "Enter a value for your numerator: " << endl;
cin >> num;
}
void Fraction::setDen(){
cout << "Enter a value for your denominator: " << endl;
cin >> den;
}
int Fraction::getNum(){
return num;
}
int Fraction::getDen(){
return den;
}
int Fraction::gcd(){
Fraction set;
if(num > den){
if(fmod(num, den) == 0){
den = temp;
return temp;
}
else{
den = fmod(num, den);
set.gcd();
}
}
else{
if(fmod(den, num) == 0){
num = temp;
return temp;
}
else{
num = fmod(den, num);
set.gcd();
}
}
}
void Fraction::lcdOutput(){
Fraction set;
set.gcd();
num = num / temp;
den = den / temp;
cout << "Fraction in lowest terms: " << num << "/" << den << endl;
}
void Fraction::decOutput(){
double decimal = num / den;
cout.precision(4);
cout << "The fraction in decimal form is: " << decimal << endl;
}
int main(){
Fraction set;
set.setNum();
set.setDen();
set.getNum();
set.getDen();
set.lcdOutput();
set.decOutput();
return 0;
}
- Wo ist der Konstruktor für die Fraktion? Ich sehe nicht, wie "temp" zugewiesen wird.
- Verwenden Sie
temp
ohne jemals zuweisen einen Wert. - Der gcd () - Funktion sieht falsch aus. Warum ist es das erstellen einer neuen Fraktion? Auch sind nicht alle code-Pfade, die eigentlich einen Wert zurückgeben.
- Sie Fragen: "ist es eine offensichtliche Logik-Fehler', die Antwort 'mehrere'. Der nicht initialisierte variable temp. Die falsche Verwendung der set variable zum erstellen einer Schleife. Es ist schwer zu verstehen, warum Sie denken, dass dieser code richtig ist.
- Was konntest du beobachten, wenn den debugger?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist, was ich bestimmen kann, nur durch das Durchlaufen von code.
Beginnend am wichtigsten, Sie instanziieren eine Instanz vom Typ
Fraction
namensset
. Ordnen Sie Zähler und Nenner über Aufrufeset.setNum()
undset.setDen()
. Die AufrufegetNum()
undgetDen()
in diesem Fall nichts bewirken, da Sie nicht zugewiesen wird, nichts.Dann rufen Sie
lcdOutput()
, so lassen Sie uns beginnen, Durchlaufen das.Sie beginnen durch die Instanziierung einer LOKALEN Instanz von Bruch (nicht sicher, warum Sie wollen, dies zu tun, es scheint mir, dass dies kann eine konzeptionelle Fehler), und rufen Sie dann
set.gcd()
für die lokale Instanz. Aufrufset.gcd()
wird, rufen Sie die Methode für diese INSTANZ, und es scheint mir, dass das, was Sie wirklich wollen, istthis->gcd()
oder einfachgcd()
.Sie follow-up durch Einstellung
num = num /temp
undden = den /temp
, abertemp
ist noch nicht initialisierte an dieser Stelle. Wenn die variable Links ist nicht initialisiert, es kann (und ist meistens), das aufgarbage
. Dies erklärt wahrscheinlich, warum Sie immer unsinnige Werte zurückgegeben.Ging ich zurück und dachte, es auf meinem eigenen. Ich sah einige der Kommentare mitbekommen und meine sehr große konzeptionelle und logische Fehler. Hier ist jemand, der die gleiche Frage!