Problem:
Design and implement an application that creates a histogram that allows you to visually inspect the frequency distribution of a set of values. The program should read in an arbitrary number of integers that are in the range 1 to 100 inclusive; then produce a chart similar to the one below that indicates how many input values fell in the range 1 to 10, 11 to 20, and so on. Print one asterisk for each value entered.
Input:
2,69,1,43,99...
Output:
1 - 10 | *****
11 - 20 | **
21 - 30 | *******************
31 - 40 |
41 - 50 | ***
51 - 60 | ********
61 - 70 | **
71 - 80 | *****
81 - 90 | *******
91 - 100 | *********
11 - 20 | **
21 - 30 | *******************
31 - 40 |
41 - 50 | ***
51 - 60 | ********
61 - 70 | **
71 - 80 | *****
81 - 90 | *******
91 - 100 | *********
Solution:
import java.util.Scanner; public class Histogram { public static void main (String[] args) { Scanner scan = new Scanner (System.in); //There are in total (100-1+2) numbers between 1 and 100 //including 1 and 100. //Let's make an array of 101 integers to keep track of how //times each number is typed (maybe never, once, twice, or more) int[] nums = new int[101]; //Time to start reading in numbers System.out.println("Enter numbers between 1 and 100[-1 to quit]: "); int num = scan.nextInt(); //We will be using this variable to help organize/count the number of //times numbers with a certain range (e.g., 1-10, 11-20) appeared //Hint: this variable represent the right-side number in 1-10, 11-20, etc. //which always has 0 in the one's digit place and let's just make it equal to //zero now to make coding easier later; you'll see why int base10 = 0; //Here we will make sure that each entered is accounted for in our array while (num != -1) { nums[num]++; num = scan.nextInt(); } //Now it's time to loop over each range (e.g., 11-20) to check //how many elements they have, e.g., how many 11's, 12's, 13's, etc. //Hint: count represents the left-side number in 1-10, 11-20, //which always has 1 in the one's digit place so we just need //to increment the count by 10 each time till we reach 100 for (int count = 1; count <=100;count+=10) { //Let's first do the easy thing: print out the range limits //Notice how we are increasing base10 by 10 during each loop //since the range right-limit always increases by 10 //such as from 10 to 20 to 30 //If we initialized base10 to 10 outside the loop then //we would've needed an if statement here just for count==1 //to make sure we don't get 1-20 System.out.print(count + " - " + (base10+=10) + " | " ); //Time to loop over each number between our left-limit //right limit, such as between 1 and 10, 11 and 20,etc. //by using a new variable that will represent each number for (int index = count ; index<=base10 ; index++) { //We have to check if the numbers between our limits //appeared at least once in our array/scan, //make sure that we count each time a number appears, //and visually represent each number with a * while(nums[index] > 0) { System.out.print("*"); nums[index]--; } } System.out.println(); } } }
Nice job !
ReplyDelete