Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Lite om reella tal Programmering Vad kan man g¨ ora med reella tal? Ut¨ over de vanliga aritmetiska operationerna, finns det ett antal funktioner i en bibliotek-klass som heter Math. hh.se/DB2004 F¨ orel¨asning 4: F¨alt samt Input/Output Avst˚ andet till origo Givna tv˚ a reella tal som st˚ ar f¨ or (x, y ) - koordinater av en punkt r¨akna ut avst˚ andet till origo. Ver´ onica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Pytagoras sats s¨ager: x2 + y2 = d2 allts˚ a ¨ar Center for Research on Embedded Systems IDE-sektionen Lite om reela tal F¨ alt 1 / 30 Inf¨ or n¨ asta vecka I java p x2 + y2 Lite om reela tal 2 / 30 F¨ alt Inf¨ or n¨ asta vecka Om operatorers associativitet och prioritet Avst˚ and 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¨ander variabler, literaler, operatorer och funktionsanrop f¨ or att bilda uttryck. Uttrycket st˚ ar f¨or ett v¨arde som ber¨aknas utifr˚ an variablernas inneh˚ all, literalers v¨arde och vad operatorer och funktioner betyder. Men ¨aven i vilken ordning man r¨aknar ut delar av uttrycket! } Utdrag fr˚ an Math Math.PI Math.E Math.sin(Math.PI/2)) Math.cos(Math.PI)) Math.log(Math.E)) d= 3.141592653589793 2.718281828459045 1.0 -1.0 1.0 N˚ agra uttryck och dess v¨arde Skall 3+4*5 r¨aknas som 7+5 eller som 3+20? Java anv¨ander samma prioritet f¨or operatorer som ni anv¨ander i matte: f¨ orst r¨aknar man * och / och sedan + och -. D˚ a blir det i v˚ art fall 3+20 allts˚ a 23. 3 / 30 4 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Om operatorers associativitet och prioritet Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka F¨alt Jag kommer troligen att uttala detta arrayer Att lagra och hantera stora m¨angder data. F¨alt En indicerad f¨oljd av v¨arden av samma typ. N˚ agra uttryck och dess v¨arde Skall 5-3+7 r¨aknas som 2+7 eller som 5-10? Java anv¨ander samma associativitet som ni anv¨ander i matte: man r¨aknar fr˚ an v¨anster (v¨anster associativitet). D˚ a blir det i v˚ art fall 2+7 allts˚ a 9. Exempel 52 kort i en kortlek. 1 miljon tecken i en bok. 10 miljoner ljudelement i en MP3-fil. 73 miljarder Google-fr˚ agor per ˚ ar. 6 / 30 5 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Flera variabler av samma typ 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; Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Flera variabler av samma typ 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]; Trist och felben¨aget! Skalar inte s˚ a l¨att till stora antal! 7 / 30 Observera deklarationen! Detaljer kommer strax! Skalar upp! 8 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Flera variabler av samma typ Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Javas st¨od f¨or f¨alt 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! Att skapa ett f¨alt a = new double[10]; eller sentence = new String[100]; Allts˚ a skapar man ett f¨alt av en viss storlek var = new type[size]; F¨altdeklaration double[] a; eller String[] sentence; Allts˚ a kan man deklarera f¨alt med element av godtycklig typ type[] var; new ¨ar ytterligare ett reserverat ord i Java, s˚ a som class, public, for, while, if och else. F¨alttyper, p˚ a samma s¨att som String, ¨ar en referenstyp. 9 / 30 Lite om reela tal F¨ alt Javas st¨od f¨or f¨alt Att initiera ett f¨alt for(int i = 0; i<10; i++){ a[i] = 0.0; } eller for(int i = 0; i<100; i++){ sentence[i] = ""; } Allts˚ a for(int i = 0; i<size; i++){ var[i] = v¨ ardeAvR¨ attTyp; } 10 / 30 Inf¨ or n¨ asta vecka Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden Summor Vi betraktar igen problemet med att ber¨akna n X F¨ or att tillverka ett f¨alt skall man deklarera det, skapa det och initiera det! i i=1 Men nu vill vi veta alla v¨arden p˚ a denna summan f¨or olika v¨arden av n. F¨ or att komma ˚ at enskilda element i ett f¨alt anv¨and var[index]. Alla dessa ¨ar variabler! 1 X Indicering b¨ orjar med 0. 3 X i=1 2 X 4 X i=1 11 / 30 i =1 i=1 i =3 i=1 i =6 5 X i = 15 i=1 i = 10 6 X i=1 i = 21 12 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden Om man beh¨ over anv¨anda n X Lite om reela tal F¨ alt 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; } } i i=1 f¨ or olika v¨arden av n kan man ber¨akna dem en g˚ ang, lagra v¨arden i ett f¨alt d¨ar man anv¨ander n som index och sedan ¨ar det bara att kolla vad som finns i f¨altet p˚ a plats n. 13 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden 14 / 30 Inf¨ or n¨ asta vecka Exempel: f¨alt f¨or att lagra ber¨aknade v¨arden Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Kodfragment Ett f¨alt med slumptal double[] a = new double[size]; for(int i = 0; i<size; i++){ a[i] = Math.random(); } P Om man beh¨ over anv¨anda ni=1 i f¨ or olika v¨arden av n kan man ber¨akna dem en g˚ ang och sedan ¨ar det bara att kolla vad som finns i f¨altet sums[n]. Skriv ut alla element for(int i = 0; i<size; i++){ System.out.println(a[i]); } 15 / 30 Medelv¨ardet double sum = 0.0; for(int i = 0; i<size; i++){ sum = sum + a[i]; } double average = sum/size; 16 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Kodfragment Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Kort i en kortlek Vi kan anv¨anda tv˚ a f¨alt f¨ or att modellera kort i en kortlek: String[] rank = {"2","3","4","5","6","7","8","9","10", "Jack","Queen","King","Ace"}; Kopiera ett f¨alt till ett annat double []b = new double[size]; for(int i = 0; i<size; i++){ b[i] = a[i]; } String[] suit = {"Clubs","Diamonds","Hearts","Spades"}; Observera initieringen, den sker under kompilering! Ett slumpm¨assigt kort int i = (int) (Math.random() * 13); int j = (int) (Math.random() * 4); System.out.println(rank[i]+" of "+suit[j]); 18 / 30 17 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Kortlek Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Eratosthenes s˚ all En kortlek ¨ar ett f¨alt med kort Vi kan t¨anka oss att anv¨anda str¨angar f¨ or att modellera kort: Att st¨ odja ber¨akningar Man kan anv¨anda f¨alt f¨ or att skriva program som kan r¨akna fortare ¨an annars. "2 of Clubs" "4 of Diamonds" d˚ a ¨ar en kortlek ett f¨alt av str¨angar: String[] deck = new String[52]; En metod f¨ or att hitta primtal 2 3 4 5 6 7 8 9 10 11 12 2 3 - 5 - 7 - 9 - 11 2 3 - 5 - 7 - 9 - 11 2 3 - 5 - 7 - - - 11 2 3 - 5 - 7 - - - 11 2 3 - 5 - 7 - - - 11 - Hur initierar vi det? Hur l¨agger 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]; } } 19 / 30 13 13 13 13 13 13 14 - 15 15 15 - 16 - 17 17 17 17 17 17 18 - 19 19 19 19 19 19 20 - 21 21 21 - 20 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Eratosthenes s˚ all Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Eratosthenes s˚ all - kodfragment Man kan anv¨anda ett f¨alt f¨ or att markera vilka som ¨ar primtal: f¨altets indices ¨ar heltalen och f¨altets element ¨ar boolska v¨arden! Startv¨arden 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¨altet f¨ or isPrime. Tanken ¨ar att n¨ar s˚ allningen ¨ar klar s˚ a skall isPrime[i] vara sann bara om i ¨ar ett primtal. 21 / 30 Lite om reela tal F¨ alt 22 / 30 Inf¨ or n¨ asta vecka Eratosthenes s˚ all - kodfragment Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Inf¨or n¨asta vecka Programmet och datorn (Nu) S˚ allet for(int i = 2;i<=bound/i;i++){ if(isPrime[i]){ for(int k = i; k<=bound/i; k++){ isPrime[i*k] = false; } } } Vi kan generera massvis med utdata! 23 / 30 Programmet och datorn Vi vill ¨aven anv¨anda massvis med indata och anv¨anda andra m¨ojligheter hos datorn. 24 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Kommandoraden Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Standard output Sammanfattning Alla klasser har en metod main() som tar ett f¨alt av str¨angar som argument. Sammanfattning F¨ or att skriva ut v¨arden fr˚ an Java-program anv¨ander vi System.out.println() och System.out.print(). F¨altet best˚ ar av de kommandoradsargument vi skriver. Dessa f¨ ormedlas till Java av operativsystemet. Java skickar dessa v¨arden till en str¨om av tecken k¨and som standard output. Det ¨ar en konvention att b˚ ade OS och Java hanterar dessa argument som str¨angar. Operativsystemet brukar koppla standard output till terminalen. Om vi vill betrakta ett argument som ett tal m˚ aste vi anv¨anda metoder som Integer.parseInt() f¨ or att konvertera argumentet. I Unix kan vi dirigera om standard output till en fil med >. 25 / 30 Lite om reela tal F¨ alt Ett exempel Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Flera m¨ojligheter Experiment med t¨arningkast 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+" "); } } } Sm˚ a experiment % java Dice 10 6 2 3 4 2 4 5 6 3 4 26 / 30 Inf¨ or n¨ asta vecka Standard input kommer att l˚ ata oss skriva program som interagerar med anv¨andaren genom tangentbordet. Man kan ¨aven dirigera om standard input s˚ a att programmet l¨aser in fr˚ an en fil. Program kan d˚ a hantera st¨orre m¨angder data. Stora experiment % java Dice 10000 > dice10000 27 / 30 28 / 30 Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Flera m¨ojligheter Lite om reela tal F¨ alt Inf¨ or n¨ asta vecka Flera m¨ojligheter Standard audio kan anv¨andas f¨ or att spela upp och manipulera ljudfiler. Vi kommer att kunna spela .wav-filer, kunna skriva program som hanterar f¨alt av double samt l¨asa och skriva dem i .wav-filer. 29 / 30 Standard draw kan anv¨andas f¨or att presentera utdata i grafisk form och ¨aven f¨or enkla animeringar. 30 / 30
© Copyright 2024