/*
    Unija, presek i razlika dva niza integera  v2.c

    Data su dva niza integera A[] i B[].

    Puni se treci niz C i prikazuje ekranu:

    Unija AUB koja predstavlja sve elemente  koji su u A i B.

    Presek A presek B koji predstavlja elemente  koji su i u A i u B.

    Razlika A\B koja predstavlja sve elemente  koji su A a nisu u B.

    Razlika B\A koja predstavlja sve elemente  koji su B a nisu u A.

*/

#include  <stdio.h>


// Prikazuje niz sa  n integer-a sa tekst komentarom
void prikazi_niz(  char *tekst, int niz[], int n )
{
    int i;
    printf("\n%s", tekst ); //  prikazuje tekst komentara
    for(i=0;i<n;i++) // prolazi kroz ceo niz
        printf("%3d", niz[i] ); //  prikazuje i-ti clan niza
    printf("\n");
}

// vraca 1 ako broj  postoji u nizu niz[] koji je duzine n,
// inace vraca 0
int  postoji_u_nizu(int niz[], int n, int broj)
{
    int i;
    for(i=0;i<n;i++) // prolazimo kroz ceo  niz
        if(niz[i] == broj) // ako je broj vec u  nizu, vraca 1
            return 1;
    return 0; // broj nije u nizu i zato vraca  0
}

void  A_unija_B_u_C(int A[],int na,int B[],int nb,int C[],int *nc){
// funkcija kao  argument dobija pointer (memorijsku adresu) nc
// na kojoj je  smesten brojni podatak duzina niza C,
// da bi mogla da  promeni duzinu niza C.
    int i;
    *nc=0; // duzina niza C je na adresi nc, i  nju resetujemo na 0
// prolazimo kroz  sve elemente niza A i njima punimo niz C
    for(i=0;i<na;i++)
        C[(*nc)++] = A[i]; // ovde se uvecava  broj koji je na adresi nc
// prolazimo kroz  sve elemente niza B i niz C punimo elementima niza B
// koji vec ne  postoje u nizu A
    for(i=0;i<nb;i++)
// ako element B[i]  vec ne postoji u nizu A, dodajemo ga u niz C
        if(!postoji_u_nizu(A,na,B[i]))
            C[(*nc)++] = B[i]; // ovde se  uvecava broj koji je na adresi nc
}

void  A_presek_B_u_C(int A[],int na,int B[],int nb,int C[],int *nc){
    int i;
    *nc=0;
// niz C punimo  elementima niza A koji postoje i u nizu B
    for(i=0;i<na;i++) // prolazimo kroz ceo  niz A
// proveravamo da li  broj A[i] postoji u nizu B
        if(postoji_u_nizu(B,nb,A[i]))
            C[(*nc)++] = A[i]; // ako postoji,  stavljamo ga u niz C
}

void  A_razlika_B_u_C(int A[],int na,int B[],int nb,int C[],int *nc){
    int i;
    *nc=0;
    for(i=0;i<na;i++) // niz C punimo  elementima niza A koji nisu u nizu B
        if(!postoji_u_nizu(B,nb,A[i]))
            C[(*nc)++] = A[i];
}

void  B_razlika_A_u_C(int A[],int na,int B[],int nb,int C[],int *nc){
    int i;
    *nc=0;
    for(i=0;i<na;i++) // niz C punimo  elementima niza B koji nisu u nizu A
        if(!postoji_u_nizu(A,na,B[i]))
            C[(*nc)++] = B[i];
}

int main(void){
// Broj clanova niza  A nije na pocetku eksplicitno zadat,
// vec se popunjava  elemntima koji su zarezom odvojeni u viticastoj zagradi.
// Broj clanova niza  A (na) dobijamo tako sto memorijski prostor koji
// zauzima niz A  podelimo sa memorijskim prostorom koji zauzima jedan integer.
    int A[] = {1,2,3,4,5,6},  na=sizeof(A)/sizeof(int);
    int B[] = {4,5,6,7,8,9},  nb=sizeof(B)/sizeof(int);
    int C[100], nc=0;

    printf("\n Broj clanova niza A je %d  \n", na);
    prikazi_niz(" Niz A :  ",A,na);
    printf("\n\n Broj clanova niza B je %d  \n", nb);
    prikazi_niz(" Niz B :  ",B,nb);

    A_unija_B_u_C(A,na,B,nb,C,&nc);
    printf("\n\n Broj clanova niza C je %d  \n", nc);
    prikazi_niz(" A unija B :  ",C,nc);

    A_presek_B_u_C(A,na,B,nb,C,&nc);
    printf("\n\n Broj clanova niza C je %d  \n", nc);
    prikazi_niz(" A presek B :  ",C,nc);

    A_razlika_B_u_C(A,na,B,nb,C,&nc);
    printf("\n\n Broj clanova niza C je %d  \n", nc);
    prikazi_niz(" A \\ B :  ",C,nc);

    B_razlika_A_u_C(A,na,B,nb,C,&nc);
    printf("\n\n Broj clanova niza C je %d  \n", nc);
    prikazi_niz(" B \\ A :  ",C,nc);

    return 0;
}