Oppgave 3 - Flystevne V2010

Løsningsskisser

H-P Ulven 12.03.12

Get Adobe Flash player

Programmering:

Viser to varianter:

 

Kode i frame:

/****************************
	Flystevne - oppgave 3  
	H-P Ulven 12.03.12
*****************************/

import flash.events.Event;

/// --- Brukergrensesnitt --- ///

// Kobler beregningsrutinen på beregn-knappen:
beregnBtn.addEventListener(MouseEvent.CLICK,beregnKlikket);

// Klargjør komboboksene i brukergrensesnitt når xml er lastet og klart i
// den egne klassen Rutetabell.as:
//		(ENKLERE løsning: Legge navn i komboboksene direkte og
//		 ha rutetabellen i vanlig Array).
//       Unngår da denne lytteren:
function xmlLastet(evt: Event): void {
	
	//setter opp komboboksen fraCb:
	var data:Array = rutetabell.getFraNavn();	//Henter tabell fra klassen Rutetabell.as
	for(var i:int =0; i<data.length;i++) {
		fraCb.addItem(data[i]);
	}//for
	
	// Setter opp komboboksen tilCb:
	data=rutetabell.getTilNavn();				//Henter tabell fra klassen Rutetabell.as
	for(i = 0; i<data.length;i++) {
		tilCb.addItem(data[i]);
	}//for
	
	//Melding til bruker:
	meldingTa.visible=true;
	meldingTa.text="Klart til beregning, tast inn fra, til og fart og trykk beregn!";
	
	rutetabell.debug();							//Sjekker debug-metode i 
Rutetabell
}//xmlLastet()


/// --- Data-struktur --- ///

// XML-LØSNING med Rutetabell.as som egen klasse:

// Rutetabell som laster rutetabell fra xml-fil og kan beregne avstander:
var rutetabell:Rutetabell = new Rutetabell();

// Må få tak i URLLoader og henge på lytter for å unngå å referere til
// data som ikke er ferdig lastet 
rutetabell.getLoader().addEventListener(Event.COMPLETE,xmlLastet);

// ENKLERE løsning med assosiativt array:
var rutetabell2: Object = {
	Gardermoen: {Gardermoen:  0, Flesland:  40},
	Flesland:   {Gardermoen: 40, Flesland:  0},
	Værnes:     {Gardermoen: 60, Flesland:  50},
	Bodø:       {Gardermoen:100, Flesland:  80},
	Evenes:     {Gardermoen:150, Flesland: 130},
	Tromsø:     {Garermoen: 200, Flesland: 180}
}//rutetabell2

/// --- Beregninger --- ///

