Управляющие структуры. Общие сведения о циклах в Java

Определение цикла в Java

Цикл — это многократно повторяющийся фрагмент программы.

В java существует два типа циклов: типа «пока» и типа «n-раз».

Первый тип «пока» предназначен для повторения какого-то действия до тех пор, пока выполняется некоторое условие. Пример: увеличивать число на 5 до тех пор, пока оно не станет трёхзначным.

Второй тип «n-раз» предназначен для повторения каких-то действий заранее известное количество раз. Пример: умножить число само на себя 4 раза.

Цикл типа «пока» (операторы while и do…while)

Оператор while повторяет указанные действия до тех пор, пока его параметр имеет истинное значение.

Например, такой цикл выполнится 4 раза, а на экран будет выведено «1 2 3 4 »:

int i = 1;
while (i < 5) {
    System.out.print(i + " ");
    i++;
}

 

Такой цикл не выполнится ни разу и на экран ничего не выведется:

int i = 1;
while (i < 0) {
    System.out.print(i + " ");
    i++;    
}

 

Такой цикл будет выполняться бесконечно, а на экран выведется «1 2 3 4 5 6 7 …»:

int i = 1;
while (true) {
    System.out.print(i + " ");
    i++;    
}

 

Условие, определяющее будет ли цикл повторятся снова, проверяется перед каждым шагом цикла, в том числе перед самым первым. Говорят, что происходит предпроверка условия.

Бывает цикл типа «пока» с постпроверкой условия. Для его записи используется конструкция из операторов do…while.

Такой цикл выполнится 4 раза, а на экран будет выведено «2 3 4 5 »:

int i = 1;
do {
    i++;
    System.out.print(i + " ");
} while (i < 5);

 

Такой цикл выполнится 1 раз, а на экран будет выведено «2 »:

int i = 1;
do {
    i++;
    System.out.print(i + " ");
} while (i < 0);

 

Тело цикла do…while выполняется по крайней мере один раз. Этот оператор удобно использовать, когда некоторое действие в программе нужно выполнить по крайней мере единожды, но при некоторых условиях придётся повторять его многократно.

Ознакомьтесь со следующей программой (она загадывает случайное целое число из отрезка [1;10] и просит пользователя его угадать, вводя варианты с клавиатуры, пока пользователь не угадает число, программа будет ему подсказывать, сообщая больше или меньше число загаданное, чем то, что ввёл пользователь):

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        // prog — число созданное программой
        // user — число введённое пользователем
        int prog, user;
        // Генерируем случайное целое число от 1 до 10
        prog = (int)(Math.random() * 10) + 1;
        System.out.println("Я загадала число от 1 до 10, отгадайте его.");
        System.out.print("Вводите ваше число: ");
        Scanner input = new Scanner(System.in);  
        // Проверяем, есть ли в потоке ввода целое число
        if( input.hasNextInt() ) {
            do {
                // Читаем с потока ввода целое число
                user = input.nextInt();
                if(user == prog) {
                    System.out.println("Вы угадали!");
                } else {
                    // Проверяем, входит ли число в отрезок [1;10]
                    if (user > 0 && user <= 10) {
                        System.out.print("Вы не угадали! ");
                        // Если число загаданное программой меньше...
                        if( prog < user ) {
                            System.out.println("Моё число меньше.");
                        } else {
                            System.out.println("Моё число больше.");
                        }
                    } else {
                        System.out.println("Ваше число вообще не из нужного отрезка!");
                    }
                }
            } while( user != prog );
        } else {
            System.out.println("Ошибка. Вы не ввели целое число!");
        }
        System.out.println("До свиданья!");
    }
}

 

Внесите в программу следующие доработки:

  1. Программа должна считать количество попыток, которое потребовалось пользователю, чтобы угадать число. И в конце сообщать, сколько было попыток.
  2. Программа должна загадывать число не из отрезка [1;10], а целое число из отрезка от [−10;10], исключая ноль. При этом, постарайтесь, чтобы распределение случайных чисел генерируемых программой было равномерных (т. е. в случае выпадения нуля его нельзя просто заменить на какое-то другое число, например, на 1, ведь тогда 1 будет выпадать с вдвое большей вероятностью, чем остальные числа).
  3. Программа должна подсказывать пользователю, что он ошибся в знаке, если программа загадала положительное число, а пользователь ввёл отрицательное. И наоборот.

