Programmering hh.se/db2004 Föreläsning 6: Input/Output Verónica Gaspes www2.hh.se/staff/vero www2.hh.se/staff/vero/programmering Omdirigering 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. Center for Research on Embedded Systems IDE-sektionen 1 / 1 2 / 1 Medelvärdet av slumptal public static void main(string[] cmdln){ int n = Integer.parseInt(cmdLn[0]); for(int i = 0; i<n; i++){ System.out.println(Math.random()); public static void main(string[] cmdln) { double sum = 0; int count = 0; while(!stdin.isempty()){ sum = sum + StdIn.readDouble(); count = count + 1; System.out.println(sum/count); 3 / 1 Omdirigering > och < Vi kan kombinera dem genom stray.hh.se% java RandomNumbers 10000 > manynumbers stray.hh.se% java Average < manynumbers Pipe Man behöver inte filen: stray.hh.se% java RandomNumbers 10000 java Average Program i olika språk Man har tillgång till alla program som använder standard input och standard output! 4 / 1
Grafisk output Standard Draw Vi skall titta på ett bibliotek för att få program att producera grafisk output. StdDraw För att ha tillgång till biblioteket måste man ladda ner filen StdDraw till arbetskatalogen. Att använda StdDraw är ganska enkelt. Man skall föreställa sig en abstrakt ritanordning som kan rita linjer och punkter på en 2D duk. Anordningen kan svara på kommandon som våra program utfärdar genom att anropa metoder i StdDraw. Till exempel StdDraw.point(x,y); StdDraw.line(x0,y0,x1,y1); 5 / 1 6 / 1 APIn för StdDraw - del 1 APIn för StdDraw - del 2 7 / 1 8 / 1
50 linjer Kommandon till StdDraw Många linjer public class Lines{ public static void main(string[] cmdln){ int n = Integer.parseInt(cmdLn[0]); StdDraw.setXscale(0,n); StdDraw.setYscale(0,n); for(int i = 1; i<=n; i++){ StdDraw.line(i,0,0,n-i); Observera Man bestämmer själv skalan för X och Y. I programmet är bägge 0... N. 9 / 1 10 / 1 Visualisering Visualisering Man kan använda grafik för att visualisera stora mängder data. Koordinater för städer Man kan samla information om koordinater, till exempel: 1097038.8890 245552.7780 1103961.1110 247133.3330 1104677.7780 247205.5560 1108586.1110 249238.8890 1109713.8890 250111.1110 1110072.2230 254475.0000 1110088.8890 254683.3330 1110572.2230 254950.0000... Man kan använda koordinaterna för att rita punkter. För att bestämma X- och Y-skalan måste man ta reda på de yttersta koordinaterna. Koordinater för städer Vi kan skriva ett program som läser koordinater från standard input (som vi sedan omdirigerar att komma från en fil!). Vi kommer att använda filer där man redan har tagit reda på de yttersta punkterna och dessa finns som de första 4 talen i filen. 11 / 1 12 / 1
Visualisering Kartan Kartan public static void main(string[] cmdln){ double x0 = StdIn.readDouble(); double y0 = StdIn.readDouble(); double x1 = StdIn.readDouble(); double y1 = StdIn.readDouble(); double x, y; StdDraw.setXscale(x0, x1); StdDraw.setYscale(y0, y1); while (!StdIn.isEmpty()) { x = StdIn.readDouble(); y = StdIn.readDouble(); StdDraw.point(x, y); 13 / 1 14 / 1 Leka med slump Lek med slumpen, efter några drag Spela på en liksidig triangel med hörn R, G och B. 1 Börja vid R 2 Gör N gånger: 1 Välj ett slumpmässigt hörn 2 Förflytta halvvägs från nuvarande punkt till hörnan 3 Rita en punkt i hörnans färg. 15 / 1 16 / 1
Lek med slumpen Chaos 100? public class Chaos { public static void main(string[] cmdln) { int T = Integer.parseInt(cmdLn[0]); double[] cx = 0.000, 1.000, 0.500 ; double[] cy = 0.000, 0.000, 0.866 ; double x = 0.0, y = 0.0; int r; for (int t = 0; t < T; t++) { r = (int) (Math.random() * 3); x = (x + cx[r]) / 2.0; y = (y + cy[r]) / 2.0; StdDraw.point(x, y); 17 / 1 18 / 1 Pennan Pennan Färger Man kan bestämma färg med StdDraw.setPenColor. Här är några exempel: StdDraw.setPenColor(StdDraw.RED); StdDraw.setPenColor(StdDraw.GREEN); StdDraw.setPenColor(StdDraw.BLUE); Följande färger finns: BLACK, BLUE, CYAN, DARK GRAY, GRAY, GREEN, LIGHT GRAY, MAGENTA, ORANGE, PINK, RED, WHITE, YELLOW. Storlek Man kan bestäma hur tjockt pennan skriver med StdDraw.setPenRadius. Här är några exempel: StdDraw.setPenRadius(0.5); StdDraw.setPenRadius(0.002); 0.002 är default. 19 / 1 20 / 1
Chaos 100? Chaos 10000? 21 / 1 22 / 1 Animeringar Animerings loop Rensa skärmen. Flytta föremålet. Rita föremålet. Visa och pausa ett litet tag. En Studsboll Bollen finns på (rx,ry) och har hastighet (vx,vy). Om man uptäcker att den krockar mot en vägg skall bollen ändra hastigheten. 23 / 1