#include <stdio.h>
#include <time.h>
#include <conio.h>
#define TIPO int
TIPO MAX = 100;
TIPO MIN = 1;
int DIM = 0;
int primoavvio=0;
int primopopolo=0;
TIPO Accetta()
{
TIPO temp;
scanf("%d",&temp);
while ( getchar() != '\n' );
return temp;
}
void DimVet()
{
int temp=DIM;
do
{
printf("\n\nInserisci la nuova dimensione del vettore(intero positivo maggiore di zero): ");
DIM=Accetta();
}while(DIM<=0);
printf("\nLa nuova nuova dimensione del vettore e' %d\n", DIM);
primoavvio=1;
if(temp<DIM) primopopolo=0;
}
void RandDIM()
{
int temp=DIM,MIN,MAX;
printf("\nDefinisci l'intervallo di estrazione (min e max) ");
do{printf("\nMIN = ");MIN=Accetta();}while(MIN<0);
do{printf("\nMAX = ");MAX=Accetta();}while(MAX<MIN);
DIM=rand()%(MAX-MIN+1)+MIN;
printf("\nLa nuova nuova dimensione del vettore e' %d\n", DIM);
primoavvio=1;
if(temp<DIM) primopopolo=0;
}
void CaricaVet(TIPO vet[],int DIM)
{
int i;
for(i=0;i<DIM;i++)
{
printf("\nInserisci l'elemento del vettore di posto %d: ",i);
vet[i]=Accetta();
}
primopopolo=1;
}
void RandVet(TIPO vet[],int DIM)
{
int i;
printf("\nDefinisci l'intervallo di estrazione degli elementi del vettore (min e max) ");
printf("\nMIN = ");MIN=Accetta();
do{printf("\nMAX = ");MAX=Accetta();}while(MAX<MIN);
for(i=0;i<DIM;i++)
{
vet[i]=rand()%(MAX-MIN+1)+MIN;
printf("\nVET[%d]=%d",i,vet[i]);
}
primopopolo=1;
}
void Scambia(int a,int b,TIPO vet[])
{
TIPO temp=vet[a];
vet[a]=vet[b];
vet[b]=temp;
}
int PosMin(TIPO vet[],int DIM)
{
int i,posmin=0;
for(i=1;i<DIM;i++)
if(vet[posmin]>vet[i]) posmin=i;
return posmin;
}
int PosMax(TIPO vet[],int DIM)
{
int i,posmax=0;
for(i=1;i<DIM;i++)
if(vet[posmax]<vet[i]) posmax=i;
return posmax;
}
int MediaInt(TIPO vet[],int DIM)
{
TIPO media=0;
int i;
for(i=0;i<DIM;i++)
media+=vet[i];
return (int) media/DIM;
}
float MediaFloat(TIPO vet[],int DIM)
{
float media=0;
int i;
for(i=0;i<DIM;i++)
media+=vet[i];
return (float) media/DIM;
}
int Scarto(TIPO vet[],int DIM)
{
int i,posmin=0,media=MediaInt(vet,DIM);
for(i=1;i<DIM;i++)
if(abs(media-vet[posmin])>abs(media-vet[i])) posmin=i;
return posmin;
}
void OrdinaC(TIPO vet[],int DIM)
{
int i,j,pos;
for(i=0;i<DIM;i++)
{
pos=i;
for(j=i+1;j<DIM;j++)
if(vet[j]<vet[pos])pos=j;
Scambia(i,pos,vet);
}
}
void OrdinaD(TIPO vet[],int DIM)
{
int i,j,pos;
for(i=0;i<DIM;i++)
{
pos=i;
for(j=i+1;j<DIM;j++)
if(vet[j]>vet[pos])pos=j;
Scambia(i,pos,vet);
}
}
void OrdinaBC(TIPO vet[],int DIM)
{
int i,flag=1,n=DIM-1;
do
{
flag=0;
for(i=0;i<n;i++)
if(vet[i]>vet[i+1])
{
Scambia(i,i+1,vet);
flag++;
}
n--;
}while(flag>0);
}
void OrdinaBD(TIPO vet[],int DIM)
{
int i,flag=1,n=DIM-1;
do
{
flag=0;
for(i=0;i<n;i++)
if(vet[i]<vet[i+1])
{
Scambia(i,i+1,vet);
flag++;
}
n--;
}while(flag>0);
}
void StampaEle(int i,TIPO vet[])
{
printf("\n VET[%d]=%d",i,vet[i]);
}
void Stampa(TIPO vet[],int DIM)
{
int i;
for(i=0;i<DIM;i++)
StampaEle(i,vet);
}
void Occorrenze(TIPO vet[],int DIM)
{
int i,j,num;
for(i=0;i<DIM;i++)
{
num=0;
for(j=0;j<DIM;j++)
if(i>j && vet[i]== vet[j]) break;
else if (vet[i]==vet[j]) num++;
if(num!=0)printf("\nil valore %d e' stato estratto %d volte",vet[i],num);
}
}
int Cerca(int ele,TIPO vet[],int DIM)
{
int i=0;
while((vet[i]!=ele) && i++<DIM);
return i;
}
void Shuffle(TIPO vet[],int DIM)
{
int i;
for(i=0;i<DIM;i++)
Scambia(i,rand()%DIM,vet);
}
void Uscita()
{
printf("\nARRIVEDERCI!");
system("PAUSE");
}
int mcd(int a, int b) //ALGORITMO DI EUCLIDE
{
if (b == 0)
return a;
else
return mcd(b, a % b);
}
int MCD(TIPO vet[],int DIM)
{
int i=0,a=0;
if(vet[PosMin(vet,DIM)]==1) return 1;
if(DIM==1) return vet[0];
while(i<DIM)a=mcd(a,vet[i++]);
return a;
}
int mcm(int a,int b)
{
return (a*b)/mcd(a,b);
}
int MCM(TIPO vet[],int DIM)
{
int i=0,a=1;
if(DIM==1) return vet[0];
while(i<DIM)a=mcm(a,vet[i++]);
return a;
}
int SottoMenu(int n)
{
switch(n)
{
case 3 ... 4:
{
if(primoavvio==0)
printf("\n\tNon hai ancora dichiarato la dimensione del vettore");
else
{
printf("\n\tLa dimensione attuale del vettore e' %d, vuoi cambiarla?",DIM);
printf("\n\t0: Usa la dimensione attuale");
}
printf("\n\t1: Inserisci manualmente la dimensione del vettore");
printf("\n\t2: Genera casualmente la dimensione del vettore");
printf("\n\t3: Torna al menu\n\t");
break;
}
case 10: {
printf("\n\t0: Ordina in verso crescente (ordinamento ingenuo)");
printf("\n\t1: Ordina in verso decrescente (ordinamento ingenuo)");
printf("\n\t2: Ordina in verso crescente (bubble sort)");
printf("\n\t3: Ordina in verso decrescente (bubble sort)");
printf("\n\t4: Torna al menu\n\t");
break;}
}
}
void SottoScelta(int n,TIPO vet[],int DIM)
{
SottoMenu(n);
switch(n)
{
case 3:{
switch(Accetta())
{
case 1: DimVet();break;
case 2: RandDIM();break;
}
CaricaVet(vet,DIM);
break;
}
case 4:{
switch(Accetta())
{
case 1: DimVet();break;
case 2: RandDIM();break;
}
RandVet(vet,DIM);
break;
}
case 10:{
switch(Accetta())
{
case 0: OrdinaC(vet,DIM);break;
case 1: OrdinaD(vet,DIM);break;
case 2: OrdinaBC(vet,DIM);break;
case 3: OrdinaBD(vet,DIM);break;
}
Stampa(vet,DIM);break;
}
}
}
int Menu()
{
int temp=0;
void PrimiQuattro()
{
printf("\n");
printf("\nSchiaccia il tasto relativo alla funzione che vuoi attivare");
printf("\n0: Uscita");
printf("\n1: Definisci dimensione del vettore");
printf("\n2: Genera casualemente la dimensione del vettore");
printf("\n3: Inserisci manualmente gli elementi del vettore");
printf("\n4: Genera casualmente gli elementi del vettore\n");
}
system("cls");
if(primopopolo==0)
{
if(primoavvio==0) printf("\nProgramma per la gestione dei vettori\nPer iniziare dichiara la dimensione del vettore");
else printf("\nDevi ancora popolare il vettore");
PrimiQuattro();
return Accetta();
}
PrimiQuattro();
printf("5: Estrai il minimo dal vettore");
printf("\n6: Estrai il massimo dal vettore");
printf("\n7: Calcola la media intera");
printf("\n8: Calcola la media reale");
printf("\n9: Estrai il valore piu' vicino alla media");
printf("\n10: Ordina il vettore");
printf("\n11: Stampa il vettore");
printf("\n12: Stampa un elemento del vettore");
printf("\n13: Calcola occorrenze");
printf("\n14: Cerca elemento nel vettore");
printf("\n15: Mischia il vettore");
printf("\n16: Calcola M.C.D. e m.c.m.");
printf("\n");
return Accetta();
}
void Scelta(int vet[],int DIM)
{
int temp,a;
do
{
do
{
temp=Menu();
}
while((primopopolo==0 && (temp<0 || temp>4))||(primopopolo!=0 && (temp<0 || temp>16)));
switch (temp)
{
case 1: DimVet();break;
case 2: RandDIM();break;
case 3: SottoScelta(temp,vet,DIM);break;
case 4: SottoScelta(temp,vet,DIM);break;
case 5: printf("\nIl minimo vale %d ed occupa la posizione %d", vet[PosMin(vet,DIM)],PosMin(vet,DIM));break;
case 6: printf("\nIl massimo vale %d ed occupa la posizione %d", vet[PosMax(vet,DIM)],PosMax(vet,DIM));break;
case 7: printf("\nLa media intera vale %d",MediaInt(vet,DIM));break;
case 8: printf("\nLa media reale vale %f",MediaFloat(vet,DIM));break;
case 9: printf("\nIl valore piu' vicino alla media vale %d e occupa la posizione %d",vet[Scarto(vet,DIM)],Scarto(vet,DIM));break;
case 10: SottoScelta(temp,vet,DIM);break;
case 11: Stampa(vet,DIM);break;
case 12: {do{printf("\nInserisci la posizione dell'elemento che vuoi stampare (tra 0 a %d)",DIM-1);scanf("%d",&a);}while(a<0 || a>=DIM);StampaEle(a,vet);break;}
case 13: Occorrenze(vet,DIM);break;
case 14: {printf("\n\nInserisci il valore dell'elemento che vuoi cercare ");Cerca(Accetta(),vet,DIM);break;}
case 15: {Shuffle(vet,DIM);Stampa(vet,DIM);break;}
case 16: printf("\nIl massimo comune divisore vale: %d\nIl minimo comune multiplo vale: %d",MCD(vet,DIM),MCM(vet,DIM));break;
}
printf("\n\nPremere un tasto per continuare...");
getch();
}
while(temp!=0);
}
int main()
{
TIPO vet[DIM];
srand(time(NULL));
Scelta(vet,DIM);
Uscita();
return 0;
}