[ nigth rider @ 07.09.2011. 21:54 ] @
Napisati funkciju na programskom jeziku c za spajanje dva ucitana niza celih brojeva u rezultujuci niz koji sadrzi elemente koji su isti u oba niza. U glavnom programu uneti duzinu niza i pozvati funkcije za ucitavanje, spajanje i ispis rezultujuceg niza.

[ pajaja @ 07.09.2011. 22:12 ] @
Oko cega ti je ovde konkretno potrebna pomoc? Okaci deo koda koji si napisao do sada da bi mogli da vidimo kako si zapoceo i da jednostavnije objasnimo sta je dalje potrebno.
[ nigth rider @ 07.09.2011. 22:41 ] @
#include<stdio.h>
Code:

main()
{
void citaj();
int n,m;

printf("Unesite broj elemenata prvog niza: ");
scanf("%d",&n);
citaj(n);

printf("Unesite broj elemenata drugog  niza: ");
scanf("%d",&m);
citaj(m);
getch();



}

void citaj(int x)
{
    int i,a[100];
    for(i=0;i<x;i++)
    {
        printf("[%d] element niza je:",i+1);
        scanf("%d",&a[i]);
    }

}

Ovo je deo koda koji sam napravio , uspem da napravim funkciju za unos clanova nizova ali problem mi je kada treba da napravim funkciju za spajanje u novi niz samo onih clanova koji su jednaki . Kako uopste da poredim sve clanove i kako da prosledim nizove u funkciju ? Veoma bih bio zahvalan na pomoci .

[Ovu poruku je menjao X Files dana 08.09.2011. u 14:49 GMT+1]
[ pajaja @ 07.09.2011. 23:49 ] @
Posto vec znas koliki je konacan broj elemenata (argument funkcije), nemoj da ogranicavas program tako sto ces da hardkodiras 100 vec iskoristi argument koji prosledjujes. Takodje ovde imas lokalnu varijablu a koju neces moci da koristis van funkcije ucitaj() tako da ovako ucitavanje nije korisno. Resenje je na primer da prosledis funkciji niz u koji zelis da se ucitaju elementi. Pre toga ces u main() metodi morati da inicijalizujes (kad ucitas koliko je veliki niz) niz koji ces onda proslediti funkciji citaj(duzina_niza, niz);. Tako ce ti citaj() funkcija izgledati ovako:
Code (c):

void citaj(int x, int *a){
     int i;
     for(i=0;i<x;i++){
          printf("[%d] element niza je:",i+1);
          scanf("%d",&a[i]);
     }
}
 


Ispisivanje niza se radi slicno.
Spajanje nizova takodje nije mnogo komplikovano. To mozes da uradis tako sto (kada ucitas nizove) pogledas koji je niz manji (tj da li je manje m ili n) i inicijalizujes nov niz, npr. c[manji_broj]. Onda prolazis kroz jedan od ta dva niza i proveravas da li trenutni element postoji u drugom nizu. Za ovo su ti potrebne dve ugnjezdene petlje, jedna za svaki niz, i provera da li su elementi jednaki i ako jesu upisuje tu vrednost u elemnt c. Imaju vidu doduse, da ovo nece da radi savrseno ako se elementi ponavljaju, tacnije radice ali ce se neke vrednosti ponavljati.
[ nigth rider @ 08.09.2011. 00:19 ] @
Hvala na pomoci ali sada mi nije jasno kako da inicijalizujem niz u glavnoj funkciji, koliko sam ja shvatio funkcija citaj bi trebalo da ucita dva niza a zatim funkcija spoji da proveri koji su sve clanovi niza jednaki i da ih spoji u novi niz, ali taj deo oko provere i ugnjezdenih petlji mi nije bas jasan jel to nesto kao npr:
Code:

for(i=0;i<n;i++)
for (=0;j<n;j++)
if(a[i]=b[j])

.................................

sta dalje kako sve to dodeliti u treci niz c npr , molim vas za malo vise detalja i pomoci .
----------------------------------------------------------------------------
Code:

#include<stdio.h>

