Консоль-копилка

  • 8
  • Недоступна
Представим, что у нас есть свинья-копилка. В неё можно складывать монетки, пока в какой-то момент вы её не разобьете. Давайте напишем консольный эмулятор такой копилки: будем вводить с клавиатуры числа и складывать их до тех пор, пока не «разобьем» этот процесс специальным словом «сумма». После этого программа должна вывести нам накопленную сумму.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (252)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Иван
Уровень 7, Новосибирск
4 сентября, 08:10
все никак не могу понять как работает метод equals, пытался сделать через ==, но выдавала ошибку и не понял почему. Много статей уже прочитать про equals, но до сих пор не догоняю
Михаил Кладовщик 80lvl
14 сентября, 16:18
У примитивов == сравнивает значение. А у ссылок адрес по которому находится это значение(объект). Чтобы сравнить значение у ссылок(String это ссылочный тип) нужен equals(). Здесь твой код будет чем-то вроде этого
while (!(line == "сумма")) {    //ну или equals("сумма")
    sum += Integer.parseInt(line);
    line = br.readLine();
}
Если ты выбрал equals() - все ок Если же == то в момент ввода слова "сумма" появится ошибка NumberFormatException с указанием на строку sum += Integer.parseInt(line); Метод parseInt не смог преобразовать "сумма" к типу int. Но он и не должен. Эта итерация цикла вообще не должна была выполняться, потому что мы ввели стоп слово, а значит условие (line == "сумма") сработало не правильно, вернув false, хотя мы надеялись на true. Так как ты прочитал много статей, наверняка видел простейшие примеры с разбором, например
String a = "mama";
String b = "mama";
String c = new String("mama");
System.out.println(a == b);         //true
System.out.println(a.equals(b));    //true
System.out.println(a == c);         //false
System.out.println(a.equals(c));    //true
Мы сравниваем line и "сумма" line последний раз инициализировался при помoщи br.readLine(), а он возвращает новый объект типа String, с новым адресом. То есть получаем случай (System.out.println(a == c); //false) Надеюсь понятно объяснил😏
panarik QA Automation Engineer
18 июля, 17:06
Всем привет! Отладил копилку. Отделяет одно, два и три числа из строки и складывает. в общем по факту работает, а тест на джавараш не проходит. Подскажете что неправильно? Может быть задание неправильно понял. Парсер считывает числа и отделяет их пробелом.
public class Solution {
    public static void main(String[] args) throws Exception {

        Scanner scanner = new Scanner(System.in);
        ArrayList<Integer> listResult = new ArrayList<>();
        int sum = 0;
        boolean go = true;

        while (go) {
            System.out.print("Insert>>>>>> ");
            String in = scanner.nextLine();
            String result = "";
            for (int i = 0; i < in.length(); i++) {
                Character character = in.charAt(i);
                if (Character.isDigit(character)) {
                    result += character;
                }
                if (character == ' ') {
                    listResult.add(Integer.parseInt(result));
                    result = "";
                }
                if (character == 'с') {
                    for (int j = 0; j < listResult.size(); j++) {
                        sum += listResult.get(j);
                    }
                    go = false;
                    break;
                }
            }
            if (!result.equals("")) listResult.add(Integer.parseInt(result));
        }
        System.out.println(sum);
    }

}
Ilia Fesenko
Уровень 19
6 сентября, 22:32
Зачем так сложно все? Если можно просто через буфер получить стринг, который сразу же проверить на "сумма" и если не совпадает парсить стринг в инт, и добавлять в массив, который потом легко сложить можно? Это все можно решить в 6 строк.
Ilia Fesenko
Уровень 19
6 сентября, 22:34
или вообще сразу в переменную записывать значение)
Modestpda
Уровень 7, воронеж, Россия
18 июля, 14:38
В IDE ругается строка int count = Integer.parseInt(s);... типа обьявленная в цикле переменная не видна вне цикла
Alexx Dorofeev
Уровень 9, Санкт-Петербург
1 июня, 08:03
блин, кучу времени убил только потому что пытался второй раз прочитать строку из буфера, вместо того чтоб распарсить уже прочитанную и != "сумма", вот что значит мало спать :)
Максим Белоусов
Уровень 13, Москва, Россия
24 мая, 19:40
Почему не проходит валидацию если вместо int sum = 0; пишешь int sum? Переменная типа int же по умолчанию должна быть 0?
Павел Соловьёв
Уровень 6, Санкт-Петербург
24 мая, 21:23
Zhanir Ex
Уровень 12, Алматы
23 мая, 17:12
код получился коротким, валидацию прошёл, но сомневаюсь что-то:
BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        (тут объявляю переменную t c нулевым значением);
        while (true)
        {
            String s = buffer.readLine();
            if (s.equals("сумма"))
                break;
                t += Integer.parseInt(s);
        }
        System.out.println(t);
panarik QA Automation Engineer
18 июля, 18:47
спасибо бро!
Mike McKein
Уровень 22, Могилев , Белоруссия
27 апреля, 18:50
в цикле добавил условие !s.equals("сумма") условие true: a = a + Integer.parseInt(s) т.е. слово "сумма" уже не будет преобразовываться в int. Спасибо за внимание.
Marat Minnigaliev
Уровень 16
26 апреля, 03:12
если хотите немного усложнить задачу, пишите код в среде IntelliJ IDEA)
Stepan
Уровень 17, Киев
29 марта, 19:13
Обратите внимание, что в выводе не должно быть ничего лишнего кроме суммы! Потому что через это не проходит валидация! Задача простая, но из-за этого убил 15 мин и немного нервов.
Kuksh
Уровень 14
6 апреля, 09:04
Ох, спасибо за комментарий - сберег мои нервы)) Я главное полностью понимаю как работает код - мол объявили Int sum = 0; за пределами while, далее думаем как программа - входим в бесконечный цикл (true) - видим String name - запрос на ввод и сохранение в name строки. Далее условие из выхода цикла, где условие (проверка name на слово "сумма") true = входим в тело if (), false - идем считать сумму переводя строчные данные в целочисленные и занося в sum += переведенное число; Далее нам надо понять, вот мы ввели одно число и получилось sum = 0 + 123; Как выйти корректно из цикла while, если он (true) - значит нам надо залезть в цикл if (выполнив условие ввода слова "сумма") и запросить вывод sum в Консоль и дальше натыкаемся на break; и покидаем цикл while. Но я вот записал System.out.println("сумма " + sum); и на этом впал в ступор сначала, когда пытался понять, что я не так делаю - ведь число одно ввел, сумму посчитал 0+123, далее я вывожу его и завершаю программу, а валидатор ругается) В общем спасибо, а этот ответ может кому поможет из новичков в будущем)
uncle-fro
Уровень 11
11 апреля, 15:10
Блин, я 2 попытки потратил из-за вывода "сумма = " + sum😡
Simpson
Уровень 10, Белгород, Россия
10 марта, 18:25
довольно легкая на самом деле. Условие a.equals() идет сразу после ввода строки. Только потом строка преобразовывается в число int i = Integer.parseInt(a); ну и далее c = c + i ;