Цикл с постусловием: do
{
...
}while ( условие );
Параметрический цикл:
for ( инициализация; условие; приращение )
{
...
}
Во всех циклах, как и в операторе if, условие должно иметь тип bool.
Алгоритмизация обработки одномерных массивов
Массив – это индексированный набор объектов одного типа. Массив может хранить элементы любого типа, но для всех элементов массива тип должен быть одним и тем же.
Объявление массивов Объявление массивов имеет следующий синтаксис:
Тип[] имя-массива.
Например:
int[] myIntArray;
Квадратные скобки ([ ]) сообщают компилятору С#, что определяется массив, а тип указывает тип элементов этого массива. В примере, приведенном выше, myIntArray является целочисленным массивом.
Экземпляр массива создается ключевым словом new. Например: myIntArrsy = new int[5];
Это объявление отводит память для массива, состоящего из пяти целых чисел.
В языке С# массивы относятся к ссылочным типам, объекты которых создаются в куче. Соответственно, массив myIntArray находится в куче. Элементы массива размещаются в соответствии с их типами. Целочисленный тип относится к размерным типам, поэтому элементы массива myIntArray будут иметь размерный тип, а не упакованный целочисленный тип. Массив элементов, имеющих ссылочный тип, будет содержать только ссылки на элементы, размещенные в куче.
Значения по умолчанию Когда создается массив элементов, имеющих тип значения, каждый
элемент первоначально содержит значение, устанавливаемое по умолчанию для данного типа (см. таблице 3). Вышеуказанное объявление создает массив из пяти целых, причем каждому элементу присваивается нулевое значение, устанавливаемое по умолчанию для переменных типа int.
46
Таблица 3 Базовые типы и их значения по умолчанию
Типы |
Значения по умолчанию |
Числовые (int, long и т. д.) |
0 |
bool |
false |
char |
‘\0’, (null) |
string |
"" |
enum |
0 |
Ссылочные |
null |
В отличие от массивов с элементами размерных типов, элементы массива, имеющие ссылочный тип, не инициализируются значениями по умолчанию. Вместо этого им присваивается значение null. Если попытаться обратиться к элементу массива, элементы которого имеют ссылочный тип до его явной инициализации, будет вызвано исключение.
Обращение к элементам массива Программист обращается к элементам любого массива с помощью
операции индексирования ([ ]). Нумерация элементов массива начинается с нуля, иными словами, индекс первого элемента массива всегда имеет нулевое значение.
Инициализация элементов массива Содержимое массива можно инициализировать в момент создания
экземпляра массива, указав в фигурных скобках список начальных значений. В языке С# существует два синтаксических варианта этого действия, полный и сокращенный:
int[] myIntArray = new int[5] {2, 4, 6, 8, 10}; int[] myIntArray = {2, 4, 6, 8, 10};
Между ними нет никакой разницы, и большинство программистов предпочитают короткий вариант.
//создание массива из 10 элементов типа int
//все элементы массива инициализируются нулями int [] intArray = new int [10];
Цикл foreach
Данный оператор позволяет перебрать все значения в массиве или в классе-коллекции. Например, если arr - массив, а N - его длина, то вывести на экран значения элементов массива можно следующими способами (рассматриваются циклы for и foreach):
for(int i = 0; i < N; i++) Console.WriteLine("{0} ", arr[i]);
и
foreach(int i in arr) // знать длину массива не
// обязательно
Console.WriteLine("{0} ", i);
47
Примечание: параметр цикла в блоке операторов, следующих за foreach, доступен только для чтения.
foreach(int i in arr) // знать длину массива не
// обязательно
i++; // Ошибка
Инициализация одномерных массивов
// создание + инициализация
int [] arr1 = new int[] {0, 3, 7, 17, 25};
//создание + инициализация (укороченный вариант) int [] arr2 = {0, 3, 7, 17, 25};
//Можно объявить массив без инициализации
int [] arr3;
//Но его нельзя использовать, пока он не создан
//с помощью оператора new
/*
arr3[0] = 0; // Ошибка
arr3 = {0, 3, 7, 17, 25}; // тоже ошибка */
arr3 = new int [] {0, 3, 7, 17, 25}; // правильно arr3[0] = 10; // правильно
//Инициализация массива длины N случайными числами в
//диапазоне [a,b] с использованием параметрического
//цикла for
int N = Convert.ToUInt32(Console.ReadLine()); int [] arr4 = new int[n];
// Инициализация генератора случайных чисел: Random rand = new Random();
for(int i = 0; i < N; i++)
arr4[i] = a + rand.Next(b - a); // инициализация
// массива
Console.Write("{0,8}", arr4[i]); // и вывод на
// консоль
Пример 2. Одномерный массив.
Программа подсчитываем количество четных и нечетных элементов в массиве. Все элементы массива задаются случайным образом в диапазоне от 0 до 999. Длина массива вводится с клавиатуры. В случае возникновения исключительной ситуации длина массива определяется равной 10. Листинг программы представлен ниже, результаты выполнения представлен на рис. 13.
48
Листинг 2. Реализация алгоритма обработки массива (см. пример 2) using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
namespace Lab_4
{
class Program
{
static void Main(string[] args)
{
// Количество элементов uint n = 0;
Console.Write("Введите кол-во элементов
массива: ");
// ОБРАБОТКА ИСКЛЮЧИТЕЛЬНОЙ СИТУАЦИИ try
{
// Ввод количества элементов с клавиатуры n = Convert.ToUInt32(Console.ReadLine());
}
catch (OverflowException ex)
{
// В случае переполнения
Console.WriteLine(ex.Message + " Default
size (=10)");
}
catch (FormatException ex)
{
// В случае ошибочного ввода
Console.WriteLine(ex.Message + " Default
size (=10)");
}
// Если n = 0, то создадим массив из 10
элементов
if (n == 0) n = 10;
//Создание массива int[] ar = new int[n];
//Инициализация генератора случайных чисел
Random rand = new Random();
49
for (int i = 0; i < n; i++)
{
// Инициализация массива случайными числами
// от 0 до 999
ar[i] = rand.Next(1000);
// Вывод i-го элемента на консоль
Console.Write("{0,8}", ar[i]);
}
Console.WriteLine();
//Счетчики четных и нечетных чисел int odd = 0, even = 0;
//Бежим по массиву
foreach (int i in ar)
{
if (i % 2 == 0) ++even;
else
++odd;
}
// Вывод результатов подсчета
Console.WriteLine("Четных чисел: {0}\nНечетных: {1}", even, odd);
Console.ReadKey();
}
}
}
Рис. 13. Консоль с результатами выполнения программы с листинга 2
50