+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 3 su 3

Problema con l'algoritmo a ricerca binaria

  1. #1
    Shoot non è in linea Novello
    Post
    47
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve a tutti. Ho un problema con un programma C. Sto facendo questo programma basato su un elenco telefonico. Ho due opzioni, la prima mi mette in ordine l'elenco in base al cognome, la seconda mi trova il numero di telefono attraverso il cognome, il nome e il domicilio. La prima opzione funziona, però la seconda ha qualche problema. Io ho messo 4 utenti con i loro rispettivi cognomi, nomi, domicili e numeri di telefono. Il programma mi trova i primi due utenti, gli altri 2 invece no. Spero che qualcuno riesca a darmi una mano, perchè è un problema molto scomodo. Ecco il codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    struct persona{
            char *nome;
            char *cognome;
            char *domicilio;
            char *numero_di_telefono;
    };
    
    typedef struct persona id;
    
    struct utenti{
            id utente;
    };
    
    typedef struct utenti utenti;
    
    void Scambio(utenti* a, utenti* b)
    {
    utenti tmp;
    
    tmp = *a;
    *a = *b;
    *b = tmp;
    
    return;
    }
    int ric_bin(char chiave_cognome[], char chiave_nome[], char chiave_domicilio[],  id utenti[], int n);
    int ric_bin(char chiave_cognome[], char chiave_nome[], char chiave_domicilio[],  id utenti[], int n)
    {
     int mediano, primo = 0, ultimo = n-1;
         while(primo <= ultimo)
         {
             mediano = (primo + ultimo)/2;
                 if(strcmp(chiave_cognome, utenti[mediano].cognome)== 0 && strcmp(chiave_nome, utenti[mediano].nome)== 0 && strcmp(chiave_domicilio, utenti[mediano].domicilio)== 0  )
                       return mediano;
                 else if(strcmp(chiave_cognome, utenti[mediano].cognome) < 0)
                            ultimo = mediano-1;
                      else
                            primo = mediano+1;
         }
       return -1;
    }
    int main()
    {
        int i;
        int ult_scambio;
        int fine_ord;
        int n=4;
        fine_ord=n-1;
        utenti utenti[100];
        int scelta;
        char nome_chiave[20];
        char cognome_chiave[20];
        char domicilio_chiave[20];
    utenti[0].utente.cognome="Lee";
    utenti[0].utente.nome="Luca";
    utenti[0].utente.domicilio="Scala";
    utenti[0].utente.numero_di_telefono="081/4617899";
    
    utenti[1].utente.cognome="Scorre";
    utenti[1].utente.nome="Gina";
    utenti[1].utente.domicilio="Via.Scala";
    utenti[1].utente.numero_di_telefono="081/4613456";
    
    utenti[2].utente.cognome="Berlusconi";
    utenti[2].utente.nome="Silvio";
    utenti[2].utente.domicilio="Via.Scala";
    utenti[2].utente.numero_di_telefono="081/4614479";
    
    utenti[3].utente.cognome="Della.Morte";
    utenti[3].utente.nome="Angelo";
    utenti[3].utente.domicilio="Via.Mare";
    utenti[3].utente.numero_di_telefono="081/5058963";
    printf("Premi 1 per mettere in ordine l'elenco in base al cognome \n");
    printf("Premi 2 per cercare il numero di telefono che vuoi trovare in base al cognome, al nome e al domicilio \n");
    scanf("%d",&scelta);
    switch(scelta)
    {
        case 1: while (fine_ord!=0)
        {
            ult_scambio=0;
            for (i=0; i<fine_ord; i++)
            {
                if (strcmp(utenti[i].utente.cognome, utenti[i+1].utente.cognome) > 0)
                {
                  Scambio(&utenti[i], &utenti[i+1]);
                 ult_scambio=i;
                }
            }
            fine_ord=ult_scambio;
        }
        for (i=0;i<n;i++) {
            printf("%s %s %s %s \n",utenti[i].utente.nome, utenti[i].utente.cognome, utenti[i].utente.domicilio, utenti[i].utente.numero_di_telefono);
    
        } break;
    
        case 2:printf("Inserisci il cognome \n");
        scanf("%s",&cognome_chiave);
        printf("Inserisci il nome \n");
        scanf("%s",&nome_chiave);
        printf("Inserisci il domicilio \n");
        scanf("%s",&domicilio_chiave);
            int esito =ric_bin(cognome_chiave, nome_chiave, domicilio_chiave, utenti, n);
        if(esito== -1)
        printf("L'utente non e' stato trovato\n");
        else
        printf("Il numero telefonico di %s %s residente in %s e': %s\n", utenti[esito].utente.cognome, utenti[esito].utente.nome, utenti[esito].utente.domicilio, utenti[esito].utente.numero_di_telefono);
    }
    }
    

  2. #2
    Post
    17,513
    Blogs
    6
    Like Inviati  
    6
    Like Ricevuti  
    36
    Perché la ricerca binaria funzioni, il vettore deve essere ordinato.
    ℹ️ Leggi di più su AntonioG ...

  3. #3
    Shoot non è in linea Novello
    Post
    47
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ho fatto in questo modo e ho provato tutti e quattro i contatti. Funzionano tutti. Grazie mille.
    Ultima modifica di Shoot; 12-11-2020 13:48 

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Algoritmo Ricerca Vocali
    Da maxpix nel forum Altri linguaggi e strumenti
    Risposte: 1
    Ultimo Post: 17-09-2013, 09:15
  2. Algoritmo Ricerca Foglie
    Da maxpix nel forum Altri linguaggi e strumenti
    Risposte: 9
    Ultimo Post: 16-09-2013, 19:24
  3. [C++] Ricerca binaria
    Da Nottambulo nel forum C/C++
    Risposte: 6
    Ultimo Post: 04-03-2012, 05:18
  4. [C] Function ricerca binaria ricorsiva
    Da mariano.monaco nel forum C/C++
    Risposte: 8
    Ultimo Post: 26-01-2012, 21:26
  5. Risposte: 12
    Ultimo Post: 11-03-2011, 14:04