PDA

Visualizza la versione completa : Function ricerca binaria ricorsiva, piccolo problemino


mariano.monaco
24-02-2010, 20:05
Premetto sono alle prime armi..
Salve, ho bisogno di un piccolissimo aiuto. Di questo programma in c mi stato chiesto di eseguire una function che permetta la ricerca di un numero di telefono tra un elenco di numeri e informazioni di persone da me inserite in input. In caso affermativo, il programma dovrebbe stamparmi le informazioni (nome, cognome, indirizzo) del soggetto.
Il problema che quando vado ad eseguire la function per la ricerca di un numero tel. mi da sempre esito negativo.
Sapreste trovarmi l'errore?




#include <stdio.h>
#include<string.h>
#include<conio.h>
#define SIZE 100
#define SIZEV 3


/*STRUCT PERSONA*/
typedef struct
{
char nome[SIZE];
char cognome[SIZE];
char indirizzo[SIZE];
char telefono[SIZE];
} Persona;


void caricaPersona ( Persona *p);
void caricaVettore(Persona *p,int n);
void ordinaVettore(Persona *p,int n);
void stampaPersona (Persona p);
void stampaVettore(Persona *p,int n);




void caricaPersona(Persona *p)
{
printf ("********************\n");
char invio;
printf("Nome:");
gets(p->nome);
printf("Cognome:");
gets(p->cognome);
printf("Indirizzo:");
gets(p->indirizzo);
printf("Telefono: 081\\");
gets(p->telefono);
}

/*Questa procedura carica il vettore*/
void caricaVettore(Persona *p,int n)
{
int i;
for(i=0;i<n;i++)
{
caricaPersona(&p[i]);
}
}


/*Questa procedura ordina il vettore*/
void ordinaVettore(Persona *p,int n)
{
int i,j;
char buffer[SIZE];
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{

/*La strcmp prende come parametri due char* e restituisce 0 se le due stringhe sono uguali,
>0 se la prima maggiore della seconda,
<0 se la prima minore della seconda
(lavorando con le stringhe parlando di maggiore e minore si intende
il normale ordine lessicografico).*/

if (strcmp(p[i].cognome,p[j].cognome)>= 1)
{
strcpy(buffer,p[i].cognome);
strcpy(p[i].cognome,p[j].cognome);
strcpy(p[j].cognome,buffer);
strcpy(buffer,p[j].nome);
strcpy(p[j].nome,p[i].nome);
strcpy(p[i].nome,buffer);
strcpy(buffer,p[j].indirizzo);
strcpy(p[j].indirizzo,p[i].indirizzo);
strcpy(p[i].indirizzo,buffer);
strcpy(buffer,p[j].telefono);
strcpy(p[j].telefono,p[i].telefono);
strcpy(p[i].telefono,buffer);

}
}
}
}


/*Questa procedura stampa il vettore in output*/
void stampaPersona(Persona p)
{
printf("\nCognome:%s \nNome:%s \nIndirizzo: %s\nTelefono':%s\n",p.cognome,p.nome,p.indirizzo,p .telefono);
}
void stampaVettore(Persona *p,int n)
{
int i;
for (i=0;i<n;i++)
stampaPersona(p[i]);
}

/*Procedura ricerca binaria ricorsiva*/
int ricerca_bin(Persona gente[],int first,int last,char tel[]){
int med;
if(first > last) /* caso in cui il vettore terminato, ritorno il valore -1 ad indicare che l'elemento non esiste */
return -1;
else
{
med = (first + last)/2;
if(tel==gente[med].telefono)
return med;
else
if (strcmp(tel,gente[med].telefono)>0) /* nel caso in cui tel sia pi grande di gente[med] */
return ricerca_bin(gente,med+1,last,tel);
else
return ricerca_bin(gente,first,med-1,tel);
}
}



//*CORPO DEL PROGRAMMA*//
int main(void)
{
char ch;
int i,j,eta;
Persona p[SIZEV],buffer[SIZEV];
printf ("\n****INSERISCI CONTATTI NELLE RUBRICA*****\n");
caricaVettore(p,SIZEV);
printf ("\n************RUBRICA ORDINATA*************\n");
ordinaVettore(p,SIZEV);
stampaVettore(p,SIZEV);

/* ricerca binaria ricorsiva */
int idx;
char tel[50];
printf ("\n \n");
printf("Inserire il num da cercare:");
scanf("%c",tel);
idx = ricerca_bin(p,0,SIZEV,tel);
if(idx == -1)
printf("Siamo spiacente, ma il numero selezionato non e' stato trovato \n");
else{
printf ("numero selezionato trovato: \b");
printf("\nNome:%s \n Cognome:%s \n Indirizzo: %s\n Telefono':%d\n",p[idx].nome,p[idx].cognome,p[idx].indirizzo,p[idx].telefono);
}

system("PAUSE");
return 0;

}

LeleFT
25-02-2010, 12:05
Per il futuro: posta il codice indentato (questo privo di indentazione) all'interno degli appositi tag CODE (e non QUOTE, che servono ad altro).


Ciao. :ciauz:

Loading