/* Questo programma contiene alcuni esempi di manipolazione di arrays unidimensionali mediante 
 funzioni. La cosa piu' importante da ricordare (e di cui osservare l'uso) e' che il passaggio
 di un array unidimensionale ad una funzione corrisponde al passaggio del puntatore al primo 
 elemento dell'array */



#include <stdio.h>

int IntRand(void); /* QUESTA FUNZIONE GENERA INTERI UNIFORMEMENTE DISTRIBUITI FRA ZERO E 100 */

void DivideOddEven(int Data[100], int *DataOdd, int DataEven[], int); /* QUESTA FUNZIONE SEPARA GLI ELEMENTI 
 DISPARI E PARI DEL VETTORE Data IN DUE VETTORI DISTINTI */

int CountOdd(int DataOdd[], int); /* QUESTA FUNZIONE CONTA IL NUMERO DI ELEMENTI DISPARI DEL VETTORE Data */

main(){
int N=5000, *i,k,NOdd,NEven;
int Data[N], DataOdd[N],DataEven[N];

	for(i=Data;i<Data+N;i++){
		*i=IntRand();
		}

	for(k=0;k<N;k++){
		printf("Data[%i]=%i\n\n",k, Data[k]);
	}
	
	DivideOddEven(Data, DataOdd, DataEven, N);
	
	NOdd=CountOdd(Data, N);
	
	printf("Il numero di elementi dispari e' %d e questi elementi sono \n",NOdd);
	for(k=0;k<NOdd;k++){
		printf("DataOdd[%d]=%d \n",k,*(DataOdd+k));
	}

	NEven=N-NOdd;
	
	printf("Il numero di elementi pari e' %d e questi elementi sono \n",NEven);
	
	for(k=0;k<NEven;k++){
		printf("DataEven[%d]=%d \n",k,*(DataEven+k));
	}


}


int IntRand(void){	
	
	return	lrand48()%(100+1);

}

void DivideOddEven(int Source[], int Odd[], int Even[], int LEN){
	int *pSource;
	for(pSource=Source; pSource<Source+LEN; pSource++){
		if(*pSource % 2){*Odd = *pSource;
		*Odd++;}else{
			*Even=*pSource;
		*Even++;}
	}
		
}


int CountOdd(int Dat[], int M){
	int *PDat;
	int NumOdd=0;
	
	for(PDat=Dat;PDat<Dat+M;PDat++){
		if(*PDat%2){NumOdd++;}
	}
	
	return NumOdd;
	
}