Variabler, tilordning og fundamentale datatyper.

Versjon: 03.12.14

Variabler

er "bokser" vi setter navn på og som kan inneholde forskjellige typer data. (Tall, tekst, logisk sann/usann, tabell, objekt, ...)

Egentlig er disse navnene en referanse til en adresse i hukommelsen (RAM).

Navngivingen, eller deklarasjonen av variablene, sparer oss for å holde orden på adresser i RAM.

Deklarasjon av variabler:

Variabler deklareres på denne måten i ActionScript:

 
   var navn: Datatype;    
var i: int;		// Variabelen får navnet i og inneholder datatypen heltall. (Integer)
var n: Number;		// Variabelen får navnet n og og inneholder datatypen flyttall. (Number)
var hilsen: String;	// Variabelen får navnet hilsen og inneholder datatypen tekststreng. (String)
var bletruffet: Boolean;// Variabelen får navnet bletrufffet og inneholder datatypen logisk variabel,
                        // (boolean,) som kan inneholde true eller false.
var tabell: Array=new Array(); //Tabell, det vil si en samling med variabler
			     //av samme datatype lagret i en tabell hvor variabelnavnet viser
			     //til hele tabellen.  deklareres som objekt med new!

Tilordning:

Variabler kan når som helst få tilordnet nytt innhold med tilordningsoperatoren = :

i = 10;			// Variabelen i får verdien 10.
n = 3.2;			// Variabelen n får verdien 3.2.
hilsen = "Vær hilset!";	// Variabelen hilsen får verdien "Vær hilset!"
bletruffet = false;	// Variabelen bletruffet får verdien false (=usant).
tabell = ["Hansen","Olsen","Jensen","Karlsen"];	//Tabellen får innholdet:
"Hansen" "Olsen" "Jensen" "Karlsen"

 

Obs: Legge merke til at vi kan gjøre deklarasjon og tilordning i en operasjon, eksempelvis:

var i: int = 10;
var n: Number = 3.2;
...
var tabell:Array = ["Hansen","Olsen","Jensen","Karlsen"];

Faktisk bør man gjøre dette for å være sikker på at variablene har fornuftige verdier fra starten av.

Tenk på tilordningsoperatoren =, som "blir lik" eller "blir satt til", ikke som matematikksymbolet "er lik" i en ligning.

 

Uttrykk og beregninger:

Istedenfor å få en verdi direkte, kan tilordning først regne ut et uttrykk med andre variabler og operasjoner og deretter legge resultatet i variabelen.

i = i+1;			// Variabelen får sin gamle verdi pluss 1
i++;  			// Kortform for i=i+1;
i = i+okning;		// Variableen får sin gamle verdi pluss verdien i variabelen okning
i += okning;		// Samme som linjen over! Kortversjon!
f = (c-32)*5/9;		// Variabelen f får resultatet av utregningen i uttrykket.
			// (Omregning fra Celcius grader til Fahrenheit grader.)
x1 = (-b+Math.sqrt(b*b-4*a*c))/(2*a);	// Utregning av en løsning på en andregradsligning
hilsen = "Vær hilset "+navn;	// Variabelen hilsen får innholdet: 
				// "Vær hilset ole" hvis variabelen navn allerede inneholder "ole".
hilsen = "Vær hilset nummer "+tall;	//hilsen blir: "Vær hilset nummer 3", hvis tall
				// inneholder tallet 3. (Blir automatisk konvertert til teksten "3"!)
bletruffet = riktigsiktet && ladet; // bletruffet får verdien true, hvis riktigsiktet og
				// ladet begge var true. && er logisk AND. (Både-og)

Bruk av tabeller i uttrykk og beregninger:

Vi kan referere til hele tabellen, eksempelvis slik:

var ny_tabell: Array = tabell;		// Vi lager en ny variabel som peker
                                        // til tabelen tabell.

Her skjøter vi sammen innholdet i alle boksene i tabellen til en ny streng tekst,
som får innholdet "HansenOlsenJensenKarlsen" ved å bruke en indeks for å få tak i innholdet i hver enkelt boks:

var tekst: String = tabell[0] + tabell[1] + tabell[2] + tabell[4];

Mer realistisk hadde kanskje vært å lage teksten "Hansen, Olsen, Jensen og Karlsen":

var tekst: String = tabell[0] + ", " + tabell[1] + ", " + tabell[2] + " og " + tabell[4];

Operasjoner:

Eksemplene over viser at det er en del operasjoner som kan brukes i uttrykk, her er en oversikt over de viktigste:

Regneoperasjoner:

+, -, *, / De fire regningsarter
^ I de fleste programmeringsspråk er dette potens, men ikke i ActionScript!
Må bruke Math.pow(2,3) for å få 23, så kvadreringen x2 er best å skrive x*x (raskere)

