bruch problem



  • Hallo

    in einer funktion soll bestimmt werden durch welchen teiler der bruch teilbar ist aber irgendwo klemmt es da ... er macht immer bis runter auf 1 und gibt dann auch 1 zurück ...

    hat jemand vielleicht nen tipp ??

    ich find den fehler net ...

    thx

    #include <stdio.h>
    
    int kuerzen(int z, int n, int teiler);
    int zaehler=0, nenner=0, ergzaehler=0, ergnenner=0, kuerzer=0, teiler=0;
    
    int main(void)
    {
    	printf("Bitte geben Sie den Zaehler ein: ");
    	scanf("%d", &zaehler);
    	printf("\nBitte geben Sie den Nenner ein: ");
    	scanf("%d", &nenner);
    	if (zaehler == 0)
    	{
    		printf("0 ist bei Bruechen nicht gueltig!");
    		return(0);
    	}
    	else if (nenner == 0)
    	{
    		printf("0 ist bei Bruechen nicht gueltig!");
    		return(0);
    	}
    	else if (zaehler-nenner<0)
    		teiler = zaehler;
    	else
    		teiler = nenner;
    	kuerzer=kuerzen(zaehler, nenner, teiler);
    	ergzaehler=zaehler/kuerzer;
    	ergnenner=nenner/kuerzer;
    	printf("\ngekuerzter Zaehler: %d", ergzaehler);
    	printf("\ngekuerzter Nenner: %d", ergnenner);
    
    	return(0);
    
    }
    
    int kuerzen(int z, int n, int teiler)
    {
    	int erg=0;
    	do
    	{
    		if (z % teiler == 0)
    			erg=teiler;
    		if (n % teiler == 0)
    			erg=teiler;
    	else
        erg=1;
    	teiler--;
    	}while(teiler > 0);
    
    	return (erg);
    }
    


  • erstmal zum mathematischen: der zähler darf o sein, da 0/10=0 ist.
    dann zu der kuerzen funktion:

    if (z % teiler == 0)
                erg=teiler;
            if (n % teiler == 0)
                erg=teiler;
    

    dieser code ließe zu, dass auch nur einer der beiden werte geteilt wird, und das ist falsch.

    desweiteren stoppt deine schleife nie,wenn ein gültiger teiler gefunden wurde(bei deiner methode ist der erste gültige teiler auch der richtige), deine schleife läuft im gegenteil bis ganz zum schluss durch, und gibt dann 1 zurück.

    so wäre es innerhalb der schleife besser:

    if(z%teiler==0&&n%teiler==0){
        return teiler
    }
    else
    {
        teiler--;
    }
    

    desweiteren würde ich mir überlegen, statt ner do while eine for schleife zu benutzen:

    int kuerzen(int z, int n, int teiler){
        for(int i=teiler;i>0;--i){
            if(z%i==0&&n%i==0){
                return i
            }
        }
        return 1;
    }
    


  • Danke für die superschnelle Antwort ...

    hat ohne probleme geklappt ...

    das mit der for schleife klingt gut aber ich muss das morgen
    evntl. auch erklären können und bei der do while weiß ich das ich das kann ...
    bin halt noch nen n00b *gg*

    thx alot ..



  • dann gratulier deinem lehrer morgen von mir, er bringt euch erfolgreich c bei 😉



  • Und wie wärs, vorher den ggT von Zähler und Nenner auszurechnen und dann damit
    zu kürzen? Halte ich für die sehr viel sauberer Methode.

    // Euklidischer Algorithmus
    unsigned ggT(unsigned a, unsigned b)
    {
        if(a < b) swap(a,b);
    
        if(a%b == 0) return b;
        else         return ggT(b, a%b);
    }
    

    edit: Ich seh eben, das macht ihr ja. Nur nicht so schick wie Euklid 🙂



  • otze schrieb:

    for(int i=teiler;i>0;--i)
    

    Das ist aber kein ANSI C, wenn ich mich recht erinnere, da darf im Kopf der for-Schleife kein int auftauchen.

    Gut, die Frage steht im C++ Forum, aber der Quellcode von sphings sieht doch nach C aus.


Anmelden zum Antworten