15.02.2015 Views

handout

handout

handout

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Programmering<br />

hh.se/DB2004<br />

Föreläsning 5:<br />

Fält samt Input/Output<br />

Verónica Gaspes<br />

www2.hh.se/staff/vero<br />

www2.hh.se/staff/vero/programmering<br />

Lite mer om Javas stöd för fält<br />

Hur många element har ett fält<br />

Till exempel cmdLn i<br />

main(String[] cmdLn){...}<br />

cmdLn.length<br />

ger svaret!<br />

Center for Research on Embedded Systems<br />

IDE-sektionen<br />

1 / 1<br />

2 / 1<br />

Exempel: vad är det största talet<br />

Kodfragment<br />

Vi måste titta på alla element i kommandoraden men vi vill inte<br />

ändra programmet för olika antal värden!<br />

public static void main(String[] cmdLn){<br />

int max;<br />

for(int i = 0 ; i< cmdLn.length ; i++){<br />

<br />

}<br />

System.out.println(max);<br />

}<br />

Exempel: vad är det största talet<br />

Hur kan vi tänka<br />

Om vi hela tiden ser mer och mer av fältet kan vi komma ihåg det<br />

största talet vi har sett hittills!<br />

Det vi vet (antecknar, kommer ihåg) är maxvärdet av den<br />

delen av fältet vi redan har sett!<br />

När vi ser ett element till måste vi vara beredda att uppdatera<br />

maxvärdet!<br />

När vi har sett hela fältet har vi maxvärdet av hela fältet!<br />

Vad är startvärdet Här finns det olika alternativ!<br />

Om vi bara tillåter positiva tal, är alla större än 0, så vi kan<br />

börja med 0!<br />

Om vi tillåter godtyckliga heltal, är alla större än<br />

Integer.MIN VALUE.<br />

Vi kan även börja med första elementet!<br />

3 / 1<br />

4 / 1


Exempel: vad är det största talet<br />

Att ommöblera ett fält<br />

Kodfragment<br />

