Programmering hh.se/db2004 Föreläsning 5: Fält samt Input/Output Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Lite mer om Javas stöd för fält Hur många element har ett fält? Till exempel cmdln i main(string[] cmdln){... cmdln.length ger svaret! Center for Research on Embedded Systems IDE-sektionen 1 / 1 2 / 1 Exempel: vad är det största talet? Kodfragment Vi måste titta på alla element i kommandoraden men vi vill inte ändra programmet för olika antal värden! public static void main(string[] cmdln){ int max; for(int i = 0 ; i< cmdln.length ; i++){? System.out.println(max); Exempel: vad är det största talet? Hur kan vi tänka? Om vi hela tiden ser mer och mer av fältet kan vi komma ihåg det största talet vi har sett hittills! Det vi vet (antecknar, kommer ihåg) är maxvärdet av den delen av fältet vi redan har sett! När vi ser ett element till måste vi vara beredda att uppdatera maxvärdet! När vi har sett hela fältet har vi maxvärdet av hela fältet! Vad är startvärdet? Här finns det olika alternativ! Om vi bara tillåter positiva tal, är alla större än 0, så vi kan börja med 0! Om vi tillåter godtyckliga heltal, är alla större än Integer.MIN VALUE. Vi kan även börja med första elementet! 3 / 1 4 / 1
Exempel: vad är det största talet? Att ommöblera ett fält Kodfragment public static void main(string[] cmdln){ int max = Integer.MIN_VALUE; int val; for(int i = 0 ; i<cmdln.length; i++){ val = Integer.parseInt(cmdLn[i]); if(max<val){ max = val; System.out.println(max); Byt plats mellan fältelement på ett slumpartat sätt. Kodfragment for (int i = 0; i < a.length; i++){ r = i + (int) (Math.random() * (a.length-i)); t = a[i]; a[i] = a[r]; a[r] = t; 5 / 1 6 / 1 Ett användbart bibliotek Input/Output Arrays Ett bibliotek med standardfunktioner som hanterar fält. Arrays är som Math var för reella tal. Ett utdrag ur Arrays Arrays.binarySearch(int[] a, int x) Arrays.binarySearch(double[] a, double x) Arrays.sort(int[] a) Arrays.sort(double[] a) 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. 7 / 1 8 / 1
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 >. 9 / 1 10 / 1 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 11 / 1 12 / 1
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. 13 / 1 14 / 1 Standard Input StdIn I Java finns ett bibliotek som heter Scanner. Vi börjar med bokens anpassning av denna som heter StdIn som är lättare att använda. Vi tar Javas om ett par veckor när vi talar om objekt och ickestatiska metoder. 1 Standard input tas, by default, från tangentbordet (som ekas i terminalen) 2 Från standard input kan man ge input till programmet medan den exekverar. 3 I unix (linux, mac, solaris) är det möjligt att dirigera om standard input så att man kan använda en fil. Kort beskrivning av StdIn Biblioteket stödjer en abstrakt ström av data som kan vara tom eller kan innehålla en följd av värden åtskilda med mellanslag. Varje värde kan vara en sträng eller ett värde av en av Javas primitiva typer. Programmet konsumerar värdena när det läser in dem. När programmet har läst ett värde kan det inte backa och läsa det igen. 15 / 1 16 / 1
StdIn Exempel I API (Application Programming Interface) boolean isempty() true om inga fler värden, false annars int readint() läs ett värde av typ int double readdouble() läs ett värde av typ double long readlong() läs ett värde av typ long boolean readboolean() läs ett värde av typ boolean char readchar() läs ett värde av typ char String readstring() läs ett värde av typ String String readline() läs resten av raden String readall() läs resten av texten Läs N från kommandoraden och sedan läs N heltalsvärden från standard input och skriv ut deras summa. Kod public class AddInts { public static void main(string[] cmdln) { int n = Integer.parseInt(cmdLn[0]); int sum = 0; for (int i = 0; i < n; i++){ sum = sum + StdIn.readInt(); System.out.println("Sum is " + sum); 17 / 1 18 / 1 Om dataströmmen standard in När man anropar java gör man tre saker 1 begär att programmet skall börja köra 2 anger värden för kommandoradsargumenten 3 börjar definiera dataströmmen standard in Den följd av tecken man anger i terminalen efter kommandoraden är standardinputströmmen. Man interagerar med programmet som väntar på att man skall ge strömmen av tal. 19 / 1 Exempel II Interagera med programanvändaren för att hon skall gissa vilket tal datorn har tänkt på. public static void main(string[] cmdln) { int n = 1 + (int) (Math.random() * 1000000); System.out.print("I m thinking of a number "); System.out.println("between 1 and 1,000,000"); int m = 0; while (m!= n) { System.out.print("What s your guess? "); m = StdIn.readInt(); if (m == n) System.out.println("You win!"); if (m < n) System.out.println("Too low "); if (m > n) System.out.println("Too high"); 20 / 1
Quiz Omdirigering Hur många gissningar behöver Du? Hur skulle Du skriva programmet för att gissa det tal som användaren har tänkt på? I unix kan man dirigera om standard input på samma sätt som man kunde dirigera om standard output. Medelvärdet av slumptal Vi har 2 program: en som genererar slumptal till standard output och en som räknar medelvärdet av värden inmatade via standard input. Vi kan kombinera dem genom stray.hh.se% java RandomNumbers 10000 > manynumbers stray.hh.se% java Average < manynumbers 21 / 1 22 / 1