Выборка элементов массива
Здравствуйте, уважаемые участники форума! Меня интересует как из 2-мерного массива выбрать (ну и записать в одномерный) только те элементы, которые встречаются в нем более одного раза. Прошу прощения за тупой вопрос. Заранее спасибо.
если диапазон значений в массиве от 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 повторяется больше одного раза.
Спасибо за подсказку.
Но почему-то в строке massiv[matrix[i,j]]++; пишет ошибку "индекс за границами массива". Что бы это значило?
Но почему-то в строке massiv[matrix[i,j]]++; пишет ошибку "индекс за границами массива". Что бы это значило?
А вы уверены что числа в массиве входят в дипазон от 0 до n-1? потому что ошибка именно в этом.
Пардон, с ошибкой разобрался. F-R-O-S-T, то есть ваш алгоритм работает только для матрицы с положительными элементами? а с отрицательными никак?
Можно и отрицательными , но тогда надо корректировать диапазон например:
Если диапазон от -10 до 10 тогда мы объявляем так :
п.с. это не мой алгоритм 
Если диапазон от -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 повторяется больше одного раза.

Спасибо! А можно вопрос из другой оперы? Чтое если мне нужно получить максимальное из встречающихся более одного раза. В таком случае я, используя представленный вами алгоритм, пишу следующим образом:
Но почему-то если искомых элементов нет, то выводится 0.
P. S. Хм... Что-то синтаксическая подсветка не работает.
Код: Выделить всё
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("Элементов, повторяющихся более одного раза, нет");}
P. S. Хм... Что-то синтаксическая подсветка не работает.
1)
for (i = 0; i < 21; i++)
{
if (massive > 1) { vektor[j] = i - 10; find = true; }
j++;
}
Вы увеличивает j даже в любом случае , тоесть в вашем массиве vector будут 0 там где число
повторяется не больше 1 раза , а так как вы максимальное ищете именно в этом массиве , то
если не было повторяющихся элементов то максимальное число в этом массиве будет именно
0 и именно его он и выведет .
for (i = 0; i < 21; i++)
{
if (massive > 1) { vektor[j] = i - 10; find = true; }
j++;
}
Вы увеличивает j даже в любом случае , тоесть в вашем массиве vector будут 0 там где число
повторяется не больше 1 раза , а так как вы максимальное ищете именно в этом массиве , то
если не было повторяющихся элементов то максимальное число в этом массиве будет именно
0 и именно его он и выведет .
Если тебе роют яму - не мешай, закончат, сделаешь бассейн.
Да я в принципе, понял это. Но проблема еще и в том, что даже если есть отрицательные элементы, повторяющиеся более одного раза, все равно выводится 0, потому что 0 в vektor все равно есть (т. к. я размерность беру с запасом). Можете поделиться мыслями по этому поводу?
сделайте так:
тогда будем искать только среди чисел которые повторялись более одного раза и если
среди них будет 0 значит он повторялся два раза и если остальные числа отрицательные
то 0 наш ответ
Код: Выделить всё
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 наш ответ

Если тебе роют яму - не мешай, закончат, сделаешь бассейн.