I tillegg ligger det mange flere mer avanserte operasjoner som metoder i klassen Math, eksempelvis:

Math.lg(n) Logaritmen til n
Math.sqrt(n) Kvadratroten av n
Math.sin(n) Sinus til n
Math.exp(n) Eksponentialfunksjonen en
...  

Operasjonen + på String:

"Pluss" på strenger skjøter dem sammen, eksempelvis blir

tekst = "Dette er starten,\n " + "og dette er fortsettelsen"

satt sammen til strengen

"Dette er starten,\n og dette er fortsettelsen" som havner i variabelen tekst.

Hvis vi kjører trace(tekst) vil dette bli skrevet ut over to linjer, da vi har lagt inn den spesielle koden \n for linjeskift. (Newline)

(+ kalles konkateneringsoperatoren; fra engelsk: concat, som betyr å skjøte sammen.)

Operasjoner på Boolean:

(Se også side 87 i kapittel 4 - Kontrollstrukturer.)

Logiske operasjoner:

a og b Boolean

a && b AND BÅDE a OG b må være sanne for å få sann i resultatet
a || b OR ENTEN a ELLER b må være sann for å få sann i resultatet
! a NOT Gir motsatt resultat av innholdet i variabelen a

Relasjonsoperatorer:

m og n int eller Number, men resultatet av operatoren er Boolean!

m == n Like
m > n Større enn
m >= n Større enn eller lik
m < n Mindre enn
m <= n Mindre enn eller lik
m != n Forskjellig fra

Datatyper:

int, Number, String og Boolean er de grunnleggende og mest brukte datatypene.

I moderne programmeringsspråk har man i tillegg sammensatte datastrukturer, som tabeller (Array), lister, trestrukturer, osv.

Egentlig er også Number, String og Boolean også sammensatte datastrukturer, nemlig Klasser, som inneholder både verdien vi tilordner og metoder (funksjoner) vi kan utføre på variabelen.

Sammensatte datatyper:

I tillegg kan vi selv definere sammensatte variabler ved hjelp av klasser og objekter, eksempelvis slik:

class Person {				// Må lage i egen fil, bare en del av koden her
   navn:	String;
   fodselsar: 	int;
   inntekt:  	Number;
}

definerer en klasse som er en egendefinert, ny, sammensatt datatype.

Når klassen/datatypen er definert, kan vi deklarere og tilordne:

var p: Person = new Person();	// Objekter laget av klasser bruker operatoren "new".

Da har vi fått et objekt med default verdiene navn lik "" (tom streng) alder lik 0 og inntekt lik 0.

Men vi kan selv tilordne hva vi vil etterhvert:

p.navn="ole";
p.fodselsar=1982;
p.inntekt=420000;

Objekter og klasser:

Klassen over kunne vært utvidet med metoder/funksjoner i tillegg, eksempelvis:

class Person {			// Må lage i egen fil, bare del av koden her
    navn:	String;
    fodselsar: 	int;
    inntekt: 	Number;
    function Person() {... }	//Funksjon med samme navn er konstruktør
				// og kjøres når vi bruker p= new Person()!
    function alder(nu: int) {
        return nu-fodselsar;	// alder er forskjell på parameteren nå og fødselsår
    }//alder()
}//class Person
Klassen er altså en slags definisjon eller fabrikk, som vi kan lage objekter med:
var p: Person = new Person();	//Vi lager en variabel som inneholder et objekt av datatype Person (klasse).
p.navn = "Ole Olsen";		//Vi referer til deler av objektet med punktum notasjon.
p.fodselsar = 1970;		
p.inntekt = 340000;
var a: int = p.alder(2012) );		// Vil legge alderen, 2012-1970 = 42, i variabelen a.

Et poeng:

I moderne språk har man beholdt syntaksen fra den gangen int, Number, String og Boolean var enkle/primitive datatyper.

Nå er også disse datatypene klasser, men vi slipper å bruke operasjonen new, da dette blir gjort automatisk av kompilatoren.

Når vi skriver:

var navn: String = "Ole Olsen";
var tall: Number = 666;

så blir dette egentlig utført som om vi hadde skrevet:

var navn: String = new String("Ole Olsen");
var tall: Number = new Number(666);

Eksempler:

var a: Number = 3.2;
var b: Number = 1.3;
var c: Number = a + b;		// c vil nå inneholde tallet 4.5

Merk forskjellen fra:

var a: String = "3.2";
var b: String = "1.3";
var c: String = a + b;		// c vil nå inneholde Strengen "3.21.3"

Bruk av objekt-variabler i Flash:

