import java.util.Scanner;

public class Histogram {

private static final int MIN_HEADS = 0; // minimum number of heads per set

/**

* main method:

* ask the user how many sets of coin flips and how many flips per set

* count occurances of heads in user specified number of sets of coin flips

* draw a horizontal and vertical histogram of the number of heads

*/

public static void main(String[] args) {

// set up to get user input

Scanner scan = new Scanner(System.in);

// ask user for the number of sets of coin flips

System.out.println("How many sets of coin flips do you want?");

int nSets = scan.nextInt();

// ask user for the number of coin flips per set

System.out.println("How many coin flips per set do you want?");

int nFlips = scan.nextInt();

// maximum number of heads that can occur is number of flips

int maxHeads = nFlips;

// calculate maximum length of histogram bars based on number of flips per set

// based on finding the number of combinations for half heads / half tails

// n!

// formula is ----------- with r = n/2

// r! (n-r)!

int maxLength = factorial (nFlips) /

(factorial (nFlips / 2) * factorial (nFlips - nFlips / 2));

// instantiate a coin object named myCoin

Coin myCoin = new Coin();

// step 1:

// declare an int array named "counts" to count coin flip occurences

// make its size one larger than maxHeads

int counts[] = new int [maxHeads + 1];

// step 2:

// initialize all of the values in the array to 0

for (int arrayindex = MIN_HEADS; arrayindex <= maxHeads; arrayindex ++)

counts[arrayindex] = 0;

// step 3:

// flip the coin for n sets with nFlips flips per set

// count the number of heads in each set (heads = 1, tails = 0)

// Using the value nSets (the number of sets of flips) and nFlips

// (the number of coin flips per set) from the user, execute a loop nSets times.

// Each time through this outer loop, your code starts with sum equal to zero and

// loops for nFlips times calling the flip method of myCoin, adding either one for a

// head or zero for a tail to the sum. After the inner loop completes, the outer loop

// uses the sum calculated by the inner loop as an array index, and increments the

// value of that element in the counts array.

for (int i = 0; i < nSets; i++) {

int sum = 0;

for (int j = 0; i < nFlips; j++)

{

sum = sum + (myCoin.flip()? 1: 0);

}

// step 4:

// print out the estimated probabilities of all heads and all tails

System.out.println ((float) counts [MIN_HEADS] / nSets);

// step 5:

// find largest number in counts array for scaling length of bars

int maxCount = 0;

for (int i = MIN_HEADS; i < maxHeads +1; i++)

{

if (maxCount <= counts

*)*

{

maxCount = counts

{

maxCount = counts

*;*

}

// step 6:

// scale data in counts array to maximum length of bars

// add 0.5 to round off instead of truncate in conversion to int

for (int i = MIN_HEADS; i < (maxHeads +1); i++)

counts}

// step 6:

// scale data in counts array to maximum length of bars

// add 0.5 to round off instead of truncate in conversion to int

for (int i = MIN_HEADS; i < (maxHeads +1); i++)

counts

*= ((double)(count*** maxLength / myCount) +.5);*

// step 7:

// draw horizontal bar graph (one line per heads value)

for (int i = MIN_HEADS; i <= maxHrads +2; i++)

System.out.print("Heads Counts " + i);

{

for (int j = 0; j < counts// step 7:

// draw horizontal bar graph (one line per heads value)

for (int i = MIN_HEADS; i <= maxHrads +2; i++)

System.out.print("Heads Counts " + i);

{

for (int j = 0; j < counts

*; j++)*

{

System.out.print ("x");

}

System.out.println (counts{

System.out.print ("x");

}

System.out.println (counts

*);*

}

// step8:

// draw vertical bar graph (one column per heads value)

for (int v = maxHeads; v >= 1; v--)

{

System.out.print ("Count " +v+ " ");

for (int u = 0; u < maxHeads +1; u++)

{

if (counts}

// step8:

// draw vertical bar graph (one column per heads value)

for (int v = maxHeads; v >= 1; v--)

{

System.out.print ("Count " +v+ " ");

for (int u = 0; u < maxHeads +1; u++)

{

if (counts

__>= v)__

System.out.print(" * ");

else

System.out.print (" ");

System.out.println ("");

}

}

}

// function to calculate factorial of n

public static int factorial(int n)

{

{

int factorial = 1;

// write the code for a loop to calculate factorial of n here

//**while (counter > 1)

//**factorial *= --counter; // Multiply the decremented number.

return factorial;

}

}

}System.out.print(" * ");

else

System.out.print (" ");

System.out.println ("");

}

}

}

// function to calculate factorial of n

public static int factorial(int n)

{

{

int factorial = 1;

// write the code for a loop to calculate factorial of n here

//**while (counter > 1)

//**factorial *= --counter; // Multiply the decremented number.

return factorial;

}

}

}