Gruppeoppgave

Eksamen V2016

H-P Ulven, mars 2017


Generelle bemerkninger

function beregning(): Number {
   // Her skulle jeg gjort en komplisert beregning som ikke er ferdig ennå!   
   // Foreløpig returneres 42, uansett.
    return 42;                     // Returnerer 42 ("Svaret på alt" )
}

Planlegging av brukergrensesnitt

(Tegning av skjermbilde, med angivelser av komponentnavn og lytterfunksjoner.)

(Jeg har konsentrert meg om det viktigste og har for eksempel ikke tatt med Gå-til-betaling-knapp )

Datastruktur

Noe av det viktigste her er at alle data bør lagres ett sted; i datastrukturen!
En uting å ha samme data flere steder, for eksempel både i tabeller og i kode eller i brukergrensesnittet (komponenter).
Oppdatering er enklest hvis alt er et sted, ikke spredd på forskjellige steder i programkoden,
eller enda verre; samme data flere steder!

Dette er eksempelvis ikke så lurt:

function hotellFalleferdig(romtype: String): Number { 
   var pris: Number = 0.0;  
   if (romtype == ENKELTROM) {
        pris = 630;                    // ikke lagre data i kode ...  
   } else {
       pris = 330;                    // ikke lagre data i kode...
   }
   return pris;
}

Variabelliste:

Navn: Type: Default: Navn: Type: Default:
KULTURPASS int 700 ENKELTROM int 300
stedsindeks   -1 hotellindeks int -1
sesong String "sommer" antallenkeltrom int 0
antalldobbeltrom int 0 antalldogn int 0
kulturpass Boolean false antallpersoner int 0
pris int 0      

Hvis det ikke skal leveres som egen oppgave, er det likevel lurt å lage en enkel liste, for å huske navnene når man skriver kode!

Tabeller:

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

Valg mellom Array og Asssosiative tabeller/Objekter, styres av behovet for å slå opp.

Her bruker jeg steds- og hotellindekser til å slå opp priser.
Steds- og hotellnavn i enkle tabeller:

stedsnavn:

"Amsterdam" "New York" "Roma" "St. Petersburg"

hotellnavn:

"Stinky" "Dirty"
"Aurora" "Downtown" "City Hall"
"BadView" "Ugly View"
"Putin" "Tall Tower"

priser:

Grønne objekter på formen: { sommer: 300, vinter: 400 }

Oppslag med: priser[stedsindeks][hotellindeks][sesong]

Programstruktur:

Lytterfunksjoner:

stedEndret():

hent stedsindeks fra komboboks
hotellNavnOppdatering(stedsindeks)
nullstillAlleValg()
oppdaterGui()

noeBleEndret():

Hvis sted valgt
   hentData()
   regnUtPris()
   oppdaterGui()
ellers
   vis "Velg et sted først!"

Andre funksjoner:

hotellNavnOppdatering(stedsindeks):

hent undertabell med hotellnavn
fjern alle item i hotell-komboboksen
for alle hotellnavn
   legg til hotellnavn i Itemliste i hotell-komboboksen

nullstillAlleValg():

Sett alle komponenter og lagrede data til defaultverdier

hentData():

Kommentar:
Kunne klart oss uten denne og gjort alt i regnUtPris(), men fint å isolere alt som har
med GUI å gjøre, slik som navn på komponenter, i denne ene funksjonen.
Hvis noe endres i brukergrensesnittet, slipper vi å endre andre steder enn i hentData(),
som eksempelvis i oppdaterGui() lenger ned der vi bruker variabler og slipper å
hente på nytt fra brukergrensesnittet!

hotellindeks=hotellCb.selecteIndex
Hvis sommer
   sesong = "sommer"      // Brukes som feltnavn i
ellers                    // i pris-tabellen
   sesong = "vinter"
antallenkeltrom  = enkeltromNs.value
antalldobbeltrom = dobbeltromNs.value
antalldogn       = antalldognNs.value
kulturpass       = kulturpassChk.selected
antallpersoner   = antallenkeltrom+2*antalldobbeltrom

regnUtPris():

dognpris = priser[stedsindeks][hotellindeks][sesong]
pris     = antalldogn*(dognpris*antalldobbeltrom+
           (dognpris+ENKELTROM)*antallenkeltrom)
Hvis kulturpass valgt
   pris += antallpersoner*KULTURPASS

oppdaterGui():

rapport = 
   "Reisested:   " + stedsnavn[stedsindeks] +
   "Hotell:      " + 
             hotellnavn[stedsindeks][hotellindeks] +
   "Enkeltrom:   " + antallenkeltrom + 
   "Dobbeltrom:  " + antalldobbeltrom +
   "Antall døgn: " + antalldogn 
Hvis kulturpass valgt
     rapport += "Kulturpass: + antallpersoner

Skisse av program

 

/*
   Oppgave 3 - Eksamen V 2016
	
   Author: H-P Ulven   Version: 0.9

    GUI:
      reisestedCb    hotellCb
      sommerRb       enkelromNs
      vinterRb	     dobbelromNs
      kulturpassChk
      sjekkutBtn     antalldognNs
      rapportTa
*/

/// --- Datastruktur --- ///
const KULTURPASS:     int     = 700;
const ENKELTROM:      int     = 300;

var stedsindeks:      int     = -1;
var hotellindeks:     int     = -1;
var sesong:           String  = "sommer"; 
var antallenkeltrom:  int     = 0;
var antalldobbeltrom: int     = 0;
var antalldogn:       int     = 0;
var kulturpass:       Boolean = false;
var antallpersoner:   int     = 0;
var pris:             int     = 0;

