Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цикл for 
V
    Опции темы
PrinceOFF
Дата 12.4.2016, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Задача: Нужно вводить с клавиатуры числа и считать их сумму, пока пользователь не введёт слово «сумма». Полученную сумму вывести на экран.

Код

import java.io.BufferedReader;
import java.io.InputStreamReader;

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

        for (;true;){
            int number = Integer.parseInt(reader.readLine());
            sum += number;
                if ("сумма".equals(reader.readLine())){
                     break;
                }
        }
        System.out.println(sum);
    }
}


К примеру - при вводе "1", "2", "3" и "сумма" данный код выводит на экран "4":
Код

1
2
3
сумма
4

Почему не считается сумма чисел? Почему 13 строка не подсчитывает сумму?

Просьба не писать готовый код и куски кода! Я его и так могу посмотреть. Направьте словами, если не сложно.

PM   Вверх
Kircul
Дата 12.4.2016, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 20.2.2007

Репутация: 6
Всего: 7



Попробуй ввести так:
Код

1
2
сумма

Что-то мне подсказывает что тебя ждет сюрприз.
PM   Вверх
PrinceOFF
Дата 13.4.2016, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Да знаю я, что "сюрприз"... В 14 строке у меня получается не условие, как я хотел, а  считывание с клавиатуры, что мне не надо... Если я выношу это условие за пределы цикла и приравниваю его к переменной, то опять нарушается условие задачи и эта переменная первая будет получать какое-то значение с клавиатуры (строка 5):
Код

public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int sum = 0;
        String line = reader.readLine();

        for (;true;){
            int number = Integer.parseInt(reader.readLine());
            sum += number;
                if ("сумма".equals(line)){
                     break;
                }
        }
        System.out.println(sum);
    }

К тому же выбрасывается исключение:
Код

Exception in thread "main" java.lang.NumberFormatException: For input string: "сумма"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:580)
    at java.lang.Integer.parseInt(Integer.java:615)    


Алгоритм для себя вывел такой:
1. Считываем поток с клавиатуры.
2. Анализируем:
3. Если число - записываем его в переменную sum.
4. Если строка "сумма" - выводим sout с параметром sum, если строка !"сумма" - продолжаем ввод с клавиатуры дальше.

Пробовал разные циклы (for, do-while...). Не получается организовать условия (как видно из приведенного выше кода)...

Это сообщение отредактировал(а) PrinceOFF - 13.4.2016, 09:31
PM   Вверх
sgrey
Дата 14.4.2016, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



а считывать ввод в строковую переменную пробовал?
PM MAIL   Вверх
PrinceOFF
Дата 14.4.2016, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Цитата(sgrey @ 14.4.2016,  05:58)
а считывать ввод в строковую переменную пробовал?

Пробовал:
Код

public static void main(String[] args) throws Exception
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int sum = 0;
        String number = null;

        do {
            number = reader.readLine();
            sum += Integer.parseInt(number);
        } while (number != "сумма");
        System.out.println(sum);
    }

Выбрасывает исключение... 
Я так понимаю, что я неправильно сформировал условие в строке 10?

Или так - будет более правильно по логике:
Код

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String number = null;
        int sum = 0;

        for (;true;){
            number = reader.readLine();
            if (number != "сумма"){
                sum += Integer.parseInt(number);
            }else
                break;
        }
        System.out.println(sum);

Но все равно исключение выбрасывает smile 

Это сообщение отредактировал(а) PrinceOFF - 14.4.2016, 11:08
PM   Вверх
PrinceOFF
Дата 14.4.2016, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



I've done it!

Короче, я устал бороться с "ветряными мельницами" и решил задачу через исключение:

Код

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String number = null;
int sum = 0;

        try
        {
            for (; true; )
            {
                number = reader.readLine();
                if (number != "сумма")
                {
                    sum += Integer.parseInt(number);
                } else
                    break;
            }
        }
        catch (NumberFormatException e){
            System.out.println(sum);
        }


