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()