Vektoren vergleich in C



  • Hallo liebes C++ Forum 🙂

    stehe vor folgender Aufgabe:

    Ich soll ein Programm schreiben, welches die Länge der Vektoren in folgender Form vergleich: V1=(X1,X2,X3), V2=(Y1,Y2,Y3).
    Das Programm soll das Ergebnis in folgender Form darstellen:|V1| > |V2| or |V1| < |V2| or |V1| = |V2|
    Die Vektoren sollen in 2 Arrays eingetragen werden. Der Vergleich der Vektorenlänge soll durch folgende Funktion durchgeführt werden: int compVecLen(int v1[], int v2[])

    Dabei habe ich folgenden Ansatz gewählt, erhalte allerdings weiterhin Fehlermeldungen. Was mache ich falsch?

    #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(v1[],v2[])
    
    {
    
    int v1[3]={A1,A2,A3};
    int v2[3]={B1,B2,B3};
    
    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;
    }
    
    }
    


  • Zuersteinmal editiere deinen Beitrag: markiere deinen Code und drücke den Button "C", dann "Absenden"...

    Und zweitens: soso Fehlermeldungen also, wie interessant 😉

    Und zu guter Letzt doch noch ein Hinweis: Arrays übergibt man einfach per Namen als Parameter an eine Funktion (ohne []).



  • Hab's gemacht 🙂

    Ich glaube insbesondere, dass ich beim Einsetzen der Variablen in das Array was grundlegend falsch mache. Wenn das so überhaupt möglich ist, wie ich mir das gedacht habe..



  • welcher Kompiler? Warnungen an

    kopier mal deinen Code in gcc.godbolt.org und kompilier ihn (links Kompiler wählen) mit Clang 3.8 und als Parameter (2. Eingabefeld) schreibst du -Wall

    kommen eine Menge Warnungen die du fixen solltest



  • Ich habe noch einen Hinweis in meinem obigen Beitrag hinzugefügt.



  • Ich benutze den Compiler auf tutorialspoint.com und erhalte insgesamt drei Fehlermeldungen:

    27:22: expected expression before ']' token

    At top level:
    46:16: unknown type name 'v1'

    46:21: unknown type name 'v2'

    Habe leider keine Ahnung wie ich die Sachen lösen soll 😕



  • Th69 schrieb:

    Ich habe noch einen Hinweis in meinem obigen Beitrag hinzugefügt.

    Danke, habe das gefixt, jetzt kommen nur noch zwei Fehler:

    At top level:
    46:16: unknown type name 'v1'

    46:21: unknown type name 'v2'

    Wenn ich das Array v1 und v2 ohne [] in die Funktion am Ende einsetze, sagt er mir, dass v1 und v2 anschließend anders deklariert sind.



  • 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).


Log in to reply