Форум программистов, компьютерный форум CyberForum.ru

Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.90
yeaahh
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 15
15.03.2013, 20:34     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #1
Помогите, народ! Срочно нужна программа.
Собственно задание:
В целочисленном массиве k(n), заданном случайным образом, много повторяющихся элементов. Найти (в процентах) частоту появления
каждого из m наиболее часто встречающихся элементов (m << n). Удалить все повторяющиеся элементы, оставив в массиве только один.

Добавлено через 1 час 23 минуты
Нашёл код, написанный в паскале по 1-й части задания:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
const
  n=30;
  m=2;
var
  mas: array[1..n] of word;
  popular: array[1..n, 1..2] of word;
  f, p, i, j, k: word;
begin
  randomize;
  for i := 1 to n do
  begin
    mas[i] := random(5);
    write(mas[i]:2)
  end;
  for i := 1 to n-1 do
  for j := i+1 to n do
  if mas[i] > mas[j] then
  begin
    k := mas[i];
    mas[i] := mas[j];
    mas[j] := k
  end;
  writeln;
  i := 1;
  p := 1;
  writeln('Vsego');
  repeat
    k := 1;
    while (mas[i] = mas[i+1])and(i<n) do
    begin
      inc(k);
      inc(i);
    end;
    writeln(mas[i], ' - ', k*100/n:0:2, '%');
    popular[p, 1] := k;
    popular[p, 2] := mas[i];
    inc(p);
    inc(i)
  until i > n;
  for i := 1 to p-2 do
  for j := i+1 to p-1 do
  if popular[i, 1] < popular[j, 1] then
  for f := 1 to 2 do
  begin
    k := popular[i, f];
    popular[i, f] := popular[j, f];
    popular[j, f] := k
  end;
  writeln('Itogo');
  if p > m then p := m;
  for i := 1 to p do
  writeln(popular[i, 2], ' - ', popular[i, 1]*100/n:0:2, '%');
  readln
end.
Если кто может, переделайте пожалуйста для c++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 20:34     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один.
Посмотрите здесь:

C++ Дан одномерный массив, элементы которого - целые числа. Удалите из него все повторяющиеся элементы, оставив только их первые вхождения.
удалить из массива повторяющиеся элементы, оставив только их первые вхождения. класс-контейнер вектор C++
C++ Дано слово. Удалить из него все повторяющиеся буквы, оставив их первые вхождения, то есть в слове должны остаться только различные буквы.
C++ Одномерный динамический массив (удалить все вещественные числа, оставив только целые)
Дан целочисленный массив размера N. Удалить из массива все одинаковые элементы, оставив их последние вхождения C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
15.03.2013, 21:28     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #2
Какие элементы? Тип задан или любые? Оставить один....какой? любой?

Добавлено через 33 минуты
В любом случае вот код для показа процентов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <map>
 
using namespace std;
 
template<typename T>
void show(T *array,int size)
{
     typedef typename std::map<T,int> TMap;
     typedef typename TMap::iterator iterator;
     TMap res;
 
     for(int i=0;i<size;i++)
     {
             res[ array[i] ]++;
     }
     
     for(iterator it=res.begin(); it!=res.end(); ++it)
     {
             cout << it->first << '\t' << ((double)it->second/(double)size)*100 <<'%'<< '\n';
     }
}
 
int main()
{
    int t[10000];
    for(int i=0;i<10000;i++)
    {
            t[i]=rand()%10;
    }
 
    show(t,10000);
    
    system("pause");
}
yeaahh
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 15
15.03.2013, 21:32  [ТС]     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #3
eocron:
1) массив из целых чисел;
2)тип, так как целые, то наверное int;
3)Оставить наверное первый попавшийся повторяющийся элемент во время прохождения по массиву..
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
15.03.2013, 21:45     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #4
Удалить все элементы из массива - это как? Произвести замену или функция должна вернуть тот самый единственный элемент?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <map>
 
using namespace std;
 
template<typename T>
T show(T *array,int size)
{
     typedef typename std::map<T,int> TMap;
     typedef typename TMap::iterator iterator;
     TMap res;
     int int_buf=0;
     T buf;
     //calculating appearence for each elemnt
     for(int i=0;i<size;i++)
     {
             res[ array[i] ]++;
             //parallel find of most popular element
             if(res[array[i]]>int_buf)
             {
                    buf=array[i];
                    int_buf=res[array[i]];
             }
     }
     //print all shit out
     for(iterator it=res.begin(); it!=res.end(); ++it)
     {
             cout << it->first << '\t' << ((double)it->second/(double)size)*100 <<'%'<< '\n';
     }
     //here you can delete "array" or do whatever you want with it
     return buf;
}
 
int main()
{
    int t[10000];
    for(int i=0;i<10000;i++)
    {
            t[i]=rand()%10;
    }
 
    cout<<show(t,10000)<<endl;
    
    system("pause");
}
yeaahh
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 15
15.03.2013, 21:54  [ТС]     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #5
Это по ходу удалить повторяющиеся элементы, а оставить все не повторяющиеся + 1-й повторяющийся, который попался при прохождении по массиву (оставить повторяющийся элемент на своём месте)

Добавлено через 2 минуты
то есть к примеру дан массив:
3 5 7 5 9 2 1 5 6 - повторяются пятёрки, то есть в ответе будет массив: 3 5 7 9 2 1 6 (то есть мы оставили только первый повторяющийся элемент, на своём месте)
eocron
Кактус
 Аватар для eocron
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
15.03.2013, 22:06     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <map>
 
