Funktion größten gemeinsamen Teiler

Schnelle objektorientierte, kompilierende Programmiersprache.
hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Funktion größten gemeinsamen Teiler

Beitrag von hardcoding » Di Okt 30, 2012 11:21 pm

Hallo allerseits,


Ich versuche gerade eine Funktion zuschreiben, die den größten gemeinsamen Teiler ausrechnet.
So sieht der folgende Code aus der Funktion aus.


i

Code: Alles auswählen

nt ggt(int wert1,int wert2)
{

    int restwert;

    if (wert1 > wert2)
    {


        do
        {
            restwert = wert1%wert2;
            wert1    = wert2;
            wert2    = restwert;

        }
        while(restwert == 0);


        cout << restwert << endl;
    }


    else
    {

        do
        {

            restwert = wert2%wert1;
            wert2    = wert1;
            wert1    = restwert;
        }
        while(restwert == 0);


    }




}






Wenn ich es kompliere,errechnet er mir nur den ersten Restwert. Ich will , dass er aber den Restwert so lange ausrechnet bis der Restwert 0 ist. Es soll mit anderen Worten die Bedingung erfüllt werden.

Nun weiß ich nicht warum er die weiteren Restwerte nicht ausrechnet bis die Bedingung erfüllt ist.
Bitte um eure Hilfe und danke im voraus
Zuletzt geändert von hardcoding am Di Okt 30, 2012 11:29 pm, insgesamt 1-mal geändert.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Funktion größten gemeinsamen Teiler

Beitrag von Xin » Di Okt 30, 2012 11:24 pm

Fang mal an, den Quelltext sauber einzurücken. Ich bin nicht sicher, ob ich die Frage richtig verstehe, aber ich vermute, dass wenn Du den Code sauber einrückst, Du den von mir vermuteten Fehler selbst findest.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Funktion größten gemeinsamen Teiler

Beitrag von hardcoding » Di Okt 30, 2012 11:30 pm

:) Ich hoffe ,dass es jetzt sauber eingerückt ist.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktion größten gemeinsamen Teiler

Beitrag von cloidnerux » Di Okt 30, 2012 11:46 pm

Code: Alles auswählen

 while(restwert == 0);
Bis "restwert" also 0 sein soll, soso. :D
Redundanz macht wiederholen unnötig.
quod erat expectandum

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Funktion größten gemeinsamen Teiler

Beitrag von hardcoding » Mi Okt 31, 2012 8:50 pm

cloidnerux hat geschrieben:

Code: Alles auswählen

 while(restwert == 0);
Bis "restwert" also 0 sein soll, soso. :D
Das ist eigentlich richtig. wieso soso ? :?


Code: Alles auswählen

int ggt(int wert1,int wert2)
{

    int restwert;

    if (wert1 > wert2)
    {


        do
        {




            restwert = wert1%wert2;
            wert1    = wert2;
            wert2    = restwert;


        }
        while(restwert == 0);


        cout << "größter gemeinsamer Teiler"<< " "<< wert2<< endl;
    }


    else
    {

        do
        {

            restwert = wert2%wert1;
            wert2    = wert1;
            wert1    = restwert;
        }
        while(restwert == 0);

        cout << "größter gemeinsamer Teiler" << wert1 << endl;

    }




}

Wenn restwert gleich null ist,zeigt er den wert2 also den grössten gemeinsamen teiler nach den Euklidischer Algorithmus. Das Problem liegt dabei ,dass er den nächsten Restwert nicht weiter rechnet. Wenn ich es mit den wert1 = 1071 und wert2 =1029 kompliere zeigt er als Restwert in der Konsole 42 und das ist der erste Restwert und nicht der Restwert == 0.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktion größten gemeinsamen Teiler

Beitrag von cloidnerux » Mi Okt 31, 2012 8:56 pm

