Другие языки программирования и технологии

Вопрос к программистам (Паскаль)

Как в одномерном массиве найти одинаковые элементы и посчитать сколько их в среднем, т.е.например массив 111 3 444 55553 , 3 и 4 одинаковых среднее (3+3+4)/2
Доброго времени суток.

А может проще поступить? Сначала взять да и отсортировать массив, допустим, по убыванию, а потом просто посчитать число повторяющихся элементов и число, скажем, групп таких элементов. Примерно так.

i := 1; {индекс в массиве}
m := 0; {число групп одинаковых элементов}
while i < n do begin
k := 1; {по-крайней мере есть один в группе}
while A[ i ] = A[i+1] do begin
Inc(k);
i := i + 1;
end;
s := s + k; {накопление числа одинаковых элементов}

WriteLn(A[ i ]:4, k:3, S:5); {это для проверки можно убрать}

if k > 1 then inc(m); {число групп}
k := 1;
i :=i + 1;
end;

WriteLn;
WriteLn(s:5, m:5); {это тоже можно не делать, а просто вывести результат}

Среднее сами посчитайте. Кстати, разве среднее так считается (3+3+4)/2? Может все-таки среднее = (3+3+4)/3 ?

Удачи!
Николай Хохулин
Николай Хохулин
59 613
Лучший ответ
program pr111;
uses CRT;
var
i,j,k: Integer;
a: array [1..11] of Integer; { массив, число 11 потом можно заменить на n }
b: array [1..2,1..11] of Integer; { второй массив имеет сл. структуру: в первом ряду храним разные значения элементов, во втором - количество их появлений }
sum: Integer; { сумма, это и так понятно }
begin
clrscr;
{ чтобы не вводить каждый раз, я их прописал намертово }
a[1]:=1;
a[2]:=1;
a[3]:=1;
a[4]:=3;
a[5]:=4;
a[6]:=4;
a[7]:=4;
a[8]:=5;
a[9]:=5;
a[10]:=5;
a[11]:=5;

{ обнуляем второй массив }
for j:=1 to 11 do
begin
b[1,j]:=0;
b[2,j]:=0;
end;

{ в первую строку, первый столбец заносим первый элемент массива а }
{ во вторую строку, первый столбец заносим количество его появлений, пока 1 }
b[1,1]:=a[1];
b[2,1]:=1;
k:=2; { k - переменная, которая будет отвечать за увеличение номера столбца в массиве b }

for i:=2 to 11 do
begin
for j:=1 to i-1 do { берем очередной а [ i ] и сравниваем его с известными элементами из массива b }
begin
if b[1,j]=a[ i ]> { если равны, то увеличиваем количество появлений и выходим из цикла, т. к. в массиве b все элементы различны}
then
begin
b[2,j]:=b[2,j]+1;
writeln('b[2,',j,']=',b[2,j]);
readkey;
break;
end;
if j=i-1 { если мы дошли до этой строки, значит все проверки не дали результата и текущий a[ i ] еще не встречается в массиве b }
then
begin
b[1,k]:=a[ i ]; { записали его и количество появлений}
b[2,k]:=1;
k:=k+1; { увеличили номер для следующего нового элемента }
break;
end;
end;
end;
sum:=0;
for i:=1 to 11 do
begin
if b[2,i]>1 { берем в сумму только те элементы массива b, количество появлений где больше 1, т. е. есть одинаковые }
then
begin
writeln(i,' stolbec: ',b[2,i]);
sum:=sum+b[2,i];
end;
end;
writeln('sum=',sum);
writeln('sred=',sum/2);
readkey;
end.
Если ты знаешь какое число может быть в массиве максимальным, то
-создаёшь ещё один массив, пронумерованный от 0 до максимального числа (array[1..MAX])
-пробегаешь по массиву и по соответствующим индексам во втором массиве прибавляешь 1.
-умножаешь все индексы на значения в них, затем суммируешь и делишь на количество индексов в которых не нулевое значение.
Виктор Довбня Идея неплохая, но в паскале не прокатит, поскольку нельзя точно знать, какое число будет наибольшим...
Создание динамических массивов тоже не предусмотрено...
Представьте, если макс. будет 32000 хотя бы... Какой расход памяти нужен, да и циклы гонять по столько...