Тема-26-1


Тема №26 (часть 1)
Структура и использование цикла while
Несмотря на то, что мы еще не изучили всех возможностей использования цикла for – теперь мы переходим к изучению нового вида команды повтора, к циклу while.
Как вы помните, цикл for – это возможность организации такого повторяющегося блока программы (части программы), то есть цикла, число повторов (проходов) которого можно определить заранее.
Однако существует масса задач, ситуаций, в которых, с одной стороны, требуется организация цикла, а с другой стороны – в принципе отсутствует возможность заранее знать, сколько повторов потребуется выполнить.
Иными словами, мы должны иметь возможность организовать так называемый "гибкий цикл" – то есть такой, в котором число повторов не определяется установленными заранее какими-то значениями (в том числе – и значениями переменных). Нам нужен цикл, в котором после каждого завершения очередного повтора (прохода), будет выполняться проверка – а выполнить ли еще один повтор (проход). Обратите внимание: каждый раз проверка выполняется заново – и каждый раз на только еще один дополнительный повтор (проход).
Для сравнения этих двух видов циклов можно привести ситуацию из жизни: учитель музыки в качестве домашнего задания может велеть ученику "сыграть пьесу 8 раз" – или "сыграть пьесу до тех пор, пока не станет получаться, как надо".
В первом случае заранее известно число повторов, а во втором – в принципе нет никакой возможности знать, сколько же раз ученик будет повторять пьесу: один, пять, восемь, пятнадцать?.. Дело в том, что, закончив в очередной раз исполнение пьесы, ученик "проверяет условие" – "получилось ли, как надо"? и уж в зависимости от результата проверки каждый раз решает, играть ли пьесу еще раз.
Структура цикла while
Как и цикл for, цикл while тоже состоит из двух частей:
заголовка цикла
тела цикла
Заголовок цикла while состоит из двух частей:
служебного слова while
условия продолжения цикла, заключенного в скобки.
Например:
while (x>0)
while (a!=b)
while (sum<66)
Важно: условие, размещенное в заголовке, проверяется каждый раз перед очередным повтором цикла.
Важно: условие, размещенное в заголовке, является условием продолжения цикла. это значит, что, если условие выполняется, цикл while делает еще один повтор (проход). А вот если условие это не выполняется, то цикл больше не сработает и класс перейдет к выполнению команды, записанной после тела цикла.
Стоит обратить внимание, что цикл while довольно заметно похож, в смысле использования условия, на команду выбора (ветвления) if.
Поскольку в условии, которое записывается в заголовке цикла, используется, как правило, по крайней мере, одна переменная, необходимо инициализировать ее (присвоить ей значение) еще до заголовка цикла.
Опасность бесконечного цикла
К сожалению, в циклах while очень легко создать ситуацию, при которой количество повторов цикла становится бесконечным – это означает, что класс (программа) просто "зависает", то есть фактически никогда не произойдет передача выполнения следующей за циклом команде.
Например, если при проверке условия в заголовке цикла:
while (x>0)
окажется, что переменная х содержит положительное значение, цикл выполнит в первый раз. Но если внутри, в теле цикла, переменная х не изменяется, следовательно, условие снова окажется верным, и цикл выполнится во второй раз… и условие снова окажется верным, и цикл выполнится в третий раз… в четвертый… в пятый… в шестой… и так без конца…
Возникает так называемый "бесконечный цикл" – или, точнее сказать, бесконечное повторение цикла.
Для того, чтобы избежать подобной ситуации, следует в теле цикла обязательно изменять значение переменной, проверяющейся в условии.
Но и этого – недостаточно! Необходимо так изменять значение переменной, проверяющейся в условии, чтобы в какой-то момент проверка условия обнаружила бы, что оно неверное – и исполнение цикла прервется.
Например, если часть класса выглядит следующим образом:
int a=1;
while (a>0)
{
a++;
System.out.print(a+" ");
}
то мы снова получим бесконечный цикл, так как значение переменной а все время увеличивается и все время остается положительным – условие, записанное в заголовке цикла, выполняется "всегда"…
Рекомендации для использования цикла while
Таким образом, при использовании в классе цикла while следует соблюдать три основных правила:
Переменная, которая используется в условии заголовка цикла, должна получать значение до начала цикла.
Условие, входящее в состав заголовка цикла, является условием еще одного повтора цикла.
Следует менять в теле цикла значение переменной, которая используется в условии заголовка цикла – но так, чтобы сохранялся шанс на прекращение исполнения цикла.
Есть еще одна очень существенная разница между циклами for и while.
При изучении цикла for мы говорили, что не рекомендуется изменять значение переменной-счетчика внутри (в теле) цикла. А вот в цикле while как раз наоборот: обязательно надо изменять переменную, от которой зависит исполнение или неисполнение цикла в очередной раз.
Как определить, какой из циклов, for или while, следует использовать при решении? Однозначного правила – не существует, но можно дать довольно простую рекомендацию: прочитав условие задания, постарайтесь понять, можно ли каким-то образом заранее определить количество повторов цикла. Если это возможно – стоит использовать цикл for, если такой возможности нет – скорее всего, надо писать цикл while.
Пример с использованием "кода прерывания"
Рассмотрим пример: "Напиши класс, который принимает с клавиатуры целые числа. Ввод данных завершится, когда с клавиатуры будет введено значение -1. Класс должен выводить на экран количество значений, которые были введены с клавиатуры – не считая значения -1".
Обратите внимание: фразы вроде "ввод завершится, когда…", "будет продолжаться, пока…", "до тех пор, пока" и им подобные – достаточно ясный намек на то, что число проходов цикла заранее неизвестно. Иными словами – надо будет использовать цикл while.
Кроме того, в классе нам понадобится переменная-счетчик – и очень важно обратить внимание на то, что в последний раз переменная-счетчик не должен увеличиваться. Иными словами, для серии 6, 9, 234, -9, 0, 6, -1 – значение переменной-счетчика должно быть равно 6, а не 7.
Решение может выглядеть так:
import java.util.*;
class primer_while1
{
static Scanner reader = new Scanner(System.in);
public static void main(String[] args)
{
int x, count=0;
x=reader.nextInt();
while (x!=-1)
{
count++;
x=reader.nextInt();
}
System.out.println(" Количество значений в серии="+count);
}
}
Обратите внимание: если первое же значение, введенное с клавиатуры, будет равно -1 – цикл вообще ни разу не будет выполняться!
Это – одна из важных особенностей цикла while: он может ни разу не выполняться – и это следует всегда иметь в виду.
В нашем примере имеется значение -1, при введении которого с клавиатуры цикл прекращается. В общем случае такое значение принято называть "кодом прерывания" (при его введение прерывается повторение цикла), "караульным" (караулит, когда в очередной раз надо "не пропустить" исполнение в тело цикла), zip-code (только не в смысле "почтовый индекс", а в смысле "код, который закрывает" – исполнение цикла).
При этом, совершенно не обязательно, чтобы условие в заголовке цикла содержало использование "кода прерывания" – это может быть и ограничение, налагаемое на значение одной из переменных.
Пример с использованием "ограничения значения"
Рассмотрим пример: "Напиши класс, который генерирует серию однозначных положительных чисел – до тех пор, пока сумма значений серии остается меньше 100. Класс должен выводить на экран количество значений в сгенерированной серии и их сумму".
Решение может выглядеть так:
import java.util.*;
class primer_while2
{
static Scanner reader = new Scanner(System.in);
public static void main(String[] args)
{
int x=0, count=0, sum=0;
while (sum<=100)
{
x=(int)(10*Math.random());
count++;
sum+=x;
}
sum-=x;
count--;
System.out.println("Сумма="+sum+" количество значений="+count);
}
}
В решении есть несколько особенностей, на которые очень важно обратить внимание:
В заголовке while (sum<=100) использовано условие, связанное с ограничением на сумму серии – и сумма эта, разумеется, должна быть в начале обнулена.
После окончания цикла сумма уменьшается на значение последнего значения в серии, а переменная-счетчик уменьшается на 1. Это делается потому, что цикл прерывается после того, как сумма превысит ограничение, то есть значение 100.
Обратите значение на то, что переменная х инициализирована значение 0. Это делается потому, что значения переменой х создаются внутри цикла, а после выхода из цикла переменную-сумму надо уменьшить на последнее значение переменной х. Без инициализации на этапе компиляции возникает ошибка, смысл которой – "переменная х может не получить значения".

