Bruch



  • Ich fand es mal ganz nützlich ein Prog zuerstellen was Brüche multipliziert addiert subtrahiert und dividiert nur irgendwie kommen immer Viel zu große Zahlen heraus...
    Könnt ihr mir vielleicht helfen?

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int Bruchaddition(int zaehler1 , int nenner1, int zaehler2, int nenner2);
    
    int Bruchsubtraktion(int zaehler1 , int nenner1, int zaehler2, int nenner2);
    
    int Bruchdivision(int zaehler1 , int nenner1, int zaehler2, int nenner2);
    
    int Bruchmultiplikation(int zaehler1 , int nenner1, int zaehler2, int nenner2);
    
    int main(int ergebnisszaehler, int ergebnissnenner, int ergebnissganzzahl)
    {
    	int zaehler1;
    	int nenner1;
    	int zaehler2;
    	int nenner2;
    	char eingabe;
    	do{
    		system("cls");
    		char operation;
    		cout<<"Zuerst den Zaehler des ersten Bruches:\n";
    		cin>> zaehler1;
    		cout<<"Jetzt den Nenner des ersten Bruches:\n";
    		cin>> nenner1;
    		cout<<"Den Z"aehler des zweiten Bruches:\n";
    		cin>> zaehler2	;
    		cout<<"Jetzt den Nenner des zweiten Bruches:\n";
    		cin>> nenner2;
    		cout<<"Welche Operation soll ausgefuehrt werden?\n";
    		cout<<"(A)ddition | (S)ubtraktion | (D)ivision | (M)ultiplikation\n";
    		cin>>operation;
    		switch (operation){
    			case 'A':
    			{
    				Bruchaddition( zaehler1, nenner1, zaehler2, nenner2);
    				 break;
    			}
    			case 'S':
    			{
    				Bruchsubtraktion( zaehler1, nenner1, zaehler2, nenner2);
    				break;
    			}
    			case 'D':
    			{
    				Bruchdivision( zaehler1, nenner1, zaehler2, nenner2);
    				break;
    			}
    			case 'M':
    			{
    				Bruchmultiplikation( zaehler1, nenner1, zaehler2, nenner2);
    				break;
    			}
    		}
    		system("cls");
    		cout<<"                "<<ergebnisszaehler<<"\n";
    		cout<<ergebnissganzzahl<<"      -\n";
    		cout<<"                "<<ergebnissnenner<<"\n";
    		cout<<"Moechten sie das Programm von vorne starten? (J)a oder (N)ein?\n";
    		cin>>eingabe;
    	}while(eingabe=='J');
    }
    
    int Bruchaddition(int zaehler1 , int nenner1, int zaehler2, int nenner2)
    {
    	int zwichenzaehler1;
    	int zwichenzaehler2;
    	int ergebnissganzzahl=0;
    	int ergebnisszaehler;
    	int ergebnissnenner;
    	int zahl;
    	if (nenner1<nenner2)
    		zahl=nenner2;
    	else zahl=nenner1;
    	for(zahl; ; zahl++) {
    		if ( zahl%nenner1==0 && zahl%nenner2==0)
    		{
    			ergebnissnenner=zahl;
    			zwichenzaehler1=zahl/nenner1*zaehler1;
    			zwichenzaehler2=zahl/nenner2*zaehler2;
    			ergebnisszaehler=zwichenzaehler1+zwichenzaehler2;
    			if ( ergebnisszaehler > ergebnissnenner )
    			{
    				ergebnissganzzahl=ergebnisszaehler/ergebnissnenner;
    				ergebnisszaehler=ergebnisszaehler-ergebnisszaehler/ergebnissnenner*ergebnissnenner;
    			}
    			break;
    		}
    	}
    	return ergebnissganzzahl;
    	return ergebnisszaehler;
    	return ergebnissnenner;
    }
    int Bruchsubtraktion(int zaehler1 , int nenner1, int zaehler2, int nenner2)
    {
    	int zwichenzaehler1;
    	int zwichenzaehler2;
    	int ergebnissganzzahl=0;
    	int ergebnisszaehler;
    	int ergebnissnenner;
    	int zahl=1;
    	while( zahl<10)
    	{
    		if ( zahl%nenner1==0 && zahl%nenner2==0)
    		{
    			ergebnissnenner=zahl;
    			zwichenzaehler1=zahl/nenner1*zaehler1;
    			zwichenzaehler2=zahl/nenner2*zaehler2;
    			ergebnisszaehler=zwichenzaehler1-zwichenzaehler2;
    			if ( ergebnisszaehler > ergebnissnenner )
    			{
    				ergebnissganzzahl=ergebnisszaehler/ergebnissnenner;
    				ergebnisszaehler=ergebnisszaehler-(ergebnisszaehler/ergebnissnenner*ergebnissnenner);
    			}
    			break;
    		}
    		zahl++;
    	}
    	return ergebnissganzzahl;
    	return ergebnisszaehler;
    	return ergebnissnenner;
    }
    int Bruchdivision(int zaehler1 , int nenner1, int zaehler2, int nenner2)
    {
    	int ergebnissganzzahl=0;
    	int ergebnisszaehler=nenner2*zaehler1;
    	int ergebnissnenner=nenner1*zaehler2;
    	int zahl=1;
    	while( zahl<10)
    	{
    		if ( ergebnisszaehler%zahl==0 && ergebnissnenner%zahl==0 )
    		{
    			ergebnisszaehler=ergebnisszaehler/zahl;
    			ergebnissnenner=ergebnissnenner/zahl;
    			if ( ergebnisszaehler > ergebnissnenner )
    			{
    				ergebnissganzzahl=ergebnisszaehler/ergebnissnenner;
    				ergebnisszaehler=ergebnisszaehler-(ergebnisszaehler/ergebnissnenner*ergebnissnenner);
    			}
    			break;
    		}
    		zahl++;
    	}
    	return ergebnissganzzahl;
    	return ergebnisszaehler;
    	return ergebnissnenner;
    }
    int Bruchmultiplikation(int zaehler1 , int nenner1, int zaehler2, int nenner2)
    {
    	int ergebnissganzzahl=0;
    	int ergebnisszaehler=zaehler1*zaehler2;
    	int ergebnissnenner=nenner1*nenner2;
    	int zahl=1;
    	while( zahl<10)
    	{
    		if ( ergebnisszaehler%zahl==0 && ergebnissnenner%zahl==0 )
    		{
    			ergebnisszaehler=ergebnisszaehler/zahl;
    			ergebnissnenner=ergebnissnenner/zahl;
    			if ( ergebnisszaehler > ergebnissnenner )
    			{
    				ergebnissganzzahl=ergebnisszaehler/ergebnissnenner;
    				ergebnisszaehler=ergebnisszaehler-(ergebnisszaehler/ergebnissnenner*ergebnissnenner);
    			}
    			break;
    		}
    		zahl++;
    	}
    	return ergebnissganzzahl;
    	return ergebnisszaehler;
    	return ergebnissnenner;
    }
    


  • Ohne den Code jetzt näher betrachtet zu haben...
    Wird das bei dir korrekt kompiliert?
    In den verschiedenen Funktionen hast du jeweils 3 returns;
    In mindestens einer Zeichnkette ein " drin...
    + main gibt nichts zurück...

    Außerdem..wieso Bruchoperanden?
    warum nicht gleich im Code...

    Ergebnis=Zaehler1/Nenner1 OPERAND Zaehler2/Nenner2;
    

    ?



  • Kompiliert wird es, nur nicht richtig ausgeführt
    solangsam frag ich mich ob ich von vorn beginnen sollte 😡



  • Kompiliert wird es,...

    😕
    Ok............

    vorn beginnen

    Wär vlt. gar nicht so übel...

    BTW: Ich bekomme beim Kompilieren 12 Fehler und 1 Warnung



  • ja weil ich es als bruch wieder ausgeben will nicht als dezimalzahl und dann muss man noch gucken dass alles gekürzt ist ich glaube es stimmt irgendwas nicht mit der schleife:

    for(zahl; ; zahl++) {
            if ( zahl%nenner1==0 && zahl%nenner2==0)
            {
                ergebnissnenner=zahl;
                zwichenzaehler1=zahl/nenner1*zaehler1;
                zwichenzaehler2=zahl/nenner2*zaehler2;
                ergebnisszaehler=zwichenzaehler1+zwichenzaehler2;
                if ( ergebnisszaehler > ergebnissnenner )
                {
                    ergebnissganzzahl=ergebnisszaehler/ergebnissnenner;
                    ergebnisszaehler=ergebnisszaehler-ergebnisszaehler/ergebnissnenner*ergebnissnenner;
                }
                break;
            }
        }
    

    (Bei allen 4)...



  • Kuldren schrieb:

    Kompiliert wird es,...

    😕
    Ok............

    vorn beginnen

    Wär vlt. gar nicht so übel...

    BTW: Ich bekomme beim Kompilieren 12 Fehler und 1 Warnung

    was denn für eine? bei mir mault der nix rum...



  • was denn für eine?

    D:\eigeneprogs\Test123\main.cpp(28) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'aehler'
    D:\eigeneprogs\Test123\main.cpp(28) : error C2065: 'aehler' : nichtdeklarierter Bezeichner
    D:\eigeneprogs\Test123\main.cpp(28) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'des'
    D:\eigeneprogs\Test123\main.cpp(28) : error C2065: 'des' : nichtdeklarierter Bezeichner
    D:\eigeneprogs\Test123\main.cpp(28) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'zweiten'
    D:\eigeneprogs\Test123\main.cpp(28) : error C2065: 'zweiten' : nichtdeklarierter Bezeichner
    D:\eigeneprogs\Test123\main.cpp(28) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Bruches'
    D:\eigeneprogs\Test123\main.cpp(28) : error C2017: Ungueltige ESCAPE-Folge
    D:\eigeneprogs\Test123\main.cpp(28) : error C2001: Zeilenumbruch innerhalb einer Konstanten
    D:\eigeneprogs\Test123\main.cpp(28) : error C2065: 'n' : nichtdeklarierter Bezeichner
    D:\eigeneprogs\Test123\main.cpp(28) : error C2143: Syntaxfehler : Fehlendes ';' vor 'string'
    D:\eigeneprogs\Test123\main.cpp(29) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'cin'
    D:\eigeneprogs\Test123\main.cpp(64) : warning C4508: 'main' : Funktion sollte einen Wert zurueckgeben; Ergebnistyp 'void' angenommen
    

    Außerdem sollte main nicht "int ergebnisszaehler, int ergebnissnenner, int ergebnissganzzahl" übergeben werden!
    + Das wird sowieso nicht verwendet



  • Für die Addidition könntest du das verwenden:
    Bzw. das Kürzungsverfahren kannst du auf alle Operationen anwenden...

    int main(){
    
    	int ze=0,ne=0,z1,z2,n1,n2;
    
    	cout<<"Bitte Zaehler 1 eingeben:";
    	cin>>z1;
    	cout<<"\nBitte Nenner 1 eingeben:";
    	cin>>n1;
    	cout<<"\nBitte Zaehler 2 eingeben:";
    	cin>>z2;
    	cout<<"\nBitte Nenner 2 eingeben:";
    	cin>>n2;
    
    	if(n1!=n2){
    		ne=n1*n2;
    		ze=n1*z2+n2*z1;
    	}
    	else{
    		ne=n1;
    		ze=z1+z2;
    	}
    
    	cout<<"Ergebins:\n\nZaehler: "<<ze<<"\n"<<"Nenner:  "<<ne<<"\n\n"<<endl;
    
    	if(ne!=1){
        // KÜRZEN
    	// ze...Ergebnis-Zähler
    	// ne...Ergebnis-Nenner
    
    	int x=1;
    	int erg_x=0;
    	bool done=FALSE;
    	do{
    		x++;
    		if(ze%x==0 && ne%x==0)
    			erg_x=x;
    
    	}while(ze>=x && ne>=x);
    	ze/=erg_x;
    	ne/=erg_x;
    	cout<<"Ergebins:\n\nZaehler: "<<ze<<"\n"<<"Nenner:  "<<ne<<"\n"<<"GGT: "<<erg_x<<endl;
    
    	}
    
    	else
    	cout<<"Ergebnis: "<<ze<<endl;
    
    return 0;
    }
    


  • Ich denke du hast C++ nicht verstanden. Soll jetzt nicht böse sein, aber das was du da machst ... kann so einfach nicht funktionieren.
    Erstmal ist 'int main(int a, int b, int c)' falsch, das muss 'int main(int argc, char** argv)' heissen. Und dann was 'return' bedeutet. Du setzt 'return x' so ein als ob dann der Wert deines lokalen 'x' in die Variable 'x' in der aufrufenden Funktion (in dem Fall 'main') zurückkopiert werden würde. So funktioniert das aber nicht. Mit 'return' verlässt du die Funktion und kannst genau einen Wert "zurückgeben". Mehrere 'return' hintereinander sind werden zwar compilieren, sind aber sinnlos da nur das erste ausgeführt werden wird - die Funktion wird ja bereits mit dem ersten 'return' verlassen.
    Beispiel wie 'return' geht:

    #include <iostream>
    
    int Addiere(int a, int b)
    {
        int ergebnis = a + b;
        return ergebnis;
    }
    
    int main(int argc, char** argv)
    {
        int a;
        int b;
        std::cout << "A eingeben: ";
        std::cin >> a;
        std::cout << "\nB eingeben: ";
        std::cin >> b;
        std::cout << std::endl;
        int c = Addiere(a, b); // Hier wird das was in 'Addiere' mittels 'return' zurückgegeben wurde in c reingeschrieben.
        std::cout << "Ergebnis: " << c << std::endl;
        return 0;
    }
    

    Du musst also an der Stelle wo du die Funktion aufrufst diesen Funktionsaufruf direkt als Wert verwenden. Das muss keine Zuweisung sein - eine Funktion die 'int' zurückgibt kannst du (vereinfacht gesagt) überall verwenden wo du einen 'int' verwenden könntest. Folgendes ginge z.B. auch:

    void Lala()
    {
        int x = Addiere(Addiere(1, 3), 8);
        std::cout << x;
        std::cout << Addiere(99, 99);
    }
    

    Wenn du mehrere Werte zurückgeben willst geht das mittels 'return' nicht so einfach. Du kannst natürlich z.B. std::pair<int, int> verwenden. Oder du kannst 'output parameter' mit Zeigern oder Referenzen verwenden, aber dafür müsstest du erstmal ein wenig sattelfest in C++ werden.



  • Danke leute 🙄 *schäm*
    naja dann hänge ich mich nochmal rein 😞
    vielleicht klappts dann bessa....




Anmelden zum Antworten