Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Бип из системно... 61046
Организация зап... 58707
Invision Power ... 58705
Приложение «Про... 57161
Модуль Forms 57126
Оператор выбора... 56629
Создание отчето... 56091
Подключение Mic... 56072
ТЕХНОЛОГИИ ДОСТ... 52308
Программируемая... 49801
Пример работы с... 48146
Имитационное мо... 47849
21 ошибка прогр... 42791
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,022
новичок: igra87
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

моделирование процесса поступления заявок в ЭВМ на GPSS + Пояснительная ...
Моделирование станции технического обслуживания на GPSS + Отчет
Лабораторная работа по динамическим спискам на Turbo Pascal (перемещение...

Реклама

Вариант For-Each цикла for
Современная теория программирования использует цикл for-each. Он разработан для циклической обработки объектов коллекции, такой как массив, в строгой последовательности, от начала к концу. Благодаря удобному способу обработки, предложенному циклом for-each, этот вид цикла быстро превратился в средство, необходимое программистам. Более ранние версии языка Java не поддерживали цикл for-each, но в версию Java 2 5.0 он включен. Это расширение языка наверняка порадует всех, пишущих на языке Java.
В отличие от некоторых языков программирования, таких как С#, в котором цикл for-each реализован с помощью ключевого слова for-each. Java включает функциональные возможности цикла for-each, усовершенствуя оператор цикла for. Преимущество такого подхода заключается в том, что не требуется нового ключевого слова и не нарушается работоспособность разработанного ранее кода. Цикл for в стиле for-each (т. е. наделенный функциональными возможностями цикла for-each) иногда называют улучшенным циклом for (enhanced for loop) и в книге будут использоваться оба эти термина.
Описание цикла for-each
Общая форма записи цикла for в стиле for-each приведена в следующей строке:
foritype itr-var : iterableObj) statement-block
Здесь type— тип, a itr-var— имя переменной цикла (iteration variable), которая будет получать элементы, содержащиеся в iterabieObj, последовательно один за другим от начала к концу. Объект, на который ссылается переменная iterabieObj, должен быть массивом или объектом, реализующим новый интерфейс Iterable. В любом случае тип type должен совпадать (или быть совместимым) с типом элементов, извлекаемых из объекта iterableObj. Таким образом, в случае циклической обработки массива type должен быть совместим с базовым типом массива. В каждом проходе тела цикла извлекается очередной элемент объекта iterabieObj и запоминается в переменной itr-var. Цикл выполняется до тех пор, пока не будут извлечены все элементы.
Для того чтобы понять принцип действия цикла for-each, рассмотрим, как работает цикл for, для замены которого и был разработан цикл for-each.
В приведенном далее фрагменте используется традиционный цикл for для подсчета суммы значений, хранящихся в элементах массива:
int nums[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = 0;
for (int i=0, i < 10; i++) sum +=nums{};




Для вычисления суммы считывается каждый элемент в массиве nums, начиная с первого и заканчивая последним. Следовательно, массив целиком читается строго последовательно. Эта операция выполняется вручную с помощью индексирования nums переменной i, управляющей переменной цикла. Более того, приходится явно задавать начальное и конечное значения управляющей переменной цикла, а также ее приращение.
Цикл for стиля for-each автоматизирует приведенный в предыдущем примере цикл. А именно, он устраняет необходимость устанавливать счетчик цикла, задавая начальное и конечное значения, и вручную индексировать массив. Вместо этого он автоматически проходит весь массив, получая поочередно каждый элемент, начиная с первого и заканчивая последним. Далее приведен переписанный предыдущий пример с использованием цикла for в стиле for-each:
int nums[] = {1, 2, 3, 4, 5, б, 7, 8, 9, 10 };
int sum = 0;
for(int x: nums) sum += x;



B каждом проходе тела цикла переменная х получает значение из следующего элемента массива nums. Таким образом, во время первого прохода переменная цикла х содержит значение 1, во время второго — значение 2 и т. д. При этом не только упрощается синтаксис, но и устраняются ошибки выхода за границы диапазона (boundary errors).
В листинге 4.1 приведена целиком программа, демонстрирующая подсчет суммы элементов массива с помощью цикла for в стиле for-each.

Листинг 4.1. Применение цикла for в стиле for-each
class ForEach {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = 0;
// use for-each style for to display and sum the values
for(int x : nums) {
System.out.println("Value is: " + x);
sum += x;
}
System.out.println("Summation: " + sum);
}
}





Далее приведен вывод результатов работы программы из листинга 4.1:
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Value is: 6
Value is: 7
Value is: 8
Value is: 9
Value is: 10
Summation: 55




