return(); umgehen?



  • Hey,

    bin immer noch an der Aufgabe nDamen dran...

    Ich muss lediglich diese letzte nicht funktionale Anforderung noch erfüllen.

    Lt. Codingstyle-Guide darf eine Funktion nur ein return pro Funktion stehen und das als letzte Anweisung.

    void queen(int row,const int iChessBoardLength)
    {
       int column;
    
       for (column = 1; column <= iChessBoardLength; ++column)
       {
          if (isPositionValid(row, column))
          {
    
             if (_kbhit())
             {
                int c = _getch();
                if (c == 's')
                {
                   _clrscr();
                   handleInputCont();
                }
                else if (c == 'e')
                {
                   exitProgram();
                }
             }
             // place queens if no conflicts
             nQueensStr.iaBoard[row] = column;
             // prints solution if dead end is met
             if (row == iChessBoardLength)
             {
                nQueensStr.iCountOfSolutions++;
                printSolution(iChessBoardLength);
    
             }
             //if no dead end is met try queen with next position
             else
             {
                queen(row + 1, iChessBoardLength);
             }
          }
          AppTimeStr.lFinishTime = clock();
          (double)AppTimeStr.dRuntime = (AppTimeStr.lFinishTime - AppTimeStr.lStartTime);
          _gotoxy(11, 22);
          printf("%.0lf ms", AppTimeStr.dRuntime);
       }
    }
    
    int isPositionValid(const int row, const int column)
    {
       int i;
    
       for (i = 1; i <= row - 1; ++i)
       {
          // Checking columns for validility
          if (nQueensStr.iaBoard[i] == column)
          {
             return 0;
          }
          // using abs to prevent negative values and checking diagonals for validility
          else if (abs(nQueensStr.iaBoard[i] - column) == abs(i - row))
          {
             return 0;
          }
       }
       return 1;
    }
    

    In der Funktion isPositionValid() check ich, ob irgendwo ein Konflikt entsteht, falls ja return 0, falls nicht, mach weiter.

    Meine Idee war, den CHeck für die Diagonalen und die Spalten in eine If-Anweisung zu stecken und falls eins davon = true dann soll ein Wert z.B. iReturn auf 0 gesetzt werden, falls nichts zutrifft wird iReturn der Wert 0 zugewiesen und am Ende steht dann return iReturn;

    int isPositionValid(const int row, const int column)
    {
       int i;
    
       for (i = 1; i <= row - 1; ++i)
       {
          // Checking columns for validility
          if (nQueensStr.iaBoard[i] == column || abs(nQueensStr.iaBoard[i] - column) == abs(i - row))
          {
    		  nQueensStr.iReturnValue = 0;
          }
          // using abs to prevent negative values and checking diagonals for validility
    
    	  if (nQueensStr.iReturnValue == 0)
    		  break;
       }
       return nQueensStr.iReturnValue;
    }
    

    So habe ichs bisweilen versucht, bekomme es aber nicht zum Laufen, da sobald die Bedingungen zutreffen, muss die Funktion beendet werden.

    Danke schon mal!



  • breezyx schrieb:

    Lt. Codingstyle-Guide darf eine Funktion nur ein return pro Funktion stehen und das als letzte Anweisung.

    Das ist mit Abstand der bescheuertste Codingstyle von dem ich ja gehört hab...und ich hab schon von vielen bescheuerten Condingstyles gehört...

    Darfst du goto verwenden?



  • Du kannst eine extra (lokale) Variable für den Rückgabewert nehmen.

    int isPositionValid(const int row, const int column)
    {
       int j, retval = 1;
    
       for (j = 1; j < row; ++j)
       {
          // Checking columns for validility
          if (nQueensStr.iaBoard[j] == column || abs(nQueensStr.iaBoard[j] - column) == abs(j - row))
          {
              retval  = 0;
              break;
          }
       }
       return retval;
    }
    

    exitProgram() verlässt auch die Funktion mittendrin.

    Statt i <= row - 1; schreibt man i.A. i < row;

    Arrays fangen in C immer noch bei 0 an.



  • dot schrieb:

    breezyx schrieb:

    Lt. Codingstyle-Guide darf eine Funktion nur ein return pro Funktion stehen und das als letzte Anweisung.

    Das ist mit Abstand der bescheuertste Codingstyle von dem ich ja gehört hab...und ich hab schon von vielen bescheuerten Condingstyles gehört...

    Darfst du goto verwenden?

    Auch goto ist strengstens verboten...ich geh halt davon aus, das soll als Lerneffekt dienen, auch wenn ich bei mehreren returns kein Problem sehe.



  • DirkB schrieb:

    Du kannst eine extra (lokale) Variable für den Rückgabewert nehmen.

    int isPositionValid(const int row, const int column)
    {
       int j, retval = 1;
     
       for (j = 1; j < row; ++j)
       {
          // Checking columns for validility
          if (nQueensStr.iaBoard[j] == column || abs(nQueensStr.iaBoard[j] - column) == abs(j - row))
          {
              retval  = 0;
              break;
          }
       }
       return retval;
    }
    

    exitProgram() verlässt auch die Funktion mittendrin.

    Statt i <= row - 1; schreibt man i.A. i < row;

    Arrays fangen in C immer noch bei 0 an.

    Das funktioniert.

    Jetzt muss mir aber wer erklären, warum dies mit der Variablen aus dem struct nicht funktioniert?



  • breezyx schrieb:

    Jetzt muss mir aber wer erklären, warum dies mit der Variablen aus dem struct nicht funktioniert?

    Du hast wohl den struct -Member nicht wieder auf 1 gesetzt.
    Nebenbei ist ein globale Variable meist Mist. Dort auf alle Fälle.


Anmelden zum Antworten