Frågesystem

Datorprov

För några år sedan fanns det ett system för att ge datorprov. Ett exempel på ett datorprov för java kan ni se här. Titta igenom provet.

Man kan dela in frågorna i olika frågetyper t.ex. fråga 4 och fråga 5 som båda börjar med en instruktion, därav följer en kodsnutt med en insprängd textbox där man ska fylla i det som saknas.


Här är ett avsnitt ur klassen  Filur . Konstruktorn  Filur()  är inte klar. Fyll i det som saknas!

class Filur {
private String smak;
public Filur(String smak) {
= smak;
}
//...
}

En flervalsfråga

En annan typ av fråga är en flervalsfråga där man måste svara alla rätt:


Betrakta följande kod:

class Pryl {
public String[] bar = new String[20];
int x = 0;
public void görNågot(String n) {
}
public void fixa {
/* Kod du inte behöver se:
Element har lagts in i hela vektorn bar. */

// Här ska ditt svar vara.
}
}
Vilken/vilka av följande satser fungerar?
  görNågot(bar.elementAt(x)); 
  görNågot("Roligt"); 
  görNågot(bar[15]); 
  bar.görNågot(Gudrun Schyrman); 
  for (int k = 0; k < 20; k++) görNågot(bar[k]); 
  bar.görNågot(); 
  görNågot(bar); 
 Inget av ovanstående.


Representation av data

Att lagra datarepresentationen av frågan är inte lätt. Det blir komplicerat när man vill ha generiska frågor. Här är ett exempel på ett generiskt klassnamn.

class <?urval klass Pryl Sak Grej Foo><urval?> {
urval är en specialtag, Pryl Sak Grej Foo är olika värden som variabeln klass kan anta.

Generiska frågor är svåra att representera men är en oerhörd förbättring jämfört med att ha 100-tals hårdkodade frågor av samma typ. Det finns frågor som har flera rätt och flera felaktiga alternativ och man slumpar ut några av varje sort. I den här frågan fanns enbart ett fixt antal alternativ och samtliga visades i slumpvis ordning (via instruktionen <?blanda alt>).

I den här representationen rättas frågan av raden:

  <?pinnar> $d && $f && $g && $n==3 && !$x <pinnar?>

För att få rätt ska alternativ d, f och g vara ikryssade och det ska vara endast tre ($n==3) ikryssade svar.

Datarepresentation

Här är datarepresentationen för frågan:


<?Kommentar> ----- Uppgift ba 005.4 ----- <Kommentar?>
<?kryssuppgift blandaej>

  <?nyckelord>programmeringsteknik, java, prgvecka5, vektor,
  metodanrop, källkod <nyckelord?>

  Betrakta följande kod:

  <pre>
class <?urval klass Pryl Sak Grej Foo><urval?> {
    public String[] <?urval vektor prylen saken grejen bar><urval?> = new String[20];
    <?urval typ int><urval?> <?urval instansvar i j k x y z><urval?> = <?helslump tal 0 20><helslump?>;
    public void <?urval metod1 görNågot görInget><urval?>(String <?urval lokalvar1 m n r s t><urval?>) {
    }
    public void <?urval metod2 fixa dona><urval?> {
        /* Kod du inte behöver se:
           Element har lagts in i hela vektorn <?skriv vektor><skriv?>. */

        // Här ska ditt svar vara.
    }
}
  </pre>

  Vilken/vilka av följande satser fungerar?<br>

  <?blanda alt>

    <?antalsvar n>
      <?alt a><code><?skriv vektor><skriv?>.<?skriv metod1><skriv?>();</code><br><alt?>
      <?alt b><code><?skriv vektor><skriv?>.<?skriv metod1><skriv?>(Gudrun Schyrman);</code><br><alt?>
      <?alt c><code><?skriv metod1><skriv?>(<?skriv vektor><skriv?>);</code><br><alt?>
      <?alt d><code><?skriv metod1><skriv?>("<?urval str Roligt Kul><urval?>");</code><br><alt?>
      <?alt e><code><?skriv metod1><skriv?>(<?skriv vektor><skriv?>.get(<?skriv instansvar><skriv?>));</code><br><alt?>
      <?alt f><code>for (int k = 0; k < 20; k++) <?skriv metod1><skriv?>(<?skriv vektor><skriv?>[k]);</code><br><alt?>
      <?alt g><code><?skriv metod1><skriv?>(<?skriv vektor><skriv?>[<?helslump gtal 0 20><helslump?>]);</code><br><alt?>
    <antalsvar?>

  <blanda?>
  <?alt x>Inget av ovanstående.<br><alt?>

  <?pinnar> $d && $f && $g && $n==3 && !$x <pinnar?>
<kryssuppgift?>

I ovanstående fall har man valt att i frågetexten lägga in specialtaggar som ska evalueras och generera html-kod.

Återkoppling

För en pedagog är det viktigt att kunna ge återkoppling när man svarat fel. Så här skulle det kunna se ut om man svarat fel.


Betrakta följande kod:

class Pryl {
public String[] bar = new String[20];
int x = 0;
public void görNågot(String n) { // Här deklareras görNågot
}
public void fixa {
/* Kod du inte behöver se:
Element har lagts in i hela vektorn bar. */

// Här ska ditt svar vara.
}
}
Vilken/vilka av följande satser fungerar?
  görNågot(bar.elementAt(x)); 
  görNågot("Roligt"); 
  görNågot(bar[15]); 
  bar.görNågot(Gudrun Schyrman); 
  for (int k = 0; k < 20; k++) görNågot(bar[k]); 
  bar.görNågot();     FEL, metoden görNågot tar en sträng som parameter se ovan
  görNågot(bar); 
 Inget av ovanstående.


I frågan får man lägga in text som bara ska visas utifall det felaktiga alternativet är ikryssat.

XML-representation

Det finns många sätt att representera data. Det vanligaste nyutvecklade program använder är XML. En XML-fil kan man läsa in i minnet till en trädstruktur (DOM) som man sedan kan traversera och ändra i.

En fördel med XML är att det är lätt att transformera från en XML-fil till en annan. Det kan använda i frågeuppgiften för att skala bort bitar, t.ex. återkoppling innan frågan är besvarad. För den intresserade finns det flera artiklar om XML på MSDN.

Givet ett XML-schema kan man generera en effektiv databas.

Administratörsgränssnittet

Det går att göra en fråge-editor ungefär som Visual Studio med en verktygslåda man kan ta knappar från. Det är alldeles för svårt. Utgå från att man har olika mallar för olika frågetyper. Med administratörsgränssnittet ska man givet en frågetyp generera utdata för en generisk fråga.

Serverprogramvara

En server ska vid behov plocka fram ovannämna genereiska fråga och generera en specifik fråga. Denna fråga och dess svar ska sparas undan och frågedelen skickas till en klient. Klienten svar rättas av en rättningsmodul och resultat skickas till både klienten och ett resultathanteringssystem (en databas förslagsvis).

Uppgift

Välj ut en eller två frågetyper och gör en fungerande prototyp som kan generera en generisk fråga. Generera från den en specifik fråga som kan besvaras av ett klientgränssnitt och rättas av en rättningsmodul.