Как показывает вывод программы, цикл for в стиле for-each автоматически обрабатывает массив в цикле от наименьшего значения индекса до наибольшего его значения.
Несмотря на то, что цикл for в стиле for-each повторяется до тех пор, пока не обработаны все элементы массива, можно прервать его с помощью оператора break. В листинге 4.2 приведена программа, суммирующая только первые пять элементов массива nums.

Листинг 4.2. Применение оператора break в цикле for в стиле for-each
class ForEach2 {
public static void main(String args[]) {
int sum = 0;
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// Use for to display and sum the values.
for(int x : nums) {
System.out.println("Value is: " + x);
sum += x;
if(x == 5) break; // stop the loop when 5 is obtained
}
System.out.println("Summation of first 5 elements: " + sum);
}
}



Далее приведен вывод результатов работы программы из листинга 4.2:
Value is: 1
Value is: 2
Value is: 3
Value is: 4
Value is: 5
Summation of first 5 elements: 15



Ясно, что цикл for прерывается после получения пятого элемента массива.
У цикла for-each есть важная особенность. Его переменная цикла доступна только для чтения (read-only), так как она связана с обрабатываемым массивом. Другими словами, Вы не можете изменить содержимое массива, присваивая переменной цикла новое значение. Рассмотрим пример, приведенный в листинге 4.3.

Листинг 4.3. Цикл for-each по существу доступен только для чтения
class NoChange {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

for(int x : nums) {
System.out.print(x + " ");
x = x * 10; // no effect on nums
}

System.out.println();

for(int x : nums)
System.out.print(x + " ");

System.out.println();
}
}



В первом цикле for значение переменной цикла увеличивается с помощью множителя 10. Однако это присваивание никак не влияет на содержимое обрабатываемого в цикле массива nums, что иллюстрирует второй цикл for в листинге 4.3, а также приведенный далее вывод результатов работы программы:
12345678910
12345678910



Опубликовал Kest January 13 2009 11:52:36 · 3 Комментариев · 32582 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Прохожий December 15 2013 02:59:35
Правильно ли я понимаю, или всё же логичнее было бы..:
Листинг 4.1. Применение цикла for в стиле for-each
class ForEach {
public static void main(String args[]) {
int nums[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum = 0;
// use for-each style for to display and sum the values
for(int x : nums) {
System.out.println("Value is: " + x); // В данной строке*
sum += x;
}
System.out.println("Summation: " + sum);
}



Написать не:
System.out.println("Value is: " + x);



а:
System.out.println("Value is: " + nums[x]);



для того, чтобы сохранить наглядность?
Всё тот же прохожий December 15 2013 03:01:08
Нет, не правильно. Написанный мною комментарий выше - чушь smiley
Пардон.
Марина February 11 2017 15:08:06
for(int x : nums) {
System.out.println("Value is: " + x);
sum += x;
if(x == 5) break; // stop the loop when 5 is obtained
}

В этом случаем суммирование прекращается не после пятого элемента, а после элемента который равен 5!
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
LaserTank [Исходн...
XPButtons
MiniTetris [Исход...
INSTANT BOOSTER v...
Архив Апгрейтов с...
Srinilist
C++ Builder 6 СПР...
Dealer
CoolHints2k v1.03
PCXReader. Програ...
Swing. Эффектные...
Андрей Боровский....
Пример клиента ФТ...
Tenis [Исходник н...
UmEdit
Bitmap [для кнопок]
CoolDev TipsSyste...
C++ Builder: Книг...
ShadelLabel
Delphi 7 Enterpri...

Топ загрузок
Приложение Клие... 100308
Delphi 7 Enterp... 78116
Converter AMR<-... 20021
Borland C++Buil... 10700
GPSS World Stud... 9304
Borland Delphi ... 7677
Turbo Pascal fo... 6885
Visual Studio 2... 4906
Калькулятор [Ис... 4007
FreeSMS v1.3.1 3486
Случайные статьи
Если нажать левую ...
Каналы и файлы FIFO
Использование слух...
14.7. Дополнительн...
Программа выбора н...
Надстройки над OpenGL
Согласование актив...
Описание сети масс...
анне Тип Choices о...
База данных на осн...
Диалоговое окно Ed...
Урок 1. Урок рисов...
Параметры шаблона ...
Структура наследов...
Вычисление суммы ч...
Когда локализация ...
Измерение длительн...
Описание кодировки...
МИФЫ О НОРМАЛИЗАЦИИ
Применение фреймов
Ассоциативные масс...
Массивы
Счетчики ссылок
Стандартный маршал...
Другой способ пере...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?