gelöst .. großes Danke an alle! :)
-
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
-
Jop kein Ding, bin doch fuer die Hilfe dankbar
aber nen kleinen Fehler hatteste noch drin...
das break war nicht mehr in der for Schleife drin, aber ein paar Klammern haben das Problem gelöst^^