Блок 1. Раздел 3. Тема 3

Операторы break и continue
Вычисления на циклах
Свой калькулятор

Иногда бывает нужно завершить цикл досрочно. Для этого есть операторы break и continue. Оператор break останавливает весь цикл, а continue останавливает один оборот, и цикл сразу же переходит к следующему обороту.

Циклы служат для двух основных целей. Во-первых, это непосредственное повторение любых действий - например, для калькулятора это введение очередного числа и операции, пока человек не остановит процесс. Во-вторых, это вычисления сумм, произведений и вообще разных больших выражений. Разберём то и другое в этой теме.
Там, где вы пишите break, цикл сразу завершается. Обычно break помещают внутрь какого-нибудь if, например:
int i = 0;
int num = 0;
Scanner scan = new Scanner (System.in);
while (i < 100) {
    System.out.println (“Введите число. Если оно отрицательное, то цикл завершится”);
    num = scan.nextInt ();
    if (num < 0)
        break; //если num меньше нуля, то завершить цикл
    i++;
}
Здесь также видно, что в цикле можно вводить числа с клавиатуры – на самом деле в цикле можно просто писать любой код, который вы хотите повторить много раз. В данном случае мы написали, что если введено отрицательное число, то это служит сигналом для досрочного завершения цикла.

Оператор continue завершает текущий оборот цикла, заставляя компилятор досрочно перейти к следующему обороту. Заменим в предыдущем примере break на continue:
int i = 0;
int num = 0;
Scanner scan = new Scanner (system.in);
while (i < 100) {
    System.out.println ("Введите число");
    System.out.println ("Если оно отрицательное, то цикл попросит вас ввести его ещё раз");
    num = scan.nextInt ();
//если num меньше нуля, то выполнить последний оборот заново
    if (num < 0)
        continue; 
    i++;
}
Разберем несколько примеров, на которых можно отточить навыки пользования циклами. Примеры типичные, часто используемые в самых разных программах. На их основе вы в будущем будете писать более сложный код, комбинируя базовые вещи и добавляя новые.

Просто к слову - вычисления сумм часто используют, чтобы подсчитать среднее арифметическое, а оно повсеместно в любом анализе. Например, вы делаете анализ прибыльности компании, и считаете среднюю прибыль за год. Также и многие другие базовые математические вещи применяются сплошь и рядом в программировании.
Пример 1. Посчитаем сумму чисел 1, 2, …, 9.
int i = 1; 
//заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
while (i < 10) {  
     sum += i; // увеличить значение суммы на величину i=1,2,…9 
     i ++;  
} 
В этом примере мы использовали базовый приём - кроме переменной счётчика, которая позволяет сделать последовательность 1,2,3,..., мы ввели отдельную переменную для хранения результата. Сейчас это сумма всех чисел, и мы назвали эту переменную sum. В начале она равна нулю. На первом обороте к ней прибавляется i=1, на втором i=2, и так постепенно накапливается результат суммирования всех нужных чисел 1+2+3+4+5+6+7+8+9.

В последующих примерах мы часто будем вводить свою переменную для хранения результата, и другие переменные для хранения всех промежуточных расчетов. Так что делайте переменных, сколько вам нужно, под каждый расчёт.
Перепишем этот пример с использованием for. Получим типичный цикл для расчета суммы многих чисел:
//заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
for (int i = 0; i < 10; i ++)   
     sum += i; // тело из одной строчки можно не брать в скобки {…} 
Получилось более лаконично. Главное в этом примере – в цикле имеет смысл писать повторяющиеся действия. При этом каждое отдельное действие определяется номером оборота цикла, то есть переменной i. В данном случае мы её просто прибавляем.
Пример 2. Посчитаем сумму нескольких чётных чисел 8+10+12+14.
//заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
// ясно, что нужно добавить каждое второе число, пишем i += 2 
for (int i = 8; i <= 14; i +=2)   
     sum += i;

