Übungsaufgabe zu Strukturen



  • Danke.

    Wenn ich das srand... in das main mache kommt eine Fehlermeldung das ein strichpunkt fehlt und das variablen net definiert sind, obwohl ich es gemacht habe.

    Ich habs im Unterprogramm versucht geht auch nicht wenns ganz am Anfang steht.

    So, aber kann man debuggen, nur verschiedene Zahlenwerte werden net erzeugt:

    void getpunkte(punkt allpoints[], int len)
    {
      int t;
    
      for(t=0; t<len; t++)
      {
        allpoints[t].x=rand()%10;
    	allpoints[t].y=rand()%8;
    
      }
    }
    
    int main()
    {
      punkt punkte[MAXSTRING];
    
      getpunkte(punkte,MAXSTRING);
    
      return(0);
    }
    

    Wo genau soll ich es jetzt hintun?



  • Du brauchst auch

    #include <stdlib.h>
    #include <time.h>
    

    und dann

    int main()
    { // in C89 (u.a MS-VisualStudio) müssen erst die Variablen definiert werden ...
      punkt punkte[MAXSTRING];
    
    // ... danach kommt der Rest (Funktionsaufrufe etc.)
      srand ( time(NULL) );
    
      getpunkte(punkte,MAXSTRING);
    
      return(0);
    }
    


  • Ok, danke.

    Aber ich will ja verschiedene Zahlen je for-schleifendurchgang... Also die Zahl soll sich ja ändert nach einem durchgang von der for-schleife.

    Was ich da gemacht habe ändert ja nur die Zahlen, wenn ich kompiliere, also wenn ich das Programm "Starte ohne Debugging" und dann von vorn...

    Hier mal das Programm:

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXSTRING 10
    
    struct punkt_struct
    {
      float x;
      float y;
    };
    
    typedef struct punkt_struct punkt;
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2);
    void getpunkte(punkt allpoints[], int len);
    
    void getpunkte(punkt allpoints[], int len)
    {
      int t;
    
      for(t=0; t<len; t++)
      {
        allpoints[t].x=rand()%10;
    	allpoints[t].y=rand()%8;
    
      }
    }
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2)
    {
    
    }
    
    int main()
    {
      punkt punkte[MAXSTRING];
    
      srand(time(NULL));
    
      getpunkte(punkte,MAXSTRING);
    
      return(0);
    }
    


  • robin987 schrieb:

    Aber ich will ja verschiedene Zahlen je for-schleifendurchgang... Also die Zahl soll sich ja ändert nach einem durchgang von der for-schleife.

    Was ich da gemacht habe ändert ja nur die Zahlen, wenn ich kompiliere, also wenn ich das Programm "Starte ohne Debugging" und dann von vorn...

    😕
    Bei jedem Programmstart (mit Run oder als Doppelklick auf das Programm) werden neue Zufallszahlen generiert.

    Warum hast du bei x 10 und bei y 8 stehen?



  • Naja um zahlen zwischen 0-8 bzw. 0-10 zu erzeugen.

    Ja, aber ich will ja verschiedene Werte erzeugen einfach so gleichzeitig im Gleich Programmablauf.



  • rand( ) erzeugt jedesmal eine neue Zahl, abhängig von der vorhergehenden.
    Mit srand() kannst du einen Startwert setzen.
    Da srand() mit der Anzahl der Sekunden seit dem 1.1.1970 gesetzt wird (time(NULL)) , hast du eigentlich bei jedem Programmstart unterschieliche Werte.

    Und du erzeugst Zahlen von 0 bis 9 bzw. 0 bis 7



  • Ja, aber ich starte ja nur einmal das Programm neu.

    Ich möchte ja gleich beim 1. mal verschiedene Werte bekommen...

    Oder hab ich das falsch verstanden?



  • robin987 schrieb:

    Ja, aber ich starte ja nur einmal das Programm neu.

    Ich möchte ja gleich beim 1. mal verschiedene Werte bekommen...

    Oder hab ich das falsch verstanden?

    Ja, hast du.

    Da MAXSTRING bei dir 20 ist, wird rand() 20 mal aufgerufen. Und jedesmal gibt es einen neuen Wert.

    Was hindert dich daran, die Werte einfach mal auszugeben? Dann siehst duesw doch.
    Du musst doch sowieso zum Testen einen vorher - nachher Vegleich machen.

    Sollte MAXSTRING nicht besser MAXPUNKTE heißen?



  • Ok, danke 🙂 !

    Mir hab nur beim "Einzelschritt" machen, schlampig geschaut und die verschiedenen Werte net wirklich gesehn :D.

    Aber bei der Ausgabe kommen Werte die gar nicht kommen dürfen bzw. viel viel höher sind als die erzeugten die man, wenn man mit Einzelschritt durchgeht sieht.

    mfg robin



  • Wie gibst du die Werte denn aus?
    Was für Werte werden ausgegeben?
    Bitte zeige den Code (mit Copy & Paste)



  • So sieht der Code aus:

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXSTRING 10
    
    struct punkt_struct
    {
      float x;
      float y;
    };
    
    typedef struct punkt_struct punkt;
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2);
    void getpunkte(punkt allpoints[], int len);
    
    void getpunkte(punkt allpoints[], int len)
    {
      int t;
    
      for(t=0; t<len; t++)
      {
        allpoints[t].x=rand()%10;
    	allpoints[t].y=rand()%10;
    	printf("%d %d\n",allpoints[t].x, allpoints[t].y);
      }
    }
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2)
    {
    
    }
    
    int main()
    {
      punkt punkte[MAXSTRING];
    
      srand(time(NULL));
    
      getpunkte(punkte,MAXSTRING);
    
      return(0);
    }
    


  • %d ist bei printf für int.
    Für float und double ist %f vorgesehen.



  • Hallo, anstatt die Punkte zur löschen, hab ich sie vorgeschoben, aber ich verstehe nicht warum...

    Kann mir das einer erklären bitte?

    Gruß

    Hier das Programm:

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXSTRING 10
    
    struct punkt_struct
    {
      float x;
      float y;
    };
    
    typedef struct punkt_struct punkt;
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2);
    void getpunkte(punkt allpoints[], int len);
    void printpunkte(punkt allpoints[], int len);
    
    void getpunkte(punkt allpoints[], int len)
    {
      int t;
    
      for(t=0; t<len; t++)
      {
        allpoints[t].x=rand()%10;
    	allpoints[t].y=rand()%10;
    	printf("%f %f\n",allpoints[t].x, allpoints[t].y);
      }
    }
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2)
    {
      int t=0;
      int anz=0;
    
      for(t=0; t<len; t++)
      {
        if(allePunkte[t].x < p1.x || allePunkte[t].y < p1.y || allePunkte[t].x > p2.x || allePunkte[t].y > p2.y)
    	{
    	  anz++;
    	}
    	else
    	{
    	  allePunkte[t-anz].x=allePunkte[t].x;
    	  allePunkte[t-anz].y=allePunkte[t].y;
    	}
      }
      printpunkte(allePunkte,MAXSTRING);
      printf("Anzahl der nicht im Rechteck liegenden Punkte: %d",anz);
    }
    
    void printpunkte(punkt allpoints[], int len)
    {
      int t=0;
    
      for(t=0; t<len; t++)
      {
        //printf("___________________________________________\n");
    	printf("(%f/%f)\n",allpoints[t].x, allpoints[t].y);
      }
    }
    
    int main()
    {
      punkt punkte[MAXSTRING];
      punkt point1 = {1,2};
      punkt point2 = {5,4};
    
      //srand(time(NULL));
    
      getpunkte(punkte,MAXSTRING);
    
      cropSelection(punkte,MAXSTRING,point1,point2);
    
      return(0);
    }
    


  • Du verschiebst sie durch Zeile 48 und 49.
    Allerdings änderst du die Anzahl (len) nicht.
    Und main() sollte dann auch noch wissen wie viele Punkte jetzt noch vorhanden sind.



  • Danke.

    Wie könnte ich das den machen? Müsst ja nicht gleich den Code posten, aber vielleicht so erklären bitte.



  • Das einfachste ist, du nutzt den Rückgabewert der Funktion.
    Das geht mit dem vorgegebenen Prototyp aber nicht. Designfehler vom Auftraggeber.

    Oder du ersetzt die üngültigen Punkte durch Werte die nicht vorkommen können. Z.B. 1000000000. Das schränkt die Funktionalität ein (macht hier aber nichts).



  • Danke.

    Also kann man die Punkte wirklich nicht löschen mit dem vorgegebenen Unterprogramm?



  • Du kannst die Größe des Array punkte[MAXSTRING]; nachträglich nicht mehr verändern.
    Du kannst ja auch weniger Punkte aus dem Array nutzen als MAXSTRING.

    Die Information, wie viele Punkte in dem Array sind wird über len weitergegeben.
    Wenn du jetzt Punkte löscht ändert sich auch len.

    Du kannst auch deine struct um einen Eintrag erweitern: int gueltig;
    Wenn der Eintrag 0 ist, ist der Punkt gelöscht, sonst gültig.



  • Ok, danke.

    ich hab es mal so versucht, aber da hab ich 22 Fehler. Könnt das so nicht gehn?:

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    #include <time.h>
    
    #define MAXSTRING 10
    
    struct punkt_struct
    {
      float x;
      float y;
    };
    
    typedef struct punkt_struct punkt;
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2);
    void getpunkte(punkt allpoints[], int len);
    void printpunkte(punkt allpoints[], int z);
    
    void getpunkte(punkt allpoints[], int len)
    {
      int t;
    
      for(t=0; t<len; t++)
      {
        allpoints[t].x=rand()%10;
    	allpoints[t].y=rand()%10;
    	printf("%f %f\n",allpoints[t].x, allpoints[t].y);
      }
    }
    
    void cropSelection(punkt allePunkte[], int len, punkt p1, punkt p2)
    {
      int t=0;
      int anz=0;
      int z=0;
    
      for(t=0; t<len; t++)
      {
        if(allePunkte[t].x < p1.x || allePunkte[t].y < p1.y || allePunkte[t].x > p2.x || allePunkte[t].y > p2.y)
    	{
    	  anz++;
    	}
    	else
    	{
    	  allePunkte[t-anz].x=allePunkte[t].x;
    	  allePunkte[t-anz].y=allePunkte[t].y;
    	  z++:
    	}
      }
    
      printpunkte(allePunkte,z);
      printf("Anzahl der nicht im Rechteck liegenden Punkte: %d",anz);
    }
    
    void printpunkte(punkt allpoints[], int z)
    {
      int t=0;
    
      //printf("___________________________________________\n");
      for(t=0; t<z; t++)
      {
    	printf("(%f/%f)\n",allpoints[t].x, allpoints[t].y);
      }
    }
    
    int main()
    {
      punkt punkte[MAXSTRING];
      punkt point1 = {1,2};
      punkt point2 = {5,4};
    
      //srand(time(NULL));
    
      getpunkte(punkte,MAXSTRING);
    
      cropSelection(punkte,MAXSTRING,point1,point2);
    
      return(0);
    }
    


  • Wichtig ist der erste Fehler. Das danach sind meist Folgefehler.
    Bei dir ist es ein : in Zeile 51.


Anmelden zum Antworten