Datastrukturer Datastrukturer • En datastruktur beskriver den information som datorn måste hålla reda på för att lösa en uppgift Vad är en datastruktur? Vad är en datatyp? Primitiva datatyper i Java Icke-primitiva datatyper i Java Minnesexempel med datastrukturer Vektorer i Java • Kan identifieras genom de substantiv som finns i problemställningen eller uppgiftslydelsen • Måste innehålla väl beskrivande namn på identifierare. Utnyttja singular- och pluralformer Erik Forslin [email protected] Rum 1445, plan 4 på Nada 08-7909690 • Måste vara strukturerad och lättläst • Beskrivs med fördel med en minnesbild 1 2 Datatyper i Java Primitiva datatyper i Java • En datatyp är något som bestämmer vilken slags data en variabel kan innehålla (t ex heltal, decimaltal, tecken, referens) • Datatypen bestäms vid deklarationen av en variabel. Exempel: int x; • De primitiva datatyperna i Java beskriver enkla saker vars värde kan lagras direkt i variabelns minnesutrymme (”låda”) int x • Java har åtta primitiva datatyper: • En variabel kan bara innehålla den typ av data som den är deklarerad för • Java har två varianter av datatyper: primitiv datatyp och icke-primitiv datatyp (referens till en instans) 3 Heltal Flyttal Tecken Logiska byte short int long float double char boolean 4 Heltal Flyttal • Det finns fyra heltalstyper i Java: Datatyp byte short int long • Det finns två flyttalstyper i Java: Bitstorlek Min-värde Max-värde Datatyp Bitstorlek Min-värde Max-värde 8 16 32 64 −128 −32 768 −2 147 483 648 ≈ −9 × 1018 127 32 767 2 147 483 647 ≈ 9 × 1018 float double 32 64 ≈ −3.4 × 1038 ≈ −1.7 × 10308 ≈ 3.4 × 1038 ≈ 1.7 × 10308 • Vid beräkningar kan dessa tal ”slå runt”. Exempel med datatypen byte: byte b = 127; b = b + 1; // b är nu -128 ! • Vid beräkningar kan dessa tal även anta värdena ”±Infinity” och ”NaN” (”Not a Number”): double d = 1.0 / 0.0; // d är nu Infinity ! d = 0.0 / 0.0; // d är nu NaN ! 5 6 Logiska Tecken • Ett logiskt (booleskt) värde har datatypen boolean • Ett tecken i Java har datatypen char • En boolesk variabel kan endast anta värdena true eller false • Java använder teckenkodningssystemet Unicode som har stöd för nästan alla språk • En teckenlitteral skrivs med omgivande apostrofer, t ex char tkn = 'a'; tkn = '&'; tkn = '\''; // apostrof måste skyddas med '\' 7 • Booleska variabler används ofta som villkor i val eller slingor: boolean spelaVidare = true; while (spelaVidare) { /* Källkod för t ex ett spel. Värdet på variabeln "spelaVidare" ändras om spelet av någon anledning inte ska fortsätta. */ } 8 Minnesexempel med primitiva och icke-primitiva datatyper Icke-primitiva datatyper i Java Källkoden int x = 3; double y = 3.14; String str = "hejsan"; BufferedReader indata = new BufferedReader(new InputStreamReader(System.in)); • En icke-primitiv datatyp används för att hålla reda på större datastrukturer än primitiva data • En variabel av en icke-primitiv datatyp kallas ofta referensvariabel eftersom den innehåller en referens • Referensvariabeln refererar till den del av minnet som innehåller den större datastrukturen ger vid exekvering upphov till följande datastrukturer i minnet: x int 3 instans av double y 3.14 String "hejsan" ? ? length() String instans av str • Den större datastrukturen är en instans av en klass och ritas som en ”stor låda” BufferedReader BufferedReader indata ? readLine() ? ? 9 10 Hakvektor eller klassen Vector? Vektorer • Vektorer används för att samla en mängd saker, element, i en och samma datastruktur • Java har inbyggda vektorer och en klass Vector som kan användas • De inbyggda vektorerna kännetecknas av att man använder ’[’ och ’]’ (hakparenteser). En del kallar dessa för ”hakvektorer” eller ”arrayer” (från engelskans ”array”) • Elementen i en vektor är numrerade från 0 och uppåt. Ett elements ordningsnummer kallas index • Ofta används slingor i kombination med vektorer 11 Vid val mellan att använda hakvektorer eller klassen Vector bör man tänka på följande: • Antalet element i hakvektorer bestäms när hakvektorn skapas (instansieras) och kan sedan inte ändras • I en instans av Vector kan man lägga till godtyckligt många element • I en hakvektor kan bara element av samma datatyp lagras • I en instans av Vector kan endast referenser lagras. Primitiva datatyper kan inte lagras utan att de ”bakas in” i en större datastruktur som man kan referera till (”Wrapper”-klasser) 12 Minnesexempel med Vector Källkoden Minnesexempel med hakvektor // Skapa en instans av Vector Vector betygen = new Vector(); // Lägg till en del betygsnamn betygen.addElement("fyra"); betygen.addElement("trea"); betygen.addElement("femma"); Källkoden // Skapa plats för åtta betyg int[] betygen = new int[8]; // Ändra 0:e betyget till 2:a betyget String tmpBetyg = (String)betygen.elementAt(2); betygen.setElementAt(tmpBetyg, 0); // Sätt en del betyg betygen[2] = 4; betygen[6] = 3; ger följande minnesbild vid exekvering: betygen[0] = betygen[2]; Vector instans av Vector betygen String ger följande minnesbild vid exekvering: 0 1 2 tmpBetyg ? ? size() instans av int[8] int[] betygen 4 4 3 instans av 0 1 2 3 4 5 6 7 ? int length 8 String "fyra" ? ? ? instans av instans av String "trea" ? ? 13 String "femma" ? ? 14