Übungsaufgabe zu Strukturen
-
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.
Mitsrand()
kannst du einen Startwert setzen.
Dasrand()
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.
-
Oh, so ein doofer Fehler :D.
Kann man diese Möglichkeit als "Punkte löschen" einordnen?
Ich meine ich verkleinere ja nicht wirklich das Array bzw. Lösche die Punkte...
ich verschiebe ja nur n-Punkte die im Rechteck liegen an die 1. n-Stellen und gib sie dann aus.Kann man das "Löschen" nennen?
Oder gibts da noch eine bessere Möglichkeit?
-
robin987 schrieb:
Kann man das "Löschen" nennen?
Ja.
Dateien werden ja auch dadurch gelöscht, dass der Speicherbereich als ungenutzt markiert wird.
Bei Strings werden durch die terminierende '\0' alle nachfolgenden Zeichen nicht mehr beachtet.