Но! На данном этапе учебы я вообще не должен знать, что такое исключение, поэтому фактически задача не решена. Т.е. решена, но не так, как ее решило большинство людей...
Наверное надо думать дальше...

Это сообщение отредактировал(а) PrinceOFF - 14.4.2016, 11:34
PM   Вверх
sgrey
Дата 14.4.2016, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



возьми свой последний код, и сравнивай строку как раньше
Код

 if ("сумма".equals(line)){
                     
                }

в джаве нельзя строки сравнивать через == и != - они сравнивают ссылки на объект, а не его значение

Это сообщение отредактировал(а) sgrey - 14.4.2016, 14:21
PM MAIL   Вверх
PrinceOFF
Дата 14.4.2016, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Ну вот как-то так получается:
Код

BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String number = null;
        int sum = 0;

            for (; true; )
            {
                number = reader.readLine();
                if ("сумма".equals(number) == false)
                {
                    sum += Integer.parseInt(number);
                }
                else break;
            }
            System.out.println(sum);

Т.е. то, что я решил в предыдущем сообщении по сути не правильно?
PM   Вверх
sgrey
Дата 15.4.2016, 04:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 15.4.2006

Репутация: нет
Всего: 4



Цитата(PrinceOFF @  14.4.2016,  15:57 Найти цитируемый пост)
Т.е. то, что я решил в предыдущем сообщении по сути не правильно? 

то что в этом тоже не правильно smile перед проверкой на равенство "сумма" надо ещё проверить число в переменной number или строка. 
а предыдущее решение - жуткий костыль. Оно будет работать для конкретного случая, но оно неправильно.
PM MAIL   Вверх
PrinceOFF
Дата 15.4.2016, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Ясно. Наверное это все попозже будет, пока по условиям задачи это не требуется)
PM   Вверх
_zorn_
Дата 15.4.2016, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Великая ява...
Цитата
for (; true; )

почему не 
Цитата
while (true)

??? (это конечно не к яве вопрос).

А "всего то" надо было
Код

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int sum = 0;
        for (;true;){
            String readed = reader.readLine();
            int number;
            try {
                number = Integer.parseInt(readed);
            } catch (ТУТ МОЖНО ВПИСАТЬ КАКОЙ ТО ТАМ ПАРСЕ ЕКСЕПТИОН или тупо Exception e) {
                number = 0;
            }
            sum += number;
                if ("сумма".equals(readed ) ){
                     break;
                }
        }
        System.out.println(sum);

PM MAIL   Вверх
PrinceOFF
Дата 15.4.2016, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



Цитата(_zorn_ @ 15.4.2016,  18:14)
Великая ява...
Цитата
for (; true; )

почему не 
Цитата
while (true)

??? (это конечно не к яве вопрос).

Мне сочетание этих трех букв больше всего нравится (я имею в виду for) и приятно для слуха  smile 


PM   Вверх
_zorn_
Дата 15.4.2016, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Выглядит ужасно  smile 
Это сейчас у тебя академический интерес, но потом же это войдет в привычку... и кто то будет материться... если твой код кроме тебя к кому нибудь попадет конечно.

Ты смог бы сходу сказать что делает for (;true;) если только учился программированию ? Все то что вынуждает ВСПОМИНАТЬ конструкции ЗЛО.
Это сейчас ты балуешься циклами, а в будущем начнешь называть классы MBSC. В рассшифровке MyBestSuperClass... разве не понятно ?

Я веду к тому что ОБЩЕПРИНЯТО бесконечные циклы через while (true) делать.

А если однажды ты напишешь for (true;;) ???
Долго баг искать будешь УВЕРЕННЫМ ЧТО У ТЕБЯ ВСЕ РОВНО ?
Сказки ЧТО ТЫ НИКОГДА ТАКОГО НЕ НАПИШЕШЬ можешь оставить при себе  smile 