// Henter fart og avstand, beregner og setter resultat
function beregnKlikket(evt: Event): void {					trace("beregnKlikket():");
	var fart: Number = Number(fartTi.text);    				trace("fart: "+fart);
	var fra:  String = fraCb.selectedItem.label;   			trace("fra: "+fra);
	var til:  String = tilCb.selectedItem.label;    			trace("til: "+til);
	
	// MED Rutetabell.as klasse:
	var avstand: Number = rutetabell.getAvstand(fra,til);  	trace("avstand: "+avstand);
    
	// ENKLERE løsning med vanlig array:
	var avstand2: Number = rutetabell2[fra][til];				trace("avstand2: 
"+avstand2);
	
	var reisetid: Number = avstand*10/(fart*1.852);			trace("tid: "+reisetid);
	var timer: Number = int(reisetid);						trace("timer: 
"+timer);
	var minutter  =int((reisetid-timer)*60);				trace("min: "+minutter);
	
	tidT.text = ""+timer+"h "+minutter+"m"
}//beregnKlikket()

Kode i Rutetabell.as (Egen klasse):

package {
	
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	
	/**
	 * Rutetabell - Klasse
	 * 
	 * Leser inn rutetabell fra xml-fil til xml-variabel.
	 * Bruker AS attributt-syntaks (@attr=...) til å slå opp.
	 * 
	 * Interface:
	 *    Rutetabell()			Leser inn rutetabell fra xml-fil til xml-variabel
	 *    getFra():Object			Hent fra-data som skal legges i combobox
	 *    getTil():Object			Hent til-data som skal legges i combobox
	 *    getAvstand(fra: String, til: String): Number    Slår opp riktig avstand
	 * 	  getLoader():URLLoader		Trenger for å henge på lytter som venter på Event.COMPLETE...
	 * 
	 * @author H-P Ulven
	 * @version 12.03.12
	 */
	public class Rutetabell {
		
		private var rutetabell: XML = null;
		
		private var xmlURL:URLRequest = new URLRequest("rutetabell.xml");
		private var xmlLoader:URLLoader = new URLLoader(xmlURL);
		
		/* Konstruktør leser inn fil til variabel rutetabell */
		public function Rutetabell():void {
			xmlLoader.addEventListener(Event.COMPLETE, rutetabellFerdig);			
		}//constructor
		
		private function rutetabellFerdig(evt:Event):void {
			rutetabell = XML(evt.target.data);
		}//rutetabellFerdig()		
		
		/* Oppslagsfunksjonen */
		public function getAvstand(fra: String, til: String): Number {
			return Number( rutetabell.avstand.(@fra == fra).verdi.(@til == til) );
		}//getAvstand(fra, til)
		
		/* Lager array med objekter {label:franavn, data: nr} til kombobox fraCb */
		public function getFraNavn():Array {
			var navn: Array = new Array();
			var o: Object = null;
			for(var i: int = 0;i<rutetabell.avstand.length();i++) {
				o=new Object();
				o.label=rutetabell.avstand[i].@fra; 	//label settes
				o.data=i;							//data settes (kan være tom)
				navn.push(o);							//legger i array
			}//for
			return navn;								//returnerer array
		}//getFraNavn
		
		/* Lager objekter til kombobox tilCb */
		public function getTilNavn():Array {
			var navn: Array = new Array();
			var o: Object=null;
			for(var i: int = 0;i<rutetabell.avstand[0].verdi.length();i++) {
				o=new Object();
				o.label=rutetabell.avstand[0].verdi[i].@til; 
				o.data=i;
				navn.push(o);
			}//for
			return navn;			
		}//getTilNavn()
		
		/* Returnerer loader slik at brukere av klassen kan henge på lytter
		   for å sikre at filen er lastet før forsøk på bruk av klassen
		*/
		public function getLoader(): URLLoader { return xmlLoader;}
		
		 /* Debug function: Lister ut innhold  i rutetabell */
		public function debug(): void {
			var fra: String;
			var til: String;
			trace("rutetabell.debug():");
			for (var i:int = 0; i < rutetabell.avstand.length(); i++) {
				fra = rutetabell.avstand[i].@fra;
				trace("fra: " + fra);
				for (var j:int=0; j< rutetabell.avstand[i].verdi.length();j++) {
					til = rutetabell.avstand[i].verdi[j].@til;
					trace("til: " + til);
					trace("avstand: " + rutetabell.avstand.(@fra == fra).verdi.(@til == til));
				}//for j
			}//for i
		}//debug()
	}//class
	
}//package

XML fil:

<rutetabell>
	<avstand fra="Gardermoen">
		<verdi til="Gardermoen">
			0
		</verdi>
		<verdi til="Flesland">
			40
		</verdi>
	</avstand>

	<avstand fra="Flesland">
		<verdi til="Gardermoen">
			40
		</verdi>
		<verdi til="Flesland">
			0
		</verdi>
	</avstand>

	<avstand fra="Værnes">
		<verdi til="Gardermoen">
			60
		</verdi>
		<verdi til="Flesland">
			50
		</verdi>
	</avstand>

	<avstand fra="Bodø">
		<verdi til="Gardermoen">
			100
		</verdi>
		<verdi til="Flesland">
			80
		</verdi>
	</avstand>

	<avstand fra="Evenes">
		<verdi til="Gardermoen">
			150
		</verdi>
		<verdi til="Flesland">
			130
		</verdi>
	</avstand>

	<avstand fra="Tromsø">
		<verdi til="Gardermoen">
			200
		</verdi>
		<verdi til="Flesland">
			180
		</verdi>
	</avstand>
</rutetabell>