17. Цикл while
Теория
Помимо ветвления алгоритма по тому или иному условию, в java
есть возможность повторять тот или иной
блок кода раз за разом, пока выполнено некоторое условие.
Такую конструкцию называют циклами while
. Общий вид таких циклов:
while(условие){
делать_пока_правда
}
Пока истинно логическое выражение, указанное в скобках цикла while
. Всё, что указано в теле цикла (между
фигурными скобками {...}
).
Попробуем решить следующую задачу:
На вход подаются целые числа, пока не будет введено отрицательное.
Требуется вывести сумму всех чисел.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int sum = 0;
while(a>0){
sum+=a;
a = sc.nextInt();
}
sum+=a;
System.out.println(sum);
}
}
Очевидно, что условие цикла - это a>0
, т. к. после чтения отрицательного числа, нам читать числа
больше не надо.
Чтобы посчитать сумму, надо ввести какую-то переменную. Мы назвали её sum
.
Внутри цикла while
мы прибавляем к переменной sum
каждое прочитанное значение.
После завершения у нас к сумме не прибавлено последнее число. Поэтому мы прибавляем его уже после тела цикла.
Повторяющийся код - это, безусловно, плохо. Т.к. гарантированно на вход подадут хотя бы одно число, то хотелось бы сначала числа считывать, прибавлять их к сумме, а когда придёт отрицательное, просто закончить выполнение цикла.
Такой цикл есть. Он называется цикл с постусловием do...while
do{
тело_цикла;
}while(условие);
Циклы с постусловием работают по следующему принципу: тело цикла гарантированно выполняется хотя бы один раз. Если условие верно, то тело цикла повторяется. Обратите внимание, что после while(условие) ставится «;»
Т.о. цикл с постусловием отличается от простого цикла с гарантией того, что его тело гарантированно выполнится хотя бы один раз.
Перепишем нашу задачу, используя цикл с постусловием.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int sum = 0;
do{
a = sc.nextInt();
sum+=a;
}while(a>0);
System.out.println(sum);
}
}
Как видите, такой код не содержит повторяющихся команд. Поэтому для каждой отдельной ситуации надо думать, какой цикл лучше использовать.
Задание
В этом задании циклами можно пользоваться только если этот цикл - while
.
- Дано целое положительное число . Найти наибольшее целое число , квадрат которого не превосходит . Функцию извлечения квадратного корня не использовать.
- Дано целое число . Найти наименьшее целое число , при котором выполняется неравенство . Операцией деления пользоваться запрещается.
- Дано целое положительное число , являющееся некоторой степенью числа . Найти целое число - показатель этой степени. Функцией взятия логарифма пользоваться запрещается.
- Дано число . Вывести наименьшее из целых чисел , для которых сумма будет больше , и саму эту сумму.
- Дано целое положительное число . Используя операции деления нацело и взятия остатка от деления, вывести все его цифры, начиная с самой правой (разряда единиц). Строками пользоваться запрещается.
- Дано целое положительное число . С помощью операций деления нацело и взятия остатка от деления
определить, имеется ли в записи числа цифра . Если имеется, то вывести
ДА
, если нет - вывестиНЕТ
. - Начальный вклад в банке равен руб. Через каждый месяц размер вклада увеличивается на процентов от имеющейся суммы ( - вещественное число, ). По данному определить, через сколько месяцев размер вклада превысит 1100 руб., и вывести найденное количество месяцев (целое число) и итоговый размер вклада (вещественное число).