Chris Pollett>Old Classes>PIC 20, Winter 2000>Hw2>Hw2 Solutions

Winter 2000 PIC 20 HW2 Solutions Page


// Program Name: Pattern.java
//
// Purpose:  This program searches the command line arguments to
//	     to see if it contains the pattern 7 7 9
//	     It outputs has pattern if the command line arguments
//	     have this pattern. And outputs no has pattern otherwise.
//	     Pattern search is done by modeling a a simple
//	     three state finite automata.
//
// Known Bugs:  None.

public class Patterns
{
   public static void main( String args[])
     {
	int state =0; 	// state keeps track of current state
			// 0 is the start state

	int value; //contains current command line arg

	boolean accept=false; 	//flag to say if we accept/reject
				//input
        
        acc : {	//labelled break used if we accept input

	for(int i=0; i< args.length; i++)
	{
	  value = Integer.parseInt(args[i]);		
	
	  switch(state)
	  {
	     case 0 :
		if(value ==7 ) state++;
		break;
	     case 1 :
		if(value == 7) state++;
		else state--;
		break;
             case 2:
		if(value == 9) {accept =true; break acc;}
		if(value != 7) state = 0;
		break;
             default : //do nothing
                 
	  } //	end switch	
        } // end for

	} //end acc block

	if(accept) System.out.println("has pattern");
	else System.out.println("no has pattern");

     } //end main
} //end Patterns

// Program Name: Triangles.java
//
// Purpose: Draw Sierpinski's triangle to the nesting depth supplied by
//	    the user in a dialog box. Triangle drawing is implemented
//	    using a recursive method drawTri below.
//
// Known Bugs:  None.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Triangles extends JApplet implements ActionListener
{
	JButton toSee; //button to click to draw Triangle

	boolean showTriangle = false; // flag used by paint method
				      // to determine if should draw triangle
				      // triangle should only be draw if we have
				      // gotten a nesting depth from user

	int nest, x[] = {60,110,160} , y[] = {140,40,140}; 
				//x,y coordinates of largest triangle
				// nest controls the nesting depth to which we draw
				// triangle

	// Name: init()
	//
	// Purpose: Adds button to applet and sets up handler
	//          for button click events. Also sets applet background color to white. 	

	public void init()
	{

		Container c = getContentPane();
		c.setLayout( new FlowLayout() );
		c.setBackground(Color.white);

		toSee = new JButton( "Click for Triangles");
		toSee.addActionListener( this);
		c.add( toSee);
		
	}

	// Name: paint(Graphics g)
	//
	// Purpose: This method explicitly calls JApplet's version of paint
	//	    so as to redraw the button  on the applet. It then draws
	//	    the Sierpinski triangle to the nesting depth provided
	//	    if the showTriangle flag has been set. 
	//	

	public void paint( Graphics g)
	{
		super.paint(g);
		if (!showTriangle) return;	
		drawTri(x,y,g,nest);
	}

	// Name: actionPerformed(ActionEvent e)
	//
	// Purpose: This method should be called when when applet's button is clicked
	//	    It prompts the user for a nesting depth, sets the showTriangle 
	//	    to true so that paint will draw the triangle then calls repaint.

	public void actionPerformed( ActionEvent e)
	{
		showTriangle =true;
		nest = Integer.parseInt(JOptionPane.showInputDialog(
				"Enter integer nesting depth:"));
		repaint();
	}


	// Name: drawTri(int xPoints[], int yPoints[], Graphics g, int nest)
	//
	// Purpose: draws the Sierpinski Triangle with outermost triangle coordinates
	//	    given by xPoints[] and yPoints[]. The triangle is drawn to
	//	    the nesting depth provided in nest. The algorithm
	//	    works by drawing the outermost triangle using drawPolygon
	//	    it then computes the midpoint sof the sides of this triangle
	//	    and uses these midpoints to compute three subtriangles
	//	    which it recursively calls with one less nesting depth

	private void drawTri(int xPoints[],int yPoints[], Graphics g, int nest)
	{
		int xx[][], yy[][];

		xx = new int [3][3];
		yy = new int [3][3];

		int nNest = nest-1;
		
		if(nest <= 0) return;

		g.drawPolygon(xPoints,yPoints,3);

		for(int i=0; i<3; i++)
		{
			xx[i][i]=xPoints[i];
			yy[i][i]=yPoints[i];
		}

		xx[0][1]=xx[1][0]=(xPoints[0]+xPoints[1])/2;
		yy[0][1]=yy[1][0]=(yPoints[0]+yPoints[1])/2;

		xx[0][2]=xx[2][0]=(xPoints[0]+xPoints[2])/2;
		yy[0][2]=yy[2][0]=(yPoints[0]+yPoints[2])/2;

		xx[1][2]=xx[2][1]=(xPoints[1]+xPoints[2])/2;
		yy[1][2]=yy[2][1]=(yPoints[1]+yPoints[2])/2;

		for(int i=0; i<3; i++)
			{ drawTri(xx[i],yy[i],g,nNest);}
		
	}
}