Szukanie powtarzających się zmiennych w tablicy

0

Mam do napisania program (nie jest to żaden konkurs itp) który wyszuka zmienne które się powtarzają i co ważne wypisze je na wyjściu w kolejności rosnącej. Napisałem program, który najpierw qsortem sortuje tablicę, potem do drugiej tablicy wprowadza powtarzające się liczby (niestety wszystkie). Jak zmodyfikować ten program, by wyświetlał tylko RAZ powtarzającą się zmienną. Dla przykładu dla tablicy {7,3,5,6,3,7} mam na wyjściu 3,3,7,7 a nie tak jak powinno być czyli np. 3,7.

 
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;
typedef int ElementT;


int sortujRosnaco( const ElementT * arg1, const ElementT * arg2 )
{
    if( * arg1 <* arg2 )
         return - 1;
   
    if( * arg1 >* arg2 )
         return 1;
   
    return 0;
}

void posortuj( ElementT * tablica, int ilosc, int( * funkcjaSortujaca )( const ElementT *, const ElementT * ) )
{
    qsort( tablica, ilosc, sizeof( * tablica ),( int( * )( const void *, const void * ) ) funkcjaSortujaca );
}

void powtorka (int *tab,int n)
{
    int powtorzenia=0,k=0;
    int B[n];
    for(int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            if (tab[i]==tab[j])
            {
                powtorzenia++;    
            }
            
        }
        
        if (powtorzenia>1)
        {
            B[k]=tab[i];
            k++;
            
        }
        
        powtorzenia=0;
        
    }
    
    for (int i=0;i<k;i++)cout<<B[i]<<" "<<endl;
    
    
}

/////////////////////////////////

int main()
{
    int n;
    cin>>n;
    int A[n];
    
    for (int i=0;i<n;i++)
    {
        cin>>A[i];
    }
    
    posortuj( A, sizeof( A ) / sizeof( ElementT ), sortujRosnaco );
    
    
    powtorka(A,n);
    
    
    return 0;
}
0
qsort( tablica, ilosc, sizeof(tablica) ...
void powtorka (int *tab,int n)
  {
   if(!n) return;
   int p=0;
   cout<<tab[p]<<endl;
   for(int i=0;i<n;++i) if(tab[p]!=tab[i]) cout<<(tab[++p]=tab[i])<<endl;
  }
0

Zaimplementowałem twoj program, jednak wyświetla on (już pojedyńczo), wszystkie elementy tablicy anie tylko te powtarzające się..

0
void powtorka (int *tab,int n)
  {
   for(int i=1;i<n-1;i++)
     if(tab[i-1]==tab[i] && tab[i]!=tab[i+1])
       cout<<tab[i]<<'\n';

   if(tab[n-2]==tab[n-1])
     cout<<tab[n-1]<<'\n';
  }
  

Ewentualnie:

void powtorka (int *tab,int n)
  {
   for(int i=1;i<n-1;i++)
     if(tab[i-1]==tab[i])
     {
       cout<<tab[i]<<'\n';
       while(tab[i]==tab[++i] && i<n-1);
     }
  }

ale ma gcc mam

ostrzeżenie:operation on 'i' may be undefined [-Wsequence-point]
        while(tab[i]==tab[++i] && i<n-1);
                                      ^

choć nie do końca rozumiem dlaczego. Według mnie żadne to UB.

2

Toż to jeszcze prostsze:

void powtorka (int *tab,int n) { for(int i=2;i<n;++i) if((tab[i-1]==tab[i])&&(tab[i-2]!=tab[i])) cout<<tab[i]<<endl; }

1 użytkowników online, w tym zalogowanych: 0, gości: 1