1 / 37

CS 112 Introduction to Programming

CS 112 Introduction to Programming. Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email: yry@cs.yale.edu. Admin. Issues on PS3 NumberCoolness: printSpaces(n): prints n – 1 spaces, not n

clandwehr
Download Presentation

CS 112 Introduction to Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS 112 Introduction to Programming Graphics; Animation Yang (Richard) Yang Computer Science Department Yale University 308A Watson, Phone: 432-6400 Email: yry@cs.yale.edu

  2. Admin • Issues on PS3 • NumberCoolness: • printSpaces(n): prints n – 1 spaces, not n • You can either change the method to print n or adapt your main • a walkthrough to be held by Fitz this evening from 8 to 9 pm • please suggest topics (e.g., nested loops, method parameters) that you want us to cover more

  3. Recap • Nested loops • If a loop is inside another loop, we say the two form a nested loop • The #loop times of the inner loop can depend on the outer loop variable • Method with parameters • Specify parameters to control the behavior of a method • Redundancy removal/abstraction through generalization

  4. Example: Nested Loop int N = 5; for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { System.out.print("."); } System.out.print(line); for (int j = 1; j <= (line - 1); j++) { System.out.print("."); } System.out.println(); } ....1 ...2. ..3.. .4... 5....

  5. Example: Rewrite public static void dots(int n) { for (inti = 1; i <= n; i++) { System.out.print("."); } } public static void main(String[] args) { int N = 5; for (int line = 1; line <= N; line++) { dots( -1 * line + N ); System.out.print(line); dots( line – 1 ); System.out.println(); } // end of outer for loop }

  6. Out-Class Read: Another Way to Motivate Method With Parameters

  7. Example: Reuse Matrix • Print two copies of inverse diagonal matrix ..1 .2. 3.. ....1 ...2. ..3.. .4... 5.... int N = 5; for (int line = 1; line <= N; line++) { // initial dots for (int j = 1; j <= (-1 * line + N); j++) { System.out.print("."); } // the number System.out.print(line); // the second set of dots for (int j = 1; j <= (line - 1); j++) { System.out.print("."); } System.out.println(); }

  8. Solution 1 • This code is redundant. public class DrawMatrix1 { public static void main(String[] args) { drawMatrix3(); drawMatrix5(); } public static void drawMatrix3() { int N = 3; for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } } // end of drawMatrix3 public static void drawMatrix5() { int N = 5; for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } } // end of drawMatrix5 }

  9. Remove Redundancy public class DrawMatrix2 { } ERROR:N is out of scope public static void main(String[] args) { drawMatrix(); // should print 3 drawMatrix(); // should print 5 } // end of main int N = 3; N = 5; public static void drawMatrix() { for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } // end of for line } // end of drawMatrix

  10. Solution 2 public class DrawMatrix2 { } static int N; // introduce a class scope variable public static void main(String[] args) { drawMatrix(); // should print 3 drawMatrix(); // should print 5 } // end of main N = 3; N = 5; public static void drawMatrix() { for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } // end of for line } // end of drawMatrix

  11. Problem of Class Variable Indirection public class DrawMatrix2 { } static int N; // introduce a class scope variable public static void main(String[] args) { drawMatrix(); drawMatrix(); } // end of main Not self clear;Implicit, depends on context; N = 3; N = 5; public static void drawMatrix() { for (int line = 1; line <= N; line++) { for (int j = 1; j <= (-1 * line + N); j++) { // initial dots System.out.print("."); } System.out.print(line); // the number for (int j = 1; j <= (line - 1); j++) { // the second set of dots System.out.print("."); } System.out.println(); } // end of for line } // end of drawMatrix

  12. Solution 3: Parameterization • Specify a parameter to control the behavior of a method • Methods with parameters solve an entire class of similar problems • Redundancy removal/abstraction through generalization • The more general a building block, the easier to reuse it • We will learn more techniques on generalization/abstraction

  13. Method Design Heuristics • The main method should read as a concise summary of the overall set of tasks performed by the program. • Each method should have a clear set of responsibilities. • No method should do too large a share of the overall task. • Use method with parameters to remove redundancy with generalization, but do not over generalize • Data should be declared/used at the lowest level possible (localized data).

  14. Example: Draw Boxes • Consider the task of printing the following box figures using “*” and ““: ***** * * ***** ********** * * ********** ***** * * * * ***** • What method(s) and parameter(s)?

  15. Box Figures Param. Chaining ***** * * ***** ********** * * ********** ***** * * * * ***** public static void main(String[] args) { drawBox(5, 3); drawBox(10, 3); drawBox(5, 4); } // end of main public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println(); // step 2. loop a total of height - 2 times // for each row: // print * // print width -2 " " for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); } // step 3. print width of "*" repeat("*", width); System.out.println(); } // end of drawBox public static void repeat(String s, int times) { for (int i = 1; i <= times; i ++) { System.out.print( s ); } } // end of repeat

  16. Method Correctness Analysis/Testing • Q: How do you analyze/test the correctness of a method? • Basic idea • A method is correct if for each input (parameters), the output is what you expect for the input • An issue: • Some input may not make sense. • Two approaches • Detect such bad input and report • Assume that the input is in the valid range: called precondition of the method

  17. Method Correctness Analysis/Testing ***** * * ***** ********** * * ********** ***** * * * * ***** public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println(); // step 2. loop a total of height - 2 times // for each row: // print * // print width -2 " " for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); } // step 3. print width of "*" repeat("*", width); System.out.println(); } // end of drawBox public static void repeat(String s, int times) { for (int i = 1; i <= times; i ++) { System.out.print( s ); } } // end of repeat

  18. Recap: Graphics using StdDraw • To access a static method or class variable defined in another class, use <class-name>.<method-name>(…), for example, • StdDraw.setCanvasSize(100, 100); • Color.BLACK; • Method designers may design different methods for the same function StdDraw: rectangle(double x, double y, double halfWidth, double halfHeight); DrawingPanel (Java): rect (int x0, int y0, int width, int height);

  19. Example: Parameterized Drawing Center:(x0 + 100 /2, y0 + 50/2) Size: 50, 25 • Write method drawCar: 100 30 50 20 Center:(x0 + 100-30/2, y0+50/2) Size: 15, 10 15 (x0, y0) r=10 Center:(x0 + 15 + 10, y0) Radius: 10 Center:(x0 + 100-15-10, y0) Radius: 10

  20. drawCar Criticism of the method? publicstaticvoid drawCar(int x0, int y0) { StdDraw.setPenColor(Color.BLACK); StdDraw.filledRectangle(x0 + 100/2, y0 + 50/2, 100/2, 50/2); // draw wheels StdDraw.setPenColor(Color.RED); StdDraw.filledCircle(x0 + 15 + 10, y0, 10); StdDraw.filledCircle(x0 + 100 - 15 - 10, y0, 10); // draw window StdDraw.setPenColor(Color.CYAN); StdDraw.filledRectangle(x0 + 100 - 30 / 2, y0 + 25, 15, 10); } See Car.java for the final version.

  21. Example: Drawing using Loops • You may use loop (nested loop) to producemore “complex” patterns: public static void main(String[] args) { init(); // set x, y scale to 512 int x0 = 56, y0 = 56; int size = 50; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { StdDraw.square(x0 + i * size + size / 2, y0 + j * size + size / 2, size/2); } } // end of main What is the display?

  22. Example: Drawing using Loops

  23. Example: Book Cover • White 500x600 drawing panel • Three components at • (20, 415), (165, 330), (220, 85) with sizes 150, 120, and 240 • Each component • Yale blue background • white “CS112" text left @ 1/2 horizontal, 4/5 vertical • 10 brown (red=192, green=128, blue=64) “bricks” • 1 pixel between two adjacent bricks BookCover.java

  24. Summary of Progress So Far • Primitive data types, expressions and variables • for loops • Methods with parameters

  25. Motivating Example: Car Launch • Two cars launching from different heights, which lands further? • Car 1: initial height: 600m, horizontal speed: 30 m/sec, vertical speed: 20 m/sec • Car 2: initial height: 500m, horizontal speed: 40 m/sec, vertical speed: 30 m/sec • Write a program to display their trajectories in 10 sec

  26. Background: Physics • In physics, for each dimension (x or y), given initial velocity v0 in m/s, acceleration a in m/s2, and elapsed time t in s • the speed of the moving body at time t: • V = v0 + a t • The displacement of the moving body at time t: • Displacement = v0 t + ½ at 2 • The position of the moving body at time t: • Pos = Initial position + displacement

  27. Position • P0 + v0 t + ½ a t2 • Horizontal (x): • vx0 * t • Vertical (y): • g ≅ 9.81 m/s2, downward • y0 + vy0 t - ½ g t 2

  28. Example • See CarLaunchv1.java

  29. Backup Slides

  30. Exercise: Generalization • Consider the task of printing the following lines/boxes: ************* //13 ******* // 7 *********************************** // 35 ********** * * ********** ***** * * * * *****

  31. ************************* ********** * * ********** Design I • Provide a new method drawLine() by calling repeat() public static void drawLine(int width) { repeat(“*”, width); } // end of drawLine

  32. ************************* ********** * * ********** Design II • Consider a line as a special box with height • draw first line of stars • if (height >= 2) // a real box • draw rest public static void drawBox(int width, int height)

  33. The if statement Executes a block of statements only if a test is true if (test) { statement; ... statement; } • Example: if (gpa >= 2.0) { System.out.println("Application accepted."); }

  34. The if-else Statement • An else clause can be added to an if statement to make it an if-else statement: if ( test ) { statement1;} else { statement2; } • If the condition is true, statement1 is executed; if the condition is false, statement2 is executed • One or the other will be executed, but not both

  35. The if/else Statement • Example: if (gpa >= 2.0) { System.out.println("Welcome to Mars University!"); } else { System.out.println("Application denied."); }

  36. ************************* ********** * * ********** Design II • Consider a line as a special box // super elastic drawBox public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println(); for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); } if (height >= 2) { // a real box repeat("*", width); System.out.println(); } // end of if } // end of drawBox public static void main(String[] args) { drawBox(13, -1); drawBox(10, 3); } // end of main

  37. ************************* ********** * * ********** Comparison public static void drawLine(int width) { repeat(“*”, width); } // end of drawLine // super elastic drawBox public static void drawBox(int width, int height) { // step 1. print width of "*" repeat("*", width); System.out.println(); for (inti = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); } if (height >= 2) { // a real box repeat("*", width); System.out.println(); } // end of if } // end of drawBox public static void drawBox(int width, int height) { repeat("*", width); System.out.println(); for (int i = 1; i <= height - 2; i++) { System.out.print("*"); repeat(" ", width - 2); System.out.println("*"); } } // end of drawBox

More Related