level05.lesson12.bonus03

Помогите решить задачу.

package com.javarush.test.level05.lesson12.bonus03;

import java.io.*;

/* Задача по алгоритмам
Написать программу, которая:
1. вводит с консоли число N > 0
2. потом вводит N чисел с консоли
3. выводит на экран максимальное из введенных N чисел.
*/

public class Solution
{
    public static void main(String[] args) throws Exception
    {
        //напишите тут ваш код
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("Введіть число N > 0 ");

        String n = reader.readLine();
        int max = Integer.parseInt(n);

        if (max > 0 )
        {
            for (int i = 0; i <= max; i++)
            {
                BufferedReader reader1 = new BufferedReader(new InputStreamReader(System.in));
                String s = reader.readLine();
                int a = Integer.parseInt(s);
                if (a > max);
                {
                    max = a;
                }
                System.out.println(max);
            }
        }
    }
}

12 комментариев

V107
  • V107
  • -1
Я думаю, ошибка тут:
int max = Integer.parseInt(n);
arthasfp
Из банального: где reader.close() и reader1.close()?
yozh
  • yozh
  • +1
  • Комментарий отредактирован 2016-09-20 07:36:12 пользователем yozh
Начните с исправления этой ошибки:
Вы сперва записываете в переменную max количество чисел, а потом начинаете в max сохранять считанные с клавиатуры числа которые больше max.

Подсказка: тут должны быть 2 переменные — в одной количество чисел, в другой максимальное число.
v_oleksiienko
  • v_oleksiienko
  • 0
  • Комментарий отредактирован 2016-09-20 22:39:42 пользователем v_oleksiienko
Спасибо. Сделал вот так. Должно работать. Что скажете?


<code>public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int maximum = 0;
        int N1 = 0;

        String s1 = reader.readLine();
        int N = Integer.parseInt(s1);

        if (N > 0) {
            for (int i = 0; i < N; i++) {
                BufferedReader reader1 = new BufferedReader((new InputStreamReader(System.in)));
                String a1 = reader1.readLine();
                int a = Integer.parseInt(a1);
                if (a > N1){
                    N1 = a;
                    maximum = a;
                }
            }
        }

        System.out.println(maximum);
    }
}
</code>


v_oleksiienko
сервер все равно почему-то не принимает ответ
aiv
  • aiv
  • 0
  • Комментарий отредактирован 2016-09-20 23:06:39 пользователем aiv
А что за переменная N1, зачем Вы дублируете переменную maximum? Хотя это и не принципиально для решения задачи, но использование лишних переменных не добавляет красоты коду.

Для понимания ошибки попробуйте вводить только отрицательные числа (за исключением первого числа N)

Также вынесите создание reader1 из цикла, его надо создать всего 1 раз, потом только считывать значение. По большому счёту, можно обойтись всего одним BufferedReader (созданный в начале reader), второй (reader1) не обязателен. И не забывайте закрывать открытые потоки — вызывать у них метод close().
v_oleksiienko
  • v_oleksiienko
  • 0
  • Комментарий отредактирован 2016-09-20 23:27:35 пользователем v_oleksiienko
Спасибо за совети.
1. убрал переменную N1.
2. вынес reader1 из цикла
3. закрыл потоки
4. попробовал с отрицательными числами. Виводить 0. Понимаю почему, но не знаю как исправить

<code>public class Solution
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int maximum = 0;

        String s1 = reader.readLine();
        int N = Integer.parseInt(s1);

        if (N > 0) {
            BufferedReader reader1 = new BufferedReader((new InputStreamReader(System.in)));
            for (int i = 0; i < N; i++) {
                String a1 = reader1.readLine();
                int a = Integer.parseInt(a1);
                if (a > 0){
                    maximum = a;
                }
            }
            reader1.close();
            System.out.println(maximum);
        }
        reader.close();
    }
}</code>
yozh
Первое считывание в переменную maximum нужно сделать перед циклом, а цикл прогонять N-1 раз. Тогда ничего с левым нулём сравниваться не будет.
aiv
yozh правильно подсказал один из вариантов. Второй вариант — присвоить изначально переменной maximum минимальное целое число. Как его узнать — не поленитесь, наберите в поиске «java минимальное целое» или в форуме почитайте комментарии к этой задаче, здесь уже много писали про эту ошибку.
Вообще, прежде чем задавать вопросы, попробуйте посмотреть, а нет ли уже ответов на эти вопросы в форуме. Только не ищите готовое решение, а проанализируйте своё и исправьте с учётом комментариев других.
Кроме этого, Вы почему-то введённые числа сравниваете с 0 (a > 0), хотя сравнивать надо с максимальным числом.
yozh
  • yozh
  • 0
  • Комментарий отредактирован 2016-09-21 07:18:43 пользователем yozh
Точно, не обратил внимания:

if (a > 0){
...
}

В результате в переменной maximum окажется последнее введенное положительное число, или 0 если все числа отрицательные.

Ещё:
Зачем вы создаёте 2 потока ввода данных? Достаточно и одного.
v_oleksiienko
yozh, aiv — спасибо за помощью.

Зделал вот так:
1. приравнил int maximum к -2147483648;
Так правильно делать?
2. условие проверки if (a > maximum), а не if (a > 0).
3. убрал reader1.

Задача прошла тест :)
aiv
  • aiv
  • 0
  • Комментарий отредактирован 2016-09-21 19:37:06 пользователем aiv
1. приравнил int maximum к -2147483648;
Можно и так, но красивее и правильней будет так:
maximum = Integer.MIN_VALUE
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.