main()
{
    void citaj();
    int n,m,i,a[],b[];

    printf("Unesite broj elemenata prvog niza: ");
    scanf("%d",&n);
    citaj(n,a[]);

    printf("Unesite broj elemenata drugog niza: ");
    scanf("%d",&m);
    citaj(m,b[]);


}

void citaj(int x, int *a){
     int i;
     for(i=0;i<x;i++){
          printf("[%d] element niza je:",i+1);
          scanf("%d",&a[i]);
     }
}
 --------------------------------------------------------


[Ovu poruku je menjao X Files dana 08.09.2011. u 14:49 GMT+1]
[ pajaja @ 08.09.2011. 01:11 ] @
Jeste tako nesto, evo konkretno funcije spoji():
Code (c):

void spoji(int *a, int *b, int *c){
     int k = 0; //brojac za niz c
     int i,j; //brojaci za a i b
     for(i=0;a[i]!='\0';i++){ // \0 je NULL i oznacava kraj niza, tako da ne moras da prosledjujes funciji i koliko clanova ima niz
          for(j=0;b[j]!='\0';j++){
               if(a[i] == b[j]){
                    c[k++] = a[i]; //dodeljuje se vrednost koja se pojavljuje u oba niza na poziciju k i uvecava se brojac
               }
          }
     }
     c[k] = '\0'; //zavrsavas niz sa NULL terminatorom tj. \0
}
 

Sto se tice glavne funcije, kada procitas m i n, odmah inicijalizujes niz sa brojem elemenata m ili n koji ce da drzi clanove. Na primer onda bi glavna funcija izgledala ovako:
Code (c):

void main(){
     void citaj();
     void spoji();
     void ispisi();

     int n,m, min;
     printf("Unesite broj elemenata prvog niza: ");
     scanf("%d",&n);
     int a[n]; //inicijalizacija prvog niza sa n clanova
     citaj(n,a);

     printf("Unesite broj elemenata drugog niza: ");
     scanf("%d",&m);
     int b[m]; // inicijalizacija drugog niza m clanova
     citaj(m,b);

     if(m>n){
          min = n;
     }else{
          min = m;
     }
     int c[min]; //inicijalizujes treci niz koji ce da sadrzi vrednosti koje se pojavljuju u oba niza
     
     spoji(a,b,c);
     ispisi(c);
}
 

Nemoj da me drzis za rec, mozda ima negde neka greska u sintaksi ili slicno, ali mislim da je to to. Naravno, iako radi ako ti nesto nije jasno pitaj :)
[ nigth rider @ 08.09.2011. 02:50 ] @
Kompletan kod izgleda ovako, morao sam da stavim da su nizovi ograniceni na 100 jer c ne prihvata nacin inicijalizacije tako sto cu da mu dodelim n ili to bi verovatno trebalo preko dinamicke dodele memorije ali ja sa tim bas slabo stojim.

Code:
#include<stdio.h>

main()
{
    void citaj();
    void sortiraj();
    void pisi();

     int n,m, a[100],b[100],c[100];
     printf("Unesite broj elemenata prvog niza: ");
     scanf("%d",&n);
    
     citaj(n,a);

     printf("Unesite broj elemenata drugog niza: ");
     scanf("%d",&m);
     
     citaj(m,b);

   
     
     sortiraj(a,b,c);
     pisi(c);
}


void citaj(int x, int *a){
     int i;
     for(i=0;i<x;i++){
          printf("[%d] element niza je:",i+1);
          scanf("%d",&a[i]);
     }
}

void sortiraj(int *a, int *b, int *c){
     int k = 0;                      
     int i,j; 
     for(i=0;a[i]!='\0';i++){
          for(j=0;b[j]!='\0';j++){
               if(a[i] == b[j]){
                    c[k++] = a[i]; 
               }
          }
     }
     c[k] = '\0'; 
}

void pisi(int *a)
{
    int i;
    for(i=0;a[i]!='\0';i++)
    {
        printf("Niz c je %d\t",a[i]);
    }
}



E kada krenem da kompajliram ovaj kod sve se pokrene i uspem da upisem clanove niza ali kada treba da izbaci obradu izbaci sledecu poruku :
...


Sad , predpostavljam da je greska negde u funkciji za sortiranje ali gde ?
Hvala