// После цикла программа продолжает выполнять код. 
// Например, можно распечатать результат всех вычислений:
System.out.println (sum);
Пример 3. Посчитаем произведение 4*8*12*16*20. То есть нужно все эти числа перемножить между собой.
// заведем переменную, в которой будем накапливать результат: 
// product по-английски «произведение» 
int prod = 1; // начальное значение 1, а не 0, иначе 0 умножить на любое число опять 0.
// ясно, что нужно добавить каждое четвертое число, пишем i += 4 
for (int i = 4; i <= 20; i +=4)
     prod *= i;  
// имейте в виду, что перемножая такие числа, мы будем получать очень большой результат
// проверяйте, что вы не выходите за максимальное значение для целых int
// если что используйте double или long
// подробнее о максимальных числах для разных типов раздел 1 тема 5.

System.out.println (prod);
Пример 4. Посчитаем выражение 1-2+3-4+5-6.
// заведем переменную, в которой будем накапливать результат: 
int sum = 0; 
int znak = 1;
// чтобы получить смену знака будем умножать znak  на -1 
for (int i = 1; i <= 6; i ++)  { 
    sum += znak*i;  
    znak *= -1; // меняем знак, с -1 на 1 и обратно каждый оборот цикла
}

System.out.println (sum); 
Пример 5. Посчитаем значения последовательности чисел по такому правилу:
a1 = 5,
a2 = a1*3 + 1,
a3 = a2*3 + 1,

a100 = a99*3 + 1.

Если a100 больше 2000000000000000000l, то вывести на экран фразу «до фига получилось!» :) Также вывести количество пройденных оборотов цикла.
Такие последовательности будут нужны, если вас интересует набор чисел, заданных любым соотношением и следующее вычисляется из предыдущего по известному правилу. В коде это выглядит так же, как и в задании:
// Заведем переменную, чтобы хранить очередное число a 
long a = 5; // именно long, а не int, иначе будет превышен лимит типа данных
int i = 1; 
while (i <= 100) { 
// рассчитать следующее из предыдущего по правилу: 
    a = 3*a + 1;  
    i++; 
} 
// переменные живут дальше после цикла 
// можно анализировать работу цикла по их значениям
// l в конце числа указывает на тип long, иначе число слишком большое для int
if (a > 2000000000000000000l) { 
    System.out.println ("До фига получилось!"); 

System.out.println ("Оборотов цикла было " + (i-1)); // (i-1) так как последний i++ уже лишний
// сейчас будет 100 оборотов, но если в будущем обрывать цикл с помощью break,
// то уже будет неизвестно заранее, сколько на самом деле прошло оборотов.
Пример 6. Зададим вопрос и будем переспрашивать несколько раз, пока человек не ответит правильно. Важно понимать – вы можете заставить программу повторить любой набор действий много раз, а не только вычислять что-либо в цикле.
// заведем объект scan класса Scanner для работы с клавиатурой 
Scanner scan = new Scanner (System.in); 
//спросим 
System.out.println ("Сколько будет 4*5?"); 
int ans = 0; // ans от слова answer - ответ пользователя
do { 
    ans = scan.nextInt (); 
    if (ans == 20) { 
        System.out.println ("Снимаю шляпу :) пока!"); 
        break; // завершить цикл, если человек угадал 
    }
    // продолжить спрашивать до бесконечности
    System.out.println ("Неверно, попробуйте ещё");
} while (true); // true всегда равно правде, поэтому цикл вечный 

Напишите полноценный калькулятор на Java

В предыдущем разделе мы писали калькулятор, который мог выполнить только несколько арифметических действий, и было так: хотите 10 действий в калькуляторе - копируйте кучу кода 10 раз. Теперь всё иначе - мы можем поместить повторяющееся действие в цикл, и выполнить его произвольное количество раз, пока пользователь сам не остановит процесс командой с клавиатуры.

Задача. Напишите калькулятор. Предложите пользователю ввести число, затем знак одной из арифметических операций +,-,*,/ . Введите ещё число, выполните операцию, распечатайте результат и предложите ввести новую. Если пользователь введёт q, то остановите программу.

Вариант работы программы:
Остановка программы буквой q
Введите число
10
Введите операцию
-
Введите число
100
Результат -90
Введите операцию
*
Введите число
2
Результат -180
Введите число
q
Окончательный результат -180
Решайте больше задач по этому разделу здесь.
В следующей теме расскажем
о двойных циклах