public static void main(String[] cmdLn){<br />

int max = Integer.MIN_VALUE;<br />

int val;<br />

for(int i = 0 ; i


Kommandoraden<br />

Standard output<br />

Sammanfattning<br />

Alla klasser har en metod main() som tar ett fält av strängar<br />

som argument.<br />

Fältet består av de kommandoradsargument vi skriver. Dessa<br />

förmedlas till Java av operativsystemet.<br />

Det är en konvention att både OS och Java hanterar dessa<br />

argument som strängar.<br />

Om vi vill betrakta ett argument som ett tal måste vi använda<br />

metoder som Integer.parseInt() för att<br />

konvertera argumentet.<br />

Sammanfattning<br />

För att skriva ut värden från Java-program använder vi<br />

System.out.println() och System.out.print().<br />

Java skickar dessa värden till en ström av tecken känd som<br />

standard output.<br />

Operativsystemet brukar koppla standard output till terminalen.<br />

I Unix kan vi dirigera om standard output till en fil med >.<br />

9 / 1<br />

10 / 1<br />

Ett exempel<br />

Flera möjligheter<br />

Experiment med tärningkast<br />

public class Dice{<br />

public static void main(String[] cmdLn){<br />

int sampleSize = Integer.parseInt(cmdLn[0]);<br />

int dice;<br />

for(int i = 0;i dice10000<br />

11 / 1<br />

12 / 1


Flera möjligheter<br />

Flera möjligheter<br />

Standard audio kan användas för<br />

att spela upp och manipulera<br />

ljudfiler. Vi kommer att kunna<br />

spela .wav-filer, kunna skriva<br />

program som hanterar fält av<br />

double samt läsa och skriva dem i<br />

.wav-filer.<br />

Standard draw kan användas för<br />

att presentera utdata i grafisk<br />

form och även för enkla<br />

animeringar.<br />

13 / 1<br />

14 / 1<br />

Standard Input<br />

StdIn<br />

I Java finns ett bibliotek som heter Scanner. Vi börjar med<br />

bokens anpassning av denna som heter StdIn som är lättare att<br />

använda. Vi tar Javas om ett par veckor när vi talar om objekt och<br />

ickestatiska metoder.<br />

1 Standard input tas, by default, från tangentbordet (som ekas i<br />

terminalen)<br />

2 Från standard input kan man ge input till programmet medan<br />

den exekverar.<br />

3 I unix (linux, mac, solaris) är det möjligt att dirigera om<br />

standard input så att man kan använda en fil.<br />

Kort beskrivning av StdIn<br />

Biblioteket stödjer en abstrakt ström av data som kan vara tom<br />

eller kan innehålla en följd av värden åtskilda med mellanslag.<br />

Varje värde kan vara en sträng eller ett värde av en av Javas<br />

primitiva typer.<br />

Programmet konsumerar värdena när det läser in dem. När<br />

programmet har läst ett värde kan det inte backa och läsa det igen.<br />

15 / 1<br />

16 / 1


StdIn<br />

Exempel I<br />

API (Application Programming Interface)<br />

boolean isEmpty() true om inga fler värden,<br />

false annars<br />

int readInt() läs ett värde av typ int<br />

double readDouble() läs ett värde av typ double<br />

long readLong() läs ett värde av typ long<br />

boolean readBoolean() läs ett värde av typ boolean<br />

char readChar() läs ett värde av typ char<br />

String readString() läs ett värde av typ String<br />

String readLine() läs resten av raden<br />

String readAll() läs resten av texten<br />

Läs N från kommandoraden och sedan läs N heltalsvärden från<br />

standard input och skriv ut deras summa.<br />

Kod<br />

public class AddInts {<br />

public static void main(String[] cmdLn) {<br />

int n = Integer.parseInt(cmdLn[0]);<br />

int sum = 0;<br />

for (int i = 0; i < n; i++){<br />

sum = sum + StdIn.readInt();<br />

}<br />

System.out.println("Sum is " + sum);<br />

}<br />

}<br />

17 / 1<br />

18 / 1<br />

Om dataströmmen standard in<br />

När man anropar java gör man tre saker<br />

1 begär att programmet skall börja köra<br />

2 anger värden för kommandoradsargumenten<br />

3 börjar definiera dataströmmen standard in<br />

Den följd av tecken man anger i terminalen efter kommandoraden<br />

är standardinputströmmen. Man interagerar med programmet som<br />

väntar på att man skall ge strömmen av tal.<br />

19 / 1<br />

Exempel II<br />

Interagera med programanvändaren för att hon skall gissa vilket tal<br />

datorn har tänkt på.<br />

public static void main(String[] cmdLn) {<br />

int n = 1 + (int) (Math.random() * 1000000);<br />

System.out.print("I’m thinking of a number ");<br />

System.out.println("between 1 and 1,000,000");<br />

int m = 0;<br />

while (m != n) {<br />

System.out.print("What’s your guess ");<br />

m = StdIn.readInt();<br />

if (m == n) System.out.println("You win!");<br />

if (m < n) System.out.println("Too low ");<br />

if (m > n) System.out.println("Too high");<br />

}<br />

}<br />

20 / 1


Quiz<br />

Omdirigering<br />

Hur många gissningar behöver Du<br />

Hur skulle Du skriva programmet för att gissa det tal som<br />

användaren har tänkt på<br />

I unix kan man dirigera om standard input på samma sätt som<br />

man kunde dirigera om standard output.<br />

Medelvärdet av slumptal<br />

Vi har 2 program: en som genererar slumptal till standard output<br />

och en som räknar medelvärdet av värden inmatade via standard<br />

input. Vi kan kombinera dem genom<br />

stray.hh.se% java RandomNumbers 10000 > manyNumbers<br />

stray.hh.se% java Average < manyNumbers<br />

21 / 1<br />

22 / 1

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!