Stefan: Benötige Hilfe bei Algorithmus

Hallo,

Ich habe ein Formular, in dem man eintragen kann, wieviele Pokerrunden man gespielt hat. Nach dem Absenden des Formulars sollen dann Tabellen erstellt werden, in denen man die Platzierungen der Mitspieler pro Runde eintragen kann.

Ich möchte, dass für drei Runden eine Tabelle erstellt wird. Also gibt es nachher ANZAHL_RUNDEN div 3 Tabellen (z.B. werden 6 Runden in 2 Tabellen aufgeteilt). Mein Problem ist der Fall, wenn die Anzahl der Runden nicht durch 3 ohne Rest teilbar ist.

Mein bisheriger Code ist

<?php
  $input = '';
  for($t = 1; $t <= $_POST['rounds']; $t++) {
   if ($t % 3 != 0) {
    $input .= '<table><tr>';
    for($r = $t; $r <= $t + 2; $r++) {
     $input .= "<th></th><th>Runde $r:</th>";
    }
    $input .= "</tr>\n";
   }
   $input .= "</table>\n";
   $t += 2;
  }
  echo $input;
 }
?>

Ich weiß zur Zeit nicht, wie ich in der zweiten for-Schleife die obere Schranke festlegen soll, also etwas anderes als $t + 2.

Weiß jemand Rat?

Viele Grüße,