var mc: MovieClip = new MovieClip();	//Opprette et objekt utfra en klasse i Flash
mc.x = 100;				//Bruke egenskap i objektet
mc.addEventListener(MouseEvent.CLICK,musKlikket);    //Bruke metode i objektet
txtMelding.text = "Noe har gått galt!"	// Tekstmelding med instancenavn (variablenavn) txtMelding,
					// bruker egenskapen text.
txtMelding.x    = 200;			// Vi bruker punktumnotasjon for å sette egenskaper.
txtMelding.y    = 250;			// (Egenskaper er variabler innenfor objektvariabelen.)

Kontroll av brukerinput av tall i et TextField:

txtTall.text.replace(",",".");		// Erstatt desimalkomma (Norge) med desimalpunktum (utlandet)
					// med metoden replace i String.
txtTall.restrict = "0-9.,";		// Begrens input til 0,1,2,3,4,5,6,7,8,9,punktum og komma med
					// egenskapen restrict i TextField.
txtResultat.text = tall.toPrecision(3); // Bruk metoden toPrecision i Number til å returnere en String
					// formatert med 3 gjeldende siffer.

Treningsoppgaver:

.I alle treningsoppgavene bruker vi kommandoen trace(String), eksempelvis:

trace("Verdien av tallet er: "+2);	//Skriver ut en tekst og et tall (som konverteres til tekst automatisk)

Noen av disse øvelsene er lite virkelighetsnære og totalt unyttige, men er ment å gi trening i å behandle variabler, tilordninger, utregninger med tall og manipuleringer med tekst.

Oppgave 1

Deklarer tre variabler setning1 og setning2 og setning3 med tekst. Skriv alle setningene med en trace() kommando!

For å få linjeskift kan vi legge inn den spesielle koden "\n". (Huskeregel: n for newline.)

Oppgave 2

Dekalrer tre tall b, l og h som er bredde, lengde og høyde på en kasse. Regn ut volumet som legges i variabelen v og skriv ut følgende:

Vi har en kasse med bredde 15, lengde 27 og høyde 20. Kassen har volumet ....

Oppgave 3

Vi har en rettvinklet trekant hvor katetene er 5 og 7 cm lange. Lag et program som skriver ut litt informasjon og regner ut lengden på hypotenusen.

Oppgave 4

Før vi fikk grafiske brukergrensesnitt lagde man ofte "grafikk" med forskjellige tegn.
Lag et program som skriver ut "grafikken":

 ----------------------
|                      |
|    * * * * * * *     |
|                      |
 ----------------------

Oppgave 5

Lag et program som finner ut om det er sant at et tall ligger mellom 3 og 8 eller ikke.
(Bruk de logiske operasjonene, <,
>, >=, <=, ==)
Finn ut om et tall enten er større enn 10 eller mindre enn 5.

Oppgave 6

Datatypen String er egentlig en Klasse som har mange interessante metoder for manipulasjon av tekststrenger, eksempelvis:

var s:String = "Dette er en tekststreng";
var start:int = s.indexOf("er",0);         //start får verdien 6.
var l:int = s.length;	//l får verdien 22. length er en egenskap alle String og Array  har.
charAt(pos) Returnerer bokstaven i posisjon pos
indexOf(streng) Returnerer posisjonen til streng i hovedstrengen.
Negativ posisjon betyr at streng ikke ble funnet!
lastIndexOf(streng) Søker bakfra
substr(startindeks, lengde),
substring(startindeks, sluttindeks),slice(startindeks,sluttindeks)
Tar ut en del av en streng.
toLowerCase(), toUpperCase() Gjør om til små eller store bokstaver.
split(skilletegn) Splitter opp på skilletegn og legger delene i en tabell
search(streng): int Omtrent som indexOf(), men mer avansert og kan
bruke såkalte regulære uttrykk. (RegExp)
replace(fra, til) Bytter ut forekomster av strengen fra med strengen til.
Kan også bruke regulære uttrykk. (RegExp)

Se litt på dokumentasjonen av String og lag en litt lengre tekststreng.

Prøv de forskjellige kommandoene og lag kode som for eksempel skriver ut::

-hvor mange tegn strengen består av
-hvilken bokstav som er nummer 11
-hvilke bokstaver som er fra nummer 5 til 8
-gjør om alle tegnene til store bokstaver og omven
dt
-undersøker om et svaralternativ finnes i en tabell (som kan fungere som fasit i quiz-programmer ol.)
-fjerner blanke i starten og slutten av en streng. (Kandidat for en egen funksjon, når vi kommer til funksjoner.)

Oppgave 7

Se på BMI-kalkulator-eksemplet side 65.

Fin mal for å lage andre kalkulator-programmer man kan bruke i andre realfag, eksempelvis:

Løsningsskisser