Hilfe mein C-Programm



  • Guten Abend allerseits,
    habe ein kleines (großes) Problem... sehr wahrscheinlich für euch nur ein Klaks.
    Da ich für mien Studium ein Programm schreiben muss und C erst seit ca. 3 Monaten kann, hoffe ich auf eure Hilfe.
    Das Programm sieht wie folgt aus:
    -Es soll ein Polygon aufgestellt werden mit diversen Punkten min. 3 max. 20
    -Die strecken untereinander dürfen sich nicht schneiden... wenn sie sich schneiden kommt ne Fehlermeldung.
    - Dann geht es zwar noch weiter aber bis dahin bin ich est mal gekommen und in der Überprüfung ob sich die Strecken schneiden liegt auch der Fehler.
    Beim ausführen des Programmes sagt der mir immer indoo (er teilt durch 0) ... habe ich allerdings vorher mit eps bestimmt.. könnt ihe da mal drüber gucken und was dazu sagen.
    Danke
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    struct vektor
    {
    double x;
    double y;

    };

    int main(void)
    {
    int a,i=1,b;
    struct vektor p[21],r[21];
    double lambda,eps=0.09;

    printf("Bitte geben Sie die Anzahl der Eckpunkte ihres Polygons ein:\n");

    while (a<3||a>20)
    {
    printf("\nDie Mindestanzahl der Eckpunkte eines Polygons muss 3 und hier maximal 20 sein!\n");
    scanf("%i", &a);
    fflush(stdin);
    }

    printf("\nBitte geben Sie nun den Punkte des Polygons ein!");
    printf("\nBeachten Sie bitte, dass die Werte der Punkte im Bereich von -10 und +10 liegen muessen!");

    for(i=1;i<=a;i++)

    {
    printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].x);
    fflush(stdin);

    printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].y);
    fflush(stdin);
    printf("\n %.5lf ; %.5lf", p[i].x,p[i].y);

    if(p[i].x<=-10 || p[i].x>=10 || p[i].y>=10 || p[i].y<=-10) /*Bereichsprüfung von -10 bis +10*/
    {
    while(p[i].x<=-10 || p[i].x>=10 || p[i].y>=10 || p[i].y<=-10)
    {
    printf("\nBitte geben sie den %i.Punkt erneut ein:", i);
    printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].x);
    fflush(stdin);
    printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].y);
    fflush(stdin);
    } /*Bereichsprüfung von -10 bis +10-ENDE*/
    }
    if(i>=2) /*Punktidentität*/
    {
    if(p[i].x == p[i-1].x && p[i].y == p[i-1].y)
    {
    printf("\nBitte geben sie den %i.Punkt erneut ein, da eine Strecke nur ein zwei nicht-identischen Punkten gebildet werden kann:", i);
    printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].x);
    fflush(stdin);
    printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].y);
    fflush(stdin);
    }
    } /*Punktidentität-ENDE*/
    }
    for(i=1;i<a;i++)
    {
    r[i].x = p[i+1].x - p[i].x;
    r[i].y = p[i+1].y - p[i].y;
    printf("\n%i.Richtungsvektor ist gleich (%lf/%lf)",i,r[i].x,r[i].y);
    }
    r[i].x = p[1].x - p[i].x;
    r[i].y = p[1].y - p[i].y;
    printf("\n%i.Richtungsvektor ist gleich (%lf/%lf)",i,r[i].x,r[i].y);

    for(i=1;i<=a;i++)
    {
    for(b=1;b<a;b++)
    {
    if(i == b)
    {
    b++;
    }
    if (fabs(r[i].x) <eps || fabs(r[b].y-(r[b].x*r[i].y/r[i].x))<eps)
    {
    lambda = (-p[b].x+p[i].x+(((p[b].y-p[i].y)*r[i].x)/r[i].y))/(r[b].x-(r[b].y*r[i].x/r[i].y));
    printf("\nLAMBDA %i ist gleich %lf",i,lambda);
    }
    else
    {
    lambda = (-p[b].y+p[i].y+(((p[b].x-p[i].x)*r[i].y)/r[i].x))/(r[b].y-(r[b].x*r[i].y/r[i].x));
    printf("\nLAMBDAa %i ist gleich %lf",i,lambda);
    }
    if(lambda >0 && lambda < 1)
    {
    printf("Biba Bumse-Biene, du bekommst gelich ein paar HIEBE!(Strecken schneiden sich)");
    printf("\nBitte geben sie den %i.Punkt erneut ein:", i);
    printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].x);
    fflush(stdin);
    printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
    scanf("%lf",&p[i].y);
    fflush(stdin);
    }
    }
    }

    system("PAUSE");
    return 0;
    }
    -------------------------------------------------------------------------------



  • Benutze doch bitte die [cpp][/cpp]-Tags um deinen Code und poste ihn nochmal.



  • xeltic schrieb:

    Beim ausführen des Programmes sagt der mir immer indoo (er teilt durch 0) ... habe ich allerdings vorher mit eps bestimmt.. könnt ihe da mal drüber gucken und was dazu sagen.

    lass es im debugger laufen, oder mach 'printf'-ausgaben rein, dann siehste ja, was du zu 0 wird.
    🙂



  • nwp2 schrieb:

    Benutze doch bitte die [cpp][/cpp]-Tags um deinen Code und poste ihn nochmal.

    was ist das bin auf dem gebiet ziemoich ahnungslos



  • Du schreibst einfach diese Tags um den code herum.

    also statt
    int main(){
    //bla
    int i;
    i++;
    return i;
    }

    schreibst du
    [cpp]
    int main(){
    //bla
    int i;
    i++;
    return i;
    }[/cpp]

    und das wird dann zu

    int main(){
        //bla
        int i;
        i++;
        return i;
    }
    

    Dann ist es viel leichter zu lesen. Unter dem Edit-Fenster unter den Smileys gibt es den C/C++-Button, der tut dasselbe.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    struct vektor
    {
           double x;
           double y;
    
           };
    
    int main(void)
    {
        int a,i=1,b;
        struct vektor p[21],r[21];
        double lambda,eps=0.09;
    
        printf("Bitte geben Sie die Anzahl der Eckpunkte ihres Polygons ein:\n");
    
        while (a<3||a>20)
              {
              printf("\nDie Mindestanzahl der Eckpunkte eines Polygons muss 3 und hier maximal 20 sein!\n");
              scanf("%i", &a);
              fflush(stdin);
              }
    
        printf("\nBitte geben Sie nun den Punkte des Polygons ein!");
        printf("\nBeachten Sie bitte, dass die Werte der Punkte im Bereich von -10 und +10 liegen muessen!");
    
                 for(i=1;i<=a;i++)
    
                    {
                       printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
                       scanf("%lf",&p[i].x);
                       fflush(stdin);
    
                       printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
                       scanf("%lf",&p[i].y);
                       fflush(stdin);
                       printf("\n %.5lf ; %.5lf", p[i].x,p[i].y);
    
                       if(p[i].x<=-10 || p[i].x>=10 || p[i].y>=10 || p[i].y<=-10)      /*Bereichsprüfung von -10 bis +10*/
                       {
                                 while(p[i].x<=-10 || p[i].x>=10 || p[i].y>=10 || p[i].y<=-10)
                                 {
                                 printf("\nBitte geben sie den %i.Punkt erneut ein:", i);
                                 printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
                                 scanf("%lf",&p[i].x);
                                 fflush(stdin);
                                 printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
                                 scanf("%lf",&p[i].y);
                                 fflush(stdin);
                                 }                                                    /*Bereichsprüfung von -10 bis +10-ENDE*/
                       } 
                       if(i>=2)                                                       /*Punktidentität*/
                       {
                       if(p[i].x == p[i-1].x && p[i].y == p[i-1].y)
                       {
                                 printf("\nBitte geben sie den %i.Punkt erneut ein, da eine Strecke nur ein zwei nicht-identischen Punkten gebildet werden kann:", i);
                                 printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
                                 scanf("%lf",&p[i].x);
                                 fflush(stdin);
                                 printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
                                 scanf("%lf",&p[i].y);
                                 fflush(stdin);        
                        }
                        }                                                             /*Punktidentität-ENDE*/
                    }
        for(i=1;i<a;i++)
        {
                        r[i].x = p[i+1].x - p[i].x;
                        r[i].y = p[i+1].y - p[i].y;
                        printf("\n%i.Richtungsvektor ist gleich (%lf/%lf)",i,r[i].x,r[i].y);
        }     
        r[i].x = p[1].x - p[i].x;
        r[i].y = p[1].y - p[i].y;
        printf("\n%i.Richtungsvektor ist gleich (%lf/%lf)",i,r[i].x,r[i].y);
    
        for(i=1;i<=a;i++)
        {
                        for(b=1;b<a;b++)
                        {
                        if(i == b)
                        {
                             b++;
                        }
                        if (fabs(r[i].x) <eps || fabs(r[b].y-(r[b].x*r[i].y/r[i].x))<eps)
                        {
                        lambda = (-p[b].x+p[i].x+(((p[b].y-p[i].y)*r[i].x)/r[i].y))/(r[b].x-(r[b].y*r[i].x/r[i].y));
                        printf("\nLAMBDA %i ist gleich %lf",i,lambda);
                        }
                        else
                        {
                            lambda = (-p[b].y+p[i].y+(((p[b].x-p[i].x)*r[i].y)/r[i].x))/(r[b].y-(r[b].x*r[i].y/r[i].x));
                            printf("\nLAMBDAa %i ist gleich %lf",i,lambda);
                        }
                        if(lambda >0 && lambda < 1)
                        {
                                  printf("Biba Bumse-Biene, du bekommst gelich ein paar HIEBE!(Strecken schneiden sich)");
                                  printf("\nBitte geben sie den %i.Punkt erneut ein:", i);
                                  printf("\nBitte geben sie nun die X-Koordinate des %i. Punktes ein:", i);
                                  scanf("%lf",&p[i].x);
                                  fflush(stdin);
                                  printf("Bitte geben sie nun die Y-Koordinate des %i. Punktes ein:", i);
                                  scanf("%lf",&p[i].y);
                                  fflush(stdin);         
                        }
                        }
        }
    
      system("PAUSE"); 
      return 0;
    }
    


  • Zeile 3: int a...;
    Zeile 20: while (a<3||a>20)
    a ist nicht initialisiert und hat einen Pseudozufallswert. Unter Umständen könnte a zum Beispiel 5 sein und dein Programm fragt nicht nach der Anzahl der Eckpunkte sondern nimmt 5, oder auch 10. Setze int a = 0 an den Anfang.

    Statt /*Bereichsprüfung von -10 bis +10*/ und /*Bereichsprüfung von -10 bis +10-ENDE*/ solltest du lieber eine Funktion basteln die das tut. Dient sehr der Übersichtlichkeit. Selbiges gilt für Punktidentität.

    Zeile 69, muss das so dass i bei 1 anfängt und nicht bei 0?

    a solltest du in AnzahlDerEckpunkte oder so umbenennen. Du solltest lokale Variablen nicht global deklarieren. Entferne b aus Zeile 3 und schreibe stattdessen in Zeile 81 for(int b = 1; b<a; b++).

    Bei deiner Streckenschnittpunktsberechnung sehe ich nicht durch. Ich habe das hier gefunden: http://www.blendpolis.de/download/file.php?id=48096&sid=7676167cda0f493ac5ace2f1ab2c21b0&mode=view
    Du musst nur noch den Fall ergänzen, wo du eine senkrechte Strecke hast und es keine Geradengleichung gibt.



  • [quote="nwp2"]Zeile 3: int a...;
    Zeile 20: while (a<3||a>20)
    a ist nicht initialisiert und hat einen Pseudozufallswert. Unter Umständen könnte a zum Beispiel 5 sein und dein Programm fragt nicht nach der Anzahl der Eckpunkte sondern nimmt 5, oder auch 10. Setze int a = 0 an den Anfang.
    ne das ist die anzahl der Punkte die der Benutzer eingeben muss

    Statt /*Bereichsprüfung von -10 bis +10*/ und /*Bereichsprüfung von -10 bis +10-ENDE*/ solltest du lieber eine Funktion basteln die das tut. Dient sehr der Übersichtlichkeit. Selbiges gilt für Punktidentität.

    Zeile 69, muss das so dass i bei 1 anfängt und nicht bei 0?

    das musst nicht so sein habe einfach bei 1 angefangen

    a solltest du in AnzahlDerEckpunkte oder so umbenennen. Du solltest lokale Variablen nicht global deklarieren. Entferne b aus Zeile 3 und schreibe stattdessen in Zeile 81 for(int b = 1; b<a; b++).

    Bei deiner Streckenschnittpunktsberechnung sehe ich nicht durch. Ich habe das hier gefunden: http://www.blendpolis.de/download/file.php?id=48096&sid=7676167cda0f493ac5ace2f1ab2c21b0&mode=view
    Du musst nur noch den Fall ergänzen, wo du eine senkrechte Strecke hast und es keine Geradengleichung gibt.[/quo
    Das hört sich interssant an könntest du das viell. ein bisschen näher beschreiben i moment kann ich damit noch nichts anfangen



  • nwp2 schrieb:

    Du musst nur noch den Fall ergänzen, wo du eine senkrechte Strecke hast und es keine Geradengleichung gibt.

    y = x*∞, *fg*
    🙂



  • Was genau verstehst du denn nicht?
    Ich nehme mal an das mit dem Streckenschnittpunkt.
    Das Verfahren vom Link geht so vor, dass die Strecken als Geraden interpretiert werden und dann wie lineare Gleichungen Klasse 8 gleichgesetzt werden um den Schnittpunkt zu berechnen. Es gibt halt nur einige Sonderfälle. Wenn die Strecken übereinander liegen kommt halt kein Schnittpunkt heraus, sondern eine Schnittgerade. Du musst außerdem überprüfen, ob der Schnittpunkt Teil beider Strecken ist, weil Strecken halt nicht so ganz dasselbe wie Geraden sind. Außerdem exestiert keine Geradengleichung für eine senkrechte Gerade, da der Anstieg unendlich wäre.

    Also erst auf Sonderfälle prüfen, dann wenn es keine gibt die Geradengleichungen der beiden Geraden aufstellen, Schnittpunkt berechnen, prüfen ob der Schnittpunkt teil beider Strecken ist. Viel genauer kriege ich das nicht hin ohne die Aufgabe für dich zu machen, worauf ich keine Lust habe. Stell eine genaue Frage, dann kann ich dir eher helfen.

    Auf jeden Fall solltest du per Kommentar ranschreiben was der Code an der Stelle gerade tun soll, also welchen Sonderfall du gerade überprüfst, dass du die Geradengleichung aufstellst und so weiter, sonst sieht man nicht durch.



  • nwp2 schrieb:

    Auf jeden Fall solltest du per Kommentar ranschreiben was der Code an der Stelle gerade tun soll, also welchen Sonderfall du gerade überprüfst, dass du die Geradengleichung aufstellst und so weiter, sonst sieht man nicht durch.

    oder das teil einfach sauber in functionen aufteilen und nicht ne 100z. main...
    aber geschmäcker sind bekanntlich verschieden...

    lg lolo


Anmelden zum Antworten