ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Циклы с постусловием. У циклов с постусловием (циклов типа ДО) проверка условия продолжения цикла производится после выполнения операторовУ циклов с постусловием (циклов типа ДО) проверка условия продолжения цикла производится после выполнения операторов, составляющих тело цикла:
ВЫПОЛНЯТЬ Цепочка ДО (условие);
Такой цикл повторяется до тех пор, пока условие истинно. Выполнение цикла заканчивается, если операторы цепочки изменяют значения переменных, входящих в условие, и оно становится ложным. В любом случае этот цикл выполняется хотя бы один раз. Цикл с постусловием превращается в бесконечный, если условие подобрано так, что оно всегда истинно. Таким образом, условие в данном цикле является условием его продолжения, как и в цикле с предусловием. В Java цикл с постусловием реализован оператором цикла do: Do { Оператор; Оператор; Оператор; ...... Оператор; } While (условие); где do – служебное слово выполнять, while – служебное слово пока. Внимание! После слова do точка с запятой не ставится! Перед закрывающей фигурной скобкой }поставить точку с запятой! Действия оператора do: 1. выполняется оператор (цепочка), 2. проверяется выполнение условия, стоящего после слова while, 3. если оно истинно, то цикл повторяется, 4. если условие становится ложным, то цикл заканчивает работу. Примеры: 1. вычислить сумму ста первых натуральных чисел: s = 1 + 2 + 3 + … + 98 + 99 + 100 Пусть s – искомая сумма, i – очередное число (изменяется от 1 до 100). Тогда алгоритм решения задачи можно описать следующим образом: a. обнуляем сумму s = 0, b. берем первое число: i = 1, c. добавляем в сумму очередное число s = s + i, d. как только очередное число станет больше ста, цикл заканчивает работу. Представим этот алгоритм так: s = 0; i = 1; ВЫПОЛНЯТЬ s = s + i; i = i + 1; ПОКА (i <= 100); Программа: int i=1, s=0; Do { s+=i; i++; } while (i <= 100); System.out.printf(“/ns=%d i=%d”,s, i); Результат решения задачи: s=5050 i=101 Второй вариант решения задачи: Do s+=i++; while (i <= 100); 2. вычислить сумму s всех цифр заданного натурального числа n Пусть s – искомая сумма, i – очередная цифра числа. Тогда алгоритм решения задачи можно описать следующим образом: 1. обнуляем сумму s = 0, 2. берем последнюю цифру числа, для чего определяем остаток от деления исходного числа на 10: i = n % 10, 3. добавляем в сумму найденную цифру: s = s + i, 4. уменьшаем число в 10 раз: n = n / 10, 5. повторяем цикл до тех пор, пока n!= 0. Схема алгоритма:
Программа: int i, n, s = 0; String input; input=JOptionPane.showInputDialog("Введите целое положительное число:"); n=Integer.parseInt(input); Do { i = n % 10; s+=i; n /= 10; } while (n!= 0); System.out.printf(“/ns=%d”,s); 3. ввести с клавиатуры по одному последовательность целых чисел (конец последовательности – число 0). Определить их сумму, максимальное и минимальное число, количество введенных чисел и их среднее арифметическое. Пусть s – искомая сумма, min, max – минимальное и максимальное из введенных чисел, count – количество введенных чисел, sred – среднее арифметическое, n – очередное число. Тогда алгоритм решения задачи можно описать следующим образом: a. обнуляем сумму s = 0, b. вводим первое число n, c. если оно не равно нулю, то · принимаем его значение за min и max · количество введенных чисел count = 1 · увеличиваем сумму на введенное число s = s + n · входим в цикл ввода: d. вводим очередное число n, если оно не равно нулю, то · количество введенных чисел увеличиваем на 1: count = count+1 · увеличиваем сумму на введенное число s = s + n · если оно меньше min, то min = n, · если оно больше max, то max = n, e. повторяем цикл до тех пор, пока n # 0 – это и будет условием продолжения цикла. Создадим интерфейс этой задачи – взаимодействие программы с пользователем, то есть что должно выводиться на экран: Первое число: 3 Очередное число: 8 Очередное число: 1 Очередное число: -2 Очередное число: 0 Сумма = 10 Количество чисел = 4 min = -2 max = 8 Среднее арифметическое = 2.50 Программа int min, max, n, count = 0; double sred, s = 0.0; String input; input=JOptionPane.showInputDialog("Введите первое число:"); n=Integer.parseInt(input); if (n==0) //если введено число 0, то return 0; //выход из программы с результатом 0 //иначе min = n; // за минимум и максимум принимаем max = n; //первое введенное число count = 1; //введено одно число s += n; // в сумме – введенное число do (n!=0) { input=JOptionPane.showInputDialog("Введите очередное число:"); n=Integer.parseInt(input); if (n==0) Break; count++; s += n; if (n > max) max = n; if (n < min) min = n; } while(n!=0); System.out.printf(“\nСумма = %4.2f”, s); System.out.printf(“\nКоличество чисел = %d”, count); System.out.printf(“\nmin = %d”, min); System.out.printf(“\nmax = %d”, max); sred = (double)s/count; System.out.printf(“\n Среднее арифметическое = %6.2f”,sred); Схема алгоритма:
4. вычислить s – сумму членов бесконечного ряда: s = 1 + x/ 1! + x2 / 2! + x3 / 3! + … + xk / k! + … с погрешностью ε0. Каждый последующий член ряда можно определить через предыдущий, используя рекуррентную формулу: yk+1 = yk·x / k Текущая погрешность вычислений ε определяется последним просуммированным членом ряда: ε =|yn| Эту погрешность необходимо сравнить с заданной погрешностью ε0 для реализации условия окончания суммирования: - если ε > ε0, то заданная точность еще не достигнута, и суммирование ряда необходимо продолжить, прибавив к имеющейся сумме еще один член, - если ε <= ε0, то заданная точность достигнута, и суммирование необходимо прекратить. Пусть s – искомая сумма, y – очередной член ряда, k - номер члена ряда, eps_0 – заданная точность вычислений, x – вводимый аргумент. Программа: Public final double EPS_0 = 0.001; int k = 0; Double x, y, s; String input; input=JOptionPane.showInputDialog("x="); x=Double.parseDouble(input); y = 1.0; // первый член ряда s = y; // в сумме – он же Do { k++; // номер члена ряда увеличиваем на единицу y *= x / k; // очередной член ряда s += y; // добавляем его в сумму } while (Math.abs(y)>EPS_0); System.out.printf(“\nСумма = %5.3f”, s); Схема алгоритма:
Циклы с постусловием обычно используются в фильтрах входных данных – исходные данные вводятся до тех пор, пока они не будут корректными, а некорректные исходные данные отвергаются. Пример: по введенному месяцу года определить количество дней в нем. Схема фильтра (month – номер месяца)
Программа: Int month; String input; Do { input=JOptionPane.showInputDialog("Введите номер месяца:"); month=Integer.parseInt(input); } while ((month < 1) || (month > 12)); Switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: System.out.printf(“\n31 день”); Break; case 4: case 6: case 9: case 11: System.out.printf(“\n30 дней”); Break; case 2: System.out.printf(“\n28 дней”); Break; default: System.out.printf(“\nТакого месяца нет\n”); } Циклы с пред - и пост условиями используются тогда, когда заранее неизвестно количество их повторений (итераций). Во всех остальных случаях используются циклы с параметром.
Циклы с параметром Управление работой циклов с параметром осуществляется не только условием, но и значением специальной переменной – параметра цикла (счетчика). Циклы этого типа получили наиболее широкое распространение в алгоритмических языках. Схему цикла с параметром можно представить в следующем виде:
где x – параметр цикла – любая переменная, x_нач – его начальное значение, x_кон – его конечное значение, x_шаг – шаг его изменения (не только целое число). В Java циклы с параметром реализуются оператором цикла: Не нашли, что искали? Воспользуйтесь поиском:
|