А еще в пхп клевое выражение есть
Код

$i = 0;
for ($n=0;$n<5;$n++);
{
 $i++;
}
echo $i;

Что выведет этот код ? smile
Задача на внимательность...

Вот после таких "задач" и задумайся, а стоит ли вые.. в написании.
Я в свое время почти полдня потратил чтобы понять почему мой код работает по космическим законам, а не по моим...

Это сообщение отредактировал(а) _zorn_ - 15.4.2016, 19:44
PM MAIL   Вверх
PrinceOFF
Дата 15.4.2016, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 21.10.2013
Где: Минск, РБ

Репутация: нет
Всего: нет



1) Я понял - "ужасно".
2) Не войдет в привычку, потому как - п.1)
3) Я не учился программированию и классической университетской базы у меня нет. Просто вот изучаю потихоньку java. 
4) Не понял эту фразу:
Цитата

Все то что вынуждает ВСПОМИНАТЬ конструкции ЗЛО.

5) Эту фразу тоже не понял:
 
Цитата

...а в будущем начнешь называть классы MBSC. В рассшифровке MyBestSuperClass... разве не понятно ?

В смысле - расшифровка ясна, а вот почему я начну называть классы именно в стиле MBSC - нет, не понял. Никогда так классы не называл, даже в маленьких задачках, но если ты советуешь, то я попробую  smile 
6) Не изучал пхп...
Цитата

А еще в пхп клевое выражение есть...

Поэтому ХЗ что это выражение обозначает. Может "0"? Хотя я не внимательный...

Цитата

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

Вот видишь, ты "все знаешь" (понимаешь о чем я), а все равно ошибку допустил, а я так... пол шажка сделал... потому и не знаю того, о чем ты пишешь...

P.S. Я все же решил дописать... Мало ли, не та тональность ответа, вдруг))) 
На самом деле спасибо за комментарий, потому что, все что говорится, все, что я слышу от программистов - это в любом случае откладывается в памяти - осознанно или неосознанно - и это хорошо. Это советы, это опыт...

Это сообщение отредактировал(а) PrinceOFF - 15.4.2016, 21:32
PM   Вверх
_zorn_
Дата 15.4.2016, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



Цитата(PrinceOFF @  16.4.2016,  04:25 Найти цитируемый пост)

Вот видишь, ты "все знаешь" (понимаешь о чем я), а все равно ошибку допустил, а я так... пол шажка сделал... потому и не знаю того, о чем ты пишешь...

Так и пытаюсь тебя от своих ошибок избавить smile
Для начала объясню что тут происходит, а как это получилось думаю сам поймёшь )
Код

for ($n=0;$n<5;$n++);

точка с запятой после цикла означает "пустой цикл" (просто тупо будут перебираться условия пока он не закончится).
Сами по себе фигурные скобки просто выделяют блок в другой области видимости (scope). т.е. ты впринципе в любом месте кода можешь заюзать.
А так как цикл закончен то мы просто выполняем выражение. В итоге получается как будто цикл прошел один раз.

У меня получилось е..тня просто и за за того что на автомате поставил точку с запятой. 
Тут конечно виноват пхп что позволяет такое непотребство, но не зарекайся что ява тебя не зае... своей через чур строгой типизацией.

По своему опыту скажу - строгая типизация НАКАЛЯЕТ. А проблемы которые она ПЫТАЕТСЯ решить, решаются одним подобным моему факапом (то есть просто надо разобратсья).
Только вот факап случается гораздо реже, чем приходится пользоватьсяс этими Integer.valueOf()


ЗЫ: Да еще вот это вот по каждому чиху бросать исключение в яве НАКАЛЯЕТ. В итоге все делают throws а дальше е.. как хотите.

Это сообщение отредактировал(а) _zorn_ - 15.4.2016, 22:31
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1112 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.