Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КНЕУ.doc
Скачиваний:
24
Добавлен:
07.03.2016
Размер:
3.9 Mб
Скачать

6.6. Оператор foreach

Оператор foreach застосовується для перебору елементів в організованій групі даних. Масив є саме такою групою. Зручність цього циклу полягає в тому, що не потрібно визначати кількість елементів в групі і виконувати їх перебір по індексу. Синтаксис оператора:

foreach (тип ім'я in вираз ) тіло_циклу

Ім'я задає локальну по відношенню до циклу змінну, яка по черзі набуватиме всіх значень з масиву. В якості виразу найчастіше застосовується ім'я масиву. У простому або складеному операторові, що є тілом циклу, виконуються дії із змінною циклу. Тип змінної повинен відповідати типу елементу масиву.

Наприклад, заданий масив:

int[] а = {24, 50, 18, 3, 16, -7, 9, -1 };

Виведення цього масиву на екран за допомогою оператора foreach виглядає таким чином:

foreach (int х in а ) Console.WriteLine( х );

У лістингу 6.8 вирішується те ж завдання, що і в лістингу 6.1, але з використанням циклу foreach. Зверніть увагу на те, наскільки зрозуміліше стала програма.

Лістинг 6.8. Робота з одновимірним масивом з використанням циклу foreach

using System;

namespace ConsoleApplication1

{

class Classl

{

static void Main( )

{

const int n = 6;

int[] a = new int[n] {3, 12, 5, -9, 8, -4};

Console.WriteLine("Исходный массив:");

foreach ( int elem in a )

Console.Write( "\t" + elem );

Console.WriteLine( );

long sum = 0; // сума від’ємних елементів

int num = 0; // кількість від’ємних елементів

foreach (int elem in a )

if ( elem < 0 )

{

sum += elem;

num ++;

}

Console.WriteLine( "Сума від’ємних елементів= " + sum );

Console.WriteLine("Кількість від’ємних елементів = " + num);

int max = a[0]; // максимальний елемент

foreach ( int elem in a )

if ( elem > max ) max = elem;

Console.WriteLine("Максимальний елемент = " + max );

}

}

}

Обмеженням оператора foreach є те, що з його допомогою можна тільки переглядати значення в групі даних, але не змінювати їх.

6.7. Масиви об’єктів

При створенні масиву, що складається з елементів посилального типу, пам'ять виділяється тільки під посилання на елементи, а самі елементи необхідно розмістити в хіпові явним чином. Як приклад створимо масив з об'єктів деякого класу Monster:

using System;

namespace ConsoleApplication1

{

class Monster

{

string name; // закриті поля

int health, ammo;

public Monster()

{

this.health = 100;

this.ammo = 100;

this.name = "Noname";

}

public Monster(string name)

: this()

{

this.name = name;

}

public Monster(int health, int ammo, string name)

{

this.health = health;

this.ammo = ammo;

this.name = name;

}

public int Health

{

get

{

return health;

}

set

{

if (value > 0) health = value;

else health = 0;

}

}

public int Ammo

{

get

{

return ammo;

}

set

{

if (value > 0) ammo = value;

else

ammo = 0;

}

}

public string Name

{

get

{

return name;

}

}

public void Passport()

{

Console.WriteLine("Monster {0} \t health = {1} ammo = {2}",

name, health, ammo);

}

}

class Classl

{

static void Main()

{

Random rnd = new Random();

const int n = 5;

Monster[] stado = new Monster[n]; // 1

for ( int i = 0; i < n; i ++) // 2

{

stado[i ] = new Monster( rnd.Next( 1, 100 ),

rnd.Next( 1, 200 ) , "Crazy" + i .ToString() );

}

foreach ( Monster x in stado ) x.Passport(); // 3

}

}

}

Результат роботи програми:

Monster

Crazy0

health =

18

ammo =

94

Monster

Crazyl

health =

85

ammo =

75

Monster

Crazy2

health =

13

ammo =

6

Monster

Crazy3

health =

51

ammo =

104

Monster

Crazy4

health =

68

ammo =

114

У операторові 1 виділяється п'ять елементів пам'яті під посилання на екземпляри класу Monster. Ці посилання заповнюються значенням null. У циклі 2 створюються п'ять об'єктів. Цикл 3 демонструє зручність застосування оператора foreach для роботи з масивом.