[ dusantod @ 04.04.2009. 16:26 ] @
Potreban mi je algoritam kako da iz niza brojeva izbacim one koji se ponavljaju vise od jedanput (tj 2 ili vise puta) ?
Code:

for (i=0;i<n-1;i++)
   for(j=i+1;j<n; j++)
      if(a[i]==a[j]) {
            b=a[i]; 
            for (l=k=0;l<n;l++)
                  if (a[i] != b) a[k++]=a[i];
            }

ali ovako ne radi kako treba, ponavlja mi neke brojeve koji su inace bili prvobitno jedinstveni
ceo kod
Code:

/* Program  by DusanT */
#include <stdio.h>
#define max 100

main(){
       int a[max],b,n,i,j,h,k,l;

  while(1){
       /* Unos duzine niza i provera unete vrednosti */       
       printf("\n\nUnesite duzinu niza (max %d): \n",max);
       scanf("%d",&n);
       if (n<2 || n>max) break;
       
       /* unos elemenata niza */
       printf("\n\nUnesite elemente niza\n");
       for (i=0; i<n; i++) scanf("%d",&a[i]);
       
       
       for (i=0;i<n-1;i++)
   for(j=i+1;j<n; j++)
      if(a[i]==a[j]) {
            b=a[i]; 
            for (l=k=0;l<n;l++)
                  if (a[i] != b) a[k++]=a[i];
            };
                       
       
       n=k;
       for(i=0; i<n; i++) printf("%2d", a[i]);
           
           }
}



[Ovu poruku je menjao X Files dana 04.04.2009. u 18:54 GMT+1]
[ X Files @ 04.04.2009. 18:00 ] @
U praksi, radi se o izdvajanju razlicitih brojeva na pocetak niza.

Dakle, funkcija izdvajanje_razlicitih izdvaja jedinstvene vrednosti na POCETAK NIZA, a kao rezultat vraca GRANICU do koje su ti brojevi izdvojeni, tako da znas koji su to brojevi.

To je jedan od mogucih algoritama, a ti ga prilagodi svojim potrebama.



Code:

#include <stdio.h>
#include <stdlib.h>
#define BROJ_ELEMENATA 10

void swap( int *a, int *b )
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int izdvajanje_razlicitih( int niz[], int elemenata )
{
    int kandidat, uredjeni, uslov, granica=1;

    for ( kandidat=granica; kandidat<elemenata; kandidat++ )
    {
        uslov=1; /* optimisticki */
        for ( uredjeni=0; uredjeni<granica; uredjeni++ )
        {
            if ( niz[kandidat]==niz[uredjeni] )
            {
                uslov=0; /* vec postoji u uredjenima */
                break;
            }
        }
        if ( uslov==1 ) /* kandidat prelazi u uredjene */
        {
            swap( &niz[kandidat], &niz[granica] );
            ++granica;
        }
    }
    return( granica );
}

int main()
{
    int x;
    //int niz[BROJ_ELEMENATA] = {1,2,1,1,2,1,2,3,4,1};
    //int niz[BROJ_ELEMENATA] = {1,1,1,1,1,1,1,2,3,1};
    //int niz[BROJ_ELEMENATA] = {1,2,3,4,5,6,7,8,9,10};
    //int niz[BROJ_ELEMENATA] = {1,2,3,4,5,6,2,8,9,10};
    int niz[BROJ_ELEMENATA] = {1,2,1,2,1,2,1,2,1,2};

    printf( "ORIGINAL:\n" );
    for ( x=0; x<BROJ_ELEMENATA; x++)
        printf( "%d\t", niz[x] );
    printf( "\n\n" );

    printf( "GRANICA RAZLICITIH:%d\n\n",  izdvajanje_razlicitih( niz, BROJ_ELEMENATA ) );

    printf( "UREDJEN\n" );
    for ( x=0; x<BROJ_ELEMENATA; x++ ) // ovde recimo mozes da petlju skratis da ispisuje samo do GRANICE, tj do povratne vrednosti funkcije
        printf( "%d\t", niz[x] );
    printf( "\n\n" );

    return 0;
}

[ dusantod @ 05.04.2009. 11:01 ] @
hvala ti. Ja se nisam izrazio konkretno, ovo mi je konkretno bilo potrebno za kolokvijum iz C-a
koji sam imao juce u pola sedam uvece a nisam mogao da se snadjem da pronadjem resenje
ovog dela programcica. Nisu mi strani pokazivaci ali nije predvidjeno da ih koristimo na kolokvijumu.
U svakom slucaju hvala sto si mi inace brzo odgovorio.

