Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Osnovy_C# Yakimova.docx
Скачиваний:
7
Добавлен:
12.11.2019
Размер:
758.74 Кб
Скачать

Многомерные массивы. При описании массива указывается базовый тип элементов, которые может содержать массив и количество измерений массива. Например, для двумерного массива размерностью 4 X 2:

int[,] arr_name_1 = new int[4,2];

int[,] arr_name_2 = {{0, 1, 2, 3}, {0, 1, 2, 3}}; //здесь размер 2 х 4

for(i = 0; i < arr_name_2.GetLength(0); i++)

{

   for (j = 0; j < arr_name_2.GetLength(1); j++)

   {

        Console.WriteLine(arr_name_1[i,j]);

   }

}

В данном коде мы рассмотрели пример вывода значений из двумерного массива. Подробнее использование многомерных массивов будет рассматриваться ниже.

Приведем решение примера 3.1. Понятно, что сначала мы должны описать размерность массива, сам массив, переменные для хранения максимального и минимального элемента, затем заполнить массив значениями, найти в массиве максимум и минимум и, наконец, обменять эти значения местами. static void Main(string[] args)

{

// Дано натуральное n, целые числа a1, …, an ( все числа попарно // различны). Поменять в этой последовательности местами // наибольший и наименьший члены.

byte n; // размерность массива

int[] a; // исходный массив

int max, min; // минимальный и максимальный элементы

byte i, nom_min, nom_max; // индексы

// ввод данных

Console.WriteLine(" n =");

n = byte.Parse(Console.ReadLine());

if (n == 0)

return;

a = new int[n]; // определение массива

for (i = 0; i < n; i++)

{

Console.Write(" a[ {0} ] = ", i);

a[i] = int.Parse(Console.ReadLine());

}

// поиск наибольшего и наименьшего элементов

min = a[0]; nom_min = 0;

max = a[0]; nom_max = 0;

for (i = 1; i < n; i++)

{

if (a[i] < min)

{

min = a[i];

nom_min = i;

}

if (a[i] > max)

{

max = a[i];

nom_max = i;

}

}

// обмен значений

a[nom_min] = max;

a[nom_max] = min;

// вывод результата

for (i = 0; i < n; i++)

Console.WriteLine(" a[ {0} ] = {1}", i, a[i]);

Console.ReadKey();

}

Часто массив заполняют случайными числами. В C# встроен генератор случайных чисел. Покажем как его использовать. Сначала необходимо создать новый экземпляр класса Random:

Random rnd = new Random(); Теперь для того, чтобы получить случайное число достаточно использовать созданный экземпляр класса, вызвая метод Next(), например:

a[i] = rnd.Next(); При желании можно генерировать число в заданном диапазоне, указав начальное и конечное значение:

a[i] = rnd.Next( 1, 100);

Заметим, что функция rnd возвращает значение с типом int, и если нам нужно значение другого типа необходимо сообщить компилятору о пребразовании явным образом:

uint some_value = (uint)rnd.Next( 0, 20);

Применим генерацию случайных чисел для заполнения массива в следующем примере. Пример 3.2. Даны целые числа a1, …, a50 – количество осадков в миллиметрах, выпавших в Ярославле за последние 50 лет. Надо вычислить среднее количество осадков и отклонение от среднего для каждого года.

Разберем общий ход решения этой задачи. Первый шаг – это объявление необходимых переменных. Нам потребуется массив для хранения количества осадков, переменные для хранения среднего значения и отклонения и переменная индекс для просмотра элементов массива.

Второй шаг – заполнение массива случайными числами. И одновременно подсчет общей суммы осадков за 50 лет. Третий шаг – вычисление среднего количества осадков. И, наконец, четвертый шаг – просмотр в цикле элементов массива, вычисление отклонения и вывод на печать. Теперь приведем код этой задачи.

static void Main(string[] args)

{

uint[] osadki = new uint[50]; // массив осадков

double sr_zn = 0, // среднее значение

otkl =0; // отклонение

byte i; // параметр цикла

// активация генератора случ. чисел

Random rnd = new Random();

// заполнение массива осадков

for (i = 0; i < 50; i++)

{

osadki[i] = (uint) rnd.Next(50, 200);

sr_zn += osadki[i];

}

// вычисление среднего значения

sr_zn = sr_zn / 50;

Console.WriteLine(" Среднее значение = {0}", sr_zn);

// подсчет отклонения и вывод результатов

Console.WriteLine(" Значение Отклонение");

for (i = 0; i < 50; i++)

{

otkl = osadki[i] - sr_zn;

Console.WriteLine(" {0} \t {1}", osadki[i], otkl);

}

Console.ReadLine();

}

Рассмотрим более сложную задачу.

Пример 3.3. Даны два массива x[1] ≤ x[2] ≤ …≤ x[k] и y[1]y[2]≤ … ≤ y[n]. Соединить их в массив z[1]≤ … ≤ z[m] ( m = k+n, каждый элемент должен входить в массив z столько раз, сколько раз он входит в общей сложности в массивы x и y). Число действий в программе порядка m.

Идею решения можно пояснить следующим образом: пусть у нас есть две стопки карточек с числами, отсортированные по возрастанию( точнее по неубыванию). Мы соединяем их в одну стопку, выбирая каждый раз ту из верхних карточек обеих стопок, чье число меньше. Если в одной стопке карточки закончились, то просто берем их из другой стопки.

static void Main(string[] args)

{

byte n, m, k; // размерности массивов

int[] x,y,z; // исходные и результирующий массивы

byte i, j; // индексы

// ввод данных

Console.Write(" k =");

k = byte.Parse(Console.ReadLine());

if (k == 0)

return;

x = new int[k]; // определение массива

for (i = 0; i < k; i++)

{

Console.Write(" x[ {0} ] = ", i);

x[i] = int.Parse(Console.ReadLine());

}

// ввод массива у

Console.Write(" n =");

n = byte.Parse(Console.ReadLine());

if (n == 0)

return;

y = new int[n]; // определение массива

for (i = 0; i < n; i++)

{

Console.Write(" y[ {0} ] = ", i);

y[i] = int.Parse(Console.ReadLine());

}

m = (byte)(n + k);

z = new int[m]; // определение массива z

// основной цикл

i = 0; j = 0;

while ((i != k) || (j != n))

{

if (i == k ) // j < n-1, массив x переписан в z

{

z[i + j] = y[j];

j++;

}

else if (j == n ) //i < k-1, массив y уже в z

{

z[i + j] = x[i];

i++;

}

else if (x[i] <= y[j])

{

z[i + j] = x[i];

i++;

}

else if (x[i] >= y[j])

{

z[i + j] = y[j];

j++;

}

}

// вывод результата

for (i = 0; i < m; i++)

Console.WriteLine(" z[ {0} ] = {1}", i, z[i]);

Console.ReadKey();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]