Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Найти в массиве и вывести значение наиболее часто встречающегося элемента.

Автор: Shmaniche 27.05.2012 19:14

Есть программа, которая находит в массиве и выводит значения наиболее часто встречающегося элемента. Но я специально в ней уменьшил размер масссива до 5 элементов и ввел 1, 1, 2, 2, 3. вывелось 1. Как сделать так, чтобы выводились оба значения, т.е. 1 и 2 ?
Вот код:


#include <stdio.h>
#include <conio.h>

const int N = 5;
int main()
{
int i, j, count, maxcount, num;
int mass[N]={1, 1, 2, 2, 3};

printf("\n Massiv iz chisel ot 1 do 10: \n");
for(i=0; i<N; i++)
{
printf("\n Massiv[%d] = %d. ", i, mass[i]);
}

maxcount=1; num=0; // Устанавливаем значения двух переменных по умолчанию.
for (i=0; i<N; i++) // Перебираем все элементы массива.
{ count=0; // Счетчик в 0.
for (j=i; j<N; j++) // Перебираем все элементы от i до конца.
if (mass[i] == mass[j]) // Если элемент [i] совпадает с одним из последующих [j],
{ count++; } // то увеличиваем значение счетчика.
if ( count > maxcount) // Если число больше ранее сохраненного,
{ maxcount = count; // тогда перезаписываем.
num = i; } // Присаваеиваем элемент массива в новую переменную
}
if (num >= 0) // Если значение новой переменной больше или равен 0.
{ printf("\n \n Povtor. chisla: %d. ", mass[num]); } // Выводим значение часто повторяющийся элемента.
else // Иначе...
{ printf("\n \n Povtor. elemenov ne naydeno "); } // повторяющихся элементов нет.

getch();
return 0;
}



Автор: Krjuger 27.05.2012 21:11


if (num >= 0) // Если значение новой переменной больше или равен 0.
{ printf("\n \n Povtor. chisla: %d. ", mass[num]); } // Выводим значение часто повторяющийся элемента.
else // Иначе...
{ printf("\n \n Povtor. elemenov ne naydeno "); } // повторяющихся элементов нет.


Бессмысленная проверка,потому что у вас num всегда будет больше, либо равен нулю.
Чтобы вывести несколько результатов,надо,либо выводить их во время подсчета повторений,либо создать массив,в который переписывать все нужные результаты.Как делать,решать вам, решается это просто переносом одной строчки.

Автор: Shmaniche 27.05.2012 21:29

Цитата(Krjuger @ 27.05.2012 21:11) *


if (num >= 0) // Если значение новой переменной больше или равен 0.
{ printf("\n \n Povtor. chisla: %d. ", mass[num]); } // Выводим значение часто повторяющийся элемента.
else // Иначе...
{ printf("\n \n Povtor. elemenov ne naydeno "); } // повторяющихся элементов нет.


Бессмысленная проверка,потому что у вас num всегда будет больше, либо равен нулю.


Эта проверка осталась от другого варианта, где я генерил числа случайным образом.

Цитата(Krjuger @ 27.05.2012 21:11) *

решается это просто переносом одной строчки.

А что и куда не подскажите? 10.gif

Автор: Krjuger 27.05.2012 22:11

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

Автор: Федосеев Павел 27.05.2012 22:36

Цитата
Самая логичная идея. за первый проход вы узнаете максимальное значение,за второй, выписываете все числа,чье количество равно максимальному.Но для этого понадобиться 2 прохода.

Можно и за один проход, сразу добавляя в список число с максимальным вхождением. А если находится новое значение максимума, то список разрушается и создаётся с вновь обнаруженным числом.

Как вариант, ещё можно отсортировать исходный массив, в нём найти максимальное количество вхождений, а вторым проходом вывести все числа, входящие ровно столько раз.

Автор: Shmaniche 27.05.2012 22:46

Павел, можешь описать первый вариант в виде кода? А то я на словах не очень.

Автор: Федосеев Павел 27.05.2012 23:05

Я в C не силён, поэтому на словах.


int list[N]; - это список
int len; - длина списка (в нашем примере для mass[N]={1, 1, 2, 2, 3}; он будет равен 2

.........
len=0;

maxcount=1; num=0; // Устанавливаем значения двух переменных по умолчанию.
for (i=0; i<N; i++) // Перебираем все элементы массива.
{ count=0; // Счетчик в 0.
for (j=i; j<N; j++) // Перебираем все элементы от i до конца.
if (mass[i] == mass[j]) // Если элемент [i] совпадает с одним из последующих [j],
{ count++; } // то увеличиваем значение счетчика.

if (count==maxcount) если очередное число встречается maxcount раз. то занесём его в список
{ list[len]=i;
len++;
}
if ( count > maxcount) // Если число больше ранее сохраненного,
{ maxcount = count; // тогда перезаписываем.
num = i; // Присаваеиваем элемент массива в новую переменную

len=1; разрушаем прежний список и формируем новый
list[0]:=i;
}
}
............
for(i=0; i<len-1; i++) printf("%d", mass[list[i]]);

Приблизительно так...

Автор: Shmaniche 27.05.2012 23:46

Павел,в твоем варианте выводится 1, а не 1 и 2. В цикле вывода надо не "i<len-1", а " i<len". Тогда все будет норм.

Автор: IUnknown 27.05.2012 23:48

Shmaniche, последний цикл должен выглядеть так:

for(i=0; i<len; i++) printf("%d ", mass[list[i]]); // Тут -1 было явно лишнее

Автор: Shmaniche 28.05.2012 0:11

Цитата(IUnknown @ 27.05.2012 23:48) *

Shmaniche, последний цикл должен выглядеть так:
for(i=0; i<len; i++) printf("%d ", mass[list[i]]); // Тут -1 было явно лишнее



Опередил меня smile.gif.

Автор: Федосеев Павел 28.05.2012 0:43

Да, я запутался. Хотел по-паскалевски, чтобы индекс был от 1, также цикл for в паскале включает границы... Потом начал мудрить и вот результат.