Лабораторная работа 1
Цель работы: научиться правильно использовать различные операторы циклов; научиться составлять программы решения задач с использованием циклических структур.
Основные сведения
В программах часто возникает необходимость повторять один и тот же фрагмент многократно в зависимости от истинности некоторого условия. Конструкции, существующие для этой цели, называются операторами цикла. В большинстве языков программирования (Java не исключение) существует несколько разных операторов цикла для разных нужд. Простейший оператор цикла в Java — оператор цикла while. Его синтаксис следующий: while(условие) оператор Здесь условие - выражение, имеющее логический результат; оператор называется телом цикла; как и в случае условного оператора, он может быть составным. Работает оператор цикла while следующим образом: сначала проверяется условие. Если оно ложно, на этом выполнение оператора цикла и заканчивается. Если же оно истинно, выполняется тело цикла, а затем снова проверяется условие, и так до тех пор, пока условие не окажется ложным, на чем оператор цикла while заканчивает свою работу. Однократное выполнение тела цикла называется одной итерацией цикла; цикл может иметь сколько угодно итераций от 0 и до бесконечности в зависимости от его тела и условия. Пример. Напишем программу, которая вводит с клавиатуры целые числа и вычисляет их сумму до тех пор, пока не будет введено число 0. В этом случае программа печатает вычисленную сумму и завершается. Текст метода «main» приведен ниже:
public static void main(String[] args) {
Scanner S = new Scanner(System.in);
int sum = 0 , x;
x = S.nextInt();
while (x != 0)
{ sum = sum + x;
x = S.nextInt(); }
System.out.println("Sum = "+sum); }
Пример. Напишем программу, которая вводит с клавиатуры оценки (целые числа от 2 до 5) до тех пор, пока не будет введено число 0, и вычисляет среднюю оценку. Текст метода «main» приведен ниже:
public static void main(String[] args) {
Scanner S = new Scanner(System.in);
int sum = 0, count = 0, x;
x = S.nextInt(); while(x != 0)
{ sum = sum + x;
count = count + 1;
x = S.nextInt(); }
System.out.println("Average = "+sum/count); }
Следующий вариант оператора цикла по входящим в его запись ключевым словам называется «do-while» и имеет следующий синтаксис: do оператор while(условие); Этот оператор аналогичен предыдущему с той только разницей, что в нем условие проверяется после выполнения тела цикла, и, следовательно, тело всегда выполняется по крайней мере один раз, т. е. такой цикл всегда имеет по крайней мере одну итерацию. Бывают ситуации, когда условие выхода из цикла должно проверяться не в начале и не в конце цикла, а где-то в середине. Для этого используется уже знакомый нам оператор break; (он встречался в операторе выбора), который может прерывать не только тело оператора выбора, но и операторов цикла. Также, здесь используется конструкция, называемая бесконечным циклом (while (true)). Пример. Перепишем программу, которая вводит с клавиатуры целые числа и вычисляет их сумму до тех пор, пока не будет введено число 0. На этот раз будем проверять условие прекращения цикла в его середине при помощи условного оператора и оператора break;. Текст метода «main» приведен ниже:
public static void main(String[] args) {
Scanner S = new Scanner(System.in);
int sum = 0 , x;
while(true) {
x = S.nextInt();
if(x == 0) break;
sum = sum + x; }
System.out.println("Sum = "+sum); }
Поскольку в данном случае условие в операторе цикла всегда истинно, он может быть прерван только при помощи оператора break;. Кроме break;, есть еще один оператор, связанный с операторами цикла. Это оператор continue;. Его выполнение вызывает немедленный переход к следующей итерации, что для циклов while и do-while означает переход к проверке условия. Пример. Перепишем еще раз программу, которая вводит с клавиатуры целые числа и вычисляет их сумму до тех пор, пока не будет введено число 0. Но на этот раз в сумму будут входить все числа кроме восьмерок. Текст метода «main» приведен ниже:
public static void main(String[] args) {
Scanner S = new Scanner(System.in);
int sum = 0 , x;
while(true) {
x = S.nextlnt();
if(x == 0) break;
if(x == 8) continue;
sum = sum + x; }
System.out.println("Sum = "+sum); }
Конечно, мы могли бы вместо последних двух строк в теле цикла обойтись одной if(x != 8) sum = sum + х; но в более сложных случаях оператор continue; позволяет уменьшить глубину вложения операторов друг в друга, что приводит к улучшению читаемости программы. Наконец, последняя разновидность оператора цикла в Java — цикл for. Этот цикл сам по себе имеет две разновидности; одну из них мы обсудим сейчас, а другую - тогда, когда речь пойдет о массивах. Итак, синтаксис рассматриваемой разновидности цикла for имеет вид: for(инициализация; условие; переход) оператор Здесь инициализация - либо выражение, либо декларация переменной; она описывает действия, выполняемые до начала работы цикла. Если это декларация переменной, то такая переменная существует только в пределах данного цикла, и за его пределами пользоваться этой переменной нельзя. Условие - это условие продолжения цикла и смысл его такой же, как и в цикле while (оно проверяется перед каждой итерацией). Переход - выражение, вычисляемое после каждой итерации для перехода к следующей. Наконец, оператор - тело цикла. Оператор цикла for обычно используется в тех случаях, когда надо перебрать элементы какой-то последовательности. В простейшем случае перебирается диапазон целых чисел от одного заданного числа до другого. Пример. Напишем программу, которая печатает таблицу функции синус для значений параметра от 0 до 1 с шагом 0.1. Текст метода «main» приведен ниже:
public static void main(String[] args) {
int i;
double x;
for(i = 0; i <= 10; i = i+1)
{ x = i*0.1;
System.out.println("sin("+x+")="+Math.sin(x)); } }
Здесь перед началом работы цикла в переменную i записывается значение 0. Цикл выполняется, пока значение переменной i не превосходит 10. После каждой итерации значение i увеличивается на 1, а сама итерация состоит в вычислении значения аргумента для синуса и записи его в переменную х, и затем вывода строки, содержащей значения аргумента и его синуса. Пример. Напишем программу, которая вводит 5 вещественных чисел с клавиатуры и вычисляет максимальное из них. Текст метода «main» приведен ниже:
public static void main(String[] args) {
Scanner S = new Scanner(System.in);
int i;
double x;
double max;
max = S.nextDouble();
for(i = 1; i < 5; i = i+1) {
x = S.nextDouble();
if(x>max) max = x; }
System.out.println("Maximum = "+max); }
Здесь применен весьма распространенный прием построения алгоритмов (детерминированных способов решения определенных классов задач), известный как динамическое программирование. У нас имеется задача с параметром, равным 5, которую нам надо решить. Для этого мы находим решение задач с меньшими значениями параметра, из которых строим решение нашей задачи. Для задачи с минимальным значением параметра (одно число) решение очевидно - если число всего одно, оно и есть максимум. Этот факт отражен в строке непосредственно перед оператором цикла. Если теперь наша задача решена для i чисел, и max - наибольшее из них, то для того, чтобы решить задачу для i+1 чисел нужно ввести новое число. Если оно больше max, то нужно записать его в переменную max, что и делается в цикле. Пример. Напишем программу, которая вводит с клавиатуры целое число n, затем n вещественных чисел и вычисляет их среднее значение. Текст метода «main» приведен ниже:
public static void main(String[] args) {
Scanner S = new Scanner(System.in);
int i,n;
double x, sum = 0;
n = S.nextInt();
for(i = 0; i < n; i = i+1) {
x = S.nextDouble();
sum = sum + x; }
System.out.println("Average = "+sum/n);
import java.util.Scanner;
public class Program {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
System.out.printf("%d\t", i * j);
}
System.out.println();
}
}
}
Задание
Do'stlaringiz bilan baham: |