Complexe Zahlen multiplizieren



  • Servus,

    ich soll 2 complexe Zahlen miteinander addieren und multiplizieren. Mein Programm funktioniert soweit auch nur habe ich eine Verständnissfrage.

    Hier mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct complx{
    
        int re;
        int im;
    
    };
    
     struct complx addieren(struct complx a, struct complx b){
    
         struct complx erg;
    
         erg.re=a.re+b.re;
         erg.im=a.im+b.im;
    
        return erg;
    
    };
    
    struct complx multiplizieren(struct complx a,struct complx b){
    
        static struct complx erg;
    
        int c = a.re;    //x1
        int d = a.im;    //y1
        int e = b.re;    //x2
        int f = b.im;    //y2
    
        int erg1 = c*e;   //x1*x2
        int erg2 = c*f;   //x1*y2
        int erg3 = e*d;   //x2*y1
        int erg4 = d*f;  //y1*y2 =i*i -> i-quadrat= -1
    
        int erg5 = erg1+(erg4*(-1));
        int erg6 = erg2+erg3;
    
        erg.re=erg5;
        erg.im=erg6;
    
        return erg;
    
    };
    
    struct complx einlesen(){
    
        struct complx neu;
        int x,y;
    
        printf("\n\nWert fuer Realteil eingeben: ");
        scanf("%d", &x);
        neu.re=x;
    
        printf("Wert fuer Immaginaerteil eingeben: ");
        scanf("%d", &y);
        neu.im=y;
    
        return neu;
    
    };
    
    void ausgabe(struct complx eingabe){
    
        char i = 'i';
    
        printf("\n%d + %d%c\n",eingabe.re,eingabe.im,i);
    
    }
    
    int main()
    {
        struct complx a;
        a.re=1;
        a.im=1;
    
        struct complx b;
        b.re=1;
        b.im=1;
    
        struct complx erg;
        char i = 'i';
    
        erg=addieren(a,b);
        printf("Ergebnis:  %d +  %d%c\n", erg.re, erg.im,i);
    
        struct complx c;
        c.re=-7;
        c.im=5;
    
        struct complx d;
        d.re=3;
        d.im=-3;
    
        struct complx erg1;
        erg1=multiplizieren(c,d);
    
        printf("Ergebnis: %d + %d%c \n", erg1.re, erg1.im,i);
    
        printf("\n\nWillkommen beim Multiplikator fuer Complexe Zahlen\n");
        printf("Nur int-Werte erlaubt!!\n");
    
        struct complx neu=einlesen();
        struct complx neu2=einlesen();
        struct complx berechnen;
        berechnen=multiplizieren(neu,neu2);
        printf("Ergebnis: %d + %d%c\n",berechnen.re,berechnen.im,i);
    
       return 0;
    
    }[
    

    Meine Frage ist nun, warum ich in Zeile 26 das static brauche. Ohne static kann ich das Programm nicht ausführen. Ein Studienkollege hat mich darauf hingewiesen, dass ich es mal mit static probieren soll, warum konnte er mir aber auch nicht genau erklären.
    Bei der addieren-Funktion (Zeile 14) funktioniert es ohne static. 😕

    Danke



  • static brauchst du nicht.
    Wer sagt dir, dass du static dort brauchst?



  • ohne static kommt ein falsches Ergebnis.
    Der erste Teil der immaginären Zahl ist immer negativ.
    (wenn ich kein static verwende)
    Mit static bekomme ich das richtige Ergebnis.

    Ich habe einen Studienkollegen gefragt ob er einen Fehler in meinem Code sieht und er meinte ich solle es mit static versuchen und schon klappts.



  • Nein. Du machst den Fehler.
    Der Compiler macht keine Fehler, insbesondere beim Rechnen niemals.
    Schaue dir an, wie du den Real-Teil berechnest und nutze einen Debugger.



  • Hi,
    ehrlich gesagt ich sehe kein Problem wenn du static weglässt und deine berechnung sieht auch gut aus! Allerdings habe ich nicht getestet.



  • IMHO ist es übrigens ein Trugschluß, dass möglichst viele Einzelschritte und Hilfsvariablen ein Programm lesbarer machen.

    Wenn ich einfach nur die Formel aus der Formelsammlung einhacke und meinen Rückgabewert beim erstellen gleich initialisiere:

    struct complx multiplizieren(struct complx a,struct complx b){
      struct complx erg = {a.re*b.re-a.im*b.im, a.re*b.im+a.im*b.re};
      return erg;
    }
    

    Vier Zeilen statt 20+.

    Was soll übrigens immer dieses char i = 'i'; ? Du kannst Doch ein i einfach in den Formatstring einfügen?
    Das alles so aus, als ob Ihr an der Uni nach LOC bezahlt würdet... 😉



  • Furble Wurble schrieb:

    IMHO ist es übrigens ein Trugschluß, dass möglichst viele Einzelschritte und Hilfsvariablen ein Programm lesbarer machen.

    Generell mag ich mehr Einzelschritte.

    Also viel viel lieber die Struktur aufdecken wie

    G=r*r;     //kreisfläche halt
    V=G*h/3;   //volumen aller spitzigen dinge
    return V;
    

    statt

    return r*r*h/3;   //sagt die formelsammlung
    

    Aber hier, wo alle Zwischenergebnisse erg# heißen, da muss ich schon schlucken.

    Oder noch besser:

    int c = a.re;    //x1
    int d = a.im;    //y1
    

    statt

    int x1 = a.re;
    int y1 = a.im;
    //Schreib NIEMALS Kommentare, die nur sagen, wie eine Variable eigentlich heißt.
    

    Also hier biste ganz meiner Meinung. 🙂


  • Mod

    Obligatorischer Hinweis auf wenig bekannte Fähigkeiten der Sprache C:

    #include <stdio.h>
    #include <complex.h>
    
    int main()
    {
      double complex a = 1 + I;
      double complex b = 1 + I;
      double complex erg = a + b;
      printf("Ergebnis: %f + %fi\n", creal(erg), cimag(erg));
    
      double complex c = -7 + 5*I;
      double complex d = 3 - 3*I;
      erg = c*d;
      printf("Ergebnis: %f + %fi\n", creal(erg), cimag(erg));
    }
    


  • Ist hier nicht das Problem des TE's, dass er eine lokale Variable zurückgibt? Und sobald er sie als "static" deklariert diese Variable einfach nicht mehr auf dem Stack sondern im DataSegmet-Speicher (oder wie auch immer der genau heisst, wo die statischen Variablen abgelegt werden) liegen und sie deshalb weiter existiert, obwohl beim Verlassen der Funktion der Stack aufgeräumt wird?

    D.h. ... ohne ablegen der Variable im DataSegment-Speicher (d.h. ohne "static") kommt es zu UB.



  • Nein, daran liegt es nicht, denn der Rückgabewert ist ja eine Struktur (und kein Zeiger) und wird deshalb als Wert zurückgegeben.


Anmelden zum Antworten