CS 100: Programming Assignment P2
Solution
// P2A: Examine the Stirling's Approximation of n! import java.io.*; public class P2A { public static void main(String args[]) { int n; long nfact; // n factorial double s; // Stirling's approximation to n!. double absErr; // The absolute error in s. double relErr; // The relative error in s. // initialize Text object in to read from standard input. TokenReader in = new TokenReader(System.in); // Read and write some numbers and strings System.out.println(" n n! Absolute Error Relative Error"); System.out.println("---------------------------------------------------------------"); nfact = 1; for (n=1;n<=20;n=n+1){ nfact = n*nfact; // The new n factorial is n times the old n factorial. s = Math.sqrt(2*Math.PI/n)*Math.pow(n/Math.exp(1),n); absErr = Math.abs(s-nfact); relErr = absErr/nfact; Format.print(System.out," %2d",n); Format.print(System.out," %20d",nfact); Format.print(System.out," %10.3e",absErr); Format.println(System.out," %10.3e",relErr); } // Wait for user to enter input to ensure console window remains visible in.waitUntilEnter(); } }
// P2B: Diamonds and Squares import java.io.*; import java.awt.*; // Class CUCSDrawing: a simple graphics window. public class CUCSDrawing extends Frame { final int xc = 500; final int yc = 300; // (xc,yc) is the center final int r0 = 250; // The radius of outermost square. final int rMin = 5; // The radius threshold. public void paint(Graphics g) { int r; // The current radius. int k=1; // Index of the current square/diamond r = r0; while (r>=rMin) { if (k%2==0) { // Draw a diamond. g.drawLine(xc+r,yc,xc,yc-r); g.drawLine(xc,yc-r,xc-r,yc); g.drawLine(xc-r,yc,xc,yc+r); g.drawLine(xc,yc+r,xc+r,yc); r = r/2; } else { // Draw a square. g.drawRect(xc-r,yc-r,2*r,2*r); } k=k+1; } } } public class P2B { public static void main(String args[]) { CUCSDrawing d = new CUCSDrawing(); d.resize(1000,800); d.move(0,75); d.setTitle("Diamonds and Squares"); d.show(); d.toFront(); } }
// P2C: Hubcaps import java.io.*; import java.awt.*; // Class CUCSDrawing: a simple graphics window. public class CUCSDrawing extends Frame { final int xc = 500; final int yc = 300; // (xc,yc) is the center of the hubcap final int r1 = 150; // The radius of the inner circle. final int r2 = 250; // The radius of the outer circle. final int n = 60; // Half the number of spokes. final int p = 2; // The spoke shift factor. public void paint(Graphics g) { double theta = 2*Math.PI/n; // The "step angle" in radians. int h,v; // (h,v) is a point on the outer circle. int hPlus,vPlus; // (hPlus,vPlus) is a point on the inner circle. int hMinus,vMinus; // (hMinus,vMinus) is another point on the inner circle. int k; g.drawOval(xc-r2,yc-r2,2*r2,2*r2); // Draw the outer circle. g.drawOval(xc-r1,yc-r1,2*r1,2*r1); // Draw the inner circle for (k=1;k<=n;k=k+1) { // (h,v) = (xc+r1*cos(k*theta),yc-r1*sin(k*theta)) h = (int)(xc + r2*Math.cos(k*theta)); v = (int)(yc + r2*Math.sin(k*theta)); // (hPlus,vPlus) = (xc+r1*cos((k+p)*theta),yc-r1*sin((k+p)*theta)) hPlus = (int)(xc + r1*Math.cos((k+p)*theta)); vPlus = (int)(yc + r1*Math.sin((k+p)*theta)); // (hMinus,vMinus) = (xc+r1*cos((k-p)*theta),yc-r1*sin((k-p)*theta)) hMinus = (int)(xc + r1*Math.cos((k-p)*theta)); vMinus = (int)(yc + r1*Math.sin((k-p)*theta)); // Connect (h,v) and (hPlus,vPlus) g.drawLine(h,v,hPlus,vPlus); // Connect (h,v) and (hMinus,vMinus) g.drawLine(h,v,hMinus,vMinus); } } } public class P2C { public static void main(String args[]) { CUCSDrawing d = new CUCSDrawing(); d.resize(1000,800); d.move(0,75); d.setTitle("Hubcaps"); d.show(); d.toFront(); } }