[Ovu poruku je menjao X Files dana 08.09.2011. u 14:48 GMT+1]
[ miodrags @ 08.09.2011. 07:44 ] @
Umesto :
Code:

if(a==b[j])

Treba :
Code:

if(a[i]==b[j])



[ nigth rider @ 08.09.2011. 13:18 ] @
Slucajno sam prilikom unosa koda na forum napisao
Code:

a==b[i]

...u kodu mi je ispravno i nece i dalje izbacuje istu gresku . Zaista sam probao dosta toga i nece, kao da funkcija za sortiranje a kasnije za ispis nije ispravna.


[Ovu poruku je menjao X Files dana 08.09.2011. u 14:52 GMT+1]
[ X Files @ 08.09.2011. 13:51 ] @
@nigth rider

Kod stavljaj u CODE tagove a ne u B tagove. Tada "indeks od i" nece biti protumacen kao ITALIC. Takodje, screenshotove najbolje uploaduj na ES server (Upload uz poruku).

Naslov teme (originalno: "Pomoc u resenju zadatka hitno !!!") daj tako da sugerise na sta se odnosi... Teme sa naslovom kako si napisao se najcesce brisu i bez citanja.


Hvala na razumevanju.
[ miodrags @ 08.09.2011. 13:57 ] @
U programu citaj na kraju dodaj naredbu :
Code:

a[i]='\0';

[ djoka_l @ 08.09.2011. 14:16 ] @
Ma ne valja ti program ni malo.

Ovo što ti je miodrags predložio, popravilo bi stanje, ali to ne znači da je program mnogo bolji. Nizovi celih brojeva nemaju kao terminator NULL karakter ('\0') već je to samo kod char nizova.

Drugo, u zahtevu zadatka se kaže da se učitavaju nizvoi CELIH brojeva, a broj 0 pripada skupu celih brojeva, tako da se ne može koristiti kao terminator niza brojeva. Uveo si varijable n i m pa ih i koristi.

Kako ja shvatam zadatak, potrebno je napraviti niz koji je PRESEK dva skupa definisinah nizovima.
Primer, ako je niz a sastavljen od elemenata (1, 1, 1), a niz b od elemenata (1,2) tada bi program na izlazu trebalo da da (1), a u tvom slučaju bi (kada bi program zaista i radio) dobio (1,1,1).

Sreća da u ovaj deo programa nisi ni stigao:

Code:

void pisi(int *a)
{
    int i;
    for(i=0;a[i]!='\0';i++)
    {
        printf("Niz c je %d\t",a[i]);
    }
}


U svakom prolasku kroz petlju ispisuješ string "Niz c je ".

Program treba izmeniti tako da funkcija koja formira niz c izbacuje iz drugog niza (b) elemente koji su pronađeni da se nalaze i u nizu a
[ nigth rider @ 08.09.2011. 17:57 ] @
Znam i sam da kod ne valja ali me interesuje da li neko moze da mi pomogne , naime funkcije citaj i pisi rade ali sortiraj nece nikako, e sada kada sam kod m i n , nizove nemogu da inicajilizujem tako cto su napisati int a[m], int b[m].

Moze li neko da mi pruzi neku konkretnu pomoc ?

Hvala .
[ nigth rider @ 08.09.2011. 22:09 ] @
Pokusao sam zadatak da resim na drugi nacin preko funkcije malloc za dinamicko dodeljivanje velicine niza i izgleda ovako :

Code:
#include<stdio.h>
#include<stdlib.h>

main()
{
    int n,m,max;
    int *A,*B,*C;
    printf("Unesite broj clanova niza A:");
    scanf("%d",&n);
    A=citaj(n);

    printf("Unesite broj clanova niza B:");
    scanf("%d",&m);
    B=citaj(m);
    
    printf("***************************************************\n");
    pisi(n,A);
    printf("***************************************************\n");
    pisi(m,B);

    if(m>n){
          max = n;
     }else{
          max = m;
     }

    C=(int*)malloc(max*sizeof(int));
    getch();
}