Das ist eigentlich richtig. wieso soso ?
"while" ist Englisch und lässt sich ungefähr mit "Solange" übersetzten. Damit wird also die Schleife nur solange ausgeführt, wie die Bedingung Wahr ist.
Wenn nun also "restwert == 0" wahr sein soll, wenn du FERTIG bist mit berechnen, dann ist es doch logisch falsch dies als Bedingung für das weiterführen der Berechnung zu nutzen.
Wenn restwert gleich null ist,zeigt er den wert2 also den grössten gemeinsamen teiler nach den Euklidischer Algorithmus
Hier solltest du deinen Gedankenfehler also merken, die Bedingung ist nicht zum beenden der Schleife, sondern zum weiterführen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Funktion größten gemeinsamen Teiler

Beitrag von hardcoding » Mi Okt 31, 2012 9:21 pm

cloidnerux hat geschrieben:
Das ist eigentlich richtig. wieso soso ?
"while" ist Englisch und lässt sich ungefähr mit "Solange" übersetzten. Damit wird also die Schleife nur solange ausgeführt, wie die Bedingung Wahr ist.
Wenn nun also "restwert == 0" wahr sein soll, wenn du FERTIG bist mit berechnen, dann ist es doch logisch falsch dies als Bedingung für das weiterführen der Berechnung zu nutzen.
Wenn restwert gleich null ist,zeigt er den wert2 also den grössten gemeinsamen teiler nach den Euklidischer Algorithmus
Hier solltest du deinen Gedankenfehler also merken, die Bedingung ist nicht zum beenden der Schleife, sondern zum weiterführen.

Ich danke dir. Ich habe do while schleife andersherum verstanden. Ich habe nochmal in meinen Buch nachgeguckt und da das Problem löst sich. :lol:
Ich musste noch eine weitere Variable hinzufügen damit das richtige Ergebnis rauskommt.


so sieht es jetzt aus.

Code: Alles auswählen

int ggt(int wert1,int wert2)
{

    int restwert,wert3;

    if (wert1 > wert2)
    {


        do
        {




            restwert = wert1%wert2;
            wert1    = wert2;
            wert3    = wert2;
            wert2    = restwert;



        }
        while(restwert != 0);


        cout << "größter gemeinsamer Teiler"<< " "<< wert3<< endl;
    }


    else
    {

        do
        {

            restwert = wert2%wert1;
            wert2    = wert1;
            wert3    = wert1;
            wert1    = restwert;
        }
        while(restwert != 0);

        cout << "größter gemeinsamer Teiler" << wert1 << endl;

    }




}










Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktion größten gemeinsamen Teiler

Beitrag von cloidnerux » Mi Okt 31, 2012 9:29 pm

Ich danke dir. Ich habe do while schleife andersherum verstanden. Ich habe nochmal in meinen Buch nachgeguckt und da das Problem löst sich.
Wusste ich doch^^
Ich musste noch eine weitere Variable hinzufügen damit das richtige Ergebnis rauskommt.
Wozu die zusätzliche Variable?
Dein Problem war doch, dass du in Wert2 den restwert gespeichert hast und damit 0.
Du willst aber den alten Wert haben, den du in wert1 speicherst. Wieso nimmst du nicht einfach direkt wert1?
Redundanz macht wiederholen unnötig.
quod erat expectandum

hardcoding
Beiträge: 91
Registriert: Do Okt 04, 2012 9:24 pm

Re: Funktion größten gemeinsamen Teiler

Beitrag von hardcoding » Mi Okt 31, 2012 9:32 pm

Wozu die zusätzliche Variable?
Dein Problem war doch, dass du in Wert2 den restwert gespeichert hast und damit 0.
Du willst aber den alten Wert haben, den du in wert1 speicherst. Wieso nimmst du nicht einfach direkt wert1?
Oh man manchmal denke ich zu umständlich. Naja egal was solls. :oops:

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktion größten gemeinsamen Teiler

Beitrag von cloidnerux » Mi Okt 31, 2012 9:57 pm

Oh man manchmal denke ich zu umständlich. Naja egal was solls.
Macht nichts, manchmal möchte man den Wald vor lauter Bäumen nicht sehen. Das kommt aber mit der Zeit^^
Und es hat schon eine gewisse Bedeutung, effizient zu programmieren: man spart Ressourcen und Zeit, was sich vor allem bei großen Algorithmen oder langen Berechnungen hilft.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten