Berechnung einer Form



  • Hallo, sitze an ner Aufgabe zur Berechung einer geometrischen Form aus 4 Koordiantenpaaren.
    Mein Quellcode sieht wie folgt aus:

    #include <stdio.h>
    
    int main (void)
    {
    	int x1, y1, x2, y2, x3, y3, x4, y4;
    	printf("Bitte geben Sie das erste X-Koordinate ein: \n");
    	scanf("%d", &x1);
    	printf("Bitte geben Sie das erste Y-Koordinate ein: \n");
    	scanf("%d", &y1);
    	printf("Bitte geben Sie das zweite X-Koordinate ein: \n");
    	scanf("%d", &x2);
    	printf("Bitte geben Sie das zweite Y-Koordinate ein: \n");
    	scanf("%d", &y2);
    	printf("Bitte geben Sie das dritte X-Koordinate ein: \n");
    	scanf("%d", &x3);
    	printf("Bitte geben Sie das dritte Y-Koordinate ein: \n");
    	scanf("%d", &y3);
    	printf("Bitte geben Sie das vierte X-Koordinate ein: \n");
    	scanf("%d", &x4);
    	printf("Bitte geben Sie das vierte Y-Koordinate ein: \n");
    	scanf("%d", &y4);
    
    	pruefe_quadrat (x1, y1, x2, y2, x3, y3, x4, y4);
    }
    
    int pruefe_quadrat(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
    	if (x1==y1==x2==y3 && y2==x3==x4==y4)
    		printf("Die eingegebenen Koordinaten ergeben ein Quadrat.\n");
    	else pruefe_rechteck (x1, y1, x2, y2, x3, y3, x4, y4);
    }
    
    int pruefe_rechteck(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
    	if ((x1==y1==x2==y3 && y2==y4 && x3==x4) || (x1==y1==x2==y3 && y2==x4 && x3==y4))
    		printf("Die eingegebenen Koordinaten ergeben ein Rechteck.\n");
    	else pruefe_parallel (x1, y1, x2, y2, x3, y3, x4, y4);
    }
    
    int pruefe_parallel(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
    	if ((y1==y2 && y3==y4) || (x1==x2 && x3==x4))
    		printf("Die eingegebenen Koordinaten ergeben ein Parallelogramm.\n");
    	else pruefe_trapez (x1, y1, x2, y2, x3, y3, x4, y4);
    }
    
    int pruefe_trapez(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
    	if ((x1==y1==y2==x3 && x2==x4) || (x1==x3==y3==y4 && y1==y2) || (x1==y1==y2 && y3==y4))
    		printf("Die eingegebenen Koordinaten ergeben ein Trapez.\n");
    	else pruefe_raute (x1, y1, x2, y2, x3, y3, x4, y4);
    }
    
    int pruefe_raute(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
    	if ((x1==y3 && y1==x2==y2 && x3==x4) || (x1==y1==x2 && y2==x3))
    		printf("Die eingegebenen Koordinaten ergeben eine Raute.\n");
    	else printf("Die eingegebenen Koordinaten ergeben ein beliebiges Vieleck.\n");
    
    	getchar();
    }
    

    Es soll auf diese 5 Formen untersucht werden und das jeweils in einer eigenen Funktion. WOllte es zuerst mit switch machen, aber wusste nicht wie das geht, bzw wie ich da die Anwendung schreiben muss.
    Visual Studio gibt mir zudem den Fehler aus, dass scanf "unsafe" ist und ich scanf_s nehmen soll. Kann ich nicht nachvollziehen und dann meckert es bei dem Funktionen, dass der Bezeichner nicht gefunden wird.


  • Mod

    UweK schrieb:

    WOllte es zuerst mit switch machen, aber wusste nicht wie das geht, bzw wie ich da die Anwendung schreiben muss.

    Und was hindert dich, nachzuschauen, wie ein switch funktioniert? Das sollte spätestens im dritten oder vierten Kapitel jedes Lehrbuches drankommen und ist so einfach, dass man sogar einem Internettutorial vertrauen kann.



  • Mit switch geht es nicht, aber mit einer if-else-Kaskade natürlich. Dazu musst du die Funktionen anders formulieren, nämlich so, dass sie das Ergebnis nicht auf den Bildschirm ausgeben, sondern als Wahrheitswert zurückgeben. So war das wahrscheinlich auch gedacht, da deine Funktionen alle int als Rückgabewert haben (int ist in C89 der Typ für Wahrheitswerte, bool gibt es ab C99).

    int pruefe_quadrat(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
        /* gibt 1 zurück, falls der Ausdruck wahr ist; 0 falls er falsch ist */
        return x1==y1==x2==y3 && y2==x3==x4==y4;
    }
    
    int pruefe_rechteck(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4)
    {
        return ((x1==y1==x2==y3 && y2==y4 && x3==x4) || (x1==y1==x2==y3 && y2==x4 && x3==y4));
    }
    
    /* ... */
    
    int main() {
      /* ... */
      if (pruefe_quadrat(x1, y1, x2, y2, x3, y3, x4, y4))
        printf("Es ist ein Quadrat!\n");
      else if (pruefe_rechteck(x1, y1, x2, y2, x3, y3, x4, y4))
        printf("Es ist ein Rechteck!\n");
      else if /* ... */
      else
        printf("Nichts davon :(\n");
    }
    

    Visual Studio gibt mir zudem den Fehler aus, dass scanf "unsafe" ist und ich scanf_s nehmen soll. Kann ich nicht nachvollziehen und dann meckert es bei dem Funktionen, dass der Bezeichner nicht gefunden wird.

    Kannst du ignorieren. scanf kann zwar gefährlich sein, aber nur wenn man es falsch benutzt. Die "sicheren" Microsoft-Alternativen sind dagegen nicht im Standard enthalten, also nicht zu anderen C-Implementierungen portabel. In der MS-Hilfe steht m.W. auch, wie man diese Warnung loswird.

    edit: Ich hab erstmal nicht die Logik angeschaut. Beim zweiten Blick seh ich, dass sie falsch ist:

    x1==y1==x2==y3
    

    prüft NICHT ob x1,y1,x2 und y3 alle gleich sind. Alle Vergleichsoperatoren sind in C zweistellig, d.h. sie können nur genau zwei Ausdrücke miteinander vergleichen. x1==y1==x2 bedeutet wegen der Linksassoziativität (x1==y1)==x2 . Was du willst ist

    x1==y1 && y1==x2 && x2==y3
    


  • UweK schrieb:

    und dann meckert es bei dem Funktionen, dass der Bezeichner nicht gefunden wird.

    Welcher denn? Wie heißt die Fehlermeldung genau?

    Das y2==x3==x4==y4 funktioniert nicht so, wie du denkst.
    Du kannst immer nur zwei Werte miteinander vergleichen.

    Und überleg mal genauer ob das wirklich so hinkommen kann.
    Du gibst Koordinaten ein.
    Das kann auch (2,1) (2,3) (4,3) (4,1) sein. Das ist ein Quadrat.
    Da kommen vier verschiedene Zahlenwerte drin vor (1,2,3,4). Das kannst du nicht mit zwei Vergleichen erledigen. 😞



  • Benenne deine Quellcodedatei in .c um, falls sie .cpp heißt und setze ganz am Beginn

    #undef UNICODE
    #undef _UNICODE
    #pragma warning ( disable:4996 )
    

    Mit switch wird das schwierig, da der case-Ausdruck immer konstant sein muss, also bleibt erstmal nur eine zusammengefasste Variante/Funktion mit mehreren if/else.


  • Mod

    Verstehe ich gerade nicht, was der Threadersteller möchte oder warum sind hier alle der Meinung, dass das nicht mit switch ginge? Ich dachte der Threadersteller wollte das klassische Anfängermenü à la "1 für Rechteck, 2 für Quadrat, ..."?



  • SeppJ schrieb:

    Ich dachte der Threadersteller wollte das klassische Anfängermenü à la "1 für Rechteck, 2 für Quadrat, ..."?

    Was genau lässt dich das vermuten?


  • Mod

    Bashar schrieb:

    SeppJ schrieb:

    Ich dachte der Threadersteller wollte das klassische Anfängermenü à la "1 für Rechteck, 2 für Quadrat, ..."?

    Was genau lässt dich das vermuten?

    Die Häufigkeit dieser Art Frage in der Vergangenheit und dass die Aussage

    Es soll auf diese 5 Formen untersucht werden und das jeweils in einer eigenen Funktion. WOllte es zuerst mit switch machen, aber wusste nicht wie das geht, bzw wie ich da die Anwendung schreiben muss.

    sich mit etwas gutem Willen damit deckt. Hier kamen schon so oft ganz einfache Fragen, wo man zuerst denkt, es wäre was kompliziertes, ich gehe mittlerweile immer zuerst davon aus, dass der Threadersteller sich schlecht ausdrückt.



  • Du liest also gar nicht die Postings, auf die du antwortest? Cool. Dass du bei diesem Fuzzy-Pattern-Matching-Approach ganz ansehnliche Trefferquoten erzielst sagt wohl einiges über das Publikum hier aus 😉



  • Das mit den dopplten Vergleichen wusste ich nicht. Das Programm hat nix dazu gesagt also ging ich auch mal davon aus, dass es ok ist. Danke schonmal dafür.
    Ich schreib dann da mal was um und bei weiteren Problemen melde ich mich.



  • UweK schrieb:

    Das mit den dopplten Vergleichen wusste ich nicht. Das Programm hat nix dazu gesagt also ging ich auch mal davon aus, dass es ok ist.

    Der Operator ist (wie die meisten) linksassoziativ, d.h. a==b==c bedeutet (a==b)==c. a==b ist 1 falls a gleich b ist und 0 falls a ungleich b ist. Danach wird dieses Ergebnis mit c verglichen. Das ganze hat eine wohldefinierte Bedeutung und rechtfertigt somit keine Warnung, es macht halt nur was anderes als du denkst.


Anmelden zum Antworten