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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
#1

Поиск повторяющихся значений массива - C++

27.12.2013, 12:41. Просмотров 1077. Ответов 13
Метки нет (Все метки)

Задача: Написать программу для поиска повторяющихся значений. Повторяющимся считается значение, которое встречается 2 или больше раз.
Реализация:
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
# include <iostream>
# include <stdlib.h>
# include <time.h>
using namespace std;
void main ()
{
    setlocale(LC_CTYPE, "rus");
    const int ArrSize = 10;
    int Nums[ArrSize];
    int RepeatedNums[ArrSize];
    bool find;
    srand(time(NULL));
    cout<<"Наш массив ";
    for (int i=0;i<ArrSize;i++)
    {
      Nums[i]=rand()%10;
      cout<<Nums[i]<<"  ";
        find = false;                   //обнуляем поиск
        for (int j = 0; j < i; j++)
            if (Nums[j] == Nums[i])     //сравниваем элементы массива Numbs
            {
                RepeatedNums[j]++;      //во второй массив записываем кол-во найденных элементов
                find = true;            //говорим что одинаковые числа найдены
            }
 
        if (!find)
            RepeatedNums[i] = 1;        //если повторы не найдены записываем 1
    }
 
    for (int i = 0; i < ArrSize; i++)
    {
        if (RepeatedNums[i] > 1)        //выводим результаты, если повторов > 1
            cout << endl << Nums[i] << ": " << RepeatedNums[i];
    }
    cout<<endl;
        system("pause");
        
}
Возможна ли реализация без второго массива?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.12.2013, 12:41     Поиск повторяющихся значений массива
Посмотрите здесь:

Перебор массива и поиск повторяющихся чисел - C++
День добрый, подскажите пожалуйста, задача следующая, имеем массив {1,2,3,9,4,5,6,9,7,8,0}, тут девятка встречается два раза, необходимо...

