Eksamen V2016 - Oppgave 2

Noen kommentarer, planlegging og løsningsskisser

H-P Ulven, mars 2017


Jeg regner med at man bruker 3 frames/rammer:

Jeg tar her bare for meg selve språktesten i den andre rammen (QuizFrame).

Planlegging av brukergrensesnitt

Skal ikke leveres, men bør gjøres på kladdeark uansett:

Tegning av skjermbilde, med angivelser av komponentnavn og lytterfunksjoner.

Komponentnavn: Lytterfunksjon:
sporsmalLbl  
alt1Chk  
alt2Chk  
...  
alt5Chk  
videreBtn videreKlikket()

 

Datastruktur

Noe av det viktigste her er at alle data bør lagres ett sted; i datastrukturen!

Her er det snakk om å legge til flere språk, og det ideelle er at dette bare krever endringer i datastrukturen, ikke i koden!

Variabelliste:

Navn: Type: Innhold: Navn: Type: Innhold:
spraktabell Array Hovedtabell poeng int Score for bruker
svartabell Array Lagrer brukersvar makspoeng int Må regnes ut!
sprak int AMERIKANSK=0, ... melding String Melding til bruker
nr int Spørsmålsnummer      

Tabeller:

Bør ikke skrive en linje kode før man har bestemt strukturen på disse tabellene!

Tegn en figur og start programmeringen med å legge inn tabellen, for eksempel slik:

const AMERIKANSK: int       = 0;
const TYSK:       int       = 1;
const FRANSK:     int       = 2;

var spraktabell: Array =
   [
      { melding:  "Avisen Lillevik Tidende tilbyr språkkurs i New-York",
        sporsmal: ["Hva betyr ordet Where?",
                   "Hvilke(t) ord kan legges til her?\nHow are ...",
                   "Spill av lydfilen \"Oversetting.mp3\" og velg"+
                                             riktig oversettelse:" 
                  ],
       alternativer:
                  [
                    ["Hvor","Vi er", "Var","Hvorfor"],
                    ["you","John doing?","things","the house","the wife"], 
                    ["Hei, mitt navn er Tom", 
                     "Jeg er Tom", 
                     "Kjenner du Tom?", 
                     "Når kommer Tom?"]
                  ],
      fasit:      [
                       [0],
                       [0,2],
                       [2]
                  ],
      media:      [
                  ["","","Oversetting.mp3"]  //media, .mp3, .flv, ...
                  ]
      }// Amerikansk
      /* og her kan vi legge inn tysk, fransk osv:
      {melding:      "   ",
         sporsmal:     [      ],
         alternativer: [ [  ], ... ],
         fasit:        [ [  ], ... ],
         media:        [   ...     ]
      }//Tysk
      ...
      */
   ];// spraktabell

 

Programstruktur:

Hovedprogram

oppdaterGUI()         // Hent spørsmål, alternativer, ...
videreBtn -> videreKlikket()  // Sett opp lytterfunksjon

Lytterfunksjoner

videreKlikket():

hentSvar()      // Ta vare på brukersvar
nr ++
Hvis nr == antall svar
   lagRapport()  // Finn poeng og lag tilbakemelding
   gå til rapport ramme
ellers
   oppdaterGUI()

Andre funksjoner

hentSvar():

//Sjekker hva bruker har krysset av og lagrer

valgtabell = new Array()
Hvis alternativ 1 er valgt
   valgtabell.push(0)
Hvis alternativ 2 er valgt
   valgtabell.push(1)
...
svartabell.push(valgtabell)

oppdaterGUI():

// Henter spørsmål, alternativer fra spraktabell, fjerner avkryssinger
// fra sjekkbokser. (Burde også hente og presentere eventuelle lyd-
// filer eller videofiler)

hent spørsmålstekst og legg i sporsmalLbl
for alle alternativer
   hent alternativtekst og legg i sjekkboks
   sett visible=false hvis ikke i bruk

lagRapport():

// Regner ut poeng og lager tilbakemelding

// Regner ut poengsum:
poeng = 0
for alle spørsmål
   hent antallsvar fra svartabell
   Hvis antallsvar>0
      for alle alternativer
         Hvis svar i fasit-tabell
            poeng++
         ellers
            poeng--
// Finner antall mulige poeng (trenger senere)
makspoeng=0
for alle spørsmål
   makspoeng += lengde på fasit-tabell

// lager tilbakemelding
Hvis poeng<0
   melding = SVAKMELDING
ellers hvis poeng == makspoeng
   melding = BRAMELDING
ellers
   melding = melding i spraktabell

Skisse av program

/*
   Skisse av quizdelen (frame 2), forutsetter
   at frame 1 har valgt språk og
   satt dette til Amerikansk.
   Forutsetter at vi følger opp med en ny
   frame som gir tilbakemelding til bruker.
*/
import flash.events.MouseEvent;

/// --- Datastruktur --- ///
const SVAKMELDING:      String = 
   "Dette gikk ikke så bra, men det er håp for alle "+
   "som vil lære et nytt språk!";
const BRAMELDING:       String = "Alt riktig, veldig bra!";

const AMERIKANSK: int       = 0;
const TYSK:       int       = 1;
const FRANSK:     int       = 2;

var spraktabell: Array =
   [
      { melding: "Avisen Lillevik Tidende tilbyr språkkurs i New-York",
      sporsmal: ["Hva betyr ordet Where?",
               "Hvilke(t) ord kan legges til her?\nHow are ...",
               "Spill av lydfilen \"Oversetting.mp3\" og velg "+
                                         "riktig oversettelse:"
              ],
      alternativer:
              [
                   ["Hvor","Vi er", "Var","Hvorfor"],
                   ["you","John doing?","things","the house","the wife"],
                   ["Hei, mitt navn er Tom", "Jeg er Tom", 
                    "Kjenner du Tom?", "Når kommer Tom?"]
              ],
      fasit:    [
                   [0],
                   [0,2],
                [2]
              ],
      media:    [
                ["","","Oversetting.mp3"]  // media, kan sjekke 
                ]                          // på endelse .mp3, .flv
     }
     /* og her kan vi legge inn tysk, fransk osv:
      {melding:      "   ",
      sporsmal:     [      ],
      alternativer: [ [  ], ... ],
      fasit:        [ [  ], ... ],
      media:        [   ...     ]
      }
     */
   ];

var svartabell: Array = new Array();  // Husker hva bruker har svart.
     
var sprak:      int    = AMERIKANSK;  // Default språk     
var nr:         int    = 0;           // Nummer på spørsmål
var poeng:      int    = 0;           // Poeng og rapport brukes
var makspoeng:  int    = 0;       
var melding:    String = "";          // i siste RapportFrame

/// --- Hovedprogram --- ///
stop();
var alternativtabell: Array =       // Legger sjekkbokser i tabell
       [alt1Chk,alt2Chk,alt3Chk,alt4Chk,alt5Chk];
// Må sette opp første spørsmål:
nr=0;
oppdaterGUI();
// Kobler opp lytterfunksjon
videreBtn.addEventListener(MouseEvent.CLICK, videreKlikket);

/// --- Underprogram/funksjoner --- ///
function videreKlikket(evt: MouseEvent): void {
   hentSvar();
   var antallsporsmal = spraktabell[sprak].sporsmal.length;
   nr++;
   if(nr == antallsporsmal) { // Hvis ferdig
      lagRapport();
      // Skal ha: gotoAndStop( rapport-frame )
   } else if (nr < antallsporsmal) {
      oppdaterGUI();
   }//if
}//videreKlikket()

/* Tar vare på brukers svar */
function hentSvar(): void {    
   var valgtabell: Array = new Array();
   for(var i:int =0; i < 5; i++) {
     if(alternativtabell[i].selected) {valgtabell.push(i); }
   }//for alle alternativ-sjekkbokser
   svartabell.push(valgtabell);
}//hentSvar()

/* Legger inn riktige tekster på skjermen,
   (Burde også sette opp lydfil eller video)
   Har også forenklet til 4 alternativer på alle spørsmål foreløpig.
*/
function oppdaterGUI(): void {
   var t: Object = spraktabell[sprak];
  sporsmalLbl.text = t.sporsmal[nr];

   var antallalternativer: int = t.alternativer[nr].length;
   for(var i:int =0; i < 5; i++) {
      if(i < antallalternativer) {   // 
         alternativtabell[i].label = t.alternativer[nr][i];
         alternativtabell[i].visible = true;
      }else{
         alternativtabell[i].visible = false;
      }// hvis det finnes alternativ
      alternativtabell[i].selected = false;
   }//for alle alternativ-sjekkbokser
}//oppdaterGUI();

/* Regner ut poeng og lager rapport
   ved å sammenligne svar med fasit. */
function lagRapport():void {
   var t: Object = spraktabell[sprak];
   poeng = 0;
   for(var sp:int=0;sp<t.sporsmal.length;sp++){
      var antallsvar:int = svartabell[sp].length;
      if(antallsvar>0) { //Sjekk om minst et valgt alternativ er valgt
         for(var alt:int=0;alt<antallsvar;alt++) { //for alle alt
            if(t.fasit[sp].indexOf(svartabell[sp][alt])>-1) {
               poeng++;
            }else{
               poeng--;
            }//if riktig eller galt svar
         }//for
      }//if
   }//for alle spørsmål
   
   makspoeng = 0;
   for(sp=0;sp<t.sporsmal.length;sp++){  // finner makspoeng
      makspoeng += t.fasit[sp].length;
   }//for alle spørsmål
   
    if(poeng<0) {
      melding = SVAKMELDING;
   } else if (poeng <= 3) {
      melding = t.melding;           //tilbud om språkkurs
   } else if(poeng == makspoeng) {
      melding = BRAMELDING;
   }// hvis poeng...
   trace("Melding: " + melding);
   trace("Poeng:   " + poeng);
}//lagRapport()