P.S.: Zaboravio sam da napisem u prvom postu da je bilo potrebno nakon unosa elemenata niza
izvrsiti proveru i izbacivanje svih elemenata koji se ponavljaju vise od jednom.
[ X Files @ 05.04.2009. 11:37 ] @
Citat:

Nisu mi strani pokazivaci ali nije predvidjeno da ih koristimo na kolokvijumu.
U svakom slucaju hvala sto si mi inace brzo odgovorio.

Pokazivacu su tu bili cisto zbog razmene dva broja, moglo je da ide i direktno u kodu bez njh:

Code:

int izdvajanje_razlicitih( int niz[], int elemenata )
{
    int kandidat, uredjeni, uslov, granica=1, pom;

    for ( kandidat=granica; kandidat<elemenata; kandidat++ )
    {
        uslov=1; /* optimisticki */
        for ( uredjeni=0; uredjeni<granica; uredjeni++ )
        {
            if ( niz[kandidat]==niz[uredjeni] )
            {
                uslov=0; /* vec postoji u uredjenima */
                break;
            }
        }
        if ( uslov==1 ) /* kandidat prelazi u uredjene */
        {
            pom = niz[kandidat];
            niz[kandidat]=niz[granica];
            niz[granica]=pom;
            ++granica;
        }
    }
    return( granica );
}
[ dmilicev @ 12.07.2017. 10:25 ] @
Code:

/*

  Izdvajanje jedinstvenih brojeva niza na pocetak niza.

*/

#include <stdio.h>

// Prikazuje niz sa brClanova integer-a
void prikazi_niz( char *tekst, int niz[], int brClanova )
{
    int i;

    printf("\n%s", tekst );

    for(i=0;i<brClanova;i++)
        printf("%3d", niz[i] );

    printf("\n");
}

// Vraca broj pojavljivanja elementa KojiElement u nizu niz[] koji ima BrojClanova elemenata
int broj_pojavljivanja_elementa_u_nizu( int niz[], int BrojClanova, int KojiElement )
{
    int i, BrojPojavljivanja=0;

    for(i=0;i<BrojClanova;i++)
        if( niz[i] == KojiElement )
            BrojPojavljivanja++;

    return BrojPojavljivanja;
}

// U nizu niz[] koji ima BrojClanova,
// pakuje jedinstvene elemente na pocetak niza niz[]
// i na kraju smanjuje BrojClanova niza na BrojJedinstvenihClanova
void niz_jedinstvenih_elemenata( int niz[], int *BrojClanova )
{
    int i, BrojJedinstvenihClanova=0;

    // Svaki element niza uporedjujemo sa svim prehodnim jedinstvenim elementima
    // i ako ga nema medju njima, stavljamo ga u niz na mesto BrojJedinstvenihClanova
    // i uvecavamo BrojJedinstvenihClanova, inace ne.

    for(i=0;i<*BrojClanova;i++){

        printf("\n broj_pojavljivanja_elementa_u_nizu (%d) = %d \n",niz[i],broj_pojavljivanja_elementa_u_nizu(niz,BrojJedinstvenihClanova,niz[i]));

        // ako se element niz[i] do sada (do indeksa i) ne pojavljuje u nizu
        if( broj_pojavljivanja_elementa_u_nizu(niz,BrojJedinstvenihClanova,niz[i]) == 0 ) {
            // stavljamo ga u niz na mesto BrojJedinstvenihClanova
            niz[BrojJedinstvenihClanova++] = niz[i];  // i uvecavamo BrojJedinstvenihClanova
            prikazi_niz(" Niz jedinstvenih je: ",niz,BrojJedinstvenihClanova);
        }
    }

    *BrojClanova = BrojJedinstvenihClanova; // smanjuje BrojClanova niza na BrojJedinstvenihClanova
}


int main()
{
    //int niz[] = {1,2,3,2,4};
    int niz[] = {1,2,1,1,2,1,2,3,4,1};
    //int niz[] = {1,1,1,1,1,1,1,2,3,1};
    //int niz[] = {1,2,3,4,5,6,2,8,9,10};
    //int niz[] = {1,2,1,2,1,2,1,2,1,2};
  
    int n = sizeof(niz) / sizeof(int);  // broj elemenata niza

    printf("\n n = %d \n",n);
    prikazi_niz(" Originalni niz je:   ",niz,n);

    niz_jedinstvenih_elemenata(niz,&n);

    printf("\n n = %d \n",n);
    prikazi_niz(" Niz jedinstvenih je: ",niz,n);

    return 0;
}