Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Rückgabewerte, Bruch kürzen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
19.04.2004, 21:46 Uhr
Lumina



Hallo!

Will ein kleines Programm in C++ schreiben, das mir nach Eingabe von zwei unsigned-Werten (Zähler und Nenner eines Bruchs) die gekürzte Version ausgibt.
Dazu lass ich zuerst den ggT berechnen und dann durch diesen teilen. Mein Problem ist, dass ich ja nur einen Rückgabewert zur Verfügung habe und ich die Funktion zum Kürzen so aufrufen will:


C++:
unsigned x=9, y=6;
kuerzen(x,y);
// Jetzt sollten x und y den Wert 3 bzw. 2 haben und das auch ausgeg. werden


--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.04.2004, 21:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


kannst z.b. ne klasse bruch schreiben

wenn du es unbedingt mit einem rückgabewert machen willst hilft dir ein struct


C++:
typedef struct{int zaehler;int nenner}bruch;



ggt so jedoch ohne spezialfälle

C++:
int ggt(int x,int y){for(;x-y;x>y?x-=y:y-=x);return x;}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.04.2004, 21:59 Uhr
Lumina



Die ggt-Berechnung geht ja schon einwandfrei, ist ja nix dabei mit dem Euklidschen Algo, aber ich will die Fkt. ja genau so aufrufen wie oben schon gesagt...
Geht das nicht irgendwie?

P.S.: Fang erst mit C++ an...
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.04.2004, 22:01 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Oder du arbeitest mit Referenzen:

C++:
#include <stdio.h>

int kuerzen (int &x, int &y)
{
    //hier ganz normal kürzen
    return 0;
}

int main()
{
    int a=12,b=9;
    kuerzen(a,b);
    printf ("%i\n%i\n",a,b);
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.04.2004, 22:02 Uhr
Lumina



so berechne ich den ggT:

C++:
unsigned ggt(unsigned u, unsigned v) // nach Euklidschem Algorithmus
{
    unsigned t;

    while (u > 0)
    {
        if (u < v) {t = u; u = v; v = t;} // Variablentausch, falls v größer u
        u = u - v;
    }

    return v; // v hat nun den Wert des ggt

}



und das soll die zweite Fkt. sein:


C++:
unsigned kuerzen(unsigned u, unsigned v)
{
    u = u / ggt(u,v);
    v = v / ggt(u,v);

//    return(u);
    return(v);
}


--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.04.2004, 22:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja du kannst zb. entweder das struct zurückliefern lassen

z.b. so

C++:
typedef struct{int zaehler;int nenner}bruch;
bruch kuerzen(bruch){
bruch rv;
int x=ggt(bruch.zaehler,bruch.nenner);
rv.zaehler/=x;
rv.nenner/=x;
return rv;
}



oder du lässt einfach danach in x und y die neuen werte drin stehen


C++:
void kuerzen(int &z,int &n){int x=ggt(z,n);z/=x;n/=x;}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 19.04.2004 um 22:04 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.04.2004, 22:05 Uhr
Lumina



@ Guybrush:

Danke! Genau so wollte ich es haben! Eigentlich ein dummer Fehler meinerseits....
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.04.2004, 22:07 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Genau und wenn du bei deiner kuerzen Funktion jetzt eine Referenz erwartest (mit dem Adressoperator & ) dann kannst du die original an die kuerzen Funktion übergebenen Variablen änden


C++:
#include <stdio.h>

unsigned ggt(unsigned u, unsigned v) // nach Euklidschem Algorithmus
{
    unsigned t;

    while (u > 0)
    {
        if (u < v) {t = u; u = v; v = t;} // Variablentausch, falls v größer u
        u = u - v;
    }

    return v; // v hat nun den Wert des ggt

}

unsigned kuerzen(unsigned int &u, unsigned int &v)
{
    u = u / ggt(u,v);
    v = v / ggt(u,v);

//    return(u);
    return(v);
}

int main()
{
    unsigned int a=12,b=9;
    kuerzen(a,b);
    printf ("%i\n%i\n",a,b);
    return 0;
}



EDIT: Ok zu spät

Dieser Post wurde am 19.04.2004 um 22:08 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.04.2004, 22:09 Uhr
Lumina



Ja, grundsätzlich ist mir das schon klar, nur war ich im Moment eben so auf diese dummen Rückgabewerte gepolt... naja, egal, danke für die Hilfestellung an alle!
--
*******************************************
Willst du glücklich sein im Leben, trage bei zu and'rer Glück,
denn die Freude, die wir geben, kehrt ins eig'ne Herz zurück!
*******************************************
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.04.2004, 22:10 Uhr
Pablo
Supertux
(Operator)


Hallo


C++:
#include <iostream>
int min(int x, int y)
{
    return x<y?x:y;
}

int ggt(int x, int y){
    int t=1;

    for(int i=2; i<=min(x,y)/2;++i) {
        if(!(x%i) && !(y%i))t=i;
    }
    return t;
}

void kuerze(int& x, int& y)
{
    int g=ggt(x,y);
    x/=g;
    y/=g;
}

int main()
{
    int x=9;
    int y=6;
    std::cout << "x=" << x << "; y=" << y << std::endl;
    std::cout << "Aufruf von kuerze" << std::endl;
    kuerze(x,y);
    std::cout << "x=" << x << "; y=" << y << std::endl;
    return 0;
}



Mehr zum ggt : www.fun-soft.de/showtopic.php?threadid=3900&time=


Bearbeitung von Pablo:

Ohh, so schnell waren die anderen, wow...


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 19.04.2004 um 22:10 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: