Домашнее задание. Массивы массивов (зубчатые массивы) - C# и .NET

Домашнее задание. Массивы массивов (зубчатые массивы)

Домашнее задание по C#: даны два одномерных массива, размерностью n. Составить из них массив массивов в котором первый элемент будет содержать только положительные значения первого одномерного массива, а второй – отрицательные элементы второго массива. Вывести полученный массив массивов в консоль.

Часть учебника C# для начинающих на которой основывается это домашнее задание

Сложность задачи заключается в том, что изначально мы не можем знать какое количество положительных или отрицательных элементов в итоге будет в одномерных массивах. Поэтому, прежде всего, нам необходимо будет определиться с размерностями каждого элемента зубчатого массива.

Итак, создадим новое консольное приложение и, вначале, создадим необходимые для работы одномерные массивы:

Console.Write("Введите размерность одномерных массивов: ");
int n = int.Parse(Console.ReadLine());

int[] first = new int[n];
int[] second = new int[n];

здесь мы выделили память под массивы и теперь нам необходимо их заполнить значениями. Сделаем это, используя прием генерации случайных чисел из предыдущего домашнего задания:

for (int i = 0; i < n; i++)
{
    first[i] = Random.Shared.Next(-10, 10); //случайное целое число от -10 до 10
    second[i] = Random.Shared.Next(-10, 10);
}

Теперь наши массивы будут заполнены случайными числами в интервале от -10 до 10. Следующая наша задача – это просчитать в первом массиве количество положительных значений, а во втором – отрицательных. Сделать мы это можем в том же цикле, представленном выше:

int firstDim = 0; //размерность первого элемента зубчатого массива
int secondDim = 0; //размерность второго элемента зубчатого массива

for (int i = 0; i < n; i++)
{
    first[i] = Random.Shared.Next(-10, 10); //случайное целое число от -10 до 10
    second[i] = Random.Shared.Next(-10, 10);
    //определяем размерности элементов зубчатого массива
    if (first[i] > 0)
        firstDim++;
    if (second[i] < 0) 
        secondDim++;
}

Теперь нам необходимо создать зубчатый массив и наполнить его значениями. И здесь есть один момент: что делать, если в одномерных массивах не будет ни одного подходящего значения? Например, первый массив будет содержать только отрицательные значения, а второй – только положительные? Как вариант, в этом случае, мы можем вывести сообщение о том, что зубчатый массив создать невозможно (или один из его элементов). Реализуем такой вариант в нашем приложении:

int[][] result = new int[2][]; //выделяем память под два элемента

if (firstDim == 0)
    Console.WriteLine("Первый массив не содержит подходящих значений. Первый элемент зубчатого массива не будет выведен в консоль");
else
{
    result[0] = new int[firstDim];//выделяем память под элементы
    int counter = 0;//индекс элемента в подмассиве
    foreach (int num in first)
    {
        if (num > 0)
        {
            result[0][counter] = num;
            counter++; 
        }
    }
}

Здесь показано заполнение первого элемента зубчатого массива. Если в итоге размерность оказалась равной нулю, то в консоль будет выведено сообщение:

Console.WriteLine("Первый массив не содержит подходящих значений. Первый элемент зубчатого массива не будет выведен в консоль");

иначе, мы проходим снова по первому одномерному массиву и заполняем элемент зубчатого массива:

result[0] = new int[firstDim];//выделяем память под элементы
int counter = 0;//индекс элемента в подмассиве
foreach (int num in first)
{
    if (num > 0)
    {
        result[0][counter] = num;
        counter++; 
    }
}

здесь мы вводим дополнительную переменную counterв которой мы храним значение индекса в элементе зубчатого массива. Эта переменная наращивается на 1 каждый раз, как только мы находим подходящее значение. Точно таким же образом заполняется второй элемент зубчатого массива:

