gelöst .. großes Danke an alle! :)
-
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^^