Цикл типа «n-раз» (оператор for)

Оператор for содержит три параметра. Первый называется инициализацией, второй — условием повторения, третий — итерацией.

for (инициализация; условие; итерация) {
    //тело цикла, т. е. действия повторяемые циклично
}

 

В первом параметре обычно выбирают какую-то переменную, с помощью которой будет подсчитываться количество повторений цикла. Её называют счетчиком. Счётчику задают некоторое начальное значение (указывают, начиная с какого значения он будет изменяться).

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

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

Перед первым шагом цикла счётчику присваивается начальное значение (выполняется инициализация). Это происходит лишь однажды.

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

После завершения каждого шага цикла и перед началом следующего (и, значит, перед проверкой условия повторения) выполняется итерация.

Представленная программа выводит на экран числа от 1 до 100:

for (int i = 1; i <= 100; i++) {
  System.out.print(i + " ");
}

 

Представленная программа выводит на экран числа от 10 до −10:

for (int s = 10; s > -11; s--) {
  System.out.print(s + " ");
}

 

Представленная программа выводит на экран нечётные числа от 1 до 33:

for (int i = 1; i <= 33; i = i + 2) {
  System.out.print(i + " ");
}

 

Представленная программа вычислит сумму элемнтов фрагмента последовательности 2, 4, 6, 8,… 98, 100. Итак:

int sum = 0; // Сюда будем накапливать результат
for (int j = 2; j <= 100; j=j+2) {
  sum = sum + j;
}
System.out.println(sum);

 

Представленная программа будет возводить число из переменной a в натуральную степень из переменной n:

double a = 2;
int n = 10;
double res = 1; // Сюда будем накапливать результат
for (int i = 1; i <= n; i++) {
  res = res * a;
}
System.out.println(res);

 

Представленная программа выведет на экран 10 первых элементов последовательности 2n+2, где n=1, 2, 3…:

for (int i = 1; i < 11; i++) {
  System.out.print(2*i + 2 + " ");
}

 

Представленная программа выведет на экран 10 первых элементов последовательности 2an−1+3, где a1=3:

int a = 3;
for (i=1; i<=10;i++) {
  System.out.print(a + " ");
  a = 2*a + 3;
}

 

В одном цикле можно задавать сразу несколько счётчиков. При этом несколько выражений в итерации и в инициализации разделяются запятыми. Условие повторения можно задавать только одно, но оно может быть выражением, содержащим сразу несколько счётчиков.

Представленная программа выведет на экран 10 первых элементов последовательности 2an−1–2, где a1=3:

for (int a=3, i=1; i<=10; a=2*a-2, i++) {
  System.out.print(a + " ");
}

 

Представленная программа выведет на экран такую последовательность «0 -1 -4 -9 -16 -25»:

for (int a=0, b=0; a-b<=10; a++, b--) {
  System.out.print(a*b + " ");
}

 

Досрочное завершение цикла (оператор break)

Как цикл типа «пока» так и цикл типа «n-раз» можно завершить досрочно, если внутри тела цикла вызвать оператор break. При этом произойдёт моментальный выход из цикла, не будет закончен даже текущий шаг (т. е. если после break присутствовали какие-то ещё операторы, то они не выполнятся).

В результате работы следующего примера на экран будут выведены только числа «1 2 3 4 Конец»:

for (int a=1; a<=10; a++) {
  if(a == 5) {
    break;
  }
  System.out.print(a + " ");
}
System.out.print("Конец");

 

Когда программа будет выполнять цикл в пятый раз(войдёт в цикл с счётчиком равным 5), сразу же будет проверено и окажется истинным условие при котором выполнится оператор break. Оставшаяся часть тела цикла (вывод на экран) уже производится не будет: программа сразу перейдёт к выполнению операций указанных после цикла и далее.

