Страница 1 из 2
Выборка элементов массива
Добавлено: 05 июл 2008, 14:49
Alex_Burn
Здравствуйте, уважаемые участники форума! Меня интересует как из 2-мерного массива выбрать (ну и записать в одномерный) только те элементы, которые встречаются в нем более одного раза. Прошу прощения за тупой вопрос. Заранее спасибо.
Re: Выборка элементов массива
Добавлено: 05 июл 2008, 22:35
F-R-O-S-T
если диапазон значений в массиве от 0 до n-1 ну или если он хотя бы известен,
то можно сделать так:
Код: Выделить всё
int massiv[n] //Вспомогательный массив
int matrix[k][l] //Массив который перебираем
int i,j;
for(i=0;i<k;i++)
for(j=0;j<l;j++)
massiv[matrix[i,j]]++;
for(i=0;i<n;i++)
if (massiv[i]>1) //значит число i повторяется больше одного раза.
Re: Выборка элементов массива
Добавлено: 05 июл 2008, 22:57
Alex_Burn
Спасибо за подсказку.
Но почему-то в строке massiv[matrix[i,j]]++; пишет ошибку "индекс за границами массива". Что бы это значило?
Re: Выборка элементов массива
Добавлено: 05 июл 2008, 23:01
F-R-O-S-T
А вы уверены что числа в массиве входят в дипазон от 0 до n-1? потому что ошибка именно в этом.
Re: Выборка элементов массива
Добавлено: 05 июл 2008, 23:05
Alex_Burn
Пардон, с ошибкой разобрался. F-R-O-S-T, то есть ваш алгоритм работает только для матрицы с положительными элементами? а с отрицательными никак?
Re: Выборка элементов массива
Добавлено: 05 июл 2008, 23:15
F-R-O-S-T
Можно и отрицательными , но тогда надо корректировать диапазон например:
Если диапазон от -10 до 10 тогда мы объявляем так :
Код: Выделить всё
int massiv[21] //Вспомогательный массив
int matrix[k][l] //Массив который перебираем
int i,j;
for(i=0;i<k;i++)
for(j=0;j<l;j++)
massiv[matrix[i,j]+10]++;
for(i=0;i<21;i++)
if (massiv[i]>1) //значит число i-10 повторяется больше одного раза.
п.с. это не мой алгоритм

Re: Выборка элементов массива
Добавлено: 05 июл 2008, 23:43
Alex_Burn
Спасибо! А можно вопрос из другой оперы? Чтое если мне нужно получить максимальное из встречающихся более одного раза. В таком случае я, используя представленный вами алгоритм, пишу следующим образом:
Код: Выделить всё
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
massive[matrix[i, j]+10]++;
}
}
bool find = false;
j = 0;
for (i = 0; i < 21; i++)
{
if (massive[i] > 1) { vektor[j] = i - 10; find = true; }
j++;
}
int max = vektor[0];
for (i = 0; i < m; i++)
{
if (vektor[i] > max) max = vektor[i];
}
if (find) Console.WriteLine("Максимальное из чисел, повторяющихся более одного раза " + max);
else {Console.WriteLine("Элементов, повторяющихся более одного раза, нет");}
Но почему-то если искомых элементов нет, то выводится 0.
P. S. Хм... Что-то синтаксическая подсветка не работает.
Re: Выборка элементов массива
Добавлено: 06 июл 2008, 00:03
F-R-O-S-T
1)
for (i = 0; i < 21; i++)
{
if (massive > 1) { vektor[j] = i - 10; find = true; }
j++;
}
Вы увеличивает j даже в любом случае , тоесть в вашем массиве vector будут 0 там где число
повторяется не больше 1 раза , а так как вы максимальное ищете именно в этом массиве , то
если не было повторяющихся элементов то максимальное число в этом массиве будет именно
0 и именно его он и выведет .
Re: Выборка элементов массива
Добавлено: 06 июл 2008, 00:16
Alex_Burn
Да я в принципе, понял это. Но проблема еще и в том, что даже если есть отрицательные элементы, повторяющиеся более одного раза, все равно выводится 0, потому что 0 в vektor все равно есть (т. к. я размерность беру с запасом). Можете поделиться мыслями по этому поводу?
Re: Выборка элементов массива
Добавлено: 06 июл 2008, 00:27
F-R-O-S-T
сделайте так:
Код: Выделить всё
bool find = false;
j = 0;
for (i = 0; i < 21; i++)
if (massive[i] > 1) { vektor[j] = i - 10; find = true; j++ }
int max = vektor[0]; // эта строчка нужна только если j больше 0
//а поиск будет производится если были числа которые повторялись более одного раза
for (i = 0; i < j ; i++)
{
if (vektor[i] > max) max = vektor[i];
}
тогда будем искать только среди чисел которые повторялись более одного раза и если
среди них будет 0 значит он повторялся два раза и если остальные числа отрицательные
то 0 наш ответ
