/*
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;
}