Vektoren vergleich in C



  • Tergo schrieb:

    Ich glaube insbesondere, dass ich beim Einsetzen der Variablen in das Array was grundlegend falsch mache.

    Die Vermutung ist doch schon ganz gut.

    Das sieht so aus, als ob Du erst alles geschrieben und dann mal getestest hast.

    Ich würde wieder zwei Schritte zurückgehen.

    Versuch mal die leere Funktion vec_print() zu implementieren, schau Dir die Ausgabe an und grübel/experimentier mal ein bisschen.

    #include <stdio.h>
    
    void vec_print(int v[3])
    {
    	// v[0], v[1] und v[2] ausgeben
    }
    
    int X1,X2,X3;
    
    int main(void)
    {
    	int V1[3]={X1,X2,X3};
    
    	printf("Enter the values of Vector 1");
    	scanf("%d",&X1);
    	scanf("%d",&X2);
    	scanf("%d",&X3);
    
    	vec_print(V1);
    }
    


  • Meinst du so?

    #include <stdio.h>
    
    void vec_print(int v[3])
    {
        printf("%d", v[0]);
        printf("%d", v[1]);
        printf("%d", v[2]);
    }
    
    int X1,X2,X3;
    
    int main(void)
    {
        int V1[3]={X1,X2,X3};
    
        printf("Enter the values of Vector 1");
        scanf("%d",&X1);
        scanf("%d",&X2);
        scanf("%d",&X3);
    
        vec_print(V1);
    }
    

    Wohl nicht, das Programm gibt nämlich anschließend 000 aus, egal was ich eintippe...



  • Ja - meinetwegen.

    Und wenn Du es kompilierst und ausprobierst? Was siehst Du? Was hättest Du erwartet? Kannst Du Dir vorstellen, was der Fehler ist?

    Ich sehe Deinen edit: Ausgabe ist 000...
    Was könnte denn der Grund sein? Ist ja alles in allem ein relativ überschaubares Programm...



  • Vergleiche mal im Originalbeitrag Zeile 46 mit Zeile 4.
    Und Zeile 50 und 51 löschen, da diese ja schon als Parameter übergeben werden...



  • Hätte gedacht, dass der Grund ist, dass v[] halt eben nicht V1[] ist? Nur wenn ich bei der vec_print Funktion auch V1 einsetze, ist dieses Array ja noch nicht deklariert.



  • Th69 schrieb:

    Vergleiche mal im Originalbeitrag Zeile 46 mit Zeile 4.
    Und Zeile 50 und 51 löschen, da diese ja schon als Parameter übergeben werden...

    Bei einem kommt int vor, bei dem anderen nicht.

    Allerdings verstehe ich nicht, wieso die Zeilen wegkönnen, dann würde das Programm doch meckern, dass diese nicht in Verbindung mit dem Array deklariert wurden, oder?



  • In C werden Befehle ausgeführt, wenn sie an der Reihe sind.

    Bei dir wird das Array mit den Werten von X1, X2 und X3 gefüllt (kopiert), die sie zu dem Zeitpunkt hatten, als das Array angelegt wurde.
    (Da dies Xn globale Variablen sind, sind sie mit 0 initialisiert.)

    Egal welchen Wert diese Xn noch bekommen, v wird dadurch nicht verändert, da ist keine weitere Verbindung dazu gibt.



  • Tergo schrieb:

    Hätte gedacht, dass der Grund ist, dass v[] halt eben nicht V1[] ist? Nur wenn ich bei der vec_print Funktion auch V1 einsetze, ist dieses Array ja noch nicht deklariert.

    In vec_print() ist das Array das gleiche.

    Es ist viel simpler. Ergänz das Programm mal um eine Ausgabe der einzelnen (globalen) Variablen.

    PS: der Grund für die "blöde" schnitzeljagd hier ist, dass ich denke dass Du möglichst viel experimentieren solltest.



  • Furble Wurble schrieb:

    Tergo schrieb:

    Hätte gedacht, dass der Grund ist, dass v[] halt eben nicht V1[] ist? Nur wenn ich bei der vec_print Funktion auch V1 einsetze, ist dieses Array ja noch nicht deklariert.

    In vec_print() ist das Array das gleiche.

    Es ist viel simpler. Ergänz das Programm mal um eine Ausgabe der einzelnen (globalen) Variablen.

    PS: der Grund für die "blöde" schnitzeljagd hier ist, dass ich denke dass Du möglichst viel experimentieren solltest.

    So?

    #include <stdio.h>
    
    int X1,X2,X3; 
    
    void vec_print(int v[3])
    {
        printf("%d", X1);
        printf("%d", X2);
        printf("%d", X3);
    }
    
    int main(void)
    {
        int V1[3]={X1,X2,X3};
    
        printf("Enter the values of Vector 1");
        scanf("%d",&X1);
        scanf("%d",&X2);
        scanf("%d",&X3);
    
        vec_print(V1);
    }
    

    Ich glaube langsam steige ich dahinter, allerdings: wieso steht bei dem Einsatz der Funktion dann noch in der Klammer int v[3]? Muss es sich hierbei einfach um ein anderes Array handeln, als das Original, welches aus der main geschickt wird?



  • #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[], int v2[])
    
    {
    
    amountv1=sqrt(A1*A1+A2*A2+A3*A3);
    amountv2=sqrt(B1*B1+B2*B2+B3*B3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    

    So funktioniert jetzt schon mal das Programm, vielen Dank bis dahin! Allerdings erhalte ich egal welche Werte ich eingebe, die 'else'-Option, also laut Programm sind die Vektoren immer gleich lang. Ich tüftel allerdings noch dran..

    edit: es scheitert offenbar bereits an der Rechnung. Ich schicke die Werte aus der Main nicht richtig in die compVecLen Function, denke ich. Sehe jedoch momentan noch nicht den Unterschied zu dem Beispiel von Furble Wurble.

    Habe nun überlegt, es genauso zu gestalten, wie im Beispiel von Furble Wurble, also ohne As und Bs (welche momentan noch als Integer deklariert sind). Das Programm startet allerdings auch wieder zum Schluss mit dem Else Statement..

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(X1*X1+X2*X2+X3*X3);
    amountv2=sqrt(Y1*Y1+Y2*Y2+Y3*Y3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    


  • Tergo schrieb:

    Ich glaube langsam steige ich dahinter, allerdings: wieso steht bei dem Einsatz der Funktion dann noch in der Klammer int v[3]? Muss es sich hierbei einfach um ein anderes Array handeln, als das Original, welches aus der main geschickt wird?

    Wie gesagt es ist kein anderes Array.
    Das Array, dass Du in vec_print() hast, ist jenes welches Du beim Aufruf reinsteckst:

    int main(void)
    {
    	int V1[3] = {7, 8, 9};
    	vec_print(V1);
    }
    

    Das eröffnet sogar die interessante Möglichkeit, direkt ins Array zu lesen:

    void vec_read(int v[3]) {
    	scanf("%d %d %d",&v[0], &v[1], &v[2]);
    }
    
    int main(void)
    {
    	int V1[3];
    	vec_read(V1);
    	vec_print(V1);
    }
    


  • Habe oben noch 'geedited'. Liegt es dann an der Berechnung der Beträge?



  • Das hat dir DirkB schon geschrieben (auch wenn es hier ein wenig durcheinander ging 😉

    Entweder verwende für scanf direkt die Adressen der einzelnen Array-Werte (z.B. &v[0]) oder aber initialisiere das Array nach den Eingaben (je nach C Compiler C89/C99 benötigst du einen eigenen Block { ... } dafür).



  • Das heißt, wenn ich X1,X2,X3,Y1,Y2,Y3 gar nicht mehr benötige, darf der Code dann so aussehen?

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&V1[0]);
    scanf("%d",&V1[1]);
    scanf("%d",&V1[2]);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&V2[0]);
    scanf("%d",&V2[1]);
    scanf("%d",&V2[2]);
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(v1[1]*v1[1]+v1[2]*v1[2]+v1[3]*v1[3]);
    amountv2=sqrt(v2[1]*v2[1]+v2[2]*v2[2]+v2[3]*v2[3]);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    

    Und die eingegebenen Daten in das Array zu initialisieren sähe dann so aus?

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    X1=V1[0];
    X2=V1[1];
    X3=V1[2];
    Y1=V2[0];
    Y2=V2[1];
    Y3=V2[2];
    
    result=compVecLen(V1,V2);
    
    if(result=d)
    {
    printf("|V1| > |V2|");
    }
    if(result=c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(X1*X1+X2*X2+X3*X3);
    amountv2=sqrt(Y1*Y1+Y2*Y2+Y3*Y3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    

    Erhalte allerdings weiterhin das Else Statement als Ausgabe...



  • gcc.godbolt.org mit clang 3.8 und -Wall als Parameter liefert dir noch ein bisschen was zum schauen



  • Gast3 schrieb:

    gcc.godbolt.org mit clang 3.8 und -Wall als Parameter liefert dir noch ein bisschen was zum schauen

    Leider verstehe ich dabei nur böhmische Dörfer 😕
    ich versuche zwar in etwa nachzuvollziehen, was dort passiert, aber mit der Ansicht ziemlich überfordert. Hast du noch einen Tipp?



  • Bin leider völlig mit meinem Latein am Ende. Vorher wusste ich zwar auch nicht genau, WAS falsch war, aber ich hatte das Gefühl, dass etwas nicht stimmen konnte. Jetzt, egal wie oft ich den Code Zeile für Zeile durchgehe, denke ich, dass es doch eigentlich stimmen müsste..

    Edit: Folgendes: müsste es bei den if-Statements mit Result nicht '==' heißen? Wenn ich das tue, erfolgt bei jeglicher Werteingabe das Statement von result==d UND result==c.



  • Tergo schrieb:

    Leider verstehe ich dabei nur böhmische Dörfer 😕
    ich versuche zwar in etwa nachzuvollziehen, was dort passiert, aber mit der Ansicht ziemlich überfordert. Hast du noch einen Tipp?

    Du bist davon überfordert, die Warnung, die dein Code produziert, nachzuvollziehen? Das ist in weniger als 5 Sekunden zu finden und in zwei Sekunden zu fixen.

    Tergo schrieb:

    Edit: Folgendes: müsste es bei den if-Statements mit Result nicht '==' heißen? Wenn ich das tue, erfolgt bei jeglicher Werteingabe das Statement von result==d UND result==c.

    Bingo. Jetzt schau dir noch mal genau ab, wie dein if-else Konstrukt aussieht, da fehlt nämlich auch was.

    Wann werden c und d gesetzt?



  • dachschaden schrieb:

    Tergo schrieb:

    Leider verstehe ich dabei nur böhmische Dörfer 😕
    ich versuche zwar in etwa nachzuvollziehen, was dort passiert, aber mit der Ansicht ziemlich überfordert. Hast du noch einen Tipp?

    Du bist davon überfordert, die Warnung, die dein Code produziert, nachzuvollziehen? Das ist in weniger als 5 Sekunden zu finden und in zwei Sekunden zu fixen.

    Ich dachte eher, dass Hauptaugenmerk liegt auf der linken Seite. Die einzige Warnung, die dann kam, drehte sich um das result==c und result==d, welches ich nun behoben habe. Die Berechnung wird jedoch weiterhin nicht richtig ausgeführt. Gcc Godbolt spuckt keine weiteren Warnungen aus.

    Dementsprechend sieht der Code nun wie folgt aus:

    #include <stdio.h>
    #include <math.h>
    
    int compVecLen(int v1[], int v2[]); char result;
    int X1,X2,X3,Y1,Y2,Y3;
    int A1,A2,A3,B1,B2,B3;
    int c,d;
    int amountv1, amountv2;
    int main()
    
    {
    
    int V1[3]={X1,X2,X3};
    int V2[3]={Y1,Y2,Y3};
    
    printf("Enter the values of Vector 1");
    scanf("%d",&X1);
    scanf("%d",&X2);
    scanf("%d",&X3);
    
    printf("Enter the values of Vector 2");
    scanf("%d",&Y1);
    scanf("%d",&Y2);
    scanf("%d",&Y3);
    
    X1=V1[0];
    X2=V1[1];
    X3=V1[2];
    Y1=V2[0];
    Y2=V2[1];
    Y3=V2[2];
    
    result=compVecLen(V1,V2);
    
    if(result==d)
    {
    printf("|V1| > |V2|");
    }
    if(result==c)
    {
    printf("|V1| < |V2|");
    }
    else
    {
    printf("|V1| = |V2|");
    }
    
    return 0;
    
    }
    
    int compVecLen(int v1[3], int v2[3])
    
    {
    
    amountv1=sqrt(X1*X1+X2*X2+X3*X3);
    amountv2=sqrt(Y1*Y1+Y2*Y2+Y3*Y3);
    
    if(amountv1<amountv2)
    {
    return c;
    }
    
    if(amountv1>amountv2)
    {
    return d;
    }
    
    else
    {
    return 0;
    }
    
    }
    


  • 'c' und 'd' werden eingesetzt, wenn amountv1<amountv2 bzw. amountv1>amountv2 ergibt


Anmelden zum Antworten