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" ) }
(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 )
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; }
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!
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]
hent stedsindeks fra komboboks hotellNavnOppdatering(stedsindeks) nullstillAlleValg() oppdaterGui()
Hvis sted valgt hentData() regnUtPris() oppdaterGui() ellers vis "Velg et sted først!"
hent undertabell med hotellnavn fjern alle item i hotell-komboboksen for alle hotellnavn legg til hotellnavn i Itemliste i hotell-komboboksen
Sett alle komponenter og lagrede data til defaultverdier
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
dognpris = priser[stedsindeks][hotellindeks][sesong] pris = antalldogn*(dognpris*antalldobbeltrom+ (dognpris+ENKELTROM)*antallenkeltrom) Hvis kulturpass valgt pris += antallpersoner*KULTURPASS
rapport = "Reisested: " + stedsnavn[stedsindeks] + "Hotell: " + hotellnavn[stedsindeks][hotellindeks] + "Enkeltrom: " + antallenkeltrom + "Dobbeltrom: " + antalldobbeltrom + "Antall døgn: " + antalldogn Hvis kulturpass valgt rapport += "Kulturpass: + antallpersoner
/* 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(); |