Ankündigung

Einklappen
Keine Ankündigung bisher.

Programmierung von Antwortmöglichkeiten kürzer gestalten

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Programmierung von Antwortmöglichkeiten kürzer gestalten

    Hallöchen zusammen,

    ich bastel gerade an einem Frage-Antwort-Ankeruz-Skript.
    Dabei werden aus 16 Antwortmöglichkeiten insgesamt 4 ausgewählt.
    Von diesen Möglichkeiten treffen 4-8 zu.

    Nun bin ich am Überlegen:
    Wie viele richtige Antworten lasse ich zu?

    Ursprünglich wollte ich alle Möglichkeiten von 0 bis 4 richtige Antworten zulassen.
    Das Problem ist die Abschließende Abfrage.

    Es können 0, 1, 2, 3 oder 4 Antworten angekreuzt sein. Für alle Fälle wird ein Wert Übergeben, oder bei mehreren Möglichkeiten auch mehrere Werte.
    Das wären dann insgesamt 16 mögliche Fälle (4 angekreuzte Antworten, 3 angekreuzte Antworten und schließlich noch die Möglichkeiten welche Antworten)

    Dies wäre mit einer recht großen if Struktur lösbar, aber durchaus umständlich.
    Geht das eleganter?

    Hier ein Beispielcode:
    PHP-Code:
    echo '<html><form action="ankreuzaufgaben.php" method="post">
                <input type="checkbox" name="auswahl1" value="'
    .$antw_1.'"/>'.$antw_1.'<br/>
                <input type="checkbox" name="auswahl2" value="'
    .$antw_2.'"/>'.$antw_2.'<br/>
                <input type="checkbox" name="auswahl3" value="'
    .$antw_3.'"/>'.$antw_3.'<br/>
                <input type="checkbox" name="auswahl4" value="'
    .$antw_4.'"/>'.$antw_4.'<br/>
                <input type="submit" value="Senden"/></html>'
    ;

            
    //Ausgabemöglichkeiten Nach Wahl der Antwort
            
    if(isset($_POST['auswahl1'])){/*Code*/}
            if(isset(
    $_POST['auswahl2'])){/*Code*/}
            if(isset(
    $_POST['auswahl3'])){/*Code*/}
            if(isset(
    $_POST['auswahl4'])){/*Code*/}
            if(isset(
    $_POST['auswahl1'] && $_POST['auswahl2'])){/*Code*/}
            if(isset(
    $_POST['auswahl1'] && $_POST['auswahl3'])){/*Code*/}
            if(isset(
    $_POST['auswahl1'] && $_POST['auswahl4'])){/*Code*/}
            if(isset(
    $_POST['auswahl2'] && $_POST['auswahl3'])){/*Code*/}
            if(isset(
    $_POST['auswah2'] && $_POST['auswahl4'])){/*Code*/}
            
    //Und so weiter 
    $antw wird vorher jeweils definiert.
    Aber das muss doch eleganter gehen ...

    Wird die Internetseite durch so eine Struktur nicht unglaublich langsam?
    Kann man den localhost vom Ladetempo her stellvertretend auf eine tatsächliche Homepage übertragen oder ist das nur für die Funktionsweise sinnvoll? (die Frage ist mir gerade noch so eingefallen)

  • #2
    Statt durchnummerierte Variablen ein Array verwenden.

    Statt Code kopieren, Schleifen verwenden.

    Kommentar


    • #3
      Zitat von Freumel Beitrag anzeigen

      Wird die Internetseite durch so eine Struktur nicht unglaublich langsam?
      Nein, im Gegenteil kann das sogar schneller sein. Wir sprechen aber von einem unglaublich marginalen Anteil, es ist trotzdem viel sinnvoller Arrays und Schleifen zu verwenden, wie oben gesagt.

      Zitat von Freumel Beitrag anzeigen
      Kann man den localhost vom Ladetempo her stellvertretend auf eine tatsächliche Homepage übertragen?
      In der Regel nicht. Computer sind nunmal nicht gleich schnell, egal ob du jetzt deinen PC, Server A oder Server B hernimmst. Unter Umständen sind auch gewisse Anwendungen (speicherintensiv/rechenintensiv) auf verschiedenen Systemen schneller. Wenn du Benchmarks willst, dann teste die Produktivumgebung.

      Kommentar


      • #4
        Ja logisch, entschuldigt.
        Nun aber ein neues Problem:
        Die Ausgabe des richtigen Ergebnisses läuft nicht und ich finde den Fehler nicht.

        PHP-Code:
                //Deklarierung der Variablen/Arrays
                
        $allg_1={/*Code*/}
                
        //...
                
        $allg_6={/*Code*/}
                
        //...
                
        $allg_13={/*Code*/}

                
        $richtige_antwort=array($allg_1$allg_2$allg_3$allg_4$allg_5$allg_6);
                
        $anzahl_richtigeAntwort=count($richtige_antwort);

                
        $antwort=array($allg_1$allg_2$allg_3$allg_4$allg_5$allg_6$allg_7$allg_8$allg_9$allg_10$allg_11$allg_12$allg_13);
                
        shuffle($antwort);


               
        //Eingabeformular
               
        echo '<html><form action="ankreuzaufgaben.php" method="post">';

                for(
        $k=0$k<4$k++){
                echo 
        '<input type="checkbox" name="auswahl'.$k.'" value="'.$antwort[$k].'"/>'.$antwort[$k].'<br/>';
                    }
                echo 
        '<input type="submit" value="Senden"/></form></html>';

                
        //eine Antwort
                
        for($k=0$k<4$k++){
                    if(isset(
        $_POST['auswahl'.$k])){
                        echo 
        $_POST['auswahl'.$k];

                        
        //Schleife zur Prüfung ob Antwort richtig ist
                            
        for($i=0$i<$anzahl_richtigeAntwort$i++){
                                if(
        $_POST['auswahl'.$k]==$richtige_antwort[$i]){
                                    echo 
        'Richtig!';
                                }
                            }
                    }
                } 
        Es geht mit Sicherheit noch schöner. Aber irgendwo läuft es definitiv falsch.
        Sollte lediglich eine Antwort angekreuzt sein, müsste doch bei einer richtigen Antwort auch ein "Richtig" Erscheinen.
        Nun Passiert dies aber nur bei allg_6 und das obwohl alle Antworten als richtig deklariert sind, die anderen zählen als "falsch".
        Sieht wer den Fehler? :/

        Kommentar


        • #5
          Moin,

          Sieht wer den Fehler? :/
          Bei so unvollständigem Code macht es für uns gar keinen Sinn da Fehler zu suchen.

          Kannst du nochmal genauer beschreiben was du eigentlich machen möchtest?

          Meine Vermutung:
          Du möchtest 4 Fragen darstellen, jede der Fragen hat 4 Antworten.
          Von den 4 Antworten können mehrere richtig sein.
          Der User darf Fragen auch unbeantwortet lassen.
          Du möchtest Nach Absenden des Formulars die Antworten auswerten und die richtig angekreuzten hervorheben.
          Du möchtest die richtigen Antworten zählen.

          Aber dein Code passt nicht ganz dazu indem du z.B. einfach mal "Richtig!" ausgibst.

          Oder gibst du die Fragen jeweils einzeln nacheinander aus?

          Man müsste auch wissen was denn auf $allg_6 steht, und so.
          [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
          [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

          Kommentar


          • #6
            Zitat von Freumel Beitrag anzeigen
            Hallöchen zusammen,

            ich bastel gerade an einem Frage-Antwort-Ankeruz-Skript.
            Dabei werden aus 16 Antwortmöglichkeiten insgesamt 4 ausgewählt.
            Von diesen Möglichkeiten treffen 4-8 zu.

            Nun bin ich am Überlegen:
            Wie viele richtige Antworten lasse ich zu?

            Ursprünglich wollte ich alle Möglichkeiten von 0 bis 4 richtige Antworten zulassen.
            Das Problem ist die Abschließende Abfrage.

            Es können 0, 1, 2, 3 oder 4 Antworten angekreuzt sein. Für alle Fälle wird ein Wert Übergeben, oder bei mehreren Möglichkeiten auch mehrere Werte.
            Das wären dann insgesamt 16 mögliche Fälle (4 angekreuzte Antworten, 3 angekreuzte Antworten und schließlich noch die Möglichkeiten welche Antworten)
            Also noch mal,

            man geht auf dein Formular, man sieht eine Frage und da drunter 4 Antwortmöglichkeiten, diese 4 sind zufällig aus 16 Gewählt, dabei könnte entweder alles falsch sein oder alles richtig oder nur eine, nur zwei oder nur 3 richtig sein?
            Soll das so sein? Was passiert wenn der Zufall es so ausfällt, dass jede Checkbox falsch ist?

            Ich würde ein Array bilden mit "Falschen Antworten" und ein mit "Richtigen" und würde aus den Falschen 3 wählen und einen von den Richtigen und daraus dann deine 4 Antwortmöglichkeiten bilden.

            Mach mal bitte ein Beispiel mit Fragen und Antworten, weil ich kann nichts mit deinem Code und deiner Fragestellung anfagnen, zu viele Dinge sind unklar die nur du kennst.

            LG

            EDIT:

            ich hab mal was vorbereitet, vielleicht kannst du dir hier und da paar Tipps daraus einholen. Achte dabei auf die Namen der Variablen

            PHP-Code:
            <?php
            /**
             * Aktiviere Fehlermeldungen
             */
            error_reporting(-1);
            ini_set('display_errors'true);

            /**
             * Liste von Fragen und Antworten mit einem Falsch oder Richtig marker bei den Antworten
             */
            $fragenUndAntworten = [
                
            'Wann wurde John F. Kennedy erschossen?' => [
                    [
            '22 November 1963'true],
                    [
            '24 Dezember 1999'false],
                    [
            '1 April 1986'false],
                    [
            '9 November 2001'false]
                ],
                
            'Wann wurde der Erfinder von PHP, Rasmuss Lerdorf geboren?' => [
                    [
            '22 November 1968'true],
                    [
            '24 Dezember 1999'false],
                    [
            '1 April 1986'false],
                    [
            '9 November 2001'false]
                ],
                
            'Wann wurder BlackScorp von php.de Geboren?' => [
                    [
            '22 November 1986'true],
                    [
            '24 Dezember 1999'false],
                    [
            '1 April 1986'false],
                    [
            '9 November 2001'false]
                ],
                
            'Was haben die Illuminaten damit zu tun?' => [
                    [
            'Alles'true],
                    [
            'Nichts'true],
                    [
            'Es gibt im Jahr nur 365/364 Tage, bei großer Anzahl von Menschen, passieren viele Dinge am Selben Tag, statistisch gesehen'true],
                    [
            'Wäre, wäre Fahrradkette oder so'true]
                ]
            ];
            /**
             * Wenn das Formular abgesendet wurde, überprüfen wir die Antworten
             */
            $gesendeteAntworten = [];
            $falscheAntwortenZuFragen = [];

            if (
            $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['antwort'])) {
                
            $gesendeteAntworten $_POST['antwort'];

                
            /**
                 * Prüfe ob die Anzahl der gesendeten Fragen mit der Anzahl der Fragen übereinstimmt
                 */
                
            $anzahlFragen count($fragenUndAntworten);
                
            $anzahlGesendeterFragen count($gesendeteAntworten);

                if (
            $anzahlFragen !== $anzahlGesendeterFragen) {
                    echo 
            '<p class="red">Nicht alle Fragen wurden beantwortet</p>';
                }
                
            /**
                 * Gehe alle Fragen durch
                 */
                
            foreach ($fragenUndAntworten as $frage => $antworten) {
                    
            /**
                     * Wenn die Frage nicht mitgesendet wurde, überspringe die
                     */
                    
            if (!isset($gesendeteAntworten[$frage])) {
                        continue;
                    }
                    
            $nurAntwortenAlsArray array_column($antworten0);
                    
            $gesendeteAntwortenZurFrage $gesendeteAntworten[$frage];

                    foreach (
            $gesendeteAntwortenZurFrage as $gesendeteAntwortZurFrage) {
                        
            $antwortIndex array_keys($nurAntwortenAlsArray$gesendeteAntwortZurFrage)[0];

                        
            $antwortIstFalsch $antworten[$antwortIndex][1] === false;

                        if (
            $antwortIstFalsch) {
                            
            $falscheAntwortenZuFragen[$frage][] = $gesendeteAntwortZurFrage;
                        }
                    }
                }

            }
            $anzahlFalscherAntworten count($falscheAntwortenZuFragen);
            $esGibtFalscheAntworten $anzahlFalscherAntworten 0;

            /**
             * Ausgabe
             */
            ?>
            <style>
                .red {
                    color: red;
                }

                .green {
                    color: green;
                }
            </style>
            <?php if ($esGibtFalscheAntworten): ?>
                <h2>Folgende Antworten sind wurden Falsch gewählt</h2>
                <?php foreach ($falscheAntwortenZuFragen as $frage => $falscheAntworten):
                    
            $anzahlFalscherAntwortenZurFrage count($falscheAntworten);
                    
            $pluralForm =  ngettext("war die Antwort""waren die Antworte"$anzahlFalscherAntwortenZurFrage);
                    
            $falscheAnwortenMitUndVerknuepft implode("' und '"$falscheAntworten);
                    
            ?>
                    <?= sprintf("Bei der Frage '%s' %s '%s' falsch <br/>"$frage,$pluralForm$falscheAnwortenMitUndVerknuepft?>
                <?php endforeach; ?>
            <?php 
            endif; ?>
            <?php 
            if ($esGibtFalscheAntworten === false): ?>
            <marquee direction="right"><h1 class="green"> Wunderbär!!!! Alles richtig beantwortet!!</h1></marquee>
            <?php endif; ?>
            <form method="POST">
                <?php foreach ($fragenUndAntworten as $frage => $antworten):
                    
            shuffle($antworten);
                    
            ?>
                    <h2><?= $frage ?></h2>

                    <?php foreach ($antworten as $antwort):
                    
            $antwortText $antwort[0];
                    
            $istFalsch = !$antwort[1];
                    
            $wurdeAusgewaehlt = isset($gesendeteAntworten[$frage]) && in_array($antwortText$gesendeteAntworten[$frage]);

                    
            ?>
                    <span<?= $wurdeAusgewaehlt && $istFalsch ' class="red"' '' ?><?= $wurdeAusgewaehlt && !$istFalsch ' class="green"' '' ?>>
                    <input<?= $wurdeAusgewaehlt ' checked="checked"' '' ?>
                            type="checkbox" name="antwort[<?= $frage ?>][]"
                            value="<?= $antwortText ?>"><?= $antwortText ?>
                        </span>
                    <br/>
                <?php endforeach; ?>
                    <button>Senden</button>
                <?php endforeach; ?>
            </form>
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

            Kommentar

            Lädt...
            X