Для этой Java-программы в виде гистограммы звездочки, есть ли более простой способ сделать это? - PullRequest
2 голосов
/ 20 мая 2019

В этой java-программе нет особых проблем, единственное, мне интересно, есть ли более простой способ сделать это, используя только циклы for и ничего больше, так как я только начал изучать для петли в яве. Под более простым способом я подразумеваю более эффективный способ сделать это, используя меньше кода.

import java.util.Scanner;
public class BarChart 
{
    public static void main(String[] args)
    {
        //#Declaring variables
        int sales1, sales2, sales3, sales4, sales5;

        //#Creating scanner object
        Scanner keyboard = new Scanner(System.in);  

        //#Asking user for input
        System.out.print("Enter today's sales for store 1: ");
        sales1 = keyboard.nextInt();

        System.out.print("Enter today's sales for store 2: ");
        sales2 = keyboard.nextInt();

        System.out.print("Enter today's sales for store 3: ");
        sales3 = keyboard.nextInt();

        System.out.print("Enter today's sales for store 4: ");
        sales4 = keyboard.nextInt();

        System.out.print("Enter today's sales for store 5: ");
        sales5 = keyboard.nextInt();

        //#Displaying the sales bar chart
        System.out.println("\nSALES BAR CHART");

        System.out.print("\nStore 1: ");        
        for (int num = 0; num < sales1; num += 100)
        {
            System.out.print("*");
        }

        System.out.print("\nStore 2: ");
        for (int num = 0; num < sales2; num += 100)
        {
            System.out.print("*");
        }

        System.out.print("\nStore 3: ");
        for (int num = 0; num < sales3; num += 100)
        {
            System.out.print("*");
        }

        System.out.print("\nStore 4: ");
        for (int num = 0; num < sales4; num += 100)
        {
            System.out.print("*");
        }

        System.out.print("\nStore 5: ");
        for (int num = 0; num < sales5; num += 100)
        {
            System.out.print("*");
        }
    }
}

Как должен выглядеть вывод:

> What the Output should look like: 
> Enter today's sales for store 1: 1000 
> Enter today's sales for store 2: 1290 
> Enter today's sales for store 3: 1850 
> Enter today's sales for store 4: 800 
> Enter today's sales for store 5: 1900

> SALES BAR CHART 
> Store 1: ********** 
> Store 2: ************* 
> Store 3: ******************* 
> Store 4: ******** 
> Store 5: *******************

Ответы [ 4 ]

1 голос
/ 20 мая 2019

Каждый раз, когда вы пишете одну и ту же строку кода более трех раз, вы должны рассмотреть возможность использования цикла.Кроме того, всякий раз, когда вы обнаруживаете, что используете имена переменных, такие как foo1, foo2 и т. Д., Вы должны рассмотреть вопрос о включении их в структуру данных.Если вы используете простой Array и цикл for, ваша программа сводится к:

int[] stores = new int[5];
Scanner in = new Scanner(System.in);
for(int i = 0; i < stores.length; i++) {
    System.out.print("Enter today's sales for store " + (1+i) + ": ");
    stores[i] = in.nextInt();
}
for(int i = 0; i < stores.length; i++) {
    System.out.print("Store " + (i+1) + ": ");
    for(int j =0; j < stores[i]; j++) {
        System.out.print("*");
    }
    System.out.println();
}

Пример выполнения:

Enter today's sales for store 1: 3
Enter today's sales for store 2: 5
Enter today's sales for store 3: 7
Enter today's sales for store 4: 2
Enter today's sales for store 5: 8
Store 1: ***
Store 2: *****
Store 3: *******
Store 4: **
Store 5: ********
1 голос
/ 20 мая 2019

Конечно, вы можете перебрать большинство повторяющихся задач:

public static void main(String[] args){
    int[] sales = new int[5];
    Scanner keyboard = new Scanner(System.in); 
    //Ask the user for input five times, stored the input in the sales array
    for (int i = 0; i < 5; i++){
        System.out.print("Enter today's sales for store " + (i+1) ": ");
        sales[i] = keyboard.nextInt();
    }
    //Print the sales
    System.out.println("Sales bar chart");
    for (int i = 0; i < 5; i++){
        printStore(i, sales[i]);
    }
}

//helper function that prints a resulting store line
private void printStore(int storeNumber, int sales){
    System.out.print("Store " + (i + 1) + ": "):
    for (int i = 0; i < sales / 100; i++){
        system.out.print("*");
    }
    System.out.println();
}

Обратите внимание, что хотя это и меньше строк кода, но оно не более эффективно, чем ваше решение.

0 голосов
/ 20 мая 2019

Если вы хотите попробовать лямбду (Java 8)

    public static void main(String[] args) {
        // Declaring steps
        int N = 5;
        // Declaring increment
        int INCREMENT = 100;
        // Creating scanner object
        Scanner keyboard = new Scanner(System.in);

        // Creating a loop from 1 to N (including the limits)
        List<Integer> variables = IntStream.rangeClosed(1, N)
                // Asking user for input
                .peek(index -> System.out.printf("Enter today's sales for store %d: ", index))
                // Read the user answer
                .mapToObj(dummy -> keyboard.nextInt())
                // Collect all the answers in a list
                .collect(Collectors.toList());

        // Displaying the sales bar chart
        System.out.println("\nSALES BAR CHART\n");

        // Creating a loop from 0 to N (without N)
        IntStream.range(0, N)
                // Display the message for each step
                .peek(index -> System.out.printf("Store %d: ", index + 1))
                // Get the saved value
                .map(variables::get)
                // Display the stars
                .forEach(element -> System.out.println("*".repeat(element / INCREMENT)));
    }
0 голосов
/ 20 мая 2019

Простой способ сделать это с помощью простого базового кодирования - просто использовать условные выражения и добавлять * к String каждый раз, так что вам нужно использовать только один цикл. Вот как это будет выглядеть ниже. Я не изменил способ, которым вы брали значения у пользователя.

    String count = "", count2 = "", count3 = "", count4 = "", count5 = "";

    int max = Collections.max(Arrays.asList(sales1,sales2,sales3,sales4,sales5));

    for (int num = 0; num < max; num += 100)
    {
        if (num < sales1)
        {
            count = count + "*";
        }
        if (num < sales2)
        {
            count2 = count2 + "*";
        }
        if (num < sales3)
        {
            count3 = count3 + "*";
        }
        if (num < sales4)
        {
            count4 = count4 + "*";
        }
        if (num < sales5)
        {
            count5 = count5 + "*";
        }
    }

    System.out.print("\nStore 1: " + count);  
    System.out.print("\nStore 2: " + count2);
    System.out.print("\nStore 3: " + count3);  
    System.out.print("\nStore 4: " + count4);
    System.out.print("\nStore 5: " + count5);

int max используется для нахождения наибольшего значения из 5 чисел продаж, чтобы цикл завершился правильно. Это более эффективный метод, когда речь идет о скорости, поскольку он охватывает несколько * за один проход через цикл. Я намеренно не вызывал метод или использовал более сложные способы хранения значений, чтобы сосредоточиться на цикле, поскольку вы изучаете циклы в настоящее время.

...