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>