Anderes Problem mit weiterer mathematischer Funktion!



  • Hachja... von dem anderen Thread (http://www.c-plusplus.net/forum/viewtopic-var-t-is-228604.html) mal abgesehen habe ich eine zweite Aufgabe zu machen. Da hänge ich nun aber auch. 😞
    Es soll eine Funktion geschrieben werden, die kartesische in polare Koordinaten umrechnet!

    Dabei sollen wir folgendes machen:
    Einmal soll die Funktion die Ergebnisse über zeiger zurückgeben mit folgendem Funktionskopf:

    double* kartesisch_zu_polar(double u, double v)
    

    Zum anderen soll die Funktion die Ergebnisse über Zeigereingabeparameter zurückgeben mit folgendem Funktionskopf:

    void kartesisch_zu_polar2(double u, double v, double *r, double *phi)
    

    der Quelltext:

    #include <stdio.h>
    #include <math.h>
    
    void kartesisch_zu_polar2(double u, double v, double *r, double *phi)
    {
    double r2,phi2;
    r2 = sqrt(u * u * v * v);
    phi2 = atan2(v,u);
    }
    
    double* kartesisch_zu_polar(double u, double v)
    {
    double r1,phi1;
    r1 = sqrt(u * u * v * v);
    phi1 = atan2(v,u);
    }
    
    int main(double u, double v, double r2, double phi2, double *r, double *phi, double r1, double phi1, double *r3, double *phi3)
    {
    r=&r2;
    phi=&phi2;
    r3=&r1;
    phi3=&phi1;
    printf("Bitte u und v eingeben:");
    scanf("%lf %lf", &u, &v);
    printf("Das Ergebnis bei Teil 1: r= %5.3lf und phi= %5.3lf \n",*r3,*phi3);
    printf("Das Ergebnis bei Teil 2: r= %5.3lf und phi= %5.3lf \n",*r,*phi);
    }
    

    Die Rückgabe ist aber falsch. Irgendwie zeigen die Zeiger (^^) auch auf falsche Adressen/Werte, aber ich finde den richtigen Weg einfach nicht. 😞



  • ich schlage vor, du guckst dir nochmal die ersten Vorlesungsstunden zu C, denn schneinbar hast du davon keine Ahnung (siehe deine main-Funktion).



  • Cicatrix schrieb:

    Einmal soll die Funktion die Ergebnisse über zeiger zurückgeben mit folgendem Funktionskopf:

    double* kartesisch_zu_polar(double u, double v)
    

    das ist doof. du braucht immer 2 doubles, wenn du x/y in polarkoordinaten wandeln willst. mach besser was mit structs oder so.
    🙂



  • ~fricky das brauch man nicht unbedingt kannst auch ein array machen.

    So hab es mal verbessert siehe comments im code

    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void kartesisch_zu_polar2(double u, double v, double *r, double *phi);
    double* kartesisch_zu_polar(double u, double v);
    
    int main(int argc, char **argv)
    {
        // Der Aufruf mit parameter geht so wie hier mit argc und **argv
        // in argc steht die anzahl der Parameter drin und in argv
        // die Argumente.
        // Bsp: Programm heist bla.exe
        // bla.exe 1 2
        // dann steht in argc 3 und in argv stehen die parameter als strings
        // argv[0]=bla.exe der Programmname
        // argv[1]=1
        // argv[2]=2
        // Wenn du zb dein Programm so starten moechtest
        // bla.exe 3.1 4.5
        // geht folgender code
        double u, v;
        double *erg1, erg_r, erg_phi;
        if(argc != 3)
        {
            printf("zu wenig parameter\n");
            printf("aufruf: %s r phi\n",argv[0]);
            return 0;
        }
        // atof wandelt einen string in einen double ist in
        // stdlib.h drin
        u=atof(argv[1]);
        v=atof(argv[2]);
    
        erg1=kartesisch_zu_polar(u, v);
        kartesisch_zu_polar2(u, v, &erg_r, &erg_phi);
        printf("Ergebnisse der Berechnung:\n");
        printf("--------------------------\n");
        printf("kartesisch_zu_polar:\n");
        printf("r: %f\tphi: %f\n",erg1[0],erg1[1]);
        printf("\nkartesisch_zu_polar2:\n");
        printf("r: %f\tphi: %f\n",erg_r, erg_phi);
        return 0;
    }
    
    void kartesisch_zu_polar2(double u, double v, double *r, double *phi)
    {
        *r = sqrt(u * u * v * v);
        *phi = atan2(v,u);
    }
    
    double* kartesisch_zu_polar(double u, double v)
    {
        double *ret;
        // hier wird ein array erstellt in ret[0] wird r gespeichert
        // und in ret[1] phi
        ret=(double*)malloc(2*sizeof(double));
        *ret = sqrt(u * u * v * v);
        *(ret+1) = atan2(v,u);
        return ret;
    }
    


  • Du machst einen Fehler beim Umrechnen von Kartesisch zu polar:

    Richtig wäre:

    void cart2polar(double re, double im, double *dist, double *phi) {
       *dist = sqrt((re * re) + (im * im));   // hier muss ein Plus und kein Mal stehen!
       if (*dist > 0.) {
           *phi = atan2(im, re);
       } else {
           *phi = 0.;
       }
    }
    

    Ich stimme ~fricky zu, es ist schöner, wenn du structs verwendest!

    Gruß mcr

    EDIT: und du hast vergessen, den mit malloc allozierten Speicherbereich
    wieder frei zu geben!



  • danke für die ratschläge aber nobody is perfect


Anmelden zum Antworten