F. lecke (HTML5, CSS3, PHP5)
az utolsó felvonás


Új ???? (PHP manual)


Tudáspróba - 3. variáció (feleletválasztós teszt egyetlen programmal, több jó válasszal)

Egy egyszerű szerkezetű szövegfájlt alakít tesztté egyetlen PHP program. Érdekessége, hogy ugyanaz a program tartalmazza a kérdőívet és az értékelést!
Minden feladat egy kérdésből és két vagy több válaszból (max. 5) áll. A válaszok közt több hibátlan is lehet, ezeket kell megjelölni. (Előfordulhat az is, hogy egy hibátlan sincs, azaz semmit sem kell bejelölni!) Az összes kérdés megválaszolása után törölhetjük válaszainkat vagy kérhetünk egy összesített értékelést, amely kérdésenként és százalékosan is értékel.

Szükséges fájlok (tömörítve):



A teszt adatfájljainak felépítése

Részletesebben az első öt sorról:

  1. a teszt címe
  2. a teszttel kapcsolatos információ (egy sor, de a <br> HTML paranccsal több sorra is törhető)
  3. a teszt szerzője (pl. Összeállította: xy)
  4. a tesz "születési dátuma" (pl. 2017.03.30.)
  5. a teszttel kapcsolatos linkek (források, hasonló kvízek, olvasmányok, de lehet egy üres sor is)

Az adatfájl elején pontosan öt sornak kell állnia, mert a 6. sort már kérdésnek értelmazi a feldolgozó program!

Részletesebben a "tesztelemekről":

  • minden kérdés egy szövegsor legyen, de ebben lehetnek HTML parancsok (pl. kép, link, egy <br> amivel többsorossá tehető a megjelenítés, felsorolás, sorszámozott lista vagy akár egy komplett táblázat)
  • a válaszok felépítése:
    - a válaszok is egysorosak
    - az első karakter mindegyik sorban egy tabulátor,
    - a válaszok közt csak egy helyes válasz lehet, ezt (a tab után) egy csillag jelölje (tehát a 2. karakter csillag)
  • az utolsó válaszok után egy üres sor álljon

Az adatfájl magyarázattal

Az adatfájl magyarázat nélkül

Kattints ide!




Az "index1.js" Javascript fájl első sorai (értékadások a változóknak)

var grade  = 0;       // pontszám
var count1 = 0;       // jó válaszok számlálója az üzenethez (mod 4)
var count2 = 0;       // rossz válaszok számlálója az üzenethez (mod 4)

var msg    = 6;       // üzenetek/hibaüzenetek száma
var msg1   = new Array(
   'Eltaláltad! Lottózzál!',
   'Szuper!',
   'A válasz hibátlan!',
   'Jó választás. A helyes választ adta!',
   'Rendben! Ügyes!',
   'Csak így tovább! A válasz helyes ...');
var msg2   = new Array(
   'Nem nyert! No még egyszer!',
   'Nem talált! No még egyszer!',
   'Nem, a válasz helytelen. Próbáld meg újból!!',
   'Hoppá! A válasz helytelen. Próbáld meg újra!',
   'A válasz helytelen. Gondold át, és próbáld meg újra!',
   'Sajnos nem ez a helyes válasz. Próbáld meg újra!');
   ...

Itt adjuk meg azokat a szövegeket, amelyek közül (véletlenszerű választással) egyet kiír a Javascript program (jó válasz esetén a felsőkből, hibás válasznál az alsókból választ). Ezek természetesen módosíthatók, de bővíthető is a lista, csak ügyelni kell a határolójelekre (bővítéskor az "msg = 6" is javítandó!)!



Másoljuk le az "indexE.php" fájlt "indexF.php", a "mainE.css" fájlt "mainF.css", valamint a "menuE.inc" fájlt "menuF.inc" néven és javítsuk át a rá való hivatkozásokat!




Vissza a tanfolyam menüjére


===================

 <!DOCTYPE html>
 <html>
 <head>
    <meta charset='utf-8'>
    <title>PHP Quiz 3</title>
    <link rel='stylesheet' href='css/style3.css'/>
 </head>

 <body>

 <?php
 if (isset($_POST['elkuldott'])) { // a kérdőív elküldése után - értékelés (második futás)
    1. teszt megjelenítése/kitöltése
 } else { // a kérdőív kitöltése (első futás)
    2. teszt kiértékelése
 }
 3. egy PHP függvény
 ?>

 </body>
 </html>

Az utolsó teszt (index3.php) egy vegyes HTML - PHP program. Első híváskor a PHP betét "else" ága fut, azaz megjeleníti a kérdőívet/tesztet. Ha ezt kitöltöttük, és rákattintunk a "Rendben ..." gombra, az "if" utáni ágra kerülünk, s megtörténik a teszt kiértékelése.

===================

 function dekod($num,$db) {   // dekod(19,5);   // ++--+
    $str = "";
    for ($j=1;$j<=$db;$j++) {
       $bin = $num % 2; $num = floor($num/2);
       if ($bin==1) {
          $str = $str."+";
       } else {
          $str = $str."-";
       }
    }
    return $str;
 }