Stefan

  1. gudn tach!

    ich hab's nur zur haelfte verstanden, aber vielleicht genuegt's ja:

    <?php
      $no_tables = ceil($_POST['rounds']/3); // anzahl an tabellen
      $last_table = $_POST['rounds']%3; // anzahl an spalten in letzter tabellen
      $input .= '';
      for($tab=1; $tab<=$no_tables; ++$tab){
        $input .= '<table><tr>';
        $no_cells = ($tab==$no_tables && $last_table)? $last_table : 3;
        for($cell=1; $cell<=$no_cells; ++$cell)
          $input .= '"<th></th><th>Runde '.$tab+cell:.'</th>';
        $input .= '</tr></table>';
      }
    ?>
    (ungetestet)

    wenn ich mich nicht vertan habe, liefert das bei n runden n/3 tabellen mit  3 doppelspalten und falls (n mod 3>0) gilt noch eine zusaetzliche tabelle fuer mit den restlichen n mod 3 doppelspalten.
    wolltest du das?

    prost
    seth

    1. gudn tach!

      na, supi. hab gedacht, ich haette "vorschau" noch aktiviert. war aber nicht mehr so. also jetzt in bunt.

        
      <?php  
        $no_tables = ceil($_POST['rounds']/3); // anzahl an tabellen  
        $last_table = $_POST['rounds']%3; // anzahl an spalten in letzter tabellen  
        $input .= '';  
        for($tab=1; $tab<=$no_tables; ++$tab){  
          $input .= '<table><tr>';  
          $no_cells = ($tab==$no_tables && $last_table)? $last_table : 3;  
          for($cell=1; $cell<=$no_cells; ++$cell)  
            $input .= '"<th></th><th>Runde '.$tab+cell:.'</th>';  
          $input .= '</tr></table>';  
        }  
      ?>
      

      wenn ich mich nicht vertan habe, liefert das bei n runden n/3 tabellen mit 3 doppelspalten und falls (n mod 3>0) gilt noch eine zusaetzliche tabelle mit den restlichen n mod 3 doppelspalten.

      hier war mit "/" die ganzzahlige division gemeint, also das, was haeufig mit "div" bezeichet wird, aber hier nix mit ableitungen zu tun hat.

      prost
      seth

      1. gudn tach ingr^Wseth!

        <?php
          $no_tables = ceil($_POST['rounds']/3); // anzahl an tabellen
          $last_table = $_POST['rounds']%3; // anzahl an spalten in letzter tabellen
          $input .= '';
          for($tab=1; $tab<=$no_tables; ++$tab){
            $input .= '<table><tr>';
            $no_cells = ($tab==$no_tables && $last_table)? $last_table : 3;
            for($cell=1; $cell<=$no_cells; ++$cell)
              $input .= '"<th></th><th>Runde '.$tab+cell:.'</th>';
            $input .= '</tr></table>';
          }
        ?>

          
        jaja, bunter kaese!  
          
        oh, mann, so'n hingerotze bringt doch echt mal gar nix. mehr fehler als gescheiter code. das haettste dir gerade mal sparen koennen.  
          
        also noch mal, jetzt lauffaehig und kommentiert, aber dedlfix' variante ist vermutlich eh verstaendlicher:  
        ~~~php
          
        <?php  
          $no_tables  = ceil($_POST['rounds']/3);   // anzahl an tabellen  
          $last_table = $_POST['rounds']%3;         // anzahl an spalten in letzter tabellen  
          $output     = '';                         // das wird die ausgabe  
          for($tab=0; $tab<$no_tables; ++$tab){     // schleife ueber anz. an tabellen.  
            $output .= '<table><tr>';               // beginn der jew. tabelle  
                                                    // anzahl an doppelspalten: immer drei, aber im letzten schritt evtl. weniger.  
            $no_cells = ($tab+1==$no_tables && $last_table)? $last_table : 3;  
            for($cell=1; $cell<=$no_cells; ++$cell) // schleife ueber anz. doppelspalten  
              $output .= '<th></th><th>Runde '.(3*$tab+$cell).'</th>';  
            $output .= '</tr></table>'."\n";        // ende der jew. tabelle  
          }  
        ?>
        

        prost
        ingr^Wseth

        1. Hallo,

          jaja, bunter kaese!

          oh, mann, so'n hingerotze bringt doch echt mal gar nix. mehr fehler als gescheiter code. das haettste dir gerade mal sparen koennen.

          Liegt das an dem

          prost

          ? :)

          1. gudn tach!

            jaja, bunter kaese!

            Liegt das an dem

            prost

            ? :)

            nee, ich bin auch ohne bier doof.
            *ueberleg* und das letzte bier is schon fast zwei wochen her, verdammt! wird mal wieder zeit; vielleicht lag's daran...

            prost
            seth

  2. echo $begrüßung;

    Ich möchte, dass für drei Runden eine Tabelle erstellt wird. Also gibt es nachher ANZAHL_RUNDEN div 3 Tabellen (z.B. werden 6 Runden in 2 Tabellen aufgeteilt). Mein Problem ist der Fall, wenn die Anzahl der Runden nicht durch 3 ohne Rest teilbar ist.

    Die äußere Schleife muss solange laufen solange ihre Laufvariable, die bei jedem Durchlauf um 3 erhöht wird, nicht die eingegebene Rundenzahl übersteigt. Die innere läuft entweder drei Runden aber nicht länger als bis ein separat mitlaufender Rundenzähler (vor der äußeren Schleife oder als zweiter Initialisierungsausdruck der äußeren Schleife auf 1 gesetzt) die maximale Rundenanzahl nicht überschritten hat. Sie setzt pro Durchlauf ihre Laufvariable und den Rundenzähler eins hoch.

    Falls die Rundenanzahl geteilt durch 3 einen Rest ergibt kannst du außerhalb der äußeren Schleife noch (3 - Anzahl Runden % 3) Leerfelder berücksichtigen, falls alle Tabellen immer 3 Spalten haben sollen.

    Wenn die Anzahl der Runden nicht gerade 0 ist hast du immer einen Tabellenanfang und ein -ende. Zwischendurch brauchst du ein Ende und einen Anfang vor dem Ende der äußeren Schleife, aber nur, wenn die Rundenanzahl noch nicht erreicht ist.

    Wenn du das nun selbst implementieren willst, ignorier das Nachfolgeposting :-)

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      echo "<pre>Tabellenanfang\n";  
      for ($runde = 1, $tabelle = 1; $tabelle <= $runden; $tabelle += 3) {  
       for ($spalte = 1; $spalte <= 3 and $runde <= $runden; $spalte++, $runde++)  
        echo "Runde $runde ";  
       if ($runde <= $runden)  
        echo "\nTabellenende\nTabellenanfang\n";  
      }  
        
      if ($rest = $runden % 3)  
       echo "\nRest ", 3 - $rest;  
      echo "\nTabellenende";
      

      echo "$verabschiedung $name";

      1. Hallo dedlfix,

        So, musste doch nachschauen, aber jetzt habe ich es (hoffentlich):

          
        // Build tables. 3 rounds per table.  
        $input .= "<table><tr>\n";  
        $max_rounds = $_POST['rounds'];  
        $max_players = $_POST['players'];  
          
        for($round_header = 1, $table= 1; $table <= $max_rounds; $table+=3) {  
          $round_placings = $round_header;  
          // Build table headers.  
          for($column = 1;  
              $column <= 3 and $round_header <= $max_rounds;  
              $column++, $round_header++) {  
            $input .= "<th></th><th>Runde $round_header:</th>\n";  
          }  
          $input .= "</tr>\n";  
          // Build as many rows as players.  
          for ($row = 1; $row <= $max_players ; $row++) {  
            $temp = $round_placings;  
            $input .= "<tr>\n";  
            for ($column = 1;  
                 $column <= 3 and $temp <= $max_rounds;  
                 $column++, $temp++) {  
              $input .= "<td>$row.</td><td><input type=\"text\" name=\"round:$temp-place:$row\"/></td>\n";  
            }  
            $input .= "</tr>\n";  
          }  
          
          if ($round <= $max_rounds) {  
            $input .= "</table>\n<table><tr>\n";  
          }  
        }  
        $input .= "<td></td></tr></table>\n";  
        echo $input;  
        }  
        
        

        Vielen Dank für Deine Hilfe,

        Stefan