Примеры задач для решения в классе и дома
Общее замечание: для каждого из заданий можно написать версию, в которой ввод значений с клавиатуры заменен генерацией случайных чисел.
Задание №1
Напиши класс, который принимает с клавиатуры числа – до тех пор, пока не будет введено значение 0. Для каждого введенного с клавиатуры положительного числа класс должен выводить на экран текст Плюс, для каждого отрицательного – текст Минус.
Задание №2
Напиши класс, который принимает с клавиатуры числа – до тех пор, пока не будет введено значение 999.
Класс должен подсчитать, сколько значений было введено с клавиатуры (не считая значения 999) и вывести эту информацию на экран.
Задание №3
Напиши класс, который принимает с клавиатуры числа – до тех пор, пока не будет введено значение 999.
Класс должен подсчитать, сколько значений было введено с клавиатуры, чему равна сумма этих значений (не считая значения 999) – и вывести эту информацию на экран.
Задание №4
Напиши класс, который должен принять с клавиатуры значение 123 и вывести на экран сообщение Код принят.
Класс будет снова и снова принимать с клавиатуры значения до тех пор, пока не будет введено значение 123 – на каждое вводимое с клавиатуры значение, отличное от 123, класс должен выводить сообщение Код неверный, повторите ввод.
Задание №5
Напиши класс, который принимает с клавиатуры значения – до тех пор, пока их сумма остается меньше 21. По окончании ввода следует вывести на экран информацию о количестве введенных значений и их сумме.
Задание №6
Напиши класс, которые принимает с клавиатуры число для переменной Х, а затем – дополнительную серию чисел, каждое из которых уменьшает значение переменной Х. Ввод серии должен производиться до тех пор, пока значение переменной Х остается положительным.
Задание №7
Напиши класс, который принимает с клавиатуры пары целых чисел – до тех пор, пока не будет введена пара одинаковых чисел.
Класс должен выводить на экран сумму всех первых чисел в парах и сумму всех вторых чисел в парах (не считая чисел, введенных в последней паре).
Задание №8
Напиши класс, который принимает с клавиатуры целые числа – до тех пор, пока не будут введены с клавиатуры друг за другом два одинаковых числа.
Класс должен выводить на экран сумму серии – за исключением последнего введенного с клавиатуры значения.
Задание №9
Напиши класс, который должен принимать с клавиатуры серию возрастающих по значению целых чисел – ввод будет прекращен, когда очередное число окажется не больше предыдущего.
Класс должен выводить на экран количество значений в серии – за исключением последнего введенного с клавиатуры значения.
Задание №10
Напиши класс, который принимает с клавиатуры целое число и выводит на экран все числа, которые можно получить из введенного за счет "стирания последней цифры". Например, для введенного числа 52435 будут выведены на экран 5243, 524, 52, 5, 0.
Задание №11
Напиши класс, который принимает с клавиатуры целое число и подсчитывает число цифр в нем.
Результат подсчета должен быть выведен на экран. Например, для числа 534 на экран будет выведено 3 цифры.
Задание №12
Напиши класс, который принимает с клавиатуры целое число и подсчитывает сумму его цифр.
Результат подсчета должен быть выведен на экран. Например, для числа 534 на экран будет выведено 12.
Задание №13
Напиши класс, который принимает с клавиатуры целое число и подсчитывает количество нулей в этом числе.
Результат подсчета надо вывести на экран.
Задание №14
Напиши класс, который принимает с клавиатуры целое число (для переменной х) и выводит на экран серию значений: х2, х3… хn – до тех пор, пока очередное значение остается меньше 1000.
Задание №15
Напиши класс, который принимает с клавиатуры целое положительное число и строит из него число с обратным порядком цифр.
Новое значение следует вывести на экран.

Приложенные файлы

  • docx 26580185
    Размер файла: 31 kB Загрузок: 0

Добавить комментарий