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

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

Восстановить пароль Регистрация
 
sabich
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 23
27.12.2013, 12:41     Поиск повторяющихся значений массива #1
Задача: Написать программу для поиска повторяющихся значений. Повторяющимся считается значение, которое встречается 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
27.12.2013, 15:29     Поиск повторяющихся значений массива #3
d1skort, способ хороший, но если числа в массиве двузначные? Тогда уже будет выход за пределы массива.
d1skort
20 / 20 / 0
Регистрация: 10.02.2013
Сообщений: 75
27.12.2013, 15:39     Поиск повторяющихся значений массива #4
Цитата Сообщение от uhx Посмотреть сообщение
d1skort, способ хороший, но если числа в массиве двузначные? Тогда уже будет выход за пределы массива.
Угу, точно. Но можно, например, размер массива задать равному максимальному элементу, но только если он меньше размера исходного массива, иначе не выгодно.
uhx
 Аватар для uhx
56 / 56 / 6
Регистрация: 11.07.2013
Сообщений: 300
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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++ Перебор массива и поиск повторяющихся чисел
C++ Поиск повторяющихся слов
C++ Удаление повторяющихся символов массива

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

Или воспользуйтесь поиском по форуму:
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     Поиск повторяющихся значений массива
Ответ Создать тему
Опции темы

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