Домашнее задание по C#: даны два одномерных массива, размерностью n. Составить из них массив массивов в котором первый элемент будет содержать только положительные значения первого одномерного массива, а второй – отрицательные элементы второго массива. Вывести полученный массив массивов в консоль.
Сложность задачи заключается в том, что изначально мы не можем знать какое количество положительных или отрицательных элементов в итоге будет в одномерных массивах. Поэтому, прежде всего, нам необходимо будет определиться с размерностями каждого элемента зубчатого массива.
Итак, создадим новое консольное приложение и, вначале, создадим необходимые для работы одномерные массивы:
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");
Здесь мы последовательно выводим одномерные массивы и полученный зубчатый массив. При этом, если какой-либо элемент зубчатого массива не будет заполнен, то на его месте в консоли будет выведена строка “[пусто]”. Например, мы можем получить вот такой результат:
В общем случае, когда оба элемента зубчатого массива формируются, мы увидим следующий вывод в консоли
Весь исходный код приложения представлен ниже:
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();