var stedsnavn: Array = ["Amsterdam", "New York", "Roma","St. Petersburg"];

var hotellnavn: Array = 
   [
      ["Stinky", "Dirty"],                  //Amsterdam
      ["Aurora", "Downtown", "City Hall"],  //New York
      ["BadView", "UglyView"],              //Roma
      ["Putin", "TallTower"]                //St. Petersburg
   ];

var priser: Array =
   [
    [{sommer: 300, vinter: 400},{sommer: 250, vinter: 300}],
    [{sommer: 590, vinter: 690},{sommer: 660, vinter: 750},
                                  {sommer:450,vinter:530}],
    [{sommer: 320, vinter: 410},{sommer: 400, vinter: 500}],
    [{sommer: 500, vinter: 600},{sommer: 400, vinter: 500}]
   ];	

/// --- Oppkobling av lytterfunksjoner --- ///
reisestedCb.addEventListener(Event.CHANGE,stedEndret); 

function stedEndret(evt: Event):void {
   stedsindeks = reisestedCb.selectedIndex;
   hotellNavnOppdatering(stedsindeks);
   nullstillAlleValg();	                 // Stedsskifte endrer alt!
   oppdaterGui();

}//stedEndret()

// Alle andre skal medføre oppdatering av pris:
hotellCb.addEventListener(Event.CHANGE,noeBleEndret);
sommerRb.group.addEventListener(Event.CHANGE,noeBleEndret);
enkeltromNs.addEventListener(Event.CHANGE,noeBleEndret);
dobbeltromNs.addEventListener(Event.CHANGE,noeBleEndret);
antalldognNs.addEventListener(Event.CHANGE,noeBleEndret);
kulturpassChk.addEventListener(Event.CHANGE,noeBleEndret);

function noeBleEndret(evt: Event): void {
   if(stedsindeks>=0) {
      hentData();           // Hent data fra GUI
      regnUtPris();         // Beregninger
      oppdaterGui();        // Oppdater GUI
   }else{
      rapportTa.text = "Velg sted først!";

   }//if

}//noeBleEndret()

/// --- Andre funksjoner --- ///

//Hent data fra brukergrensesnitt:
function hentData():void {
   hotellindeks = hotellCb.selectedIndex;
   if(sommerRb.selected) {
      sesong = "sommer";
   }else{
      sesong = "vinter";
   }//if
   antallenkeltrom=enkeltromNs.value;
   antalldobbeltrom=dobbeltromNs.value;
   antalldogn=antalldognNs.value;
   kulturpass=kulturpassChk.selected;   debug();
   antallpersoner = antallenkeltrom+2*antalldobbeltrom;
}//hentData()

// Regn ut totalprisen
function regnUtPris(): void {
   var dognpris: int = priser[stedsindeks][hotellindeks][sesong];
   pris = 0;
   pris += antalldogn*
           (dognpris*antalldobbeltrom + 
           (dognpris+ENKELTROM)*antallenkeltrom);
   if(kulturpass) {
      pris += antallpersoner*KULTURPASS;
   }//if

}// regnUtPris()

// Lag oppdatering og vis i brukergrensesnitt
function oppdaterGui():void {
   var rapport: String = "Velg hotell!";
   if(hotellindeks>=0) {
      rapport = 
         "Reisested:    " + stedsnavn[stedsindeks] + "\n" +
         "Hotell:       " + hotellnavn[stedsindeks][hotellindeks] + "\n"+  
         "Enkeltrom:    " + antallenkeltrom + "\n" +
         "Dobbeltrom:   " + antalldobbeltrom + "\n" +
         "Antall døgn:  " + antalldogn + "\n";
      if(kulturpass) {
        rapport += "Kulturpass:   " + antallpersoner + "\n\n";
      }//if
      rapport += "Totalsum:   " + pris;
   }//if
   rapportTa.text = rapport;
}// oppdaterGui()

// Oppdatering av hotellnavn i hotellnavn-komboboksen
function hotellNavnOppdatering(stedsindeks:int):void {
	var navn: Array = hotellnavn[stedsindeks];
	hotellCb.removeAll();                     //Fjern alle items
	for(var i:int=0;i<navn.length;i++){	  //For hvert navn
		var o: Object = {label: navn[i]}; //Legg inn nye items
		hotellCb.addItemAt(o,i);
	}//for
}//hotellNavnOppdatering()

// Nullstill alle valg når reisested er endret:
function nullstillAlleValg():void {
   hotellCb.selectedIndex = -1;	// -1 for å vise "hotell" som label
   hotellindeks=-1;
   sommerRb.selected = true;       sesong="sommer";
   enkeltromNs.value=0;            antallenkeltrom=0;
   dobbeltromNs.value=0;           antalldobbeltrom=0;
   antalldognNs.value=0;           antalldogn=0;
   kulturpassChk.selected=false;   kulturpass=false;

}//nullstillAlleValg()

// Debug av GUI og valg
function debug():void { 
   trace("Stedsindeks: " + stedsindeks);
   trace("Hotellindeks: " + hotellindeks);
   trace("Sesong: " + sesong);
   trace("Enkeltrom: " + antallenkeltrom);
   trace("Dobbeltrom: " + antalldobbeltrom);
   trace("Antall døgn: " + antalldogn);
   trace("Kulturpass: " + kulturpass);

}//debug()

/// --- Hovedprogram ("Main") --- ///
nullstillAlleValg();