using namespace std;
 
template<typename T>
void show(T *array,int size)
{
     typedef typename std::map<T,int> TMap;
     typedef typename TMap::iterator iterator;
     TMap res;
     T buf;
     //calculating appearence for each elemnt
     for(int i=0;i<size;i++)
     {
             res[ array[i] ]++;
             //parallel find second multi-appearence
             if(res[array[i]]>1)
             {
                     //delete array[i];
                     array[i]=-1; //umm..-1..or...0....or whatever means delete to you
             }
     }
     
     //print all shit out
     for(iterator it=res.begin(); it!=res.end(); ++it)
     {
             cout << it->first << '\t' << ((double)it->second/(double)size)*100 <<'%'<< '\n';
     }
}
 
int main()
{
    int t[10000];
    for(int i=0;i<10000;i++)
    {
            t[i]=rand()%10;
    }
 
    show(t,10000);
    
    system("pause");
    
}
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
17.03.2013, 20:18     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #7
Вам сюда
http://www.cyberforum.ru/order-program/
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
17.03.2013, 20:22     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #8
yeaahh, что значит
Цитата Сообщение от yeaahh Посмотреть сообщение
(m << n)
Добавлено через 52 секунды
Цитата Сообщение от yeaahh Посмотреть сообщение
наиболее часто
это относительное понятие, необходимо работать с конкретными данными, как определить, что еще не очень часто, а уже наиболее часто?
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
17.03.2013, 20:28     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main()  {
    srand(time(NULL));
    int n;
    int *k;
    cout << "n = ";
    cin >> n;
 
    if(n <= 0)
        return 1;
    k = new int[n];
 
    for(int i = 0; i < n; i++)  {
        k[i] = rand() % 100;
        cout << k[i] << ((i < n - 1) ? "  " : "");
    }
    cout << endl;
 
 
    return 0;
}
И т.д.
yeaahh
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 15
17.03.2013, 20:44  [ТС]     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #10
наиболее часто встречающиеся элементы - это просто повторяющиеся элементы.

Добавлено через 2 минуты
Цитата Сообщение от m1Rr0r Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main()  {
    srand(time(NULL));
    int n;
    int *k;
    cout << "n = ";
    cin >> n;
 
    if(n <= 0)
        return 1;
    k = new int[n];
 
    for(int i = 0; i < n; i++)  {
        k[i] = rand() % 100;
        cout << k[i] << ((i < n - 1) ? "  " : "");
    }
    cout << endl;
 
 
    return 0;
}
И т.д.
Я просто только начинаю программировать на c++ , а это задание дали практически сегодня на завтра... Если Вам не трудно, могли бы вы мне помочь с этой задачей?..
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
17.03.2013, 20:44     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #11
Цитата Сообщение от m1Rr0r Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <time.h>
 
using namespace std;
 
int main()  {
    srand(time(NULL));
    int n;
    int *k;
    cout << "n = ";
    cin >> n;
 
    if(n <= 0)
        return 1;
    k = new int[n];
 
    for(int i = 0; i < n; i++)  {
        k[i] = rand() % 100;
        cout << k[i] << ((i < n - 1) ? "  " : "");
    }
    cout << endl;
 
 
    return 0;
}
И т.д.
а где хедер cstdlib и освобождение памяти?
HighPredator
17.03.2013, 20:45
  #12
 Комментарий модератора 
yeaahh, правила форума п. 5.5: Запрещено размещать тему в нескольких разделах одновременно (кросспостинг), а также дублировать тему в одном разделе.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
17.03.2013, 20:47     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #13
Цитата Сообщение от MrGluck Посмотреть сообщение
а где хедер cstdlib и освобождение памяти?
Разместил пост не для того чтобы ты исправлял.
Лучше когда человек сам подумает что к чему, хоть и с подсказкой.
Цитата Сообщение от MrGluck Посмотреть сообщение
cstdlib
Для чего ?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
17.03.2013, 20:51     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #14
Цитата Сообщение от m1Rr0r Посмотреть сообщение
Разместил пост не для того чтобы ты исправлял.
Лучше когда человек сам подумает что к чему, хоть и с подсказкой.
Подумал над самой тяжелоуловимой ошибкой - утечкой памяти? Да вы либо садист, либо просто боитесь признать факт своей ошибки.

Цитата Сообщение от m1Rr0r Посмотреть сообщение
Для чего ?
srand и rand определны там, gcc данный код, например, не скомпилит
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
17.03.2013, 20:55     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #15
Предвижу хуливар...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 20:59     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один.
Еще ссылки по теме:

Удалить из слова все повторяющиеся буквы, оставив их первые вхождения C++
Удалить из массива повторяющиеся элементы, оставив только их первые вхождения C++
C++ Одномерные массивы, удалить все повторяющиеся элементы, оставив только первые вхождения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
17.03.2013, 20:59     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один. #16
Цитата Сообщение от MrGluck Посмотреть сообщение
srand и rand определны там
Точно так.
Цитата Сообщение от m1Rr0r Посмотреть сообщение
Предвижу хуливар
Предвижу наказания за попытку холиварить
Yandex
Объявления
17.03.2013, 20:59     Массив: Удалить все повторяющиеся элементы, оставив в массиве только один.
Ответ Создать тему
Опции темы

Текущее время: 05:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru