как отобразить правильный вывод, когда не введены положительные числа - PullRequest
0 голосов
/ 16 февраля 2020

Я новичок в кодировании. Назначение состоит в том, чтобы вычислить среднее значение для всех положительных чисел на входе и выходе при вводе нуля. Если никакие положительные числа не введены, отобразить среднее сообщение невозможно.

Вот что у меня есть. Я застрял на части о печати сообщения «не могу вычислить среднее», когда вводятся только ноль или отрицательные числа.

public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int numbers = 0;
    int sumOfNumbers = 0;
    double averagePositive = 0;
    while (true) {
        System.out.println("Give a number: ");
        int number = Integer.valueOf(scanner.nextLine());
        if (number == 0)
            break;

        if (number > 0)
            sumOfNumbers = number + sumOfNumbers;

        if (number > 0)
            numbers = numbers + 1;

        if (number > 0)
            averagePositive = (double)sumOfNumbers / (double)numbers;
    }   
    System.out.println(averagePositive);
}

Ответы [ 3 ]

0 голосов
/ 16 февраля 2020

Я бы, наверное, сделал это так, чтобы было проще. Кроме того, в общем, старайтесь не сводить код вместе. Наиболее формальный проект требует определенной степени стилизации и обычно между пробелами и пробелами, и т. Д. c ... требуется. В долгосрочной перспективе это делает код более читабельным и простым в обслуживании.

В вашем коде не было необходимости повторять одно и то же, если тестировать число> 0 несколько раз, они могли бы быть все связаны вместе. Если бы программа была больше и сложнее, я мог бы назвать имена переменных с большей квалификацией, но для такой короткой программы, как эта, кратких имен было достаточно для ясности.

continue и break являются важными ключевыми словами для управления поведением l oop и могут использоваться для повышения краткости и ясности. continue немедленно возвращается к вершине l oop и break немедленно покидает самый внутренний l oop. Разделив double на int, мы получим double, поэтому я смог исключить бросок. А оператор += делает чтение строки немного легче.

Также в Java и C любое предложение if() или else, содержащее одну строку, не требует скобок и если программа не вложена таким образом, что добавление фигурных скобок в любом случае добавляет ясности, в этом случае зачастую яснее опустить фигурные скобки. Оператор if иллюстрирует оба способа в одном операторе.

import java.util.Scanner;
public class avg 
{
    static int count = 0;
    static double sum = 0;

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        System.out.println("\nEnter a sequence of positive numbers (0 to calculate average):\n");

        while (true) {
            System.out.print("Number? ");
            int n = scanner.nextInt();
            if (n < 0) {
                System.out.println("Negative numbers not allowed.");
                continue;
            } else if (n == 0)
                break;

            sum += (double)n;
            ++count;
        }           

        System.out.println("Average of " + count + " numbers = " + 
            (double)(sum / count) + "\n");


        System.exit(1);
    }
}

Пример вывода:

    $ java avg

    Enter a sequence of positive numbers (0 to calculate average)

    Number? 1
    Number? 2
    Number? 3
    Number? 4
    Number? 5
    Number? -6
    Negative numbers not allowed.
    Number? 0

    Average of 5 numbers = 3.0
0 голосов
/ 08 марта 2020

Сделайте это следующим образом:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number, numbers = 0;
        double sumOfNumbers = 0.0, averagePositive;
        boolean valid;
        do {
            do {
                number = 0;
                valid = true;
                System.out.print("Give a positive integer (0 to exit): ");
                try {
                    number = Integer.valueOf(scanner.nextLine());
                    numbers++;
                    if (number <= 0 && numbers == 1) {
                        System.out.println("Cannot calculate the average");
                    }
                    if (number < 0 && numbers > 1) {
                        System.out.println("Hello");
                        System.out.println("This input will be ignored as it is not positive");
                        numbers--;
                        valid = false;
                    }
                } catch (NumberFormatException e) {
                    System.out.println("Hi");
                    System.out.println("Invalid entry");
                    valid = false;
                }
            } while (!valid);

            sumOfNumbers += number;

        } while (number > 0);
        if (sumOfNumbers > 0) {
            averagePositive = sumOfNumbers / (numbers - 1);
            System.out.println("Average: " + averagePositive);
        }
    }
}

Пробный прогон:

Give a positive integer (0 to exit): 0
Cannot calculate the average

Другой пробный прогон:

Give a positive integer (0 to exit): -2
Cannot calculate the average

Еще один пример прогона:

Give a positive integer (0 to exit): 5
Give a positive integer (0 to exit): 10
Give a positive integer (0 to exit): 15
Give a positive integer (0 to exit): 0
Average: 10.0
0 голосов
/ 16 февраля 2020

Попробуйте следующим образом ...

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    System.out.print("Give a number: ");
    int num=input.nextInt();
    int tot=0; //total
    int count=0; // counting the positive numbers
    if(num>0){
         while(num!=0){
             tot+=num;
             count++;
             System.out.print("Give a number: ");
             num=input.nextInt();
             if(num<0){
              System.out.print("Not possible");
              return;
              }
         }
         double avg =(double)tot/n;
         System.out.print("Average: "+avg);

    }else{
         System.out.println("Cannot calculate the average.");
    }

}
...