Sei sulla pagina 1di 3

Scrivere un programma (main) in linguaggio C che, attraverso un menu permetta di:

 definisca uno struct persona composto dai campi: cognome, nome e telefono
 definisca un vettore di struct persona, la cui dimensione viene fissata liberamente a scelta
dello studente
 richiami una procedura di riempimento del vettore
 richiami una procedura che visualizza l'intero vettore
 richiami una procedura che ordina il vettore per cognome e nome (ordine alfabetico
crescente), utilizzando il Bubbole Sort
 richiami una funzione di ricerca binaria per cognome e nome, che permetta di visualizzare il
telefono nel caso in cui il cognome e nome venga trovato nel vettore.
 Registri il vettore su file
 Permetta di caricare da file (se esiste) il contenuto del vettore

Soluzione

#include<stdio.h>
#include<string.h>

#define N 15
#define C 20

struct persona {
  char cognome[C], nome[C], telefono[C];
} ;

struct persona archivio[N];
FILE *f;

void flush(void);
void LeggiStringa(char [],unsigned short );
void riempi(struct persona [], unsigned long);
void stampa(struct persona [], unsigned long);
void scambia(struct persona [], unsigned long, unsigned long);
void BubbleSort(struct persona [],unsigned long);
long RicercaBinaria(struct persona [], long, long, struct persona);

main(){
 struct persona elem;
 long indice;
 unsigned short scelta;
 
 do {
    printf("\n1­Riempi Vettore da tastiera ");
    printf("\n2­Visualizza Vettore ");
    printf("\n3­Ordina Vettore ");
    printf("\n4­Ricerca  ");
    printf("\n5­Carica Vettore da File ");
    printf("\n6­Salva il Vettore su File ");
    printf("\n7­Fine ");
    printf("\nInserisci la scelta ");
    scanf("%u",&scelta);
    flush();
    switch(scelta){   
          case 1:  riempi(archivio,N);
                   break;  
          case 2:  stampa(archivio,N);
                   break;

1
          case 3:  BubbleSort(archivio,N);
                   break;
          case 4:  printf("\nInserisci il Cognome da Cercare");
                   LeggiStringa(elem.cognome,C);
                   printf("\nInserisci il Nome da Cercare");
                   LeggiStringa(elem.nome,C);
                   indice=RicercaBinaria(archivio, 0, N­1, elem);
                   if (indice<0)
                      printf ("\nElemento non trovato");
                   else {
                         printf("\nElemento Trovato di indice %ld ",indice);
                         printf("\nTelefono = %s ",archivio[indice].telefono); 
                   }
                   break;
           case 5: if (f=fopen("archivio.dat","rb")) 
                     fread(archivio,sizeof(struct persona),N,f);
                   else printf("\nErrore di Apertura File "); 
 break;
           case 6: f=fopen("archivio.dat","wb");
                   fwrite(archivio,sizeof(struct persona),N,f);
                   fclose(f);
    }
  }while (scelta<7);  

void flush(void){
  while(getchar()!='\n');
}

void LeggiStringa(char s[],unsigned short dim){
  unsigned short i;
  for (i=0; (s[i]=getchar())!='\n' && i<dim­1;i++);
  s[i]='\0';
}

void riempi(struct persona v[], unsigned long dim){
  unsigned long i;

  for (i=0; i<dim; i++) {
    printf("\n\nElemento %u ",i);
    printf("\nCognome ");
    LeggiStringa(v[i].cognome,C);
    printf("\nNome ");
    LeggiStringa(v[i].nome,C);
    printf("\nTelefono ");
    LeggiStringa(v[i].telefono,C);
  }
}

void stampa(struct persona v[], unsigned long dim){
  unsigned long i;

  for (i=0; i<dim; i++) {
    printf("\n\nElemento %u ",i);
    printf("\nCognome %s", v[i].cognome);
    printf("\nNome %s", v[i].nome);
    printf("\nTelefono %s", v[i].telefono);
  }

2
}

void scambia(struct persona v[], unsigned long i, unsigned long j)
{
  struct persona temp=v[i];

  v[i]=v[j];
  v[j]=temp;
}

void BubbleSort(struct persona v[],unsigned long dim){
 unsigned long i,j;
 short ordinato=0;

 for (j=0;j<dim­1 && !ordinato;j++){
  ordinato=1;

  for (i=dim­1;i>j;i­­)
     if (strcmp(v[i].cognome,v[i­1].cognome)<0 ||
        !strcmp(v[i].cognome,v[i­1].cognome) && strcmp(v[i].nome,v[i­1].nome)<0)
      {
             scambia(v,i,i­1);
             ordinato=0;
      }
 }
}

long RicercaBinaria(struct persona v[], long inf, long sup, struct persona x)
{
  long medio=(inf + sup)/2;

  if (inf>sup) return ­1;
  if (!strcmp(v[medio].cognome,x.cognome) &&
      !strcmp(v[medio].nome,x.nome)) 
                         return medio;
  if (strcmp(v[medio].cognome,x.cognome)<0 ||
     !strcmp(v[medio].cognome,x.cognome) && strcmp(v[medio].nome,x.nome)<0)
         return RicercaBinaria(v,medio+1,sup,x);
  if (strcmp(v[medio].cognome,x.cognome)>0 ||
     !strcmp(v[medio].cognome,x.cognome) && strcmp(v[medio].nome,x.nome)>0)
         return RicercaBinaria(v,inf,medio­1,x);
}

Potrebbero piacerti anche