Kommentarer og tips til eksamensoppgaven V2014

Planleggingsskisser og del-løsninger

Jeg tar ikke brukergrensesnittet, konsentrerer meg om datastruktur og programstruktur (kode)


Datastruktur:

Tar datastruktur først. Antagelig greiest å ha en tabell:

Men,vi trenger ikke bruke objekter i den innerste tabellen, i så fall må man bruke indeks 0 og 1 på promillkjøring og ulovlig hastighet, for eksempel deklarert som:

const PROMILLE_KJORING:  int =  0;

const ULOVLIG_HASTIGHET: int =  1;

og aksesserer med:

... lovbruddtabell[i][PROMILLE_KJORING]

istendenfor:

... lovbruddtabell[i]["promillekjoring"]...

 eller

... lovbruddstabell[i].promillekjoring...

Eller deklartert:

var lovbruddtabell: Array = 

   [

	 {promillekjoring: 9631, ulovlig_hastighet: 9863},     

	 {promillekjoring: 8593, ulovlig_hastighet: 12217},

	   //...

	 {promillekjoring: 8534, ulovlig_hastighet: 18010}

	];
// Overgang fra år til indeks eller omvendt:
// Med konstanten:

const STARTAR: int = 2002;
// Kan vi senere i koden gjøre omregninger med:

...

indeks = ar - STARTAR;

...

ar = i + STARTAR;

Legg merke til at jeg ikke lagrer årstallene i tabellen!
Det er unødvendig å lagre ting som kan regnes ut!
Sammenhengen mellom indeks i tabellen og årstallene er enkel, bare en differanse på 2002!

Legg merke til dette trikset, det kan forenkle kodingen betraktelig i mange oppgaver.

Programstruktur (kode):

Oppgave 2 a):

/*   Numeric Stepper:

            ar1_ns for første år

            ar2_ns for siste år

     TextField:

            melding_tf
*/
// Datastruktur: Som i boksen lenger opp
// Kobler opp lytterfunksjon til begge års-velgerne:   
ar1_ns.addEventListener(Event.CHANGE, arEndret);

ar2_ns.addEventListener(Event.CHANGE, arEndret);
// Lytterfunksjon:
function arEndret(evt: Event): void {

   var indeks_1: int = ar1_ns.value - STARTAR;

   var indeks_2: int = ar2_ns.value - STARTAR;
   var antall_1: int = lovbruddstabell[indeks_1].promillekjoring;   

   var antall_2: int = lovbruddstabell[indeks_2].promillekjoring;
   var melding: String = "";
   if( antall_1 < antall_2 ) {

       melding = "Positiv utvikling";

   } else if ( antall_1 == antall_2) {

       melding = "Nøytral utvikling";

   } else {

       melding = "Negativ utvikling";

   }//if

   melding_tf.text = melding;

}//arEndret()

Oppgave 2 b):

/* 

   Komboboks: type_cb

*/
const STARTAR:           int = 2002;
const PROMILLEKJORING:   int = 0;

const ULOVLIG_HASTIGHET: int = 1;
var feltnavn: String = "";
type_cb.addEventListener(Event.CHANGE, typeEndret);
function typeEndret(evt: Event): void {

   if( type_cb.selectedIndex == PROMILLEKJORING ) {

      feltnavn = "promillekjoring";

   } else {

      feltnavn = "ulovlig_hastighet";

   }//if
   for(var i:int = 0; i<lovbruddstabell.length; i++) {

      var verdi: int = lovbruddstabell[i][feltnavn];    // Hent verdi

      settSoyle(i, verdi);    // Se kode i neste lyseblå ramme, lenger ned... 

   }//for

 

/* Bør lage søyler som rektangler i Flash, et nivå under.  

   Hvis vi har laget søylene:

       s2002, s2003, ..., s2007

   kan vi lage følgende kode:

   Se også eksemplet for temperaturvisning i

   eksamensoppgave høsten 2010.

*/
const MAX_VERDI: int = 20000;    //Skalering
var soyletabell: Array = [ s2002, s2003, ..., s2007 ];
function settSoyle(nr: int, verdi: int): void {

   var soyle: Soyle = soyletabell[nr];

   soyle.scaleX =verdi/MAX_VERDI;

}//settSoyle()

Oppgave 3a):

Brukergrensesnitt der man velger et år (ar_ns: Numeric Stepper), velger type lovbrudd (type_cb: ComboBox) og to tekstfelt:
verdi_tf og ny_verdi_tf og en knapp for å utføre en lytterfunksjon når oppdatering er gjort i brukergrensesnitt.

/*

   Ikke så mye nytt i forhold til oppgave 2.    

   Hvis det bare skal gå an å redigere fra 2008,

   kan dette begrenses ved at ar_ns starter på 2008.

   Jeg forutsetter at man enten deklarererer eller bruker

   kode til å fylle opp tabellen med for eksempel -1 opp

   til år 2012 for de årene der det ikke er registrert data.

 */
   ...	// Mye samme kode som i oppgave 2a)
   // Ikke så mye nytt: 
   verdi_tf.text = String( lovbruddstabell[ ar_ns.value-STARTAR ][feltnavn] );
   ...
   lovbruddstabell[ar_ns.value-STARTAR ][feltnavn] = int(ny_verdi_tf.text);
   ...

Oppgave 3 b):

Tar bare med kode som finner det året med færrest lovbrudd.

// Funksjon som finner året med færrest lovbrudd: 
function finnMinimum(): int {

   var min: int = int.MAX_VALUE;        // Minste hittil

   var min_indeks: int = 0;             // Indeks til året med færrest lovbrudd

   for(var i:int; i<lovbruddstabell.length; i++) {

      var verdi: int = 

         lovbruddstabell[i]["promillekjoring"]+lovbruddstabell[i]["ulovlig_hastighet"];

      if(verdi < min) {

         min = verdi;

         min_indeks = i;

      }//if

   }//for

   return min_indeks;                  // Returner funnet indeks

}//finnMinimum()
// senere kode som bruker denne funksjonen:
...
melding_tf.text = "Året med færrest lovbrudd er: " + String(finnMinimum() + STARTAR);
...