C помощью оператор break можно прервать заведомо бесконечный цикл. Пример (на экран выведется «100 50 25 12 6 3 1 0 » и после этого цикл остановится):

int s = 100;
while (true) {
  System.out.print(s + " ");
  s = s / 2;
  if(s == 0) {
    break;
  }
}

 

Оператор break имеет смысл вызывать только при наступлении какого-то условия, иначе цикл будет завершен досрочно на первом же своём шаге.

int a;
for (a=25; a>0; a--) {
  break;
  System.out.print(a + " ");
}
System.out.print("a=" + a);

 

В представленном выше примере вывода в цикле на экран не произойдёт ни разу, а когда переменная a выведется на экран после цикла, то окажется, что её значение ни разу не менялось, т. е. выведено будет «a=25» (и ничего больше).

Обратите внимание также на то, что переменная была объявлена до начала цикла. Когда переменная объявляется в параметрах цикла, то она оказывается недоступной за его приделами, а в данном случае требовалось иное — узнать какое значение будет у счётчика после завершенияцикла.

Задачи

  1. Создайте программу, выводящую на экран все четырёхзначные числа последовательности 1000 1003 1006 1009 1012 1015 ….
  2. Создайте программу, выводящую на экран первые 55 элементов последовательности 1 3 5 7 9 11 13 15 17 ….
  3. Создайте программу, выводящую на экран все неотрицательные элементы последовательности 90 85 80 75 70 65 60 ….

 

< Предыдущая       Оглавление       Следующая >