ccc

===================

    $kdrb = $_POST["kdrb"];   // kérdések darabszáma
    $vdrb = explode(";",$_POST["vdrb"]);   // válaszok darabszámának tömbje
    $hval = explode(";",$_POST["hval"]);   // helyes válaszok kódolt tömbje
    $aval = array("");   // adott válaszok kódolt tömbje

    $tdrb = 0;   // találatok darabszáma
    for ($i=1;$i<=$kdrb;$i++) {
    $av = $_POST["v$i"]; $num = 0; $hatv = 1;
    for ($j=1;$j<=$vdrb[$i];$j++) {
       if ($av[$j]) { $num += $hatv; }
       $hatv = 2*$hatv;
    }
    if ($num==$hval[$i]) {
       $tdrb++;
    }
    array_push($aval,$num);
    }

    $szaz = round(100*$tdrb/$kdrb,1);
    echo "<p class='h1'>Értékelés ($tdrb/$kdrb) => $szaz %</p>\n";
    echo "<p class='h2'>(elöl a helyes, utána az adott válasz)</p>\n";
    echo "<div id='ertekeles'>\n";
    for ($i=1;$i<=$kdrb;$i++) {
    $db = $vdrb[$i]; $hst = dekod($hval[$i],$db); $ast = dekod($aval[$i],$db);
    echo "<h5>$i. kérdés: _____________________";
    if ($ast==$hst) {
       echo "<img src='css/yes.gif' id='ynimg'>";
    } else {
       echo "<img src='css/no.gif' id='ynimg'>";
    }
    echo "</h5>\n";
    for ($j=0;$j<$db;$j++) {
       if ($hst[$j]=="+") { $hkep="css/yes.gif"; } else { $hkep="css/no.gif"; }
       if ($ast[$j]=="+") { $akep="css/yes.gif"; } else { $akep="css/no.gif"; }
       echo "<div id='yesno'><img src='$hkep'>         <img src='$akep'></div>\n";
    }
    echo "\n";
    }

    echo "<p id='vissza'><a href='../..'>Vissza a kezdőoldalra!</a></p>\n";
    echo "</div>\n";

===================

    $kod = $_GET['kd']; if ( $kod == "" ) { $kod = "minta"; }   // hívás .txt nélkül
    $inpfajl = "data/$kod.txt";

    if (!file_exists($inpfajl)) {
    echo "A(z) $inpfajl nem létezik!";
    } else {
    $s = file("$inpfajl");   // 5. a kérdés

    $cim   = chop(array_shift($s));   // teszt megnevezése
    $info   = chop(array_shift($s));   // információ
    $szerzo   = chop(array_shift($s));   // szerző(i)
    $datum   = chop(array_shift($s));   // dátuma
    $forras   = chop(array_shift($s));   // forrása(i)

    echo "<p class='h1'> $cim </p>\n";
    echo "<p class='h2'> $info </p><br>\n\n";

    echo "<form id='form' method='POST' action='index3.php'>\n\n";
    echo "\n<ol>\n\n";
    $i = 1; $ii = 0; $vdrb = ""; $hval = "";
    do {
       $sor = chop($s[$ii]);
       $ii++; $j = 0; $num = 0; $hatv = 1;
       echo "<div class='kerdes'>\n";
       echo "<li> <div class='pk'>$sor</div> \n";
       echo "\t<div class='valasz'>\n";
       do {
          $sor = chop($s[$ii]); $sor = substr($sor,1);   // tab leszedve
          $ii++; $j++;
          if ($sor[0]=='*') {
             $sor = substr($sor,1);   // * leszedve
             $num += $hatv;
          }
          $valt = "v$i"."[$j]"; $hatv = 2*$hatv;
          echo "\t<div class='pv'><input name=$valt type='checkbox'> $sor</div>\n";
       } while (chop($s[$ii])!='');
       echo "\t</div>\n";
       echo "</li>\n";
       echo "</div>\n\n";
       $hval = $hval.";".$num;   // stringben adom át a helyes válaszokat
       $vdrb = $vdrb.";".$j;   // stringben adom át a válaszok darabszámát
       $ii++; $i++;
    } while (chop($s[$ii])!='');
    $i--;
    echo "</ol>\n\n";
    echo "<input type='hidden' name='elkuldott'>\n";   // első futás jelzésére
    echo "<input type='hidden' name='kdrb' value='$i'>\n";   // kérdések darabszáma
    echo "<input type='hidden' name='vdrb' value='$vdrb'>\n";   // válaszok darabszáma (tömb)
    echo "<input type='hidden' name='hval' value='$hval'>\n";   // helyes válaszok (kódolt tömb)
    echo "<div class='ressub'><input type='reset' value=' Adott válaszok törlése '>     <input type='submit' value=' Rendben van, értékelés '></div>\n\n";
    echo "</form>\n\n";

    echo "<p class='h3'>$forras</p>\n";
    echo "<p class='h4'>$szerzo ($datum)</p>\n";
    echo "<p id='vissza'><a href='../..'>Vissza a kezdőoldalra!</a></p>\n";
    }

 }