gelöst .. großes Danke an alle! :)


  • Mod

    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^^


Anmelden zum Antworten