|
[ 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;
}
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|