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);
...