Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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("\n1Riempi Vettore da tastiera ");
printf("\n2Visualizza Vettore ");
printf("\n3Ordina Vettore ");
printf("\n4Ricerca ");
printf("\n5Carica Vettore da File ");
printf("\n6Salva il Vettore su File ");
printf("\n7Fine ");
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, N1, 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<dim1;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<dim1 && !ordinato;j++){
ordinato=1;
for (i=dim1;i>j;i)
if (strcmp(v[i].cognome,v[i1].cognome)<0 ||
!strcmp(v[i].cognome,v[i1].cognome) && strcmp(v[i].nome,v[i1].nome)<0)
{
scambia(v,i,i1);
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,medio1,x);
}