Central-enhet PM CPU BIOS Skiv- minne Sekundär- minnes- enheter (SM) CD-läsare Diskett-läsare
Primär-minne (PM) Processor (CPU) 11001010 00101101 10101100 10101101 00101101 10101100 10101101 10101010 4 10101011 01101101 10011100 11010011 8 00101101 10101100 10101101 11010001 12 16 01011100 01111001 00110100 11101001 20 10011100 10101011 10101100 10101101 24 11001010 00101101 10101100 01110001 28 R1 R2 Ett antal register ... Styr- enhet Aritmetisk enhet Vektor av minnesceller 8 bitar = 1 byte, 4 byte = 1 ord t ex 256 MB (megabyte - miljoner byte) program-instruktioner & -data
Olika nivåer av program Maskinkod (binär kod) Ett antal (t ex 32) ettor/nollor 100111001001111100011010 Krångligt att skriva direkt Assemblerkod Mnemoniska namn för instruktioner Add #25 to R3 Ett-till-ett matchning mot maskinkod Olika instruktioner beroende på dator Högnivåspråk Mer kraftfulla instruktioner if (x!=5) x+=10; Ger 5-10 maskininstruktioner Ej beroende av datorsystem T ex Pascal, C, C++, Java
Kod i högnivåspråk måste översättas till maskinkod. Kompilering: Interpretering: Kompilator Olika beroende på datorsystem Maskinkod som kan exekveras i datorsystemet Källkod i högnivåspråk Interpretator Olika beroende på datorsystem Läser en instruktion i taget, översätter till maskinkod och exekverar Källkod i högnivåspråk
Programmering Indata Program Utdata Data kan vara av olika typ: 12 43 ”Kalle Nilsson” Bil: Volvo 73.67 ’X’ 730512 ABC 123 Röd true ”Stockholm” 7300 mil Måste representeras i programmet.
Javas Primitiva Datatyper Heltalstyper: byte 8 bitar short 16 bitar int 32 bitar long 64 bitar Flyttalstyper: float 32 bitar double 64 bitar Övriga: char Unicode 16 bitar boolean true / false Textsträngar (INTE primitiv datatyp): String
Litteraler Deklaration Tilldelning Utskrift Inläsning Selection Iteration
if-satsen Nästlade if-satser int x=8; if (<villkor>) if (x>5) <programsats>; <programsats1>; else <programsats2>; Nästlade if-satser int x=8; if (x>5) System.out.println(x); if (x<10) x++; else x--; //Kan även skrivas så här: if (x<10) x++; else x--; if (x>25) if (x<50) System.out.println(”Mellan 25 och 50”); else System.out.println(”50 eller större”); System.out.println(”25 eller mindre”);
Villkor (booleska uttryck) Jämförelse-operatorer: < <= > >= == != (operanderna enkla datatyper) Logiska operatorer: && || ! (fullständigt utvärderande: & | ) String’ar jämförs INTE med dessa operatorer. String s1=”Hej”, s2=”Hopp”; if ( s1.equals(s2) ) ... ; //equals returnerar true om INNEHÅLLET i s1 och s2 är lika int x = s1.compareTo(s2); //compareTo returnerar ett positivt tal om s1 > s2 //ett negativt tal om s1 < s2 samt 0 om s1 = s2
switch-satsen switch (<uttryck>) { case <värde>: <programsatser> default: } ”Hoppar” till den case som matchar uttrycket. Exekverar resten av programsatserna. break-satsen bryter switch break; (kan även användas på loopar) Uttryck och värde måste vara av heltalstyp eller char int x, tal=10; //x får ett slumpvärde switch(x){ case 1: System.out.println(tal); case 2: case 3: System.out.println(++tal); case 4: System.out.println(tal++); default: }
while - loopen false villkor sats true true villkor sats false while (<villkor>) <programsats>; do while (<villkor>); <villkor> - booleskt uttryck <programsats> - valfri programsats om flera satser inom { } - block break; //bryter loopen continue; //börja om nästa varv false villkor sats true true villkor sats false
for-loopen initiering villkor programsats uppräkning for (<initiering> ; <villkor> ; <uppräkning>) <programsats>; Skriv ut talen 1 - 10: for (int x=1; x<=10; x++) System.out.println(x); Man kan utelämna någon del: int x=1; for ( ; x<=10; x++) for (int y=1; y<=10; ) System.out.println(y++); initiering villkor programsats uppräkning true false
Skriv en programsnutt som skriver ut en tabell över celsius-temperaturer & motsvarande fahrenheit-temperaturer var 10’de celsius i intevallat 10-90: Förväntat utseende: Celsius Fahrenheit ----------------------- 10 50 20 68 30 86 40 104 50 122 60 140 70 158 80 176 90 194 System.out.println("Celsius Fahrenheit"); System.out.println("-----------------------"); for (int cels=10; cels<100; cels+=10){ int fahr=(int)(9.0/5.0*cels+32); System.out.println(" "+cels+" "+fahr); }
Operatorer Prioritetsordning Operatorer 1 [] . (metod anrop) ++ -- 2 ++ -- + - ~ ! 3 new (cast) 4 * / % 5 + - 6 << >> >>> 7 < <= > >= instanceof 8 == != 9 & 10 ^ 11 | 12 && 13 || 14 ?: 15 = += -= *= /= %=
Flera variabler av samma sort - arrayer Varje variabel som deklareras får ett utrymme i primärminnet. int tal; double d; tal=43; d=7.85; En array deklareras som <typ>[ ] int[] arr; arr (inget utrymme finns...) Utrymmet måste skapas, görs med new arr = new int[5]; arr[0]=28; arr arr[1]=43; arr[2]=12; arr[3]=19; arr[4]=193; 43 7.85 tal d 28 43 12 19 193 0 1 2 3 4
Array Deklaration: int[] arr; Skapas med new int arr[]; //Alternativ deklarering Skapas med new arr=new int[25]; //Alltid index från 0 och uppåt Indexering med [<index>] arr[3]=12; Längden kan kollas med length int max=arr.length; //max får värdet 25 Initiering vid deklaration int[] kvadrater={0, 1, 4, 9, 16, 25, 36};
Om vi vill representera mer komplexa objekt? T ex bilar som har ett bilmärke, ett registreringsnummer, en färg samt en mätarställning. Volvo ABC 123 Röd 7300 Saab XYW 987 Vit 3800 Fiat MSQ 545 Svart 12900 Att ”samla ihop” flera attribut på detta sätt görs i klasser. Vi behöver alltså nu en klass Bil som skall ha attributen märke, regnummer, färg och mätarställning. Klasser kan innehålla mer än attribut, exempelvis konstruktorer och metoder.
Deklaration av klass Bil: class Bil{ String märke, regnummer, färg; int mätarställning; } Varje klass läggs lämpligen i en egen fil. Denna Bil-klass läggs alltså då på filen Bil.java Skapa objekt Referenser Åtkomst null
class - deklaration class <class-namn>{ <variabel-deklarationer> <konstruktorer> <metoder> <class-deklarationer> } Olika data som beskriver klassen, t ex märke, mätarställning hos en Bil Anropas när ett objekt av klassen skapas (med new <classnamn>) Olika operationer som kan göras på klassen En klass kan ha ”inre” klasser
Metoder - subrutiner <modifierare> <returtyp> <namn> (<argumentlista>){ <lokala deklarationer och programsatser>; } modifierare anger olika egenskaper, t ex för åtkomst public, private, protected, abstract, static, final, native, synchronized returtyp vad som returneras. Valfri datatyp, även referenser till classer eller arrayer. argumentlista lista över eventuella indata till metoden. Om inga argument ( ). int getInt(){...} static void skriv(int x, int y, String str){...} Java ”letar upp” och startar metoden main vid programmets start: public static void main(String[] args){...}
Argumentöverföring Retur-värde Överlagring klass-metoder instans-metoder
Slumptal - biblioteks-klassen Random Det finns ett antal fördefinierade klasser i Java’s API-bibliotek. Beskrivs i API-dokumentationen: http://java.sun.com/j2se/1.5.0/docs/api/ Klassen Random används om man vill ha slumptal. Random ligger i java.util - delbiblioteket. Innehåller metoder för att få slumptal, t ex: int nextInt() returnerar ett slumpmässigt heltal int nextInt(int n) returnerar ett slumptal mellan 0 och n-1 (nextInt(100) returnerar alltså ett tal mellan 0 och 99) boolean nextBoolean() returnerar true eller false double nextDouble() returnerar ett tal mellan 0.0 och 1.0
Ett program som skriver ut 10 slumptal mellan 1 och 100: import java.util.*; class SlumpTest{ public static void main(String[] args){ Random slump = new Random(); for (int x=1; x<=10; x++){ int tal = slump.nextInt(100) + 1; System.out.println(tal); } import-satsen kan utelämnas. Man måste då skriva: java.util.Random slump = new java.util.Random(); Man kan skriva: import java.util.Random;
Klassen Math Ligger på java.lang - delbiblioteket. Allt som ligger i java.lang kan användas direkt, man behöver alltså INTE göra: import java.lang.*; I Math-klassen finns ett antal statiska metoder och variabler, t ex static double PI pi med jättemånga decimaler... static int abs(int a) returnerar absolutbeloppet av a static double log(double a) returnerar naturliga logaritmen av a static double pow(double a, double b) returnerar a upphöjt till b plus många fler... Eftersom metoderna är statiska så kan de anropas utan att man skapar ett Math-objekt: double dd = Math.sqrt(14); double omkrets = Math.PI * diameter;
Jämförelse av anrop på metoder i Random och Math: Random slump = new Random(); int tal = slump.nextInt(100); double d = 4.876; int x = (int)Math.round(d); nextInt är en instans- metod. Man måste alltså skapa ett Random-objekt innan nextInt kan anropas round är en klassmetod. static long round(double d); Kan alltså anropas via klassnamnet