Programmering hh.se/db2004 Föreläsning 4: Fält samt Input/Output Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Lite om reella tal Vad kan man göra med reella tal? Utöver de vanliga aritmetiska operationerna, finns det ett antal funktioner i en bibliotek-klass som heter Math. Avståndet till origo Givna två reella tal som står för (x, y) - koordinater av en punkt räkna ut avståndet till origo. Pytagoras sats säger: alltså är x 2 + y 2 = d 2 Center for Research on Embedded Systems IDE-sektionen 1 / 30 d = x 2 + y 2 2 / 30 I java Om operatorers associativitet och prioritet Avstånd till origo public class Distance{ public static void main(string[] cmdln){ double x = Double.parseDouble(cmdLn[0]); double y = Double.parseDouble(cmdLn[1]); System.out.println(Math.sqrt(x*x+y*y)); Uttryck Man använder variabler, literaler, operatorer och funktionsanrop för att bilda uttryck. Uttrycket står för ett värde som beräknas utifrån variablernas innehåll, literalers värde och vad operatorer och funktioner betyder. Men även i vilken ordning man räknar ut delar av uttrycket! Utdrag från Math Math.PI 3.141592653589793 Math.E 2.718281828459045 Math.sin(Math.PI/2)) 1.0 Math.cos(Math.PI)) -1.0 Math.log(Math.E)) 1.0 3 / 30 Några uttryck och dess värde Skall 3+4*5 räknas som 7+5 eller som 3+20? Java använder samma prioritet för operatorer som ni använder i matte: först räknar man * och / och sedan + och -. Då blir det i vårt fall 3+20 alltså 23. 4 / 30
Om operatorers associativitet och prioritet Fält Jag kommer troligen att uttala detta arrayer Att lagra och hantera stora mängder data. Några uttryck och dess värde Skall 5-3+7 räknas som 2+7 eller som 5-10? Java använder samma associativitet som ni använder i matte: man räknar från vänster (vänster associativitet). Då blir det i vårt fall 2+7 alltså 9. Flera variabler av samma typ 5 / 30 Flera variabler av samma typ Fält En indicerad följd av värden av samma typ. Exempel 52 kort i en kortlek. 1 miljon tecken i en bok. 10 miljoner ljudelement i en MP3-fil. 73 miljarder Google-frågor per år. 6 / 30 10 variabler av samma typ double a0, a1, a2, a3, a4, a5, a6, a7, a8, a9; a0 = 0.0; a1 = 0.0; a2 = 0.0; a3 = 0.0; a4 = 0.0; a5 = 0.0; a6 = 0.0; a7 = 0.0; a8 = 0.0; a9 = 0.0; a4 = 3; double x = a4 + a8; Trist och felbenäget! Skalar inte så lätt till stora antal! 10 variabler av samma typ double[] a = new double[10]; for(int i = 0; i<10; i++){ a[i] = 0.0; a[4] = 3; double x = a[4] + a[8]; Observera deklarationen! Detaljer kommer strax! Skalar upp! 7 / 30 8 / 30
Flera variabler av samma typ Javas stöd för fält 1000000 variabler av samma typ double[] a = new double[1000000]; for(int i = 0; i<1000000; i++){ a[i] = 0.0; a[4] = 3; double x = a[1234] + a[987654]; Observera deklarationen! Detaljer kommer strax! Skalar upp! Fältdeklaration double[] a; eller String[] sentence; Alltså kan man deklarera fält med element av godtycklig typ type[] var; Att skapa ett fält a = new double[10]; eller sentence = new String[100]; Alltså skapar man ett fält av en viss storlek var = new type[size]; new är ytterligare ett reserverat ord i Java, så som class, public, for, while, if och else. Fälttyper, på samma sätt som String, är en referenstyp. 9 / 30 10 / 30 Javas stöd för fält Exempel: fält för att lagra beräknade värden Att initiera ett fält for(int i = 0; i<10; i++){ a[i] = 0.0; eller for(int i = 0; i<100; i++){ sentence[i] = ""; Alltså var[i] = värdeavrätttyp; För att tillverka ett fält skall man deklarera det, skapa det och initiera det! För att komma åt enskilda element i ett fält använd var[index]. Alla dessa är variabler! Indicering börjar med 0. 11 / 30 Summor Vi betraktar igen problemet med att beräkna n i Men nu vill vi veta alla värden på denna summan för olika värden av n. 1 i = 1 2 i = 3 3 i = 6 4 i = 10 5 i = 15 6 i = 21 12 / 30
Exempel: fält för att lagra beräknade värden Om man behöver använda n i för olika värden av n kan man beräkna dem en gång, lagra värden i ett fält där man använder n som index och sedan är det bara att kolla vad som finns i fältet på plats n. 13 / 30 Exempel: fält för att lagra beräknade värden Exempel: fält för att lagra beräknade värden Summor public class Sums{ public static void main(string[] cmdln){ int size = Integer.parseInt(cmdLn[0]); int[] sums = new int[size + 1]; int sum; sums[0]=0; for(int n = 1; n < size + 1; n++){ sum = 0; for(int i = 1; i <= n; i++){ sum=sum+i; sums[n]=sum; Kodfragment 14 / 30 Om man behöver använda n i för olika värden av n kan man beräkna dem en gång och sedan är det bara att kolla vad som finns i fältet sums[n]. Ett fält med slumptal double[] a = new double[size]; a[i] = Math.random(); Skriv ut alla element System.out.println(a[i]); Medelvärdet double sum = 0.0; sum = sum + a[i]; double average = sum/size; 15 / 30 16 / 30
Kodfragment Kort i en kortlek Vi kan använda två fält för att modellera kort i en kortlek: Kopiera ett fält till ett annat double []b = new double[size]; b[i] = a[i]; String[] rank = {"2","3","4","5","6","7","8","9","10", "Jack","Queen","King","Ace"; String[] suit = {"Clubs","Diamonds","Hearts","Spades"; Observera initieringen, den sker under kompilering! Ett slumpmässigt kort int i = (int) (Math.random() * 13); int j = (int) (Math.random() * 4); System.out.println(rank[i]+" of "+suit[j]); 17 / 30 18 / 30 Kortlek En kortlek är ett fält med kort Vi kan tänka oss att använda strängar för att modellera kort: "2 of Clubs" "4 of Diamonds" då är en kortlek ett fält av strängar: String[] deck = new String[52]; Hur initierar vi det? Hur lägger vi ut korten i arrayen? for(int i = 0; i<13; i++){ for(int j = 0; j<4; j++){ deck[4*i+j]=rank[i] + " of " + suit[j]; Eratosthenes såll Att stödja beräkningar Man kan använda fält för att skriva program som kan räkna fortare än annars. En metod för att hitta primtal 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2 3-5 - 7-9 - 11-13 - 15-17 - 19-21 2 3-5 - 7-9 - 11-13 - 15-17 - 19-21 2 3-5 - 7 - - - 11-13 - - - 17-19 - - 2 3-5 - 7 - - - 11-13 - - - 17-19 - - 2 3-5 - 7 - - - 11-13 - - - 17-19 - - 19 / 30 20 / 30
Eratosthenes såll Eratosthenes såll - kodfragment Man kan använda ett fält för att markera vilka som är primtal: fältets indices är heltalen och fältets element är boolska värden! Startvärden boolean[] isprime = new boolean[bound+1]; isprime[0] = false; isprime[1] = false; for(int i = 2; i<bound+1; i++){ isprime[i] = true; Man kan kalla fältet för isprime. Tanken är att när sållningen är klar så skall isprime[i] vara sann bara om i är ett primtal. 21 / 30 22 / 30 Eratosthenes såll - kodfragment Inför nästa vecka Sållet for(int i = 2;i<=bound/i;i++){ if(isprime[i]){ for(int k = i; k<=bound/i; k++){ isprime[i*k] = false; Programmet och datorn (Nu) Vi kan generera massvis med utdata! Programmet och datorn Vi vill även använda massvis med indata och använda andra möjligheter hos datorn. 23 / 30 24 / 30
Kommandoraden Standard output Sammanfattning Alla klasser har en metod main() som tar ett fält av strängar som argument. Fältet består av de kommandoradsargument vi skriver. Dessa förmedlas till Java av operativsystemet. Det är en konvention att både OS och Java hanterar dessa argument som strängar. Om vi vill betrakta ett argument som ett tal måste vi använda metoder som Integer.parseInt() för att konvertera argumentet. Sammanfattning För att skriva ut värden från Java-program använder vi System.out.println() och System.out.print(). Java skickar dessa värden till en ström av tecken känd som standard output. Operativsystemet brukar koppla standard output till terminalen. I Unix kan vi dirigera om standard output till en fil med >. 25 / 30 26 / 30 Ett exempel Flera möjligheter Experiment med tärningkast public class Dice{ public static void main(string[] cmdln){ int samplesize = Integer.parseInt(cmdLn[0]); int dice; for(int i = 0;i<sampleSize; i++){ dice = (int)(math.random()*6)+1; System.out.print(dice+" "); Standard input kommer att låta oss skriva program som interagerar med användaren genom tangentbordet. Man kan även dirigera om standard input så att programmet läser in från en fil. Program kan då hantera större mängder data. Små experiment % java Dice 10 6 2 3 4 2 4 5 6 3 4 Stora experiment % java Dice 10000 > dice10000 27 / 30 28 / 30
Flera möjligheter Flera möjligheter Standard audio kan användas för att spela upp och manipulera ljudfiler. Vi kommer att kunna spela.wav-filer, kunna skriva program som hanterar fält av double samt läsa och skriva dem i.wav-filer. Standard draw kan användas för att presentera utdata i grafisk form och även för enkla animeringar. 29 / 30 30 / 30