Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 1
Регистрация: 24.12.2013
Сообщений: 23
1

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

27.12.2013, 12:41. Просмотров 2599. Ответов 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");
        
}
Возможна ли реализация без второго массива?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2013, 12:41
Ответы с готовыми решениями:

Поиск повторяющихся элементов динамического массива
Задача: задается целочисленная матрица &quot;А&quot; из M строк и N столбцов. Сформировать вектор &quot;В&quot; из М...

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

Поиск минимального из всех положительных значений элементов массива
поиск минимального из всех положительных значений элементов массива и вывод его на консоль

Удаление повторяющихся значений в массиве
arr1 - исходный массив arr2 - новый массив без повторов cnt1 - число строк arr1 cnt2 -...

13
20 / 20 / 8
Регистрация: 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;
}
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 304
27.12.2013, 15:29 3
d1skort, способ хороший, но если числа в массиве двузначные? Тогда уже будет выход за пределы массива.
0
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75
27.12.2013, 15:39 4
Цитата Сообщение от uhx Посмотреть сообщение
d1skort, способ хороший, но если числа в массиве двузначные? Тогда уже будет выход за пределы массива.
Угу, точно. Но можно, например, размер массива задать равному максимальному элементу, но только если он меньше размера исходного массива, иначе не выгодно.
0
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 304
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");
}
2
0 / 0 / 1
Регистрация: 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 что пользователь увидит на экране? Вы запускали ее на выполнение?
0
Форумчанин
Эксперт CЭксперт С++
8153 / 5003 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
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;
}
3
0 / 0 / 1
Регистрация: 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>?
0
1170 / 883 / 94
Регистрация: 03.08.2011
Сообщений: 2,453
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;
}
1
0 / 0 / 1
Регистрация: 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;
    }
      }
   }
}
Задание выполнено всем спасибо!
0
Форумчанин
Эксперт CЭксперт С++
8153 / 5003 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
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);
}
0
0 / 0 / 1
Регистрация: 24.12.2013
Сообщений: 23
28.12.2013, 18:54  [ТС] 12
MrGluck, я только начинаю писать на с++, поэтому извините еще не все стандарты знаю. И функция void main это требование учреждения, кому собственно и нужно было написать программу, библиотеки "с" тоже из тех же соображений. Якобы мы пишем код на с, но подразумеваем с++. C отступами вроде старался придерживаться стандартов. Ваш код у меня вообще не работает.
0
Форумчанин
Эксперт CЭксперт С++
8153 / 5003 / 1436
Регистрация: 29.11.2010
Сообщений: 13,460
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 в сях нет. И вообще, С выглядит по другому. У вас же пишется С++ и от чистых сей лишь два заголовочных файла. Да и если код нужен на С - идите в соответствующую ветку. Вы же почему то выбрали раздел С++.
1
0 / 0 / 1
Регистрация: 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;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2013, 19:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Одноразовый вывод повторяющихся значений
Задача: Написать шаблонную функцию, котороая будет принимать массивы любого типа const int...

Удаление повторяющихся значений в списке
Добрый день. Нужна помощь в написании функции удаления повторяющихся элементов в списке. struct...

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

Поиск повторяющихся слов
Напишите программу, в которую сначала вводится набор пар, состоящих из имени и значения, например...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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