gelöst .. großes Danke an alle! :)
-
So ich möchte also einen Vektor füllen. Wie ich das mache erkläre ich gleich mal..
Ich frage erst den User, zu wieviel Prozent er den Vektor gefüllt haben möchte.
Dann rechne ich den Prozentwert in die erforderliche Anzahl von Feldern um. Dannach laufe ich den Vektor durch, aber lasse mir bei jedem Feld eine Zufallszahl von 1 oder 0 erzeugen.
Beo 1 setzt er ein Stern und zaehlt einen Counter hoch, bei 0 geht er ein Feld weiter.Nach und nach füllt sich so der Vektor und kommt nahezu an den angepeilten Prozentwert.
Jetzt das große ABER:
Das ist so verdammt Zeitintensiv...
Ich nutz die Randfunktion in Abhängigkeit von der Systemzeit. Da ich jetzt aber immer ne sec warten muss, um ne neue Zufallszahl zu bekommen ist das natuerlich nicht sehr effektiv.Ich wuesste jetzt gern ob ich das generieren beschleunigen kann, oder ob ich komplett umdenken muss.
Letzteres waere nicht so toll.
Mfg
Gradiee
-
Nicht jedes Mal srand() aufrufen (nur einmalig am Anfang) und die Releaseversion erstellen..
-
Häh?
srand() mit der Systemzeit aufrufen und ab dann einfach rand().Wo ist das Problem? Du musst nicht jede Sekunde den Pseudo-Zufallszahlengenerator neu ninitialisieren!
-
ok danke, das hat geholfen
Noch ne andere Frage.. eher ein Denkanstoß
Wenn ich den Vektor nun wirklich zufällig füllen möchte, dann waere ja der Weg einfach durchzugehen auch nicht das wahre.
Wäre dann eine For - Schleife mit der maxanzahl der zu belegenden felder nicht interessanter?
-
Was ist denn der Unterschied zwischen Durchgehen und einer for-Schleife?
-
beim "durchgehen" gehe ich von anfang an den Vektor komplett durch und setz zufällig sterne
bei der "for schleife" erstell ich ne for schleife mit anzahl = zu besetzender felder und lasse mir die Koordinaten generieren.
Eigentlich ist das eher relevant bei niedrigeren Prozentsätzen
Und ja for - schleife ist dumm ausgedrueckt..
eher Koordinaten generieren, oder durchlaufen mit ja/nein abfrage
-
Kannst du uns mal deinen Code zeigen, dann kann man dir auch helfen.
-
und wenn ich jetzt hier tatsächlich einen std::vector sehe, gibts was auf die Finger!
-
Ich bin auf alles gefasst. Außer auf den std::vector
-
Wenn der Vektor wirklich zufällig gefüllt werden sollte, dann ist die Variante mit den Koordinaten besser geeignet.
Ich stelle mir dein Programm so vor:
char vector[100]; const int size = sizeof(vector)/sizeof(*vector); int i, r, percentage; scanf("%i", &percentage); srand (time (0)); memset (vector, 0, size); for (i = percentage*size/100; i; r=rand()%size) if (!vector[r]) vector[r]=1, --i;
-
Undefiniertes Verhalten, Schrott.
-
void vek_erstellen_zufall(char vek[49][49]) { float prozent; int felder, i, j; printf("\n____________________ Vektor zuf\204llig f\201llen\n\n"); prozent=eingabe("Zu wieviel Prozent soll der Vektor gef\201llt werden? [Format: 1 ... 100]",1,100,5); prozent=prozent/100; //umrechnung in Bereich 0.1 - 1 felder=2500*prozent; // Berechnung, wieviele Felder gefueltt werden sollen for (z=0; z<felder; z++){ i=rand()%50; j=rand()%50; if (vek[i][j] != '*') vek[i][j]='*'; } }
Funktioniert auch so, aber das ergebnis kann trotzdem verfaelscht werden.
Werd mir das später nochmal anschauen.Häng jetz wo ganz anders..
-
for (z=0; z<felder; z++){ i=rand()%50; j=rand()%50; if (vek[i][j] != '*') vek[i][j]='*'; else z--; }
Das is jetzt der Code fuer das zufaellige fuellen.
Das z-- ist dafuer da den Zaehler zu vermindern, sollte er auf ein * stoßen um das Ergebnis net zu verfaelschen.Aber leider klappt es nicht so richtig.
bei ner fuellung von 98% zB, ist nur ein Feld nicht gefuellt, aber eig sollten 50 nicht gefuellt sein.Wo liegt mein Denkfehler?
-
void vek_erstellen_zufall(char vek[49][49]) // <- hier muss vek[50][50] hin
-
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> //Funktionsdeklarationen int eingabe(char*, int, int, int); void vek_erstellen_zufall(char, char, char); void vek_erstellen_datei(char, char, char); void vek_ausgeben(char, char, char); void vek_ablauf(); void vek_schritt(); void pruefen(); void main() { // Variablen deklarationen int min,max,v=5,auswahl,i, j; char v_alt[49][49],v_neu[49][49]; char titel[]="\n____________________ Game of Life\n\n"; char menu[]="[1] Zustand zuf\204llig generieren\n"\ "[2] Zustand aus Datei laden\n"\ "[3] Anzeigen\n"\ "[0] Beenden\n"; //Systemzeit holen srand (time(NULL)); //Menue zeichnen printf("%s",titel); printf("%s",menu); printf("\n"); while(1){ auswahl=eingabe("\nMen\201punkt w\204hlen ",0,3,5); switch(auswahl){ case 1: vek_erstellen_zufall(v_alt, titel, menu); break; case 2: vek_erstellen_datei(v_alt, titel, menu); break; case 3: vek_ausgeben(v_alt, titel, menu); break; case 0: exit(0); } } } int eingabe(char* p,int min,int max,int v) { int k; if(v<1){ printf("Programmabbruch wegen falscher Eingabe"); return 0; } printf("%s: ",p); fflush(stdin); if(scanf_s("%d",&k)!=1){ printf("Bitte eine Zahl eingeben!\n\n"); return eingabe(p,min,max,v-1); } if((k<min) || (k>max)){ printf("Bitte Wertebereich [ %d,%d ] einhalten\n\n",min,max); k=eingabe(p,min,max,v-1); } return k; } void vek_erstellen_zufall(char vek[49][49], char titel[],char menu[]) { float prozent; int felder, i, j, z; system("cls"); //Feld fuellen printf("__________ Vektor zuf\204llig f\201llen\n\n"); prozent=eingabe("Zu wieviel Prozent soll der Vektor gef\201llt werden? [Format: 1 ... 100]",1,100,5); prozent=prozent/100; // Umrechnung in Bereich 0.1 - 1 felder=2500*prozent; // Berechnung, wieviele Felder gefueltt werden sollen if ( prozent <= 0.5){ for (i=0;i<50;i++) for (j=0; j<50;j++) vek[i][j]=' '; for (z=0; z<felder; z++){ i=rand()%50; j=rand()%50; if (vek[i][j] != '*') vek[i][j]='*'; else z--; } } else{ for (i=0;i<50;i++) for (j=0; j<50;j++) vek[i][j]='*'; felder=2500-felder; for (z=0; z<felder; z++){ i=rand()%50; j=rand()%50; if (vek[i][j] != ' ') vek[i][j]=' '; else z--; } } system("cls"); printf("%s",titel); printf("%s",menu); } void vek_erstellen_datei(char vek[49][49], char titel_datei[], char menu_datei[]) { int i,j,auswahl; FILE *datei; char c; system("cls"); //Menue printf("__________ Vektor aus Detei laden\n\n"); printf("[1] Datei 1 laden\n"); printf("[2] Datei 2 laden\n"); printf("[3] Datei 3 laden\n"); printf("[0] Zur\201ck\n\n"); auswahl=eingabe("\nMen\201punkt w\204hlen ",0,3,5); // Dateien oeffnen switch(auswahl){ case 1: datei = fopen("datei1.txt", "rt"); if (datei == NULL){ printf("Fehler beim oeffnen der Datei."); } break; case 2: datei = fopen("datei2.txt", "rt"); if (datei == NULL){ printf("Fehler beim oeffnen der Datei."); } break; case 3: datei = fopen("datei3.txt", "rt"); if (datei == NULL){ printf("Fehler beim oeffnen der Datei."); } break; case 0: system("cls"); printf("%s",titel_datei); printf("%s",menu_datei); } while( (c=fgetc(datei)) != EOF){ for (i=0; i<=50; i++) for (j=0; j<=50; j++){ c=fgetc(datei); if ((c != '\n') && (c != 50)) vek [i][j]=c; } } system("cls"); printf("%s",titel_datei); printf("%s",menu_datei); } char vek_ausgeben(char vek[49][49], char titel[], char menu[]) { int i, j; system("cls"); printf("%s",titel); printf("%s",menu); printf("\n"); for (i=0;i<50;i++) for (j=0; j<50;j++) if (j == 49) printf("%c\n",vek[i][j]); else printf("%c",vek[i][j]); } void vek_ablauf() { } void vek_schritt() { } void pruefen(char vek_alt[49][49], char vek_neu[49][49], char titel, char menu) { }
Das ist mal der ganze Code, es funktioniert auch alles soweit, nur zeigt der mir immer ein herz gefolgt von drei Leerzeichen in der unteren rechten Ecke an.
Egal ob ich den Vektor zufällig generiere, oder mir den Vektor aus ner Datei fuellen lasse.Auch wenn ich mir den Vektor anzeigen lasse, ohne ihn vorher zu fuellen ist dieses Herz da.
Ich weiß mir keinen Rat, vllt koennt ihr mir da weiter helfen.
Das istn Problem, was unmöglich allein hin bekomme...Hier noch ein Bild:
http://img17.imageshack.us/img17/481/scheissherzimbild.jpg
Danke fuer eure Geduld
btw das zufällig fuellen klappt jetzt auch, obwohl ich vek[49][49] stehen hab
-
int wert[49] bedeutet das du ein Array mit 49 Elementen hast. Die sind indiziert von 0 bis 48. Du zählst immer bis <50 und das bedeutet bis 49.
Ein Element wert[49] gib es hier aber nicht.
Du musst deine Vektoren als [50][50] deklarieren.
-
Danke Danke Danke
Ja das war der Fehler, nun klappt zwar das Datei auslesen nicht mehr, aber das sollte ich in den Griff bekommen
nochmals danke
-
Dann schreib da auch <50 statt <=50
-
das funktioniert leider nicht.
Da zeigt er mir viele leerzeichen an und ein Stern.Die Datei ist so formatiert:
49 Leerzeichen * <Enter>
49 Leerzeichen * <Enter>
.
.
.
49 Leerzeichen * <Enter>insgesamt 50 Zeilen
------
edit:
while( (c=fgetc(datei)) != EOF){ for (i=0; i<=50; i++) for (j=0; j<=51; j++){ c=fgetc(datei); if ((c != '\n') && (j != 51 )) vek [i][j]=c; } }
Wenn ichs so schreib gibt ers mir richtig formatiert aus, aber links und rechts sind komische Zeichen.
-
// while( (c=fgetc(datei)) != EOF){ // Sinnlos, hier wird schon das erste Zeichen gelesen for (i=0; i<50; i++) // <50 da 50 Zeilen for (j=0; 1 ; j++){ // Endlosschleife c=fgetc(datei); if ((c == '\n') || (c == EOF)) break; // Zeile fertig if (j < 50) // j muss < 50 sein sonst Fehler vek [i][j]=c; } if (c == EOF) break; // }
Bei Fehlern bitte Bedenken: nicht ausprobiert und spät