if (secondDim == 0)
    Console.WriteLine("Второй массив не содержит подходящих значений. Второй элемент зубчатого массива не будет выведен в консоль");
else
{
    result[1] = new int[secondDim];//выделяем память под элементы
    int counter = 0;//индекс элемента в подмассиве
    foreach (int num in second)
    {
        if (num < 0)
        {
            result[1][counter] = num;
            counter++;
        }
    }
}

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

Остается только вывести в консоль результаты:

Console.WriteLine("Исходные одномерные массивы");
Console.WriteLine("Первый массив");
foreach (int i in first)
    Console.Write($"{i}\t");

Console.WriteLine();

Console.WriteLine("Второй массив");
foreach (int i in second)
    Console.Write($"{i}\t");

Console.WriteLine();

Console.WriteLine("Зубчатый массив");
if (firstDim == 0)
    Console.WriteLine("[пусто]");
else
{
    foreach (int i in result[0])
        Console.Write($" {i}\t");

}

Console.WriteLine();

if (secondDim == 0)
    Console.WriteLine("[пусто]");
else
{
    foreach (int i in result[1])
        Console.Write($"{i}\t");

Здесь мы последовательно выводим одномерные массивы и полученный зубчатый массив. При этом, если какой-либо элемент зубчатого массива не будет заполнен, то на его месте в консоли будет выведена строка “[пусто]”. Например, мы можем получить вот такой результат:Домашнее задание по C#. Массивы массивов (зубчатые массивы)

В общем случае, когда оба элемента зубчатого массива формируются, мы увидим следующий вывод в консолиДомашнее задание по C#. Массивы массивов (зубчатые массивы)

Весь исходный код приложения представлен ниже:

Console.Write("Введите размерность одномерных массивов: ");
int n = int.Parse(Console.ReadLine());

int[] first = new int[n];
int[] second = new int[n];

int firstDim = 0; //размерность первого элемента зубчатого массива
int secondDim = 0; //размерность второго элемента зубчатого массива

for (int i = 0; i < n; i++)
{
    first[i] = Random.Shared.Next(-10, 10); //случайное целое число от -10 до 10
    second[i] = Random.Shared.Next(-10, 10);
    //определяем размерности элементов зубчатого массива
    if (first[i] > 0)
        firstDim++;
    if (second[i] < 0) 
        secondDim++;
}


int[][] result = new int[2][]; //выделяем память под два элемента

if (firstDim == 0)
    Console.WriteLine("Первый массив не содержит подходящих значений. Первый элемент зубчатого массива не будет выведен в консоль");
else
{
    result[0] = new int[firstDim];//выделяем память под элементы
    int counter = 0;//индекс элемента в подмассиве
    foreach (int num in first)
    {
        if (num > 0)
        {
            result[0][counter] = num;
            counter++; 
        }
    }
}

if (secondDim == 0)
    Console.WriteLine("Второй массив не содержит подходящих значений. Второй элемент зубчатого массива не будет выведен в консоль");
else
{
    result[1] = new int[secondDim];//выделяем память под элементы
    int counter = 0;//индекс элемента в подмассиве
    foreach (int num in second)
    {
        if (num < 0)
        {
            result[1][counter] = num;
            counter++;
        }
    }
}

Console.WriteLine("Исходные одномерные массивы");
Console.WriteLine("Первый массив");
foreach (int i in first)
    Console.Write($"{i}\t");
Console.WriteLine();
Console.WriteLine("Второй массив");
foreach (int i in second)
    Console.Write($"{i}\t");

Console.WriteLine();
Console.WriteLine("Зубчатый массив");
if (firstDim == 0)
    Console.WriteLine("[пусто]");
else
{
    foreach (int i in result[0])
        Console.Write($" {i}\t");

}
Console.WriteLine();

if (secondDim == 0)
    Console.WriteLine("[пусто]");
else
{
    foreach (int i in result[1])
        Console.Write($"{i}\t");

}

Console.ReadKey();