• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Массивы

  • Автор темы Автор темы Lolo
  • Дата начала Дата начала

Lolo

Ученик
Регистрация
12 Июл 2011
Сообщения
4
Реакции
0
Баллы
0
Массивы

Дан массив целых чисел. Для каждого из этих чисел выяснить сколько раз каждое число входит в этот массив. Результат представить в виде ряда строк, первая из которых есть А1- k, где k - есть число вхождений А1 в последовательность. Вторая строка будет иметь вид Аi- m, где Аi -есть первый по порядку член, отличный от А1, m - число вхождений этого члена в последовательность и т.д.
т.е. например дан массив 6 9 3 1 3 6 6
элемент - кол-во вхождений
6 - 3
9 - 1
3 - 2
1 - 1
Сам хочу решить, ничего на ум не приходит. Как это можно реализовать?
 
язык программирования какой?

Реализовать можно через двумерный массив, через последовательный анализ одномерного массива, через последовательности и прочее...

В общих чертах, через двумерный массив алгоритм следующий:
Заводится двумерный массив [N,2], в 1 столбец которого в цикле анализа исходного массива заносятся встреченные числа, а во второй столбец - соответственно количество повторений каждого числа. По окончании анализа исходного массива выводится полученный двумерный массив.
 
Алекс, я уже прикидывал - тут есть одна тонкость, связанная с исключением повторов. Позже помаракую - сейчас некогда.
 
С этим никаких проблем - вложенные циклы и все дела! :)

А вот с ЯП - ещё та трудность. :(
 
AlexZir
язык программирования С++, условия реализации - через одномерные массивы
Vladimir_S
Вы правы, здесь есть тонкость - повторяющиеся элементы. Есть вариант создать еще один массив, в него переписать элементы первого массива без повторений, и завести массив счетчиков, куда будет заносится кол-во вхождений каждого элемента, как-то так))
 
Вышеупомянутый мной двумерный массив можно представить как два одномерных массива с размерностью, не превышающей размерность исходного массива :)
 
Вот, настрочила кой-чего

Код:
# include <conio.h>
# include <stdio.h>

void main ()
{
    const n = 7;
    int array1[n] = {3,8,3,12,11,8,8};  // оригинальный массив
    int array2[n] = {0};                // массив уникальных элемeнтов
    int array3[n] = {0};                // массив счетчиков
    int m = 0, index1 = 0, index2 = 0;
    
   for (int i = 0; i < n; i++)
   {
       int x = 0;   // счетчик кол-ва вхождений элемента в массив
       for (int j =  0; j < n; j++)
       {
          if (array1[i] == array1[j])
          {
            x++;
            m = array1[i];
          }
       }
       array2[index1] = m;
       index1++;
       array3[index2] = x;
       index2++;
   }
   for (i = 0; i < index2; i++)
   {
       printf ("%i - %i\n", array2[i], array3[i]);
   }
getch ();
}

Но как избавиться от повторяющихся элементов не могу понять :tehnari_ru_281: Помогите пожалуйста :)
 
Придумал один довольно-таки тупой алгоритм. Но работает. Реализация, к сожалению, на Паскале - на Си я не пишу. Полагаю, что перевести с языка на язык проблем не составит. Если, конечно, алгоритм устроит.
Суть:
1. Ищется максимальное значение исходного массива (М).
2. Путем последовательного перебора натуральных чисел (i) от 0 до М заполняется массив счетчиков количества вхождений каждого i в исходный массив.
3. Организован вывод опять же чисел i от 0 до М и соответствующих значений счетчиков, но только тех, где счетчики отличны от нуля.
Всё.
Код:
const
 n=7;
 array1:Array[1..n] of Integer= (3,8,3,12,11,8,8);  // оригинальный массив
var
 array3:Array[0..1000] of Integer;                // массив счетчиков
 M,i,j:Integer;
BEGIN
 M:=0;
 for i:=1 to n do
  if array1[i]>M then M:=array1[i];
 for i:=0 to M do array3[i]:=0;
 for i:=0 to M do
  for j:=1 to n do
   if array1[j]=i then Inc(array3[i]);
 for i:=0 to M do
  if array3[i]>0 then
   writeln(i:4,' - ',array3[i]);
 readln;
END.
 
Реализация, к сожалению, на Паскале - на Си я не пишу.

Ничего страшного, и Паскаль учили когда-то :) . Алгоритм правда не совсем тот, все равно спасибо за помощь, буду думать дальше ))
 
что делает Inc в этой строичке if array1[j]=i then [[Inc]](array3);?
 
что делает Inc в этой строичке if array1[j]=i then [[Inc]](array3);?

Оператор Inc(n), где n - целое число, увеличивает значение n на 1. Оператор Inc(n,k), где n и k - целые числа, увеличивает значение n на k. "Обратный" оператор - Dec. Делает то же самое, но в сторону уменьшения. Таким образом,
Inc(array3) (зачем Вы там квадратных скобок понаставили - не пойму) полностью эквивалентен
array3:= array3 + 1;
 
Назад
Сверху