Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Массивы (http://www.tehnari.ru/f41/t54398/)

Lolo 12.07.2011 01:47

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

AlexZir 12.07.2011 11:39

язык программирования какой?

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

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

Vladimir_S 12.07.2011 12:58

Алекс, я уже прикидывал - тут есть одна тонкость, связанная с исключением повторов. Позже помаракую - сейчас некогда.

AlexZir 12.07.2011 13:05

С этим никаких проблем - вложенные циклы и все дела! :)

А вот с ЯП - ещё та трудность. :(

Lolo 12.07.2011 14:28

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

Vladimir_S 12.07.2011 14:51

Цитата:

Сообщение от Lolo (Сообщение 551580)
язык программирования С++

А - ну, значит, не ко мне! Можно продолжать бездельничать. :D

AlexZir 12.07.2011 14:56

Вышеупомянутый мной двумерный массив можно представить как два одномерных массива с размерностью, не превышающей размерность исходного массива :)

Lolo 12.07.2011 17:24

Вот, настрочила кой-чего

Код:

# 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: Помогите пожалуйста :)

Vladimir_S 13.07.2011 10:07

Придумал один довольно-таки тупой алгоритм. Но работает. Реализация, к сожалению, на Паскале - на Си я не пишу. Полагаю, что перевести с языка на язык проблем не составит. Если, конечно, алгоритм устроит.
Суть:
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.


Lolo 14.07.2011 15:50

Цитата:

Сообщение от Vladimir_S (Сообщение 551898)
Реализация, к сожалению, на Паскале - на Си я не пишу.

Ничего страшного, и Паскаль учили когда-то :) . Алгоритм правда не совсем тот, все равно спасибо за помощь, буду думать дальше ))


Часовой пояс GMT +4, время: 17:39.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.