fputs in Schleife



  • Hallo zusammen,

    mein Code behandelt das nDamen-Problem.

    Ich möchte, das alle gefundenen Lösungen in eine .txt geschrieben werden.

    Der Output sieht z.B. so aus:

    [ ][ ][ ][Q]
    [ ][Q][ ][ ]
    [Q][ ][ ][ ]
    [ ][ ][Q][ ]

    Hier mein bisheriger Code:

    int board[20];
    
    void printSolution(int iChessBoardLength)
    {
    	int i, j, c;
    	int x =25, y=6;
    	FILE* psFile;
    	psFile = fopen(nQueensStr.acFilename, "w+");
    
    	// If-else which checks if stepmode is chosen
    		if (nQueensStr.AppMode == 0)
    		{
    			_clrscr();
    			printMenu();
    			printStatus();
    			nQueensStr.AppMode = 0;
    
    				// For-loop which prints the board until maxlength is reached
    				for (i = 1; i <= iChessBoardLength; ++i)
    				{
    					_gotoxy(x, y);
    					y++;
    					printf("\n");
    
    					// For-loop which prints out the solved board configuration
    					for (j = 1; j <= iChessBoardLength; ++j) 
    					{
    						if (board[i] == j)
    							printf("[Q]"); 
    						else
    							printf("[]"); 
    					}
    
    				}
    				// waits for userinput everytime a solution was successfully printed
    				c = _getch();
    
    				// checks if pressed key is a 's' and handles it accordingly
    				if (c == 's')
    				{
    					handleInputStep();
    				}
    		}
    		else // else part which is triggered if continious mode is chosen
    		{
    			printStatus();
    		}
    	printf("\n\n");
    
    	return 0;
    }
    
    void queen(int row, int iChessBoardLength)
    {
    	int c;
    	int column;
    
    	for (column = 1; column <= iChessBoardLength; ++column)
    	{
    		if (isPositionValid(row, column))
    		{
    
    			if (kbhit())
    			{
    				char c = getch();
    				if (c == 's')
    				{
    					_clrscr();
    					exit(handleInputCont());
    				}
    			}
    			board[row] = column; //no conflicts so place queen
    			if (row == iChessBoardLength) //dead end
    			{
    				nQueensStr.iCountOfSolutions++;
    				printSolution(iChessBoardLength); //printing the board configuration
    			}
    			else //try queen with next position
    			{
    				queen(row + 1, iChessBoardLength);
    			}
    		}	
    		AppTimeStr.lFinishTime = clock();
    		(double)AppTimeStr.dRuntime = AppTimeStr.lFinishTime - AppTimeStr.lStartTime;
    		_gotoxy(11, 22);
    		printf("%.1lf", AppTimeStr.dRuntime);
    	}
    	return 0;
    }
    
    int isPositionValid(int row, int column)
    {
    	int i;
    
    		for (i = 1; i <= row - 1; ++i)
    		{
    			// Checking columns and digonals for validility
    			if (board[i] == column)
    				return 0;
    			else
    				if (abs(board[i] - column) == abs(i - row))
    					return 0;
    		}
    
    	return 1;
    }
    

    Ich kenne die Funktionen fputs und fopen usw, habe die aber bisher nur bei simplen Sachen angewendet.

    Ich verstehe nicht, wie ich mit fputs das Brett so wie oben in die Text bekomme, hat jemand n Anstoß für mich?

    Danke schon mal.



  • es gibt eine funktion namens fprintf, mit der du wie mit printf irgendwas in eine datei schreiben kannst.



  • In C fangen Arrays immer beim Index 0 an. Immer.



  • okay, fprintf ist ne Idee, damit bekomme ich es aber nur im gleichen Modul hin.

    Ich möchte am Liebsten, dass die Funktion, die es in die Txt-Datei schreibt in einem eigenen Modul steht, ist das realisierbar ohne das ich die ganze Berechnung nochmals durchführen muss?

    Danke euch!



  • Wo möchtest du die Funktion denn aufrufen?

    Findet deine Algorithmus alle möglichen Stellungen oder nur die Erste?

    Warum hat queen als void -Funktion ein return 0;?
    (Da muss eine Compilerwarnung kommen, wenn nicht, ist dein Compiler falsch eingestellt)



  • wie meinst du das mit eigenem modul? also du kannst natürlich auch einfach ein array erstellen:

    //für 8*8 felder, bei kleineren oder größeren spielfeldern die 8 eben entsprechend anpassen
    char array[8][3 * 8 + 1];
    

    dann einfach dort alles hinein schreiben:

    strcpy(array[0][0], "[Q]"); // 1. Reihe 1. Feld
    strcpy(array[0][3], "[ ]"); // 1. Reihe 2. Feld
    strcpy(array[7][21], "[Q]"); // 8. Reihe 8. Feld
    

    und mittels fprintf in die datei schreiben:

    for(i = 0; i < numrows; i++)
    {
         printf(myfile, "%s", array[i]);
    }
    

    das array musst du dann nur an die entsprechenden funktionen übergeben.



  • DirkB schrieb:

    Wo möchtest du die Funktion denn aufrufen?

    Findet deine Algorithmus alle möglichen Stellungen oder nur die Erste?

    Warum hat queen als void -Funktion ein return 0;?
    (Da muss eine Compilerwarnung kommen, wenn nicht, ist dein Compiler falsch eingestellt)

    Die compilerwarnung kommt, ist mir auch bereits aufgefallen und habe es angepasst.

    Danke für eure Hilfe!

    Ich habe es nun so gelöst, das immer wenn die printSolution funktion aufgerufen wird zeitgleich die selbe Funktion nur mit fprintf statt printf.

    Ich hatte nur immer einen debug assertion error bekommen, da der file pointer = null war...took me a while..

    danke trotzdem!


Log in to reply