int citaj(int n)
{
    int i;
    int *a;

    a=(int*)malloc(n*sizeof(int));

    if(a==0)
    {
        printf("Greska!!! Nema dovoljno memorije!!!");
        return 1;
    }

    for(i=0;i<n;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    return realloc(a,n * sizeof(int));
    
    
}

int pisi(int n,int *a)
{
    int i;

    for(i=0;i<n;i++)
        
    {
        printf("a[%d]=",i);
        printf("%d\n",a[i]);
    }
    
    
}



E sada interesuje me kako da napravim funkciju koja ce da poredi elemente dva niza i da iste elemente smesta u novi niz?
[ miodrags @ 09.09.2011. 08:57 ] @
Mislim da nije uopšte bilo potrebno da radiš sa funkcijama za alociranje memorije. Samo je trebalo toj funkciji (spoji ili sortiraj ) da proslediš još dva ulazna argumenta m i n i da izostaviš poređenje sa '\0' jer ti to onda nije više potrebno.

Što se tiče sugestije da taj program ništa ne valja, to nije tako. Ono što je potrebno je da napišeš još dve funkcije i da ih pozoveš pre ili u samoj funkciji sortiraj. Prva od te dve funkcije bi trebalo da sortira već unete nizove u rastućem poretku npr. :

Code:

int sort(int n, int * a)
{
    int i,j,tmp;
    if(n<=0) return n;
    for(i=0;i<n-1;i++)
      for(j=i+1;j<n;j++)   // indeksi i<j
         if(a[i]>a[j])
             {
                 tmp=a[i];  // razmena a[i] i a[j]
                 a[i]=a[j];
                 a[j]=tmp;
             }
    return n;
}


Druga od te dve funkcije bi trebalo da izbaci višestruka ponavljanja istog elementa u nizu npr. :

Code:

int scan(int n, int * a)
{
    int i,j,k;
    if(n<=1) return n;
    for(i=0;i<n-1;i++)
      for(j=i+1;j<n;j++)   // indeksi i<j
         if(a[i]==a[j])
             {
                 n--;  // smanjujem duzinu niza za 1
                 for(k=j;k<n;k++) a[k]=a[k+1];  // pomeram sve ostale elemente za jedno mesto u levo
             }
    return n;
}


Funkcije vraćaju vrednost dužine niza n i ne rade za negativno n ili za n=0 !
[ djoka_l @ 09.09.2011. 13:53 ] @
Uh, kako komplikujete. Evo koda koji radi to što treba sa test primerom:

Code (c):


int main() {

   int a[] = {1,1,2,2,3,4,5},
       m=7,
       b[] = {1,1,2,5,6},
       n = 5,
       c[10],
       i,k;

   k=intersect(a, m, b, n, c);

   printf("Rezultat:\n");
   for (i=0; i<k; i++)
      printf("c[%d]= %d\n", i, c[i]);

   exit(0);
}

int intersect( int *set1, int set_size1,
               int *set2, int set_size2,
               int *result) {

   int i,j,k;

   k=0;
   for (i=0; i<set_size1; i++)
      for (j=0; j<set_size2; j++)
         if( set1[i] == set2[j] ) {
            result[k++] = set1[i];
            set2[j] = set2[set_size2-1];
            set_size2--;
            break;
         };
   return k;
}
 


Funkcija intersect nalazi presek dva niza, tako što ide u glavnoj petlji po elementima prvog niza. U unutrašnjoj petlji ide po drugom nizu, i ako nađe da postoji isti element, taj element stavlja u rezultujući niz, uvećava broj elemenata rezultujećeg niza i element drugog niza koji je pronađen u prvom briše, tako što na njegovo mesto stavlja poslednji element drugog niza, a dužinu drugog niza umanjuje za 1. Nakon pronalaska elementa koji se poklapa prekida unutrašnju petlju komandom break.

Drugi niz se menja u ovoj funkciji, a ako ti on treba za kasnije, onda pošalji njegovu kopiju...
[ nigth rider @ 09.09.2011. 16:37 ] @
Uspeo sam da resim zadatak naravno uz pomoc svih vas. Zadatak izgleda ovako , ali ponovo postoji mali problem koji cu da objasnim u daljem tekstu.

Code:
#include<stdio.h>
#include<stdlib.h>

main()
{
    int n,m,i,min;
    int *A,*B,*C;
    printf("Unesite broj clanova niza A:");
    scanf("%d",&n);
    A=citaj(n);
    sort(n,A);
    

    printf("Unesite broj clanova niza B:"); 
    scanf("%d",&m);
    B=citaj(m);
    sort(m,B);
    
    
    printf("***************************************************\n");
    printf("Clanovi niza A:\n");
    pisi(n,A);
    printf("\n");
    printf("Clanovi niza B:\n");
    pisi(m,B);

    if(m>n){
          min = n;
     }else{
          min = m;
     }

    C=(int*)malloc(min*sizeof(int));
    
    presek(A,n,B,m,C);
    realloc(C,min*sizeof(int));

     printf("\n");
     printf("***************************************************\n");
     printf("***************************************************\n");
     printf("Clanovi koji su isti u oba niza su:\n");
   for (i=0; i<min; i++)
      printf("c[%d]= %d\n", i, C[i]);
     printf("***************************************************\n");
     printf("***************************************************\n");
 
   free(A);
   free(B);
   free(C);
    
    getch();
}


int citaj(int n)
{
    int i;
    int *a;

    a=(int*)malloc(n*sizeof(int));

    if(a==0)
    {
        printf("Greska!!! Nema dovoljno memorije!!!");
        return 1;
    }

    for(i=0;i<n;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    return realloc(a,n * sizeof(int));
    
    
}

int pisi(int n,int *a)
{
    int i;

    for(i=0;i<n;i++)
        
    {
        printf("a[%d]=",i);
        printf("%d\n",a[i]);
    }
    
    
}

int sort(int n, int * a)
{
    int i,j,tmp;
    if(n<=0) return n;
    for(i=0;i<n-1;i++)
      for(j=i+1;j<n;j++)   // indeksi i<j
         if(a[i]>a[j])
             {
                 tmp=a[i];  // razmena a[i] i a[j]
                 a[i]=a[j];
                 a[j]=tmp;
             }
    return n;
}

int presek( int *A, int set_size1,
               int *B, int set_size2,int *rezultat) {

   int i,j,k;

   k=0;
   for (i=0; i<set_size1; i++)
      for (j=0; j<set_size2; j++)
         if( A[i] == B[j] ) {
            rezultat[k++] = A[i];
            B[j] = B[set_size2-1];
            set_size2--;
            break;
         };
   return k;
  
}



Slika ispod pokazuje rad programa kada se elementnti jednog niza nalaze u elementima drugog niza u potpunosti.



Slika ispod pokazuje problem kada se u niz C smesta manji broj elemenata nego sto se nalazi u bilo kom od dva niza koja se porede , tacnije problem je u delu koda kada niz C alociram preko malloc tako sto stavim da je duzina niza min*sizeof(int).



E sada to i niije toiliko strasno bitno mi je da je program proradio i da je zadatak resen ali mi je ruzno i nepotrebno da tako ostane.

Hvala svima na pomoci.
[ Sonec @ 09.09.2011. 17:57 ] @
Hm, ja bih rekao da ti argumenti funkcija malloc i realloc nisu dobri, tacnije za funkciju realloc, jer npr. iz ovoga

Code:
 C=(int*)malloc(min*sizeof(int));
    
    presek(A,n,B,m,C);
    realloc(C,min*sizeof(int));

se vidi da su argumentri f-je mall i realloc isti (u 1, odnosno 2 argumentu), a ne bi trebalo (sem ako min nisi menjao usput, posle malloc), f-ja realloc bi trebalo (kako bih ja uradio) da sadrzi neki KORAK, pa bi ona u pozivu izgledala
Code:
realloc(C,(min+KORAK)*sizeof(int))

takodje, ona bi trebala da bude dodeljena tom nizu, tj.
Code:
C=realloc(C,(min+KORAK)*sizeof(int))


Takodje, kada radis sa dinamickom alokacijom, bilo bi dobro da imas neku funkciju koja ce proveravati pri svakom koraku dinamicku alokaciju...

Nesto vise, mozes videti na ovom primeru: OVDE

[Ovu poruku je menjao Sonec dana 09.09.2011. u 21:27 GMT+1]
[ djoka_l @ 09.09.2011. 20:03 ] @
Problem je u tome što funkcija presek (u mom primeru se zvala intersect) kao svoj rezultat vraća broj članova rezultujućeg niza. Ti tu vrednost nigde ne prihvataš, nego koristiš min kao dužinu niza.

Dakle, umesto:

Code (c):

    presek(A,n,B,m,C);
    realloc(C,min*sizeof(int));
 


uradi:

Code (c):

    min = presek(A,n,B,m,C);
    realloc(C,min*sizeof(int));
 


i sve će biti kako treba...
[ nigth rider @ 12.09.2011. 18:07 ] @
Hvala na pomoci , sada sve zaista radi odlicno.
[ Predrag Student @ 05.10.2011. 10:09 ] @
Imam isti tip zadatak na ispitu sutra, glasi ovako:
1. Napisati funkciju na programskom jeziku C za spajanje dva učitana niza celih brojeva u rezultujući niz koji sadrži sve elemente iz dva niza *osim onih elemenata koji su isti u oba niza. U glavnom programu uneti dužinu niza i pozvati funkcije za učitavanje i spajanje niza.

*Razlika je samo u delu zadatka gde se traži ispis svih elemenata iz dva niza osim elemenata koji su isti u oba niza.

Da li neko zna da ovaj postojeći kod koji je ovde na forumu okačen preformuliše u ovaj koji se traži?

----------------------------
Podsetnik: kod koji je urađen (na forumu) za ispisivanje svih elemenata koji su isti u oba niza:
------------------------------
code:

Code:

#include<stdio.h>
#include<stdlib.h>

main()
{
    int n,m,i,min;
    int *A,*B,*C;
    printf("Unesite broj clanova niza A:");
    scanf("%d",&n);
    A=citaj(n);
    sort(n,A);

    printf("Unesite broj clanova niza B:"); 
    scanf("%d",&m);
    B=citaj(m);
    sort(m,B);

    printf("***************************************************\n");
    printf("Clanovi niza A:\n");
    pisi(n,A);
    printf("\n");
    printf("Clanovi niza B:\n");
    pisi(m,B);

    if (m > n)
    {
        min = n;
    }
    else
    {
        min = m;
    }

    C = (int*)malloc(min*sizeof(int));

    min = presek(A,n,B,m,C);
    realloc(C,min*sizeof(int));

    printf("\n");
    printf("***************************************************\n");
    printf("***************************************************\n");
    printf("Clanovi koji su isti u oba niza su:\n");

    for (i=0; i<min; i++)
        printf("c[%d]= %d\n", i, C[i]);

    printf("***************************************************\n");
    printf("***************************************************\n");

    free(A);
    free(B);
    free(C);

    getch();
}


int citaj(int n)
{
    int i;
    int *a;

    a = (int*)malloc(n*sizeof(int));

    if (a == 0)
    {
        printf("Greska!!! Nema dovoljno memorije!!!");
        return 1;
    }

    for(i=0;i<n;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }

    return realloc(a,n * sizeof(int));
}

int pisi(int n,int *a)
{
    int i;

    for(i=0;i<n;i++)
    {
        printf("a[%d]=",i);
        printf("%d\n",a[i]);
    }
}

int sort(int n, int * a)
{
    int i,j,tmp;

    if (n <= 0)
        return n;

    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)   // indeksi i<j
            if(a[i]>a[j])
            {
                tmp=a[i];  // razmena a[i] i a[j]
                a[i]=a[j];
                a[j]=tmp;
            }

    return n;
}

int presek(int *A, int set_size1,
           int *B, int set_size2,int *rezultat) 
{

    int i,j,k;

    k=0;
    for (i=0; i<set_size1; i++)
        for (j=0; j<set_size2; j++)
            if( A[i] == B[j] )
            {
                rezultat[k++] = A[i];
                B[j] = B[set_size2-1];
                set_size2--;
                break;
            };

    return k;

    system("pause");
}


--------------------------------------------------------------

Hvala vam unapred, za svaku vrstu pomoći!


[Ovu poruku je menjao Mihajlo Cvetanović dana 05.10.2011. u 11:24 GMT+1]
[ Mihajlo Cvetanović @ 05.10.2011. 11:00 ] @
Pa prva stvar je da ona promenljiva min (veličina rezultatnog niza) mora da uzme u obzir najgori scenario. U ovom slučaju najgori scenario je da nema ni jednog elementa zajedničkog u oba niza, što znači da u rezultatni niz ulaze svi elementi iz oba niza. Promenljiva min treba da dobije vrednost m+n, a ne min(m, n). Shodno tome ne bi trebalo ni da se zove min, i bolje bi bilo da se zove duzina_C, ili nešto drugo što ne govori o tome kako je dobijeno, nego čemu služi.

Drugo, funkcija koja radi posao verovatno ne treba da se zove presek, jer se ne traži presek nego simetrična razlika.

Treće, trenutni kod u funkciji presek nije optimalan za računanje preseka, jer ne koristi činjenicu da su nizovi sortirani. Postoji bolji kod koji ima jednu petlju umesto dve. U toj jednoj petlji koristimo dva indeksa, po jedan za svaki niz, ali u jednom prelazu petlje inkrementiramo samo jedan od ta dva, i to onaj koji referencira manji od dva elementa. Cilj ovakve logike je da jurimo iste elemente u dva niza. Funkcija presek je trebalo da izgleda ovako:

Code:
int presek(int *A, int set_size1,
           int *B, int set_size2,int *rezultat) 
{
    int i, j, k;

    i = j = k = 0;

    while (i < set_size1 && j < set_size2)
    {
        if (A[i] == B[j])
        {
            rezultat[k++] = A[i];
            i++;
            j++;
        }
        else if (A[i] < B[j])
            i++;
        else
            j++;
    }

    return k;
}


Kad se ovako postave stvari onda računanje simetrične razlike biva lakše. Opisaću šta treba, a ti probaj to da realizuješ. Imaj u vidu da su oba niza sortirana. Funkcija i dalje treba da inkrementira onaj indeks sa manjim elementom, ili oba, ako su elementi jednaki, stoga tu logiku ne diraj. Ono što je razlika je da funkcija treba da nađe elemente koji su različiti, a ne jednaki, tako da ona linija gde se popunjava niz rezultat sad treba da stoji u druge dve grane. Novi element niza rezultat treba da dobije manju vrednost od dve dostupne. Ako ti nije jasno šta se dešava onda uzmi na papiru dva sortirana niza, i prvo nađi presek, a onda nađi i simetričnu razliku, i to tako što slediš logiku sa inkrementiranjem onog indeksa čiji je element manji u svakom koraku. Kad vidiš na papiru kako to radi, biće ti lakše da to pretvoriš u kod.
[ djoka_l @ 05.10.2011. 14:13 ] @
Samo da na brzinu odgovorim na zapažanje na neoptimizovani kod:

http://www.elitesecurity.org/t436366-0#2945515

Kao što se iz mog posta na ovoj temi vidi, ja sam dao rešenje koje ne zahteva da su nizovi sortirani, dok je night rider, deo sa bubble sort ubacio potpuno nepotrebno iz prethodnih snipeta koji nisu rešavali problem (po meni je daleko bolje da night rider nauči kako da koristi bibliotečku funkciju qsort, nego da piše najgori mogići kod po pitanju performansi za sortiranje).

Sada mi je žao što sam dao gotov kod, jer vidim da night rider nije ništa naučio iz njega, a sutra mu je ispit.

Zato ću ti reći isto što kažem i mojoj desetogodišnjoj ćerki kad ima problem sa zadakom iz matematike: NACRTAJ SLIKU!

Ono što tebi treba je da od unije dva skupa (predstavljenih nizovima) oduzmeš presek ta dva skupa. Funkciju za presek imaš od pre, napravi trivijalnu funkciju za uniju i iskoristi caku za brisanje člana niza koju sam ti demonstrirao u svom primeru...

edit: ne treba da se radi prvo unija pa oduzimanje preseka nego (a-p) unija (b - p) gde su ti a i b ulazni nizovi, a p njihov presek..

[Ovu poruku je menjao djoka_l dana 05.10.2011. u 15:45 GMT+1]