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