С# Функция, соединяющая два любых массива. Ошибка: индекс находился вне границ массива
задание следующее:
Напишите функцию, которая будет соединять два массива таким образом: из, к примеру, [2, 4, 6] и ['a', 'b', 'c'] она сделает [2, 'a', 4, 'b', 6, 'c']. Т.е. сделать так, чтобы элементы двух массивов чередовались.
Проблем сделать это с массивами одинаковых размеров у меня не составило:
void ArrCon(string[] Arr, string[] Arr2) // Метод для соединения двух массивов
{
string str = " "; // переменная для соединения символов двух массивов
for (int j = 1; j < Arr2.Length; j++)
{
str += Arr[j];
str += ", ";
str += Arr2[j];
if (Arr2.Length == j + 1)
{
str += ". ";
break;
}
str += ", ";
}
Console.WriteLine("\n---------------------------------------------------------");
Console.WriteLine($"\nСоединение двух массивов: {str}");
}
Console.Write("Введите количество элементов для первого массива: ");
int n = Convert.ToInt32(Console.ReadLine()); // определение количество символов в массиве
string[] arr = new string[n + 1]; // создение массива arr
int i;
Console.WriteLine("Введите элементы для массива: "); // заполнение массива символами
for (i = 1; i <= n; i++)
{
Console.Write($"Элемент {i} = ");
arr[i] = Console.ReadLine();
}
Console.WriteLine();
Console.Write("Массив: ");
for (i = 1; i <= n; i++)
{
Console.Write($"{arr[i]} \t");
}
Console.WriteLine("\n---------------------------------------------------------");
Console.Write("\nВведите количество элементов для второго массива: ");
int n2 = Convert.ToInt32(Console.ReadLine()); // определение количества символов в массиве
string[] arr2 = new string[n2 + 1]; // создание массива arr2
int i2;
Console.WriteLine("Введите элементы для массива: "); // заполнение массива символами
for (i2 = 1; i2 <= n2; i2++)
{
Console.Write($"Элемент {i2} = ");
arr2[i2] = Console.ReadLine();
}
Console.WriteLine();
Console.Write("Массив: ");
for (i2 = 1; i2 <= n2; i2++)
{
Console.Write($"{arr2[i2]} \t");
}
ArrCon(arr, arr2); // проверка
Console.WriteLine("########################################################");
Вывод в консоль:
########################################################
Введите количество элементов для первого массива: 4
Введите элементы для массива:
Элемент 1 = 1
Элемент 2 = 2
Элемент 3 = i
Элемент 4 = e
Массив: 1 2 i e
---------------------------------------------------------
Введите количество элементов для второго массива: 4
Введите элементы для массива:
Элемент 1 = q
Элемент 2 = s
Элемент 3 = 54
Элемент 4 = 333
Массив: q s 54 333
---------------------------------------------------------
Соединение двух массивов: 1, q, 2, s, i, 54, e, 333.
########################################################
Однако я попытался реализовать возможность соединения двух массивов разных размеров, к примеру: {1, 2, 3, 4, 5} и {а, п} и чтобы в результате получилось: 1, а, 2, п, 3, 4, 5. Но программа начала выдавать ошибку, которую мне не удается исправить: "Индекс находился вне границ массива".
void ArrCon(string[] Arr , string[] Arr2) // Метод для соединения двух массивов
{
string str = " "; // переменная для соединения символов двух массивов
if (Arr.Length > Arr2.Length) //Если размер первого массива превышает размер второго
{
for (int j = 1; j < Arr.Length; j++)
{
str += Arr[j];
str += ", ";
if (j > Arr2.Length) // когда шаг больше размера (ОШИБКА ЗДЕСЬ)
{
for (int f = j + 1; f < Arr.Length; f++)
{
str += Arr[f];
if (Arr.Length == f)
{
str += ". ";
break;
}
str += ", ";
}
}
str += Arr2[j];
str += ", ";
}
Console.WriteLine("\n---------------------------------------------------------");
Console.WriteLine($"\nСоединение двух массивов: {str}");
}
else if (Arr.Length < Arr2.Length) //Если размер второго массива превышает размер первого
{
//по аналогии с первым случаем
}
else if (Arr.Length == Arr2.Length) //Если массивы равны
{
for (int j = 1; j < Arr2.Length; j++)
{
str += Arr[j];
str += ", ";
str += Arr2[j];
if (Arr2.Length == j + 1)
{
str += ". ";
break;
}
str += ", ";
}
Console.WriteLine("\n---------------------------------------------------------");
Console.WriteLine($"\nСоединение двух массивов: {str}");
}
}
Ошибка ссылается на строчку со следующим кодом: str += Arr2[j]; (в самом коде это место обозначил комментарием). Программа почему-то не видит условия if (j > Arr2.Length) и продолжает выполняться дальше, из-за чего конечно же выдает ошибку:
########################################################
Введите количество элементов для первого массива: 5
Введите элементы для массива:
Элемент 1 = 1
Элемент 2 = 2
Элемент 3 = 3
Элемент 4 = 4
Элемент 5 = 5
Массив: 1 2 3 4 5
---------------------------------------------------------
Введите количество элементов для второго массива: 2
Введите элементы для массива:
Элемент 1 = а
Элемент 2 = п
Массив: а п
Необработанное исключение: System.IndexOutOfRangeException: Индекс находился вне границ массива.
Программа останавливается на следующем этапе: 1, а, 2, п, 3,
Прошу помощи в решении этой проблемы. Возможно, что код в условии if (j > Arr2.Length) так же неправильный, т.к. программа в него не заходила и проверить этот момент я не могу.
Ответы (1 шт):
Ошибка в том, что вы продолжаете "бежать" по массиву, который уже закончился.
Чтобы этого не происходило - надо добавить проверку на размер массива.
Вы рассматриваете три случая отдельно, и, думаю, где то там в коде и есть ошибка.
Проще написать это одним фрагментом кода, который будет "бежать" по обеим массивам одновременно, от нуля до максимального размера массива, если массив кончился - то просто "пропускать ход"
Основыаясь на Вашем коде, я бы такое написал так:
int maxlen = Max(Arr.Length, Arr2.Length);
for( int i=0; i<maxlen; i++ )
{
if ( i<Arr.Length )
s += Arr[j] + " ";
if ( i<Arr2.Length )
s += Arr2[j] + " ";
}
Это - вроде бы минимальное исправление именно Вашего кода.
Но по хорошему не надо "склеивать" строки, надо использовать StringBuilder