Одноразовый вывод повторяющихся значений - C++
Задача: Написать шаблонную функцию, котороая будет принимать массивы любого типа const int size=10; int mas={ 1, 2, 3, 4, 1, 2, 3,...

Удаление повторяющихся значений в списке - C++
Добрый день. Нужна помощь в написании функции удаления повторяющихся элементов в списке. struct Adr { char name; char street; ...

Попытка сделать поиск max и min значений массива через функцию - C++
Стандартная задача - найти максимальное и минимальное значения в массиве из случайных элементов. Впервые пытаюсь передавать массив в...

Поиск повторяющихся слов - C++
Напишите программу, в которую сначала вводится набор пар, состоящих из имени и значения, например Joe 17 и Barbara 22. Для каждой пары...

Сравнение двух массивов и выборка из них не повторяющихся значений - C++
Задание 2 на скриншоте. Я сделал ввод с клавиатуры двух массивов нужно как то остальное сделать #include &lt;iostream&gt; #include &lt;cmath&gt; ...

Поиск повторяющихся строк в файле - C++
Нужна рекомендация! Есть сгенерированные цепочки (строки) которые записаны и в файл, и естественно выводятся с него. Нужно сделать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
27.12.2013, 14:18     Поиск повторяющихся значений массива #2
Хм, можно сделать попроще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main()
{
    const int N = 10;
    int A[N] = {1, 1, 1, 2, 3, 2, 0, 1, 5, 5};
    int B[N];
    for (int i = 0; i < N; ++i)
        B[i] = 0;
    for (int i = 0; i < N; ++i)
        ++B[A[i]];
    return 0;
}
uhx
57 / 57 / 6
Регистрация: 11.07.2013
Сообщений: 303
27.12.2013, 15:29     Поиск повторяющихся значений массива #3
d1skort, способ хороший, но если числа в массиве двузначные? Тогда уже будет выход за пределы массива.
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
27.12.2013, 15:39     Поиск повторяющихся значений массива #4
Цитата Сообщение от uhx Посмотреть сообщение
d1skort, способ хороший, но если числа в массиве двузначные? Тогда уже будет выход за пределы массива.
Угу, точно. Но можно, например, размер массива задать равному максимальному элементу, но только если он меньше размера исходного массива, иначе не выгодно.
uhx
57 / 57 / 6
Регистрация: 11.07.2013
Сообщений: 303
27.12.2013, 16:03     Поиск повторяющихся значений массива #5
Цитата Сообщение от d1skort Посмотреть сообщение
Угу, точно. Но можно, например, размер массива задать равному максимальному элементу, но только если он меньше размера исходного массива, иначе не выгодно.
Не выйдет, к сожалению. Изменить переменную const не выйдет. Только если через динамический массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    const int N = 10;
    int A[N] = { 42, 42, 49, 18, 92, 18, 12, 1, 2, 1 },mx=10;
    for(int i=0;i<N;i++){
        cout<<A[i]<<" ";
        if(mx<A[i])mx = A[i];
    }
    int *B = new int[mx];
    for (int i = 0; i < N; ++i){
        if(B[A[i]]<0)B[A[i]] = 0;
        if(B[A[i]]>=0)B[A[i]]++;
    }
    for(int i=0;i<mx;i++)
        if(B[i]>1)cout<<endl<<i<<":"<<B[i];
    system("pause>>void");
}
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
28.12.2013, 12:26  [ТС]     Поиск повторяющихся значений массива #6
Я смотрю вы сути вопроса не поняли, я спрашиваю можно ли реализовать в одном массиве эту задачу с произвольными элементами. А ваши варианты это то же, что и я предложил просто упрощенные.

Добавлено через 37 минут
Цитата Сообщение от d1skort Посмотреть сообщение
Хм, можно сделать попроще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main()
{
    const int N = 10;
    int A[N] = {1, 1, 1, 2, 3, 2, 0, 1, 5, 5};
    int B[N];
    for (int i = 0; i < N; ++i)
        B[i] = 0;
    for (int i = 0; i < N; ++i)
        ++B[A[i]];
    return 0;
}
Ваше попроще, уж слишком простое. А где cout что пользователь увидит на экране? Вы запускали ее на выполнение?
MrGluck
Модератор
Эксперт CЭксперт С++
7171 / 4337 / 633
Регистрация: 29.11.2010
Сообщений: 11,783
28.12.2013, 12:50     Поиск повторяющихся значений массива #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от sabich Посмотреть сообщение
Возможна ли реализация без второго массива?
Конечно:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <unordered_set>
 
int main()
{
    int A[] = {1, 2, 3, 4, 5, 1};
    const int size = sizeof(A) / sizeof (*A);
    std::unordered_set<int> us(A, A + size);
    std::cout << std::boolalpha << (us.size() == size) << std::endl;
}
C++
1
2
3
4
5
6
7
8
9
10
#include <algorithm>
#include <iostream>
 
int main()
{
    int A[] = {1, 2, 3, 4, 5, 1};
    const int size = sizeof(A) / sizeof (*A);
    std::sort(A, A + size);
    std::cout << std::boolalpha << (std::unique(A, A + size) == A + size) << std::endl;
}
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
28.12.2013, 13:08  [ТС]     Поиск повторяющихся значений массива #8
Цитата Сообщение от uhx Посмотреть сообщение
Не выйдет, к сожалению. Изменить переменную const не выйдет. Только если через динамический массив:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
using namespace std;
int main()
{
    const int N = 10;
    int A[N] = { 42, 42, 49, 18, 92, 18, 12, 1, 2, 1 },mx=10;
    for(int i=0;i<N;i++){
        cout<<A[i]<<" ";
        if(mx<A[i])mx = A[i];
    }
    int *B = new int[mx];
    for (int i = 0; i < N; ++i){
        if(B[A[i]]<0)B[A[i]] = 0;
        if(B[A[i]]>=0)B[A[i]]++;
    }
    for(int i=0;i<mx;i++)
        if(B[i]>1)cout<<endl<<i<<":"<<B[i];
    system("pause>>void");
}
Чето в вашем коде я вообще запутался, что значит
C++
1
2
3
4
5
int *B = new int[mx];
    for (int i = 0; i < N; ++i){
        if(B[A[i]]<0)B[A[i]] = 0;
        if(B[A[i]]>=0)B[A[i]]++;
    }
вы что мусор сравниваете? И зачем вот эта библиотека #include <vector>?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
28.12.2013, 13:09     Поиск повторяющихся значений массива #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
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <cstdlib>
 
 
int main() {
   const int SIZE = 100;
   
   int arr[ SIZE ];
   int cnt;
   
   for ( int i = 0; i < SIZE; i++ ) {
      arr[ i ] = std::rand() % 10;
      std::cout << arr[ i ] << ' ';
   }
   
   std::cout << '\n' << std::endl;
   
   for ( int i = 0; i < SIZE; i++ ) {
      if ( arr[ i ] != 10 ) {
         cnt = 1;
         
         for ( int j = i + 1; j < SIZE; j++ ) {
            if ( arr[ i ] == arr[ j ] ) {
               arr[ j ] = 10;
               cnt++;
            }
         }
         
         std::cout << arr[ i ] << ' ' << cnt << std::endl;
      }
   }
   
   return 0;
}
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
28.12.2013, 15:30  [ТС]     Поиск повторяющихся значений массива #10
MrGluck, Спасибо пользователь польщен вашему "false".

Добавлено через 2 часа 13 минут
Toshkarik, наконец-то нашелся человек, который понял что я хочу! Спасибо все верно, правдо я внес кое-какие коррективы, чтобы соответствовало условию задания.
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
# include <iostream>
# include <stdlib.h>
# include <time.h>
using namespace std;
void main ()
{  
   const int SIZE = 10;
   int arr[ SIZE ];
   int cnt,r=10;
   srand(time(NULL));
   for ( int i = 0; i < SIZE; i++ ) {
      arr[ i ] = rand() % r;
      cout << arr[ i ] << " ";
   }
   
   cout << "\n" << endl;
   
   for ( int i = 0; i < SIZE; i++ ) {
      if ( arr[ i ] != r ) {
         cnt = 1;
         
         for ( int j = i + 1; j < SIZE; j++ ) {
            if ( arr[ i ] == arr[ j ] ) {
               arr[ j ] = r;
               cnt++;
            }
         }
    if(cnt>=2){     
        cout << arr[ i ] << " : " << cnt << endl;
    }
      }
   }
}
Задание выполнено всем спасибо!
MrGluck
Модератор
Эксперт CЭксперт С++
7171 / 4337 / 633
Регистрация: 29.11.2010
Сообщений: 11,783
28.12.2013, 16:27     Поиск повторяющихся значений массива #11
А вы уверены, что сделать из форматированного кода, соответствующего стандарту и с нормальными С++ -ными заголовочными файлами, пляшущий и несоответствующий стандарту с сишными заголовками является условием задачи?
main должна возвращать int по стандарту, зря вы это исправили. И с отступами советую придерживаться хотя бы того, что вложенные элементы должны иметь больший отступ, нежели их предки.
И если пишете на С++, то и заголовочные файлы используйте С++, функционал они имеют разный.
Одно только вы сделали верно - от magic number избавились

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <unordered_map>
 
int main()
{
    int A[] = {1, 2, 3, 4, 5, 1};
    std::unordered_map<int, int> um;
    for (auto x: A)
        ++um[x];
    for (auto& p: um)
        if (p.second >= 2)
            std::cout << p.first << " ";
}
Добавлено через 6 минут
Выводит все дубляжи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <algorithm>
#include <iostream>
#include <iterator>
 
bool foo(const int x, const int y)
{
    return x != y;
}
 
int main()
{
    int A[] = {1, 2, 3, 4, 5, 1};
    const int size = sizeof(A) / sizeof (*A);
    std::sort(A, A + size);
    std::unique_copy(A, A + size, std::ostream_iterator<int>(std::cout, " "), foo);
}
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
28.12.2013, 18:54  [ТС]     Поиск повторяющихся значений массива #12
MrGluck, я только начинаю писать на с++, поэтому извините еще не все стандарты знаю. И функция void main это требование учреждения, кому собственно и нужно было написать программу, библиотеки "с" тоже из тех же соображений. Якобы мы пишем код на с, но подразумеваем с++. C отступами вроде старался придерживаться стандартов. Ваш код у меня вообще не работает.
MrGluck
Модератор
Эксперт CЭксперт С++
7171 / 4337 / 633
Регистрация: 29.11.2010
Сообщений: 11,783
28.12.2013, 19:04     Поиск повторяющихся значений массива #13
Цитата Сообщение от sabich Посмотреть сообщение
И функция void main это требование учреждения
3.6.1 Main function
2. An implementation shall not predefine the main function. This function shall not be overloaded. It shall
have a return type of type int, but otherwise its type is implementation-defined. All implementations shall
allow both of the following definitions of main:
int main() { /* ... */ }
and
int main(int argc, char* argv[]) { /* ... */ }
Вот что говорит стандарт.
По поводу заголовочных файлов - iostream в сях нет. И вообще, С выглядит по другому. У вас же пишется С++ и от чистых сей лишь два заголовочных файла. Да и если код нужен на С - идите в соответствующую ветку. Вы же почему то выбрали раздел С++.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 19:51     Поиск повторяющихся значений массива
Еще ссылки по теме:

Поиск повторяющихся элементов в массиве - C++
Если повторяющихся элементов 2 (например: 1 2 3 1) - то выдвигает 1 элемент(правильно), если же их больше чем 2 (например 1 2 1 3 1) - то...

Поиск повторяющихся (строковых) элементов в массиве - C++
Друзья помогите пожалуйста встала такая задача. Есть 3 файла со строчками нужно найти и вывести строчки которые повторяються и вывести...

Поиск повторяющихся слов через вектор - C++
Здравствуйте. При вводе текста в переменную string current должно только что написанное слово должно попадать в вектор previous, но это...

Поиск повторяющихся слов в тексте (доработка кода) - C++
Дан текст, содержащий n строк. Для каждого слова указать, сколько раз оно встречается в тексте. Я тут кое-что попробовала сделать (с++),...

Бинарный поиск для нахождения количества повторяющихся элементов - C++
Здравствуйте. Стоит следующая несложная задача: Дан массив (отсортированный). Например 1 1 1 4 5 6 6 6 6 6 6 6 При вводе...


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

Или воспользуйтесь поиском по форуму:
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
28.12.2013, 19:51  [ТС]     Поиск повторяющихся значений массива #14
С учетом всех замечаний, спасибо MrGluck, выкладываю окончательный вариант
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
# include <iostream>
# include <cstdlib>
# include <ctime>
using namespace std;
int main ()
{
   const int SIZE = 20;
   int arr[ SIZE ];
   int cnt,r=10;
   srand(time(NULL));
   for ( int i = 0; i < SIZE; i++ ) {
      arr[ i ] = rand() % r;
      cout << arr[ i ] << " ";
   }
   cout << "\n" << endl;
 
   for ( int i = 0; i < SIZE; i++ ) {
      if ( arr[ i ] != r ) {
         cnt = 1;
 
         for ( int j = i + 1; j < SIZE; j++ ) {
            if ( arr[ i ] == arr[ j ] ) {
               arr[ j ] = r;
               cnt++;
            }
         }
            if(cnt >= 2){
               cout << arr[ i ] << " : " << cnt << endl;
            }
       }
   }
return 0;
}
Yandex
Объявления
28.12.2013, 19:51     Поиск повторяющихся значений массива
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru