3. Массивы в c#
TRANSCRIPT
Высшая школа экономики, Москва, 2013
www.hse.ru
Язык программирования C# и платформа
.NET.
Массивы
Многомерные массивы
Максименкова Ольга ВениаминовнаСтарший преподаватель
Кафедра управления разработкой программного обеспечения
МАССИВЫ
• Одномерные массивы
• Обработка одномерных массивов
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
Ссылочный тип данных
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
имя_переменной значение_адреса_данных значение_данных
Объекты ссылочных типов размещаются в «куче»
[manager heap]
Если ссылка не связана с данными, то ее значение - null
Одномерные массивы
имя_ссылки_на_массив[индексирующее_выражение]
тип[ ] имя_ссылки
Операция индексирования
Объявление ссылки на массив
Объявление ссылки на
массив
Инициализация элементов
массива
Работа с элементами
массива
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
Создание экземпляра
массива
Создание экземпляра объекта конкретного типа
new тип[размер_массива]
Допустимо объединение
Одномерные массивы
Объявление ссылки
Описание с инициализацией
Описание и последующая инициализация
int[ ] intArr; // ссылка на целочисленный массив
double[ ] arr; // ссылка на вещественный массив
int[ ] intArr = { 1, 3, -8, 19, 0, 11 };
double[ ] arr = { 3.14, 0.0, 0.5 };
// ссылка
int[ ] intArr;
// выделение памяти
intArr = new int[5];
intArr[0] = -1;
intArr[1] = 12;
intArr[2] = 34;
intArr[3] = -23;
intArr[4] = 78;
int[ ] intArr; // ссылка
intArr = new int[5]; // выделение памяти
for (int i = 0; i < 5; i++) {
intArr[i] = i * i - 1;
Console.Write(intArr[i] + " ");
}
ФПК учителей НИУ ВШЭ 06.2013, Максименкова О.В.
Цикл foreach
foreach (тип идентификатор in ссылка)
{
<тело_цикла>
}
int[ ] arInt = { 22, 5, 12, 63, -6, -52, 77, 41, 35, 23 };
foreach (int memb in arInt)
Console.Write(memb + " ");
for (int i = 0; i < arInt.Length; i++)
Console.Write(arInt[i] + " ");
Сравните:
По memb доступно
только значение
элемента
arInt[i] – доступ к значению
i – индекс элемента
Случайные числа
7
Предыдущее число
Датчик
Новое случайное
число
Random ran = new Random(start);
Random ran = new Random();
Ссылка на
объект-
датчик
Объект-
датчик
случайных
чисел
В 1-м случае, когда в ran заносится стартовое число start. Если его не
изменять, то при повторных запусках программы датчик всегда будет
выдавать одну и туже последовательность случайных чисел.
Во 2-м случае в датчик ran заносится число, зависящее от текущего значения
системного времени - при повторных запусках программы датчик будет
выдавать разные последовательности случайных чисел.
http://msdn.microsoft.com/ru-ru/library/system.random(v=VS.95)
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Методы получения случайного числа
int Next () 0≤X<int.MaxValue
int Next (int B) 0≤X<B
int Next(int A, int B) A≤X<B
double NextDouble () 0≤X<1
Получение случайного вещественного числа X из
нужного диапазона A≤X<B:
X = A + (B-A) * ran.NextDouble()
или
X = ran.Next((int)A, (int)B) + ran.NextDouble()
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
/* Определить и инициализировать целочисленный массив из 10-ти
элементов. Ввести целое число и заменить им значение
максимального элемента. Окончание работы - ввод нулевого
числа.*/
using System;
class Program {
static void Main() {
int[ ] arInt = { 22, 5, 12, 63, -6, -52, 77, 41, 35, 23 };
int numb;
Console.Title = "Инициализация массива";
do { // цикл для повторения ввода числа
Console.WriteLine();
Console.WriteLine("Для выхода нажмите клавишу ESC");
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
}
}
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Замена максимального элемента
do Console.Write("Введите целое число: ");
while (!int.TryParse(Console.ReadLine(), out numb));
int index = 0; // индекс максимального элемента массива
for (int i = 0; i < arInt.Length; i++) // поиск
if (arInt[i] > arInt[index]) index = i;
Console.WriteLine("Заменяем arInt[{0}]={1} на {2} ",
index, arInt[index], numb);
arInt[index] = numb; // замена значения
for (int i = 0; i < arInt.Length; i++)
if ((i + 1) % 10 != 0)
Console.Write(arInt[i] + "\t");
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Замена максимального элемента
Описание одномерного массива
double[ ] dbArr; // описание ссылки на массив
dbArr = new double[10]; // определение массива из 10-ти элементов
int[ ] intArr = new int[15];
// элементы массива могут иметь ссылочный тип
string[ ] strArr = new string[3];
Решите самостоятельно:
1. Пользователем с клавиатуры вводится целое число N > 0.
Сформировать и вывести на экран целочисленный массив из N
элементов, элементами которого являются нечетные числа от 1.
2. Пользователем с клавиатуры вводится целое число N > 1.
Сформировать целочисленный массив, содержащий N первых
элементов последовательности Фибоначчи: A[0] = 1, A[1] = 1, A[2] = A[0]
+ A[1], … A[K] = A[K-1] + A[K-2], … Элементы массива вывести на экран
в обратном порядке, методы класса Array не использовать.
// описание с инициализацией
int[ ] intArr = {1, 0, 1};
ФПК учителей НИУ ВШЭ 11.2012, Максименкова О.В.
Методы класса Array
/* Клонирование массива. */
using System;
class Program {
static void Main() {
char[ ] hi = { '1', 'A', '2', 'B', '3', 'C', '4', 'D', '5', 'E‘ };
char[ ] hiNew = (char[ ])hi.Clone(); // копирование
Array.Sort(hiNew); // сортировка
Console.Write("Сортировка: ");
foreach (char ch in hiNew) // вывод значений массива
Console.Write("" + ch);
Console.WriteLine();
Array.Reverse(hiNew); // реверсирование
Console.Write("Реверсирование: ");
foreach (char ch in hiNew)
Console.Write("" + ch);
Console.WriteLine();
Console.Write("Исходный массив: ");
foreach (char ch in hi)
Console.Write("" + ch);
Console.WriteLine();
}
} ФПК учителей НИУ ВШЭ 11.2012, Максименкова О.В.
/* Определить и инициализировать целочисленный массив из 10-ти
элементов. Упорядочить его элементы по возрастанию значений, методом
Sort(). Ввести целое число и методом двоичного поиска найти номер
элемента с этим значением в упорядоченном массиве.*/
using System;
class Program {
static void Main() {
int[ ] arInt = { 22, 5, 12, 63, -6, -52, 77, 41, 35, 23 };
int numb;
Console.Title = "Двоичный поиск в массиве";
Array.Sort(arInt); // Сортировка (упорядочение массива)
Console.WriteLine("Упорядоченный массив: ");
foreach (int memb in arInt) // Перебор значений элементов
Console.Write(memb + " ");
Console.WriteLine();
do {// цикл для повторения ввода числа
Console.WriteLine("Для выхода нажмите клавишу ESC");
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
}
}
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Бинарный поиск
do Console.Write("Введите целое число: ");
while (!int.TryParse(Console.ReadLine(), out numb));
int index = -1; // индекс найденного элемента массива
// Алгоритм двоичного поиска в упорядоченном массиве:
for (int i = 0, j = arInt.Length - 1, k = j / 2; i <= j; k = (i + j) / 2) // поиск
if (arInt[k] == numb) { index = k; break; }
else
if (numb > arInt[k]) i = k + 1;
else j = k - 1;
if (index == -1)
Console.WriteLine("В массиве нет такого элемента!");
else
Console.WriteLine("Результат поиска: arInt[{0}]={1}",
index, arInt[index]);
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Бинарный поиск
/* Определить и инициализировать целочисленный массив из 10-ти
элементов. Упорядочить его элементы по возрастанию значений,
методом Sort(). Ввести целое число и с помощью метода BinarySearch()
найти номер
элемента с этим значением в упорядоченном массиве. */
using System;
class Program {
static void Main() {
int[] arInt = { 22, 5, 12, 63, -6, -52, 77, 41, 35, 23 };
int numb;
Console.Title = "Сортировка и поиск методами класса Array";
Array.Sort(arInt); // Сортировка
Console.WriteLine("Упорядоченный массив: ");
foreach (int memb in arInt)
Console.Write(memb + " ");
Console.WriteLine();
do { // цикл для повторения ввода числа
Console.WriteLine("Для выхода нажмите клавишу ESC");
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
}
} ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Бинарный поиск(2)
do Console.Write("Введите целое число: ");
while (!int.TryParse(Console.ReadLine(), out numb));
// индекс искомого элемента массива:
int index = Array.BinarySearch(arInt, numb);
if (index < 0)
Console.WriteLine("В массиве нет такого элемента!");
else
Console.WriteLine("Результат поиска: arInt[{0}]={1}",
index, arInt[index]);
ФПК учителей НИУ ВШЭ 03.2013, Максименкова О.В.
Бинарный поиск(2)
101000, Россия, Москва, Мясницкая ул., д. 20
Тел.: (495) 621-7983, факс: (495) 628-7931
www.hse.ru