Коментарі: 7
  1. Alexei

    public class Example {
    public static void main(String args[]){
    int prog, user;
    int n = 0;

    prog = (int)(Math.random() * 21) – 10;
    if(prog != 0){
    System.out.println(“Я загадал число от -10 до 10, отгадайте его. \n Вводите ваше число: “);
    Scanner input = new Scanner(System.in);
    if(input.hasNextInt()){
    do{
    n = n + 1;
    user = input.nextInt();
    if(user == prog){
    System.out.println(“Вы, угадали!”);
    }else {
    if(user > -10 && user <=10){
    System.out.println("Вы, не угадали!");

    if(user * prog < 0){
    System.out.println("Смените знак на противоположный!");
    }else{
    System.out.println("Попробуйте другое число.");
    }

    if(prog < user){
    System.out.println("Мое число меньше!");
    }else {
    System.out.println("Мое число больше!");
    }
    }else {
    System.out.println("Ваше число вообще не из нужного отрезка!");
    }
    }
    }while ( user != prog);
    }else {
    System.out.println("Ошибка, вы не ввели целое число!");
    }
    System.out.println("Вы угадали с " + n + " попытки. \n До свидания!");
    }else {
    return;
    }
    }}

  2. Zezulko

    почемуто код публикуется не тот что я вставлял(((

  3. Zezulko

    Первое почемуто с ошибкой import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    // prog — число созданное программой
    // user — число введённое пользователем
    int prog, user;
    int n = 0;
    // Генерируем случайное целое число от -10 до 10
    prog = (int)(Math.random() * 10) - 10;
    System.out.println("Я загадала число от -10 до 10, отгадайте его.");
    // Первая попытка
    System.out.print("Попытка № " + ++n + " Вводите ваше число: " );
    Scanner input = new Scanner(System.in);

    // Проверяем, есть ли в потоке ввода целое число
    if( input.hasNextInt() ) {
    do {
    // Читаем с потока ввода целое число
    user = input.nextInt();
    if (user == prog) {
    System.out.println("Вы угадали!");
    } else {
    // Проверяем, входит ли число в отрезок [1;10]
    if (user > -10 && user = 0 && prog <= -1) {
    System.out.print("Число имеет отрицательное значение!");}
    if (user = 0) {
    System.out.print("Число имеет положительное значение!");}

    // Если число загаданное программой меньше...
    if (prog < user) {
    System.out.println(" Моё число меньше.");

    } else {
    System.out.println(" Моё число больше.");
    // Последующие попытки
    }System.out.print("Попытка № " + ++n + " Вводите ваше число: " );

    } else {
    System.out.println("Ваше число вообще не из нужного отрезка!");
    }

    }
    } while (user != prog);

    }
    else {
    System.out.println("Ошибка. Вы не ввели целое число!");

    }
    System.out.println("До свиданья!");
    }

    }

  4. Zezulko

    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    // prog — число созданное программой
    // user — число введённое пользователем
    int prog, user;
    int n = 0;
    // Генерируем случайное целое число от 1 до 10
    prog = (int)(Math.random() * 10) - 10;
    System.out.println("Я загадала число от -10 до 10, отгадайте его.");
    // Первая попытка
    System.out.print("Попытка № " + ++n + " Вводите ваше число: " );
    Scanner input = new Scanner(System.in);

    // Проверяем, есть ли в потоке ввода целое число
    if( input.hasNextInt() ) {
    do {
    // Читаем с потока ввода целое число
    user = input.nextInt();
    if (user == prog) {
    System.out.println("Вы угадали!");
    } else {
    // Проверяем, входит ли число в отрезок [1;10]
    if (user > -10 && user = 0 && prog <= -1) {
    System.out.print("Число имеет отрицательное значение!");}
    if (user = 0) {
    System.out.print("Число имеет положительное значение!");}

    // Если число загаданное программой меньше...
    if (prog < user) {
    System.out.println(" Моё число меньше.");

    } else {
    System.out.println(" Моё число больше.");
    // Последующие попытки
    }System.out.print("Попытка № " + ++n + " Вводите ваше число: " );

    } else {
    System.out.println("Ваше число вообще не из нужного отрезка!");
    }

    }
    } while (user != prog);

    }
    else {
    System.out.println("Ошибка. Вы не ввели целое число!");

    }
    System.out.println("До свиданья!");
    }

    }

  5. Arelav

    а почему вот так не работает??
    int count=0;
    while(count<55) {
    for( int i=1; true; i+=2)
    System.out.println(count + " элемент " + i);
    count++;

  6. Alex

    /* Сделал с ограничением, а не с какого количества угадали*/
    package pervueshagi;
    import java.util.Scanner;

    public class PervueShagi {
    public static void main(String[] args) {
    int user, comp, n = 5;

    comp = (int) (Math.random() * 21) – 10;

    while (true && comp != 0) {
    System.out.println(“Я загадал число, угадай его!\n” + “Введи число от -10 до 10”);
    System.out.println(“Чтобы выйти из программы нажми 77”);
    System.out.println(“Количество допустимых ошибок: 5”);
    System.out.println(“Количество осташихся ошибок: ” + n–);
    Scanner input = new Scanner(System.in);
    if(input.hasNextInt() ){
    user = input.nextInt();
    if (user == comp) {
    System.out.println(“Вы угадали!”);
    break;
    }
    else
    {
    if (n == 0) {
    System.out.println(“Ваши шансы исчерпаны!”);
    break;
    }
    if (user >= -10 && user <=10) {
    System.out.println("Вы попали в диапазон но");

    if (user =-10 && user 0) System.out.println(“нужно поменять знак на +\n”);
    }
    if (user > comp){
    System.out.println(“загаданное число меньше чем ваше\n”);
    if ((user >=0 && user <=10) && comp < 0) System.out.println("нужно поменять знак на -\n");
    }
    }
    else if (((user < -10 && user -10 && user > 10)) && user !=77) {
    System.out.println(“Вы слишком ушли от заданного диапазона [-10:10]\n”);
    }
    if (user == 77) {
    System.out.println(“До свиданья!”);
    n ++;
    break;
    }
    }
    }
    else {
    System.out.println(“Введите чило!\n”);
    n = 5;
    }
    }
    if (comp == 0){
    System.out.println(“Я загадал число 0, придется заново запустить меня!\n”);
    comp = (int) (Math.random() * 21) – 10;
    }}}

Додати коментар