Problema ricerca binaria ricorsiva Dizionario della lingua italiana

di il
14 risposte

Problema ricerca binaria ricorsiva Dizionario della lingua italiana

Buonasera, con la premessa che sono alle prime armi avrei un problema per quanto riguarda un progetto in c. In pratica il progetto richiede che l'utente deve effettuare i seguenti punti, ovvero:

• Inserire una parola, ricercarla nel dizionario e visualizzare il significato
• Inserire una nuova parola nel dizionario se è possibile (le parole per ogni lettera possono essere al massimo 5)
• Ricercare una parola mediante l'utilizzo di un algoritmo di ricerca binario ricorsivo

Il problema sorge dopo il secondo punto, una volta inserita la parola verifico che sia inserita correttamente tramite una procedura che mi permette di stampare l'intero dizionario(fin qui va tutto bene la parola compare con il proprio significato ed eventuali sinonimi) però se vado a ricercarla all'interno della funzione ric_bin_ricTF non me la trova. Sapreste darmi una mano? grazie in anticipo ecco il codice:

// Includiamo le librerie

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

// Definiamo il Min e il Max

#define Min 50
#define Max 500

// Definiamo la struct composta da 4 campi "lettera, nome, significato e sinonimi"

typedef struct {
	char lettera;
	char nome[Min];
	char significato[Max];
	char sinonimo[Min][Min];
} Dizionario;

// Prototipi funzioni

int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[]);
void riempi_dizionario(Dizionario *a);
int ricerca_lettera(Dizionario *a, char ch);
void compilazione_dizionaro(Dizionario *a , int *dim_arr);
void stampa_dizionario(Dizionario *a, int *dim_arr);

int main ()
{                                                   // Parte dichiarativa
    Dizionario a[120];
    int indice_ricerca, first=0, last=25;
    int dim_arr=20;
    int scelta_caso, uscita_dal_menu=0;
    char chiave [24];
    riempi_dizionario(a);                           // Procedura che permette di riempire il dizionario
    do                                              // Ciclo do while, permette la creazione di un menù
    {
    system("CLS");
    system("COLOR 2");
    printf("\t\t\t\t********************************************\n");
    printf("\t\t\t\t*                                          *\n");
    printf("\t\t\t\t*     Dizionario della lingua Italiana     *\n");
    printf("\t\t\t\t*                                          *\n");
    printf("\t\t\t\t********************************************\n");
    printf("\n --- ATTENZIONE --- : Nel dizionario sono escluse le lettere straniere\n");
    printf("\n Selezionare una delle seguenti scelte:");
    printf("\n\n [1] Se si vuole ricercare una parola \n [2] Se si vuole aggiungere una parola all\'interno del vocabolario \n [3] Se si vuole stampare il dizionario \n [4] Se si vuole chiudere il programma.\n\n Scelta: \t");
    scanf("%d", &scelta_caso);
    if (scelta_caso == 1)      // Costrutto di selezione permette di selezionare la prima scelta del menù
    {
        system("CLS");
        fflush(stdin);
        printf("\n Inserire la parola da ricercare:\t");
        gets(chiave);                                          // Acquisizione chiave
        indice_ricerca=ric_bin_ricTF(a, first, last, chiave);  // Chiamata algoritmo di ricerca binaria ricorsiva
        if (indice_ricerca>=0)        // Se la ricerca fornisce esito positivo allora si procede con quanto segue
            {
                printf("\n\n Il significato della parola %s e' :\n\n%s", a[indice_ricerca].nome, a[indice_ricerca].significato);
                printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[indice_ricerca].sinonimo[0], a[indice_ricerca].sinonimo[1], a[indice_ricerca].sinonimo[2], a[indice_ricerca].sinonimo[3], a[indice_ricerca].sinonimo[4]);
                system("Pause");
            }
        else                          // altrimenti viene selezionata la seguente opzione
            {
                printf("\a\n La parola non e\' stata trovata nel dizionario\n\n ");
                system("Pause");
            }
    }
    else if (scelta_caso == 2)     // Costrutto di selezione permette di selezionare la seconda scelta del menù
    {
        compilazione_dizionaro(a, &dim_arr); // Procedura che permette l'inserimento di nuovi elementi all'interno della struct Dizionario
    }
    else if (scelta_caso== 3){          // Costrutto di selezione permette di selezionare la terza scelta del menù
    	stampa_dizionario(a, &dim_arr); // Chiamata alla procedura che permette di stampare il dizionario
    	system("Pause");
	}
    else                           // Costrutto di selezione permette di selezionare la quarta scelta del menù
    {
        printf("\n\n ---------- Grazie per aver usato il nostro programma ---------- \n\n");
        printf("\n\n");
        uscita_dal_menu++;               // Contatore che permette l'uscita dal menù
    }
    }
    while (uscita_dal_menu != 1);        // Chiusura del ciclo do while, permette l'uscita dal menù
    system("Pause");
    return 0;
}

void riempi_dizionario(Dizionario *a)   // Inizializzazione della struct dizionario
{
    a[0].lettera='a';
    strcpy (a[0].nome, "antico");
    strcpy (a[0].significato, "Di eta\' passata da gran tempo, che risale a molti anni o a molti secoli fa.");
    strcpy (a[0].sinonimo[0], "vecchio");
    strcpy (a[0].sinonimo[1], "preistorico");
    strcpy (a[0].sinonimo[2], "primitivo");
    strcpy (a[0].sinonimo[3], "remoto");
    strcpy (a[0].sinonimo[4], "arcaico");

    a[1].lettera='b';
    strcpy (a[1].nome, "banca");
    strcpy (a[1].significato, "Istituto che compie operazioni monetarie e creditizie.");
    strcpy (a[1].sinonimo[0], "istituto di credito");
    strcpy (a[1].sinonimo[1], "istituto di emissione");
    strcpy (a[1].sinonimo[2], "istituto finanziario");
    strcpy (a[1].sinonimo[3], "cassa");
    strcpy (a[1].sinonimo[4], "cassa di risparmio");

    a[2].lettera='c';
    strcpy (a[2].nome, "conchiglia");
    strcpy (a[2].significato, "Involucro che protegge il corpo dei molluschi.");
    strcpy (a[2].sinonimo[0], "valva");
    strcpy (a[2].sinonimo[1], "guscio");
    strcpy (a[2].sinonimo[2], "nicchio");

    a[3].lettera='d';
    strcpy (a[3].nome, "dizionario");
    strcpy (a[3].significato, "Raccolta delle parole di una determinata lingua.");
    strcpy (a[3].sinonimo[0], "lessico");
    strcpy (a[3].sinonimo[1], "vocabolario");
    strcpy (a[3].sinonimo[2], "glossario");

    a[4].lettera='e';
    strcpy (a[4].nome, "enoteca");
    strcpy (a[4].significato, "Raccolta, in genere a scopo commerciale, di bottiglie di vini pregiati di vario tipo.");
    strcpy (a[4].sinonimo[0], "bottiglieria");
    strcpy (a[4].sinonimo[1], "cantina");
    strcpy (a[4].sinonimo[2], "fiaschetteria");
    strcpy (a[4].sinonimo[3], "vineria");
    strcpy (a[4].sinonimo[4], "liquoreria");

    a[5].lettera='f';
    strcpy (a[5].nome, "ferro");
    strcpy (a[5].significato, "Elemento chimico dal simbolo Fe, presente nei minerali da cui viene estratto (ossidi, solfuri, carbonati).");
    strcpy (a[5].sinonimo[1], "lama");
    strcpy (a[5].sinonimo[2], "catene");
    strcpy (a[5].sinonimo[3], "ceppi");
    strcpy (a[5].sinonimo[4], "manette");

    a[6].lettera='g';
    strcpy (a[6].nome, "golfo");
    strcpy (a[6].significato, "Avanzamento piu\' o meno accentuato e aperto del mare entro la terraferma, con profondita\' varia ma con prevalenza di fondali bassi o medi.");
    strcpy (a[6].sinonimo[0], "baia");
    strcpy (a[6].sinonimo[1], "insenatura");
    strcpy (a[6].sinonimo[2], "cala");
    strcpy (a[6].sinonimo[3], "fiordo");

    a[7].lettera='h';
    strcpy (a[7].nome, "hotel");
    strcpy (a[7].significato, "Parola di uso internazionale, e s\'intende di solito un albergo di lusso o comunque di buona categoria.");
    strcpy (a[7].sinonimo[0], "pensione");
    strcpy (a[7].sinonimo[1], "motel");
    strcpy (a[7].sinonimo[2], "locanda ");
    strcpy (a[7].sinonimo[3], "rifugio");
    strcpy (a[7].sinonimo[4], "riparo");

    a[8].lettera='i';
    strcpy (a[8].nome, "isole");
    strcpy (a[8].significato, "Porzione di terraferma completamente circondata dalle acque di un oceano, mare, lago, fiume, palude.");
    strcpy (a[8].sinonimo[0], "area staccata");
    strcpy (a[8].sinonimo[1], "oasi");
    strcpy (a[8].sinonimo[2], "territorio isolato");

    a[9].lettera='l';
    strcpy (a[9].nome, "libro");
    strcpy (a[9].significato, "Complesso di fogli della stessa misura, stampati o manoscritti, e cuciti insieme cosi da formare un volume, fornito di copertina o rilegato.");
    strcpy (a[9].sinonimo[0], "tomo");
    strcpy (a[9].sinonimo[1], "registro");
    strcpy (a[9].sinonimo[2], "manuale");
    strcpy (a[9].sinonimo[3], "opera");
    strcpy (a[9].sinonimo[4], "trattato");

    a[10].lettera='m';
    strcpy (a[10].nome, "monologo");
    strcpy (a[10].significato, "Scena drammatica in cui un attore parla e recita da solo.");
    strcpy (a[10].sinonimo[0], "soliloquio");

    a[11].lettera='n';
    strcpy (a[11].nome, "noleggiare");
    strcpy (a[11].significato, "Contratto di locazione di un mezzo di trasporto o di beni mobili: pagare il noleggio; noleggio di un pianoforte, di una tenda.");
    strcpy (a[11].sinonimo[0], "tariffa della locazione ");
    strcpy (a[11].sinonimo[1], "affitto");
    strcpy (a[11].sinonimo[2], "locazione");
    strcpy (a[11].sinonimo[3], "nolo");

    a[12].lettera='o';
    strcpy (a[12].nome, "oroscopo");
    strcpy (a[12].significato, "In senso originario, punto dell\'eclittica, o costellazione dello zodiaco, che sorge in un dato momento all\'orizzonte.");
    strcpy (a[12].sinonimo[0], "predizione");
    strcpy (a[12].sinonimo[1], "pronostico");
    strcpy (a[12].sinonimo[2], "previsione");

    a[13].lettera='p';
    strcpy (a[13].nome, "pelle");
    strcpy (a[13].significato, "In senso generico, organo di rivestimento esterno del corpo dell\'uomo o degli animali, detta anche cute e facente parte, con i cosiddetti annessi cutanei, del sistema tegumentario.");
    strcpy (a[13].sinonimo[0], "epidermide");
    strcpy (a[13].sinonimo[1], "derma");
    strcpy (a[13].sinonimo[2], "carnagione ");
    strcpy (a[13].sinonimo[3], "cuoio");
    strcpy (a[13].sinonimo[4], "rivestimento");

    a[14].lettera='q';
    strcpy (a[14].nome, "quadro");
    strcpy (a[14].significato, "Dipinto di forma quadrangolare.");
    strcpy (a[14].sinonimo[0], "tela");
    strcpy (a[14].sinonimo[1], "dipinyo");
    strcpy (a[14].sinonimo[2], "tavola");

    a[15].lettera='r';
    strcpy (a[15].nome, "ragno");
    strcpy (a[15].significato, "Nome comune di alcune specie di acari della famiglia trombididi.");
    strcpy (a[15].sinonimo[0], "aracnide");
    strcpy (a[15].sinonimo[1], "treppiede");


    a[17].lettera='t';
    strcpy (a[17].nome, "terreno");
    strcpy (a[17].significato, "Genericamente, lo strato superficiale della crosta terrestre.");
    strcpy (a[17].sinonimo[0], "ampo");
    strcpy (a[17].sinonimo[1], "suolo");
    strcpy (a[17].sinonimo[2], "area");
    strcpy (a[17].sinonimo[3], "lotto");
    strcpy (a[17].sinonimo[4], "superfice");

    a[18].lettera='u';
    strcpy (a[18].nome, "ulivo");
    strcpy (a[18].significato, "Albero sempreverde di media altezza, ha foglie ovali di colore verde scuro nella pagina superiore e verde argenteo in quella inferiore, frutti a drupa verdastri o neri, da cui si estrae l1'olio.");
    strcpy (a[18].sinonimo[0], "Sinonimi non presenti");

    a[19].lettera='v';
    strcpy (a[19].nome, "vigneto");
    strcpy (a[19].significato, "Esteso appezzamento di terra coltivato a vite.");
    strcpy (a[19].sinonimo[0], "vigna");

    a[20].lettera='z';
    strcpy (a[20].nome, "zebra");
    strcpy (a[20].significato, "Denominazione comune di vari mammiferi, diffusi nelle savane africane, simili al cavallo e dotati di un mantello a strisce trasversali bianche e nere.");
    strcpy (a[20].sinonimo[0], "Sinonimi non presenti");

    a[21].lettera;
    strcpy (a[21].nome, "zell");
    strcpy (a[21].significato, "Denominazione comune di vari mammiferi, diffusi nelle savane africane, simili al cavallo e dotati di un mantello a strisce trasversali bianche e nere.");
    strcpy (a[21].sinonimo[0], "Sinonimi non presenti");
}

int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[])    // Algoritmo ricerca binaria ricorsiva
{                                                                                                // Ha come parametri in ingresso Array in cui cercare
    int med;                                                                                // Indice first da cui partire, inizializzato nel main
    if (first > last)                                                            // Indice last a cui fermarsi nella ricerca, anchesso inizializzato nel main
      return -1;                                                                            // Chiave ovvero l'elemento da cercare
    else
    {
      med = (first + last) / 2;
    if (strcmp(chiave,a[med].nome)==0)                               // I valori in uscita sono
      return med;                                                                 // Successo della ricerca ed posizione dell'elemento nell'array
    else if (strcmp(chiave,a[med].nome)>0)                          // Un numero negativo può essere considerato un insucesso
      return ric_bin_ricTF(a, med+1, last, chiave);
    else
      return ric_bin_ricTF(a, first, med-1, chiave);
    }
}

void compilazione_dizionaro(Dizionario *a ,int *dim_arr) // Procedura per l'acquisizione dei nuovi dati
{                                                        // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
    int opzione, i, numero_sinonimi=0, num, uscita_dal_menu2=0, i_o;  
                                                         // I parametri in uscita sono gli ultimi 3 campi della struct
    int cout=0;
    char ch;
    do
    {
        printf("\n Selezionare una delle seguenti scelte:");
	    printf("\n\n [1] Se si vuole inserire una nuova parola \n [2] Se si vuole ritornare al menu\' principale\n\n Scelta: \t");
        scanf("%d",&opzione);

        if(opzione==1)                    // Costrutto di selezione che permette di creare nuovamente un menù
        {
            system("CLS");
            fflush(stdin);
            printf("\n\n Digitare il primo carattere della parola da memorizzare:\t");
            scanf("%c",&ch);
            for(i=0; i < *dim_arr; i++)
                {
                    if (a[i].lettera==ch)
                    {
                        cout++;
                    }
                }

            if (cout<=5) // Costrutto che permette di selezione la seguente alternativa finchè le parole per ogni lettera non siano maggiori di 5
            {
            	*dim_arr= *dim_arr+1;
                fflush(stdin);
                printf("\n\n Inserire la nuova parola da memorizzare:\t");
                gets(a[*dim_arr].nome);                                        // Acquisizione parola
                printf("\n\n Inserire il significato della parola:\n\n ");
                gets(a[*dim_arr].significato);                                 // Acquisizione significato
                printf("\n\n Inserire il numero dei sinonimi:\t");
                scanf("%d", &numero_sinonimi);
                if(numero_sinonimi<=5)
                {
                    i_o=0;
                    for(num=0;num<numero_sinonimi;num++)
                        {
                            fflush(stdin);
                            printf("\nInserire il sinonimo:\t");
                            gets(a[*dim_arr].sinonimo[i_o]);                     // Acquisizione sinonimi
                            i_o=i_o+1;
                        }
                }
                else
                {
                    printf("\a\n\n Possono essere inseriti massimo 5 sinonimi per ogni parola\n\n");
                }
            }
            else
            {
                system("CLS");
                printf ("\a\n\n Non puoi memorizzare piu\' parole con questa lettera\n\n");
                system("Pause");
            }
        }
        else
        {
            printf("\n\n");
            n++;    // Contatore che permette di uscire dal menù e tornare al menù principale
        }
    }
    while(uscita_dal_menu2 != 1); // Chiusura del ciclo do while
    cout=0;
}

void stampa_dizionario(Dizionario *a, int *dim_arr) // Procedura per la stampa dei dati
{                                                   // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
 	int i;
 	for(i=0; i<= *dim_arr; i++)
        {
            printf("\n\n Parola : %s", a[i].nome);
            printf("\n\n Significato :\n %s", a[i].significato);
            printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[i].sinonimo[0], a[i].sinonimo[1], a[i].sinonimo[2], a[i].sinonimo[3], a[i].sinonimo[4]);
	    }
}

14 Risposte

  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Non è che la spiegazione sia chiara... tu usi la funzione di ricerca al punto 1 quindi è il punto 1 che non funziona?

    E poi mi togli una curiosità? Perché usi last=25 ?
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Salve, ora cerco di rispiegarmi meglio. Il progetto mi richiede di simulare la gestione di un dizionario della lingua italiana. Il primo punto mi chiede di inserire una parola ricercarla tra quelle di default e trovare la parola stessa il significato ed eventuali sinonimi(funziona correttamente). Il secondo punto mi chiede di inserire una nuova parola all'interno del dizionario massimo 5 parole per lettera (credo che anche qua si debba rivedere poichè ho un unico contatore che viene incrementato mano mano che l'utente inserisce le parole, fino ad un max di 5 parole, poi viene riportato a 0). Il problema sorge al terzo punto poichè devo ricercare le parole (sia di default che quelle inserite dall'utente, quindi la funzione viene utilizzata per entrambi i punti)tramite l'algoritmo di ricerca binaria ricorsiva, ora per quanto riguarda le parole di default me le trova correttamente, mentre, quelle che inserisce l'utente no. Però se stampo il dizionario le parole sono presenti. Inoltre uso *dim_arr per modificare il contenuto di last. last è uguale a 20, avevo messo 25 perchè pensavo che il problema fosse il size della porzione in cui cercare ma non è cosi!! spero di essermi spiegato meglio, ora riallego il codice aggiustato, grazie in anticipo.
    // Includiamo le librerie
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    // Definiamo il Min e il Max
    
    #define Min 50
    #define Max 500
    
    // Definiamo la struct composta da 4 campi "lettera, nome, significato e sinonimi"
    
    typedef struct {
    	char lettera;
    	char nome[Min];
    	char significato[Max];
    	char sinonimo[Min][Min];
    } Dizionario;
    
    // Prototipi funzioni
    
    int ric_bin_ricTF(Dizionario a[], int first, int last, char chiave[]);
    void riempi_dizionario(Dizionario a[]);
    void compilazione_dizionaro(Dizionario *a , int *dim_arr);
    void stampa_dizionario(Dizionario a[], int *dim_arr);
    
    int main ()
    {                                                   // Parte dichiarativa
        Dizionario a[120];
        int indice_ricerca, first=0, last=20;
        int *dim_arr;
        int scelta_caso, uscita_dal_menu=0;
        char chiave [24];
        riempi_dizionario(a);                           // Procedura che permette di riempire il dizionario
        do                                              // Ciclo do while, permette la creazione di un menù
        {
        system("CLS");
        system("COLOR 2");
        dim_arr=&last;
        printf("%d", *dim_arr);
        printf("\t\t\t\t********************************************\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t*     Dizionario della lingua Italiana     *\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t********************************************\n");
        printf("\n --- ATTENZIONE --- : Nel dizionario sono escluse le lettere straniere\n");
        printf("\n Selezionare una delle seguenti scelte:");
        printf("\n\n [1] Se si vuole ricercare una parola \n [2] Se si vuole aggiungere una parola all\'interno del vocabolario \n [3] Se si vuole stampare il dizionario \n [4] Se si vuole chiudere il programma.\n\n Scelta: \t");
        scanf("%d", &scelta_caso);
        if (scelta_caso == 1)      // Costrutto di selezione permette di selezionare la prima scelta del menù
        {
            system("CLS");
            fflush(stdin);
            printf("\n Inserire la parola da ricercare:\t");
            gets(chiave);                                          // Acquisizione chiave
            indice_ricerca=ric_bin_ricTF(a, first, last, chiave);  // Chiamata algoritmo di ricerca binaria ricorsiva
            if (indice_ricerca>=0)        // Se la ricerca fornisce esito positivo allora si procede con quanto segue
                {
                    printf("\n\n Il significato della parola %s e' :\n\n%s", a[indice_ricerca].nome, a[indice_ricerca].significato);
                    printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[indice_ricerca].sinonimo[0], a[indice_ricerca].sinonimo[1], a[indice_ricerca].sinonimo[2], a[indice_ricerca].sinonimo[3], a[indice_ricerca].sinonimo[4]);
                    system("Pause");
                }
            else                          // altrimenti viene selezionata la seguente opzione
                {
                    printf("\a\n La parola non e\' stata trovata nel dizionario\n\n ");
                    system("Pause");
                }
        }
        else if (scelta_caso == 2)     // Costrutto di selezione permette di selezionare la seconda scelta del menù
        {
            compilazione_dizionaro(a, dim_arr); // Procedura che permette l'inserimento di nuovi elementi all'interno della struct Dizionario
        }
        else if (scelta_caso== 3){          // Costrutto di selezione permette di selezionare la terza scelta del menù
        	stampa_dizionario(a, dim_arr); // Chiamata alla procedura che permette di stampare il dizionario
        	system("Pause");
    	}
        else                           // Costrutto di selezione permette di selezionare la quarta scelta del menù
        {
            printf("\n\n ---------- Grazie per aver usato il nostro programma ---------- \n\n");
            printf("\n\n");
            uscita_dal_menu++;               // Contatore che permette l'uscita dal menù
        }
        }
        while (uscita_dal_menu != 1);        // Chiusura del ciclo do while, permette l'uscita dal menù
        system("Pause");
        return 0;
    }
    
    void riempi_dizionario(Dizionario *a)   // Inizializzazione della struct dizionario
    {
        a[0].lettera='a';
        strcpy (a[0].nome, "antico");
        strcpy (a[0].significato, "Di eta\' passata da gran tempo, che risale a molti anni o a molti secoli fa.");
        strcpy (a[0].sinonimo[0], "vecchio");
        strcpy (a[0].sinonimo[1], "preistorico");
        strcpy (a[0].sinonimo[2], "primitivo");
        strcpy (a[0].sinonimo[3], "remoto");
        strcpy (a[0].sinonimo[4], "arcaico");
    
        a[1].lettera='b';
        strcpy (a[1].nome, "banca");
        strcpy (a[1].significato, "Istituto che compie operazioni monetarie e creditizie.");
        strcpy (a[1].sinonimo[0], "istituto di credito");
        strcpy (a[1].sinonimo[1], "istituto di emissione");
        strcpy (a[1].sinonimo[2], "istituto finanziario");
        strcpy (a[1].sinonimo[3], "cassa");
        strcpy (a[1].sinonimo[4], "cassa di risparmio");
    
        a[2].lettera='c';
        strcpy (a[2].nome, "conchiglia");
        strcpy (a[2].significato, "Involucro che protegge il corpo dei molluschi.");
        strcpy (a[2].sinonimo[0], "valva");
        strcpy (a[2].sinonimo[1], "guscio");
        strcpy (a[2].sinonimo[2], "nicchio");
    
        a[3].lettera='d';
        strcpy (a[3].nome, "dizionario");
        strcpy (a[3].significato, "Raccolta delle parole di una determinata lingua.");
        strcpy (a[3].sinonimo[0], "lessico");
        strcpy (a[3].sinonimo[1], "vocabolario");
        strcpy (a[3].sinonimo[2], "glossario");
    
        a[4].lettera='e';
        strcpy (a[4].nome, "enoteca");
        strcpy (a[4].significato, "Raccolta, in genere a scopo commerciale, di bottiglie di vini pregiati di vario tipo.");
        strcpy (a[4].sinonimo[0], "bottiglieria");
        strcpy (a[4].sinonimo[1], "cantina");
        strcpy (a[4].sinonimo[2], "fiaschetteria");
        strcpy (a[4].sinonimo[3], "vineria");
        strcpy (a[4].sinonimo[4], "liquoreria");
    
        a[5].lettera='f';
        strcpy (a[5].nome, "ferro");
        strcpy (a[5].significato, "Elemento chimico dal simbolo Fe, presente nei minerali da cui viene estratto (ossidi, solfuri, carbonati).");
        strcpy (a[5].sinonimo[1], "lama");
        strcpy (a[5].sinonimo[2], "catene");
        strcpy (a[5].sinonimo[3], "ceppi");
        strcpy (a[5].sinonimo[4], "manette");
    
        a[6].lettera='g';
        strcpy (a[6].nome, "golfo");
        strcpy (a[6].significato, "Avanzamento piu\' o meno accentuato e aperto del mare entro la terraferma, con profondita\' varia ma con prevalenza di fondali bassi o medi.");
        strcpy (a[6].sinonimo[0], "baia");
        strcpy (a[6].sinonimo[1], "insenatura");
        strcpy (a[6].sinonimo[2], "cala");
        strcpy (a[6].sinonimo[3], "fiordo");
    
        a[7].lettera='h';
        strcpy (a[7].nome, "hotel");
        strcpy (a[7].significato, "Parola di uso internazionale, e s\'intende di solito un albergo di lusso o comunque di buona categoria.");
        strcpy (a[7].sinonimo[0], "pensione");
        strcpy (a[7].sinonimo[1], "motel");
        strcpy (a[7].sinonimo[2], "locanda ");
        strcpy (a[7].sinonimo[3], "rifugio");
        strcpy (a[7].sinonimo[4], "riparo");
    
        a[8].lettera='i';
        strcpy (a[8].nome, "isole");
        strcpy (a[8].significato, "Porzione di terraferma completamente circondata dalle acque di un oceano, mare, lago, fiume, palude.");
        strcpy (a[8].sinonimo[0], "area staccata");
        strcpy (a[8].sinonimo[1], "oasi");
        strcpy (a[8].sinonimo[2], "territorio isolato");
    
        a[9].lettera='l';
        strcpy (a[9].nome, "libro");
        strcpy (a[9].significato, "Complesso di fogli della stessa misura, stampati o manoscritti, e cuciti insieme cosi da formare un volume, fornito di copertina o rilegato.");
        strcpy (a[9].sinonimo[0], "tomo");
        strcpy (a[9].sinonimo[1], "registro");
        strcpy (a[9].sinonimo[2], "manuale");
        strcpy (a[9].sinonimo[3], "opera");
        strcpy (a[9].sinonimo[4], "trattato");
    
        a[10].lettera='m';
        strcpy (a[10].nome, "monologo");
        strcpy (a[10].significato, "Scena drammatica in cui un attore parla e recita da solo.");
        strcpy (a[10].sinonimo[0], "soliloquio");
    
        a[11].lettera='n';
        strcpy (a[11].nome, "noleggiare");
        strcpy (a[11].significato, "Contratto di locazione di un mezzo di trasporto o di beni mobili: pagare il noleggio; noleggio di un pianoforte, di una tenda.");
        strcpy (a[11].sinonimo[0], "tariffa della locazione ");
        strcpy (a[11].sinonimo[1], "affitto");
        strcpy (a[11].sinonimo[2], "locazione");
        strcpy (a[11].sinonimo[3], "nolo");
    
        a[12].lettera='o';
        strcpy (a[12].nome, "oroscopo");
        strcpy (a[12].significato, "In senso originario, punto dell\'eclittica, o costellazione dello zodiaco, che sorge in un dato momento all\'orizzonte.");
        strcpy (a[12].sinonimo[0], "predizione");
        strcpy (a[12].sinonimo[1], "pronostico");
        strcpy (a[12].sinonimo[2], "previsione");
    
        a[13].lettera='p';
        strcpy (a[13].nome, "pelle");
        strcpy (a[13].significato, "In senso generico, organo di rivestimento esterno del corpo dell\'uomo o degli animali, detta anche cute e facente parte, con i cosiddetti annessi cutanei, del sistema tegumentario.");
        strcpy (a[13].sinonimo[0], "epidermide");
        strcpy (a[13].sinonimo[1], "derma");
        strcpy (a[13].sinonimo[2], "carnagione ");
        strcpy (a[13].sinonimo[3], "cuoio");
        strcpy (a[13].sinonimo[4], "rivestimento");
    
        a[14].lettera='q';
        strcpy (a[14].nome, "quadro");
        strcpy (a[14].significato, "Dipinto di forma quadrangolare.");
        strcpy (a[14].sinonimo[0], "tela");
        strcpy (a[14].sinonimo[1], "dipinyo");
        strcpy (a[14].sinonimo[2], "tavola");
    
        a[15].lettera='r';
        strcpy (a[15].nome, "ragno");
        strcpy (a[15].significato, "Nome comune di alcune specie di acari della famiglia trombididi.");
        strcpy (a[15].sinonimo[0], "aracnide");
        strcpy (a[15].sinonimo[1], "treppiede");
    
    
        a[17].lettera='t';
        strcpy (a[17].nome, "terreno");
        strcpy (a[17].significato, "Genericamente, lo strato superficiale della crosta terrestre.");
        strcpy (a[17].sinonimo[0], "ampo");
        strcpy (a[17].sinonimo[1], "suolo");
        strcpy (a[17].sinonimo[2], "area");
        strcpy (a[17].sinonimo[3], "lotto");
        strcpy (a[17].sinonimo[4], "superfice");
    
        a[18].lettera='u';
        strcpy (a[18].nome, "ulivo");
        strcpy (a[18].significato, "Albero sempreverde di media altezza, ha foglie ovali di colore verde scuro nella pagina superiore e verde argenteo in quella inferiore, frutti a drupa verdastri o neri, da cui si estrae l1'olio.");
        strcpy (a[18].sinonimo[0], "Sinonimi non presenti");
    
        a[19].lettera='v';
        strcpy (a[19].nome, "vigneto");
        strcpy (a[19].significato, "Esteso appezzamento di terra coltivato a vite.");
        strcpy (a[19].sinonimo[0], "vigna");
    
        a[20].lettera='z';
        strcpy (a[20].nome, "zebra");
        strcpy (a[20].significato, "Denominazione comune di vari mammiferi, diffusi nelle savane africane, simili al cavallo e dotati di un mantello a strisce trasversali bianche e nere.");
        strcpy (a[20].sinonimo[0], "Sinonimi non presenti");
    }
    
    int ric_bin_ricTF(Dizionario a[], int first, int last, char chiave[]) // Algoritmo ricerca binaria ricorsiva
    {                                                                     // Ha come parametri in ingresso Array in cui cercare
        int med;                                                          // Indice first da cui partire, inizializzato nel main
        if (first > last)                                                 // Indice last a cui fermarsi nella ricerca, anchesso inizializzato nel main
          return -1;                                                      // Chiave ovvero l'elemento da cercare
        else
        {
          med = (first + last) / 2;
        if (strcmpi(chiave,a[med].nome)==0)                               // I valori in uscita sono
          return med;                                                     // Successo della ricerca ed posizione dell'elemento nell'array
        else if (strcmpi(chiave,a[med].nome)>0)                           // Un numero negativo può essere considerato un insucesso
          return ric_bin_ricTF(a, med+1, last, chiave);
        else
          return ric_bin_ricTF(a, first, med-1, chiave);
        }
    }
    
    void compilazione_dizionaro(Dizionario *a ,int *dim_arr) // Procedura per l'acquisizione dei nuovi dati
    {                                                        // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
        int opzione, i, numero_sinonimi=0, num, n=0, o;    // I parametri in uscita sono gli ultimi 3 campi della struct
        int cout=0;
        char ch;
        do
        {
            printf("\n Selezionare una delle seguenti scelte:");
    	    printf("\n\n [1] Se si vuole inserire una nuova parola \n [2] Se si vuole ritornare al menu\' principale\n\n Scelta: \t");
            scanf("%d",&opzione);
    
            if(opzione==1)                    // Costrutto di selezione che permette di creare nuovamente un menù
            {
                system("CLS");
                fflush(stdin);
                printf("\n\n Digitare il primo carattere della parola da memorizzare:\t");
                scanf("%c",&ch);
                for(i=0; i < *dim_arr; i++)
                    {
                        if (a[i].lettera==ch)
                        {
                            cout++;
                        }
                    }
    
                if (cout<=5) // Costrutto che permette di selezione la seguente alternativa finchè le parole per ogni lettera non siano maggiori di 5
                {
                	*dim_arr= *dim_arr+1;
                    fflush(stdin);
                    printf("\n\n Inserire la nuova parola da memorizzare:\t");
                    gets(a[*dim_arr].nome);                                        // Acquisizione parola
                    printf("\n\n Inserire il significato della parola:\n\n ");
                    gets(a[*dim_arr].significato);                                 // Acquisizione significato
                    printf("\n\n Inserire il numero dei sinonimi:\t");
                    scanf("%d", &numero_sinonimi);
                    if(numero_sinonimi<=5)
                    {
                        o=0;
                        for(num=0;num<numero_sinonimi;num++)
                            {
                                fflush(stdin);
                                printf("\nInserire il sinonimo:\t");
                                gets(a[*dim_arr].sinonimo[o]);                     // Acquisizione sinonimi
                                o=o+1;
                            }
                    }
                    else
                    {
                        printf("\a\n\n Possono essere inseriti massimo 5 sinonimi per ogni parola\n\n");
                    }
                }
                else
                {
                    system("CLS");
                    printf ("\a\n\n Non puoi memorizzare piu\' parole con questa lettera\n\n");
                    system("Pause");
                }
            }
            else
            {
                printf("\n\n");
                n++;    // Contatore che permette di uscire dal menù e tornare al menù principale
            }
        }
        while(n != 1); // Chiusura del ciclo do while
        cout=0;
    }
    
    void stampa_dizionario(Dizionario *a, int *dim_arr) // Procedura per la stampa dei dati
    {                                                   // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
     	int i;
     	for(i=0; i<= *dim_arr; i++)
            {
                printf("\n\n Parola : %s", a[i].nome);
                printf("\n\n Significato :\n %s", a[i].significato);
                printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[i].sinonimo[0], a[i].sinonimo[1], a[i].sinonimo[2], a[i].sinonimo[3], a[i].sinonimo[4]);
    	    }
    }
    
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Le parole, anche quelle aggiunte, devono essere in ordine alfabetico altrimenti la ricerca binaria non può funzionare. Ma tu semplicemente le aggiungi in coda.
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Ho provato a scrivere questa funzione per ordinare le parole, mi aiuteresti a correggerla?
    
    void ordinamento_inserimento(Dizionario *a, int *dim_arr)
    {
        int i, j;
        char elemento_da_inserire;
    	for(i=0;i<*dim_arr;i++)
            {
                elemento_da_inserire=a[i].nome;
                j=i+1;
    		    while(j>=0 && elemento_da_inserire<a[j].nome)
                    {
                        a[j+1].nome=a[j].nome;
                        j--;
                    }
                a[j+1].nome=elemento_da_inserire;
    	}
    }
    
    Mi da i seguenti errori:
    warning: assignment makes integer from pointer without a cast [-Wint-conversion]
    per quanto riguarda elemento_da_inserire=a.nome;

    warning: comparison between pointer and integer
    per quanto riguarda while(j>=0 && elemento_da_inserire<a[j].nome)

    error: assignment to expression with array type
    per quanto riguarda a[j+1].nome=a[j].nome;

    error: assignment to expression with array type
    per quanto riguarda a[j+1].nome=elemento_da_inserire;
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Usa le varibili globali se sei alle prime armi, non le funzioni coi puntatori. Concentrati sul focus dell'esercizio che è la ricerca binaria
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Grazie per il consiglio, comunque sono riuscito a realizzare quanto segue, però come richiamo la funzione di ordinamento crasha il programma, mi sapreste aiutare?
    
    // Includiamo le librerie
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    // Definiamo il Min e il Max
    
    #define Min 50
    #define Max 500
    
    // Definiamo la struct composta da 4 campi "lettera, nome, significato e sinonimi"
    
    typedef struct {
    	char lettera;
    	char nome[Min];
    	char significato[Max];
    	char sinonimo[Min][Min];
    } Dizionario;
    
    // Prototipi funzioni
    
    int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[]);
    void riempi_dizionario(Dizionario *a);
    void compilazione_dizionaro(Dizionario *a , int *dim_arr);
    void stampa_dizionario(Dizionario *a, int *dim_arr);
    void ordinamento(Dizionario *a, int *dim_arr);
    
    int main ()
    {                                                   // Parte dichiarativa
        Dizionario a[120];
        int indice_ricerca, first=0, last=20;
        int *dim_arr;
        int scelta_caso, uscita_dal_menu=0;
        char chiave [24];
        riempi_dizionario(a);                           // Procedura che permette di riempire il dizionario
        do                                              // Ciclo do while, permette la creazione di un menù
        {
        system("CLS");
        system("COLOR 2");
        dim_arr=&last;
        printf("%d", *dim_arr);
        printf("\t\t\t\t********************************************\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t*     Dizionario della lingua Italiana     *\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t********************************************\n");
        printf("\n --- ATTENZIONE --- : Nel dizionario sono escluse le lettere straniere\n");
        printf("\n Selezionare una delle seguenti scelte:");
        printf("\n\n [1] Se si vuole ricercare una parola \n [2] Se si vuole aggiungere una parola all\'interno del vocabolario \n [3] Se si vuole stampare il dizionario \n [4] Se si vuole chiudere il programma.\n\n Scelta: \t");
        scanf("%d", &scelta_caso);
        if (scelta_caso == 1)      // Costrutto di selezione permette di selezionare la prima scelta del menù
        {
            system("CLS");
            fflush(stdin);
            printf("\n Inserire la parola da ricercare:\t");
            gets(chiave);                                          // Acquisizione chiave
            indice_ricerca=ric_bin_ricTF(a, first, last, chiave);  // Chiamata algoritmo di ricerca binaria ricorsiva
            if (indice_ricerca>=0)        // Se la ricerca fornisce esito positivo allora si procede con quanto segue
                {
                    printf("\n\n Il significato della parola %s e' :\n\n%s", a[indice_ricerca].nome, a[indice_ricerca].significato);
                    printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[indice_ricerca].sinonimo[0], a[indice_ricerca].sinonimo[1], a[indice_ricerca].sinonimo[2], a[indice_ricerca].sinonimo[3], a[indice_ricerca].sinonimo[4]);
                    system("Pause");
                }
            else                          // altrimenti viene selezionata la seguente opzione
                {
                    printf("\a\n La parola non e\' stata trovata nel dizionario\n\n ");
                    system("Pause");
                }
        }
        else if (scelta_caso == 2)     // Costrutto di selezione permette di selezionare la seconda scelta del menù
        {
            compilazione_dizionaro(a, dim_arr); // Procedura che permette l'inserimento di nuovi elementi all'interno della struct Dizionario
        }
        else if (scelta_caso== 3){          // Costrutto di selezione permette di selezionare la terza scelta del menù
        	stampa_dizionario(a, dim_arr); // Chiamata alla procedura che permette di stampare il dizionario
        	system("Pause");
    	}
        else                           // Costrutto di selezione permette di selezionare la quarta scelta del menù
        {
            printf("\n\n ---------- Grazie per aver usato il nostro programma ---------- \n\n");
            printf("\n\n");
            uscita_dal_menu++;               // Contatore che permette l'uscita dal menù
        }
        }
        while (uscita_dal_menu != 1);        // Chiusura del ciclo do while, permette l'uscita dal menù
        system("Pause");
        return 0;
    }
    
    void riempi_dizionario(Dizionario *a)   // Inizializzazione della struct dizionario
    {
        a[0].lettera='a';
        strcpy (a[0].nome, "antico");
        strcpy (a[0].significato, "Di eta\' passata da gran tempo, che risale a molti anni o a molti secoli fa.");
        strcpy (a[0].sinonimo[0], "vecchio");
        strcpy (a[0].sinonimo[1], "preistorico");
        strcpy (a[0].sinonimo[2], "primitivo");
        strcpy (a[0].sinonimo[3], "remoto");
        strcpy (a[0].sinonimo[4], "arcaico");
    
        a[1].lettera='b';
        strcpy (a[1].nome, "banca");
        strcpy (a[1].significato, "Istituto che compie operazioni monetarie e creditizie.");
        strcpy (a[1].sinonimo[0], "istituto di credito");
        strcpy (a[1].sinonimo[1], "istituto di emissione");
        strcpy (a[1].sinonimo[2], "istituto finanziario");
        strcpy (a[1].sinonimo[3], "cassa");
        strcpy (a[1].sinonimo[4], "cassa di risparmio");
    
        a[2].lettera='c';
        strcpy (a[2].nome, "conchiglia");
        strcpy (a[2].significato, "Involucro che protegge il corpo dei molluschi.");
        strcpy (a[2].sinonimo[0], "valva");
        strcpy (a[2].sinonimo[1], "guscio");
        strcpy (a[2].sinonimo[2], "nicchio");
    
        a[3].lettera='d';
        strcpy (a[3].nome, "dizionario");
        strcpy (a[3].significato, "Raccolta delle parole di una determinata lingua.");
        strcpy (a[3].sinonimo[0], "lessico");
        strcpy (a[3].sinonimo[1], "vocabolario");
        strcpy (a[3].sinonimo[2], "glossario");
    
        a[4].lettera='e';
        strcpy (a[4].nome, "enoteca");
        strcpy (a[4].significato, "Raccolta, in genere a scopo commerciale, di bottiglie di vini pregiati di vario tipo.");
        strcpy (a[4].sinonimo[0], "bottiglieria");
        strcpy (a[4].sinonimo[1], "cantina");
        strcpy (a[4].sinonimo[2], "fiaschetteria");
        strcpy (a[4].sinonimo[3], "vineria");
        strcpy (a[4].sinonimo[4], "liquoreria");
    
        a[5].lettera='f';
        strcpy (a[5].nome, "ferro");
        strcpy (a[5].significato, "Elemento chimico dal simbolo Fe, presente nei minerali da cui viene estratto (ossidi, solfuri, carbonati).");
        strcpy (a[5].sinonimo[1], "lama");
        strcpy (a[5].sinonimo[2], "catene");
        strcpy (a[5].sinonimo[3], "ceppi");
        strcpy (a[5].sinonimo[4], "manette");
    
        a[6].lettera='g';
        strcpy (a[6].nome, "golfo");
        strcpy (a[6].significato, "Avanzamento piu\' o meno accentuato e aperto del mare entro la terraferma, con profondita\' varia ma con prevalenza di fondali bassi o medi.");
        strcpy (a[6].sinonimo[0], "baia");
        strcpy (a[6].sinonimo[1], "insenatura");
        strcpy (a[6].sinonimo[2], "cala");
        strcpy (a[6].sinonimo[3], "fiordo");
    
        a[7].lettera='h';
        strcpy (a[7].nome, "hotel");
        strcpy (a[7].significato, "Parola di uso internazionale, e s\'intende di solito un albergo di lusso o comunque di buona categoria.");
        strcpy (a[7].sinonimo[0], "pensione");
        strcpy (a[7].sinonimo[1], "motel");
        strcpy (a[7].sinonimo[2], "locanda ");
        strcpy (a[7].sinonimo[3], "rifugio");
        strcpy (a[7].sinonimo[4], "riparo");
    
        a[8].lettera='i';
        strcpy (a[8].nome, "isole");
        strcpy (a[8].significato, "Porzione di terraferma completamente circondata dalle acque di un oceano, mare, lago, fiume, palude.");
        strcpy (a[8].sinonimo[0], "area staccata");
        strcpy (a[8].sinonimo[1], "oasi");
        strcpy (a[8].sinonimo[2], "territorio isolato");
    
        a[9].lettera='l';
        strcpy (a[9].nome, "libro");
        strcpy (a[9].significato, "Complesso di fogli della stessa misura, stampati o manoscritti, e cuciti insieme cosi da formare un volume, fornito di copertina o rilegato.");
        strcpy (a[9].sinonimo[0], "tomo");
        strcpy (a[9].sinonimo[1], "registro");
        strcpy (a[9].sinonimo[2], "manuale");
        strcpy (a[9].sinonimo[3], "opera");
        strcpy (a[9].sinonimo[4], "trattato");
    
        a[10].lettera='m';
        strcpy (a[10].nome, "monologo");
        strcpy (a[10].significato, "Scena drammatica in cui un attore parla e recita da solo.");
        strcpy (a[10].sinonimo[0], "soliloquio");
    
        a[11].lettera='n';
        strcpy (a[11].nome, "noleggiare");
        strcpy (a[11].significato, "Contratto di locazione di un mezzo di trasporto o di beni mobili: pagare il noleggio; noleggio di un pianoforte, di una tenda.");
        strcpy (a[11].sinonimo[0], "tariffa della locazione ");
        strcpy (a[11].sinonimo[1], "affitto");
        strcpy (a[11].sinonimo[2], "locazione");
        strcpy (a[11].sinonimo[3], "nolo");
    
        a[12].lettera='o';
        strcpy (a[12].nome, "oroscopo");
        strcpy (a[12].significato, "In senso originario, punto dell\'eclittica, o costellazione dello zodiaco, che sorge in un dato momento all\'orizzonte.");
        strcpy (a[12].sinonimo[0], "predizione");
        strcpy (a[12].sinonimo[1], "pronostico");
        strcpy (a[12].sinonimo[2], "previsione");
    
        a[13].lettera='p';
        strcpy (a[13].nome, "pelle");
        strcpy (a[13].significato, "In senso generico, organo di rivestimento esterno del corpo dell\'uomo o degli animali, detta anche cute e facente parte, con i cosiddetti annessi cutanei, del sistema tegumentario.");
        strcpy (a[13].sinonimo[0], "epidermide");
        strcpy (a[13].sinonimo[1], "derma");
        strcpy (a[13].sinonimo[2], "carnagione ");
        strcpy (a[13].sinonimo[3], "cuoio");
        strcpy (a[13].sinonimo[4], "rivestimento");
    
        a[14].lettera='q';
        strcpy (a[14].nome, "quadro");
        strcpy (a[14].significato, "Dipinto di forma quadrangolare.");
        strcpy (a[14].sinonimo[0], "tela");
        strcpy (a[14].sinonimo[1], "dipinyo");
        strcpy (a[14].sinonimo[2], "tavola");
    
        a[15].lettera='r';
        strcpy (a[15].nome, "ragno");
        strcpy (a[15].significato, "Nome comune di alcune specie di acari della famiglia trombididi.");
        strcpy (a[15].sinonimo[0], "aracnide");
        strcpy (a[15].sinonimo[1], "treppiede");
    
    
        a[17].lettera='t';
        strcpy (a[17].nome, "terreno");
        strcpy (a[17].significato, "Genericamente, lo strato superficiale della crosta terrestre.");
        strcpy (a[17].sinonimo[0], "ampo");
        strcpy (a[17].sinonimo[1], "suolo");
        strcpy (a[17].sinonimo[2], "area");
        strcpy (a[17].sinonimo[3], "lotto");
        strcpy (a[17].sinonimo[4], "superfice");
    
        a[18].lettera='u';
        strcpy (a[18].nome, "ulivo");
        strcpy (a[18].significato, "Albero sempreverde di media altezza, ha foglie ovali di colore verde scuro nella pagina superiore e verde argenteo in quella inferiore, frutti a drupa verdastri o neri, da cui si estrae l1'olio.");
        strcpy (a[18].sinonimo[0], "Sinonimi non presenti");
    
        a[19].lettera='v';
        strcpy (a[19].nome, "vigneto");
        strcpy (a[19].significato, "Esteso appezzamento di terra coltivato a vite.");
        strcpy (a[19].sinonimo[0], "vigna");
    
        a[20].lettera='z';
        strcpy (a[20].nome, "zebra");
        strcpy (a[20].significato, "Denominazione comune di vari mammiferi, diffusi nelle savane africane, simili al cavallo e dotati di un mantello a strisce trasversali bianche e nere.");
        strcpy (a[20].sinonimo[0], "Sinonimi non presenti");
    }
    
    int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[]) // Algoritmo ricerca binaria ricorsiva
    {                                                                     // Ha come parametri in ingresso Array in cui cercare
        int med;                                                          // Indice first da cui partire, inizializzato nel main
        if (first > last)                                                 // Indice last a cui fermarsi nella ricerca, anchesso inizializzato nel main
          return -1;                                                      // Chiave ovvero l'elemento da cercare
        else
        {
          med = (first + last) / 2;
        if (strcmpi(chiave,a[med].nome)==0)                               // I valori in uscita sono
          return med;                                                     // Successo della ricerca ed posizione dell'elemento nell'array
        else if (strcmpi(chiave,a[med].nome)>0)                           // Un numero negativo può essere considerato un insucesso
          return ric_bin_ricTF(a, med+1, last, chiave);
        else
          return ric_bin_ricTF(a, first, med-1, chiave);
        }
    }
    
    void compilazione_dizionaro(Dizionario *a ,int *dim_arr) // Procedura per l'acquisizione dei nuovi dati
    {                                                        // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
        int opzione, i, numero_sinonimi=0, num, n=0, o;    // I parametri in uscita sono gli ultimi 3 campi della struct
        int cout=0;
        char ch;
        do
        {
            printf("\n Selezionare una delle seguenti scelte:");
    	    printf("\n\n [1] Se si vuole inserire una nuova parola \n [2] Se si vuole ritornare al menu\' principale\n\n Scelta: \t");
            scanf("%d",&opzione);
    
            if(opzione==1)                    // Costrutto di selezione che permette di creare nuovamente un menù
            {
                system("CLS");
                fflush(stdin);
                printf("\n\n Digitare il primo carattere della parola da memorizzare:\t");
                scanf("%c",&ch);
                for(i=0; i < *dim_arr; i++)
                    {
                        if (a[i].lettera==ch)
                        {
                            cout++;
                        }
                    }
    
                if (cout<=5) // Costrutto che permette di selezione la seguente alternativa finchè le parole per ogni lettera non siano maggiori di 5
                {
                	*dim_arr= *dim_arr+1;
                    fflush(stdin);
                    printf("\n\n Inserire la nuova parola da memorizzare:\t");
                    gets(a[*dim_arr].nome);                                        // Acquisizione parola
                    printf("\n\n Inserire il significato della parola:\n\n ");
                    gets(a[*dim_arr].significato);                                 // Acquisizione significato
                    printf("\n\n Inserire il numero dei sinonimi:\t");
                    scanf("%d", &numero_sinonimi);
                    if(numero_sinonimi<=5)
                    {
                        o=0;
                        for(num=0;num<numero_sinonimi;num++)
                            {
                                fflush(stdin);
                                printf("\nInserire il sinonimo:\t");
                                gets(a[*dim_arr].sinonimo[o]);                     // Acquisizione sinonimi
                                o=o+1;
                            }
                    }
                    else
                    {
                        printf("\a\n\n Possono essere inseriti massimo 5 sinonimi per ogni parola\n\n");
                    }
                }
                else
                {
                    system("CLS");
                    printf ("\a\n\n Non puoi memorizzare piu\' parole con questa lettera\n\n");
                    system("Pause");
                }
            }
            else
            {
                printf("\n\n");
                n++;    // Contatore che permette di uscire dal menù e tornare al menù principale
            }
        }
        while(n != 1); // Chiusura del ciclo do while
        cout=0;
        ordinamento(a, dim_arr);
    }
    
    void ordinamento(Dizionario *a, int *dim_arr)
    {
        int i, j;
        char appoggio, appoggio1, appoggio_s_0, appoggio_s_1, appoggio_s_2, appoggio_s_3, appoggio_s_4;
        for(i=1;i<*dim_arr;i++)
        {
            j=i-1;
            strcpy(appoggio, a[i].nome);
            strcpy(appoggio1, a[i].significato);
            strcpy(appoggio_s_0, a[i].sinonimo[0]);
            strcpy(appoggio_s_1, a[i].sinonimo[1]);
            strcpy(appoggio_s_2, a[i].sinonimo[2]);
            strcpy(appoggio_s_3, a[i].sinonimo[3]);
            strcpy(appoggio_s_4, a[i].sinonimo[4]);
            while (j>=0 && strcmp(appoggio, a[j].nome))
            {
               strcpy(a[j+1].nome, a[j].nome);
               strcpy(a[j+1].significato, a[j].significato);
               strcpy(a[j+1].sinonimo[0], a[j].sinonimo[0]);
               strcpy(a[j+1].sinonimo[1], a[j].sinonimo[1]);
               strcpy(a[j+1].sinonimo[2], a[j].sinonimo[2]);
               strcpy(a[j+1].sinonimo[3], a[j].sinonimo[3]);
               strcpy(a[j+1].sinonimo[4], a[j].sinonimo[4]);
               j--;
            }
            strcpy(a[j+1].nome, appoggio);
            strcpy(a[j+1].significato, appoggio1);
            strcpy(a[j+1].sinonimo[0], appoggio_s_0);
            strcpy(a[j+1].sinonimo[1], appoggio_s_1);
            strcpy(a[j+1].sinonimo[2], appoggio_s_2);
            strcpy(a[j+1].sinonimo[3], appoggio_s_3);
            strcpy(a[j+1].sinonimo[4], appoggio_s_4);
        }
    
    }
    
    void stampa_dizionario(Dizionario *a, int *dim_arr) // Procedura per la stampa dei dati
    {                                                   // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
     	int i;
     	for(i=0; i<= *dim_arr; i++)
            {
                printf("\n\n Parola : %s", a[i].nome);
                printf("\n\n Significato :\n %s", a[i].significato);
                printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[i].sinonimo[0], a[i].sinonimo[1], a[i].sinonimo[2], a[i].sinonimo[3], a[i].sinonimo[4]);
    	    }
    }
    
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Qui:
    void ordinamento(Dizionario *a, int *dim_arr)
    {
        int i, j;
        int appoggio, appoggio1, appoggio_s_0, appoggio_s_1, appoggio_s_2, appoggio_s_3, appoggio_s_4;
        for(i=0;i<*dim_arr;i++)
        {
            j=i-1;
            strcpy(appoggio, a[i].nome);
            .....
    appoggio è un intero,
    a[i].nome
    dovrebbe essere una stringa: come fai a copiare una stringa in un intero?
    Poi perché dim_arr è un puntatore ad un intero? Non andava bene un intero e basta?
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    LoL ha scritto:


    Grazie per il consiglio, comunque sono riuscito a realizzare quanto segue, però come richiamo la funzione di ordinamento crasha il programma, mi sapreste aiutare?
    
    // Includiamo le librerie
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    // Definiamo il Min e il Max
    
    #define Min 50
    #define Max 500
    
    // Definiamo la struct composta da 4 campi "lettera, nome, significato e sinonimi"
    
    typedef struct {
    	char lettera;
    	char nome[Min];
    	char significato[Max];
    	char sinonimo[Min][Min];
    } Dizionario;
    
    // Prototipi funzioni
    
    int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[]);
    void riempi_dizionario(Dizionario *a);
    void compilazione_dizionaro(Dizionario *a , int *dim_arr);
    void stampa_dizionario(Dizionario *a, int *dim_arr);
    void ordinamento(Dizionario *a, int *dim_arr);
    
    int main ()
    {                                                   // Parte dichiarativa
        Dizionario a[120];
        int indice_ricerca, first=0, last=20;
        int *dim_arr;
        int scelta_caso, uscita_dal_menu=0;
        char chiave [24];
        riempi_dizionario(a);                           // Procedura che permette di riempire il dizionario
        do                                              // Ciclo do while, permette la creazione di un menù
        {
        system("CLS");
        system("COLOR 2");
        dim_arr=&last;
        printf("%d", *dim_arr);
        printf("\t\t\t\t********************************************\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t*     Dizionario della lingua Italiana     *\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t********************************************\n");
        printf("\n --- ATTENZIONE --- : Nel dizionario sono escluse le lettere straniere\n");
        printf("\n Selezionare una delle seguenti scelte:");
        printf("\n\n [1] Se si vuole ricercare una parola \n [2] Se si vuole aggiungere una parola all\'interno del vocabolario \n [3] Se si vuole stampare il dizionario \n [4] Se si vuole chiudere il programma.\n\n Scelta: \t");
        scanf("%d", &scelta_caso);
        if (scelta_caso == 1)      // Costrutto di selezione permette di selezionare la prima scelta del menù
        {
            system("CLS");
            fflush(stdin);
            printf("\n Inserire la parola da ricercare:\t");
            gets(chiave);                                          // Acquisizione chiave
            indice_ricerca=ric_bin_ricTF(a, first, last, chiave);  // Chiamata algoritmo di ricerca binaria ricorsiva
            if (indice_ricerca>=0)        // Se la ricerca fornisce esito positivo allora si procede con quanto segue
                {
                    printf("\n\n Il significato della parola %s e' :\n\n%s", a[indice_ricerca].nome, a[indice_ricerca].significato);
                    printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[indice_ricerca].sinonimo[0], a[indice_ricerca].sinonimo[1], a[indice_ricerca].sinonimo[2], a[indice_ricerca].sinonimo[3], a[indice_ricerca].sinonimo[4]);
                    system("Pause");
                }
            else                          // altrimenti viene selezionata la seguente opzione
                {
                    printf("\a\n La parola non e\' stata trovata nel dizionario\n\n ");
                    system("Pause");
                }
        }
        else if (scelta_caso == 2)     // Costrutto di selezione permette di selezionare la seconda scelta del menù
        {
            compilazione_dizionaro(a, dim_arr); // Procedura che permette l'inserimento di nuovi elementi all'interno della struct Dizionario
        }
        else if (scelta_caso== 3){          // Costrutto di selezione permette di selezionare la terza scelta del menù
        	stampa_dizionario(a, dim_arr); // Chiamata alla procedura che permette di stampare il dizionario
        	system("Pause");
    	}
        else                           // Costrutto di selezione permette di selezionare la quarta scelta del menù
        {
            printf("\n\n ---------- Grazie per aver usato il nostro programma ---------- \n\n");
            printf("\n\n");
            uscita_dal_menu++;               // Contatore che permette l'uscita dal menù
        }
        }
        while (uscita_dal_menu != 1);        // Chiusura del ciclo do while, permette l'uscita dal menù
        system("Pause");
        return 0;
    }
    
    void riempi_dizionario(Dizionario *a)   // Inizializzazione della struct dizionario
    {
        a[0].lettera='a';
        strcpy (a[0].nome, "antico");
        strcpy (a[0].significato, "Di eta\' passata da gran tempo, che risale a molti anni o a molti secoli fa.");
        strcpy (a[0].sinonimo[0], "vecchio");
        strcpy (a[0].sinonimo[1], "preistorico");
        strcpy (a[0].sinonimo[2], "primitivo");
        strcpy (a[0].sinonimo[3], "remoto");
        strcpy (a[0].sinonimo[4], "arcaico");
    
        a[1].lettera='b';
        strcpy (a[1].nome, "banca");
        strcpy (a[1].significato, "Istituto che compie operazioni monetarie e creditizie.");
        strcpy (a[1].sinonimo[0], "istituto di credito");
        strcpy (a[1].sinonimo[1], "istituto di emissione");
        strcpy (a[1].sinonimo[2], "istituto finanziario");
        strcpy (a[1].sinonimo[3], "cassa");
        strcpy (a[1].sinonimo[4], "cassa di risparmio");
    
        a[2].lettera='c';
        strcpy (a[2].nome, "conchiglia");
        strcpy (a[2].significato, "Involucro che protegge il corpo dei molluschi.");
        strcpy (a[2].sinonimo[0], "valva");
        strcpy (a[2].sinonimo[1], "guscio");
        strcpy (a[2].sinonimo[2], "nicchio");
    
        a[3].lettera='d';
        strcpy (a[3].nome, "dizionario");
        strcpy (a[3].significato, "Raccolta delle parole di una determinata lingua.");
        strcpy (a[3].sinonimo[0], "lessico");
        strcpy (a[3].sinonimo[1], "vocabolario");
        strcpy (a[3].sinonimo[2], "glossario");
    
        a[4].lettera='e';
        strcpy (a[4].nome, "enoteca");
        strcpy (a[4].significato, "Raccolta, in genere a scopo commerciale, di bottiglie di vini pregiati di vario tipo.");
        strcpy (a[4].sinonimo[0], "bottiglieria");
        strcpy (a[4].sinonimo[1], "cantina");
        strcpy (a[4].sinonimo[2], "fiaschetteria");
        strcpy (a[4].sinonimo[3], "vineria");
        strcpy (a[4].sinonimo[4], "liquoreria");
    
        a[5].lettera='f';
        strcpy (a[5].nome, "ferro");
        strcpy (a[5].significato, "Elemento chimico dal simbolo Fe, presente nei minerali da cui viene estratto (ossidi, solfuri, carbonati).");
        strcpy (a[5].sinonimo[1], "lama");
        strcpy (a[5].sinonimo[2], "catene");
        strcpy (a[5].sinonimo[3], "ceppi");
        strcpy (a[5].sinonimo[4], "manette");
    
        a[6].lettera='g';
        strcpy (a[6].nome, "golfo");
        strcpy (a[6].significato, "Avanzamento piu\' o meno accentuato e aperto del mare entro la terraferma, con profondita\' varia ma con prevalenza di fondali bassi o medi.");
        strcpy (a[6].sinonimo[0], "baia");
        strcpy (a[6].sinonimo[1], "insenatura");
        strcpy (a[6].sinonimo[2], "cala");
        strcpy (a[6].sinonimo[3], "fiordo");
    
        a[7].lettera='h';
        strcpy (a[7].nome, "hotel");
        strcpy (a[7].significato, "Parola di uso internazionale, e s\'intende di solito un albergo di lusso o comunque di buona categoria.");
        strcpy (a[7].sinonimo[0], "pensione");
        strcpy (a[7].sinonimo[1], "motel");
        strcpy (a[7].sinonimo[2], "locanda ");
        strcpy (a[7].sinonimo[3], "rifugio");
        strcpy (a[7].sinonimo[4], "riparo");
    
        a[8].lettera='i';
        strcpy (a[8].nome, "isole");
        strcpy (a[8].significato, "Porzione di terraferma completamente circondata dalle acque di un oceano, mare, lago, fiume, palude.");
        strcpy (a[8].sinonimo[0], "area staccata");
        strcpy (a[8].sinonimo[1], "oasi");
        strcpy (a[8].sinonimo[2], "territorio isolato");
    
        a[9].lettera='l';
        strcpy (a[9].nome, "libro");
        strcpy (a[9].significato, "Complesso di fogli della stessa misura, stampati o manoscritti, e cuciti insieme cosi da formare un volume, fornito di copertina o rilegato.");
        strcpy (a[9].sinonimo[0], "tomo");
        strcpy (a[9].sinonimo[1], "registro");
        strcpy (a[9].sinonimo[2], "manuale");
        strcpy (a[9].sinonimo[3], "opera");
        strcpy (a[9].sinonimo[4], "trattato");
    
        a[10].lettera='m';
        strcpy (a[10].nome, "monologo");
        strcpy (a[10].significato, "Scena drammatica in cui un attore parla e recita da solo.");
        strcpy (a[10].sinonimo[0], "soliloquio");
    
        a[11].lettera='n';
        strcpy (a[11].nome, "noleggiare");
        strcpy (a[11].significato, "Contratto di locazione di un mezzo di trasporto o di beni mobili: pagare il noleggio; noleggio di un pianoforte, di una tenda.");
        strcpy (a[11].sinonimo[0], "tariffa della locazione ");
        strcpy (a[11].sinonimo[1], "affitto");
        strcpy (a[11].sinonimo[2], "locazione");
        strcpy (a[11].sinonimo[3], "nolo");
    
        a[12].lettera='o';
        strcpy (a[12].nome, "oroscopo");
        strcpy (a[12].significato, "In senso originario, punto dell\'eclittica, o costellazione dello zodiaco, che sorge in un dato momento all\'orizzonte.");
        strcpy (a[12].sinonimo[0], "predizione");
        strcpy (a[12].sinonimo[1], "pronostico");
        strcpy (a[12].sinonimo[2], "previsione");
    
        a[13].lettera='p';
        strcpy (a[13].nome, "pelle");
        strcpy (a[13].significato, "In senso generico, organo di rivestimento esterno del corpo dell\'uomo o degli animali, detta anche cute e facente parte, con i cosiddetti annessi cutanei, del sistema tegumentario.");
        strcpy (a[13].sinonimo[0], "epidermide");
        strcpy (a[13].sinonimo[1], "derma");
        strcpy (a[13].sinonimo[2], "carnagione ");
        strcpy (a[13].sinonimo[3], "cuoio");
        strcpy (a[13].sinonimo[4], "rivestimento");
    
        a[14].lettera='q';
        strcpy (a[14].nome, "quadro");
        strcpy (a[14].significato, "Dipinto di forma quadrangolare.");
        strcpy (a[14].sinonimo[0], "tela");
        strcpy (a[14].sinonimo[1], "dipinyo");
        strcpy (a[14].sinonimo[2], "tavola");
    
        a[15].lettera='r';
        strcpy (a[15].nome, "ragno");
        strcpy (a[15].significato, "Nome comune di alcune specie di acari della famiglia trombididi.");
        strcpy (a[15].sinonimo[0], "aracnide");
        strcpy (a[15].sinonimo[1], "treppiede");
    
    
        a[17].lettera='t';
        strcpy (a[17].nome, "terreno");
        strcpy (a[17].significato, "Genericamente, lo strato superficiale della crosta terrestre.");
        strcpy (a[17].sinonimo[0], "ampo");
        strcpy (a[17].sinonimo[1], "suolo");
        strcpy (a[17].sinonimo[2], "area");
        strcpy (a[17].sinonimo[3], "lotto");
        strcpy (a[17].sinonimo[4], "superfice");
    
        a[18].lettera='u';
        strcpy (a[18].nome, "ulivo");
        strcpy (a[18].significato, "Albero sempreverde di media altezza, ha foglie ovali di colore verde scuro nella pagina superiore e verde argenteo in quella inferiore, frutti a drupa verdastri o neri, da cui si estrae l1'olio.");
        strcpy (a[18].sinonimo[0], "Sinonimi non presenti");
    
        a[19].lettera='v';
        strcpy (a[19].nome, "vigneto");
        strcpy (a[19].significato, "Esteso appezzamento di terra coltivato a vite.");
        strcpy (a[19].sinonimo[0], "vigna");
    
        a[20].lettera='z';
        strcpy (a[20].nome, "zebra");
        strcpy (a[20].significato, "Denominazione comune di vari mammiferi, diffusi nelle savane africane, simili al cavallo e dotati di un mantello a strisce trasversali bianche e nere.");
        strcpy (a[20].sinonimo[0], "Sinonimi non presenti");
    }
    
    int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[]) // Algoritmo ricerca binaria ricorsiva
    {                                                                     // Ha come parametri in ingresso Array in cui cercare
        int med;                                                          // Indice first da cui partire, inizializzato nel main
        if (first > last)                                                 // Indice last a cui fermarsi nella ricerca, anchesso inizializzato nel main
          return -1;                                                      // Chiave ovvero l'elemento da cercare
        else
        {
          med = (first + last) / 2;
        if (strcmpi(chiave,a[med].nome)==0)                               // I valori in uscita sono
          return med;                                                     // Successo della ricerca ed posizione dell'elemento nell'array
        else if (strcmpi(chiave,a[med].nome)>0)                           // Un numero negativo può essere considerato un insucesso
          return ric_bin_ricTF(a, med+1, last, chiave);
        else
          return ric_bin_ricTF(a, first, med-1, chiave);
        }
    }
    
    void compilazione_dizionaro(Dizionario *a ,int *dim_arr) // Procedura per l'acquisizione dei nuovi dati
    {                                                        // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
        int opzione, i, numero_sinonimi=0, num, n=0, o;    // I parametri in uscita sono gli ultimi 3 campi della struct
        int cout=0;
        char ch;
        do
        {
            printf("\n Selezionare una delle seguenti scelte:");
    	    printf("\n\n [1] Se si vuole inserire una nuova parola \n [2] Se si vuole ritornare al menu\' principale\n\n Scelta: \t");
            scanf("%d",&opzione);
    
            if(opzione==1)                    // Costrutto di selezione che permette di creare nuovamente un menù
            {
                system("CLS");
                fflush(stdin);
                printf("\n\n Digitare il primo carattere della parola da memorizzare:\t");
                scanf("%c",&ch);
                for(i=0; i < *dim_arr; i++)
                    {
                        if (a[i].lettera==ch)
                        {
                            cout++;
                        }
                    }
    
                if (cout<=5) // Costrutto che permette di selezione la seguente alternativa finchè le parole per ogni lettera non siano maggiori di 5
                {
                	*dim_arr= *dim_arr+1;
                    fflush(stdin);
                    printf("\n\n Inserire la nuova parola da memorizzare:\t");
                    gets(a[*dim_arr].nome);                                        // Acquisizione parola
                    printf("\n\n Inserire il significato della parola:\n\n ");
                    gets(a[*dim_arr].significato);                                 // Acquisizione significato
                    printf("\n\n Inserire il numero dei sinonimi:\t");
                    scanf("%d", &numero_sinonimi);
                    if(numero_sinonimi<=5)
                    {
                        o=0;
                        for(num=0;num<numero_sinonimi;num++)
                            {
                                fflush(stdin);
                                printf("\nInserire il sinonimo:\t");
                                gets(a[*dim_arr].sinonimo[o]);                     // Acquisizione sinonimi
                                o=o+1;
                            }
                    }
                    else
                    {
                        printf("\a\n\n Possono essere inseriti massimo 5 sinonimi per ogni parola\n\n");
                    }
                }
                else
                {
                    system("CLS");
                    printf ("\a\n\n Non puoi memorizzare piu\' parole con questa lettera\n\n");
                    system("Pause");
                }
            }
            else
            {
                printf("\n\n");
                n++;    // Contatore che permette di uscire dal menù e tornare al menù principale
            }
        }
        while(n != 1); // Chiusura del ciclo do while
        cout=0;
        ordinamento(a, dim_arr);
    }
    
    void ordinamento(Dizionario *a, int *dim_arr)
    {
        int i, j;
        char appoggio, appoggio1, appoggio_s_0, appoggio_s_1, appoggio_s_2, appoggio_s_3, appoggio_s_4;
        for(i=1;i<*dim_arr;i++)
        {
            j=i-1;
            strcpy(appoggio, a[i].nome);
            strcpy(appoggio1, a[i].significato);
            strcpy(appoggio_s_0, a[i].sinonimo[0]);
            strcpy(appoggio_s_1, a[i].sinonimo[1]);
            strcpy(appoggio_s_2, a[i].sinonimo[2]);
            strcpy(appoggio_s_3, a[i].sinonimo[3]);
            strcpy(appoggio_s_4, a[i].sinonimo[4]);
            while (j>=0 && strcmp(appoggio, a[j].nome))
            {
               strcpy(a[j+1].nome, a[j].nome);
               strcpy(a[j+1].significato, a[j].significato);
               strcpy(a[j+1].sinonimo[0], a[j].sinonimo[0]);
               strcpy(a[j+1].sinonimo[1], a[j].sinonimo[1]);
               strcpy(a[j+1].sinonimo[2], a[j].sinonimo[2]);
               strcpy(a[j+1].sinonimo[3], a[j].sinonimo[3]);
               strcpy(a[j+1].sinonimo[4], a[j].sinonimo[4]);
               j--;
            }
            strcpy(a[j+1].nome, appoggio);
            strcpy(a[j+1].significato, appoggio1);
            strcpy(a[j+1].sinonimo[0], appoggio_s_0);
            strcpy(a[j+1].sinonimo[1], appoggio_s_1);
            strcpy(a[j+1].sinonimo[2], appoggio_s_2);
            strcpy(a[j+1].sinonimo[3], appoggio_s_3);
            strcpy(a[j+1].sinonimo[4], appoggio_s_4);
        }
    
    }
    
    void stampa_dizionario(Dizionario *a, int *dim_arr) // Procedura per la stampa dei dati
    {                                                   // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
     	int i;
     	for(i=0; i<= *dim_arr; i++)
            {
                printf("\n\n Parola : %s", a[i].nome);
                printf("\n\n Significato :\n %s", a[i].significato);
                printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[i].sinonimo[0], a[i].sinonimo[1], a[i].sinonimo[2], a[i].sinonimo[3], a[i].sinonimo[4]);
    	    }
    }
    
    Ok risolto non avevo dichiarato gli appoggi come array
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Andrea Quaglia ha scritto:


    Qui:
    void ordinamento(Dizionario *a, int *dim_arr)
    {
        int i, j;
        int appoggio, appoggio1, appoggio_s_0, appoggio_s_1, appoggio_s_2, appoggio_s_3, appoggio_s_4;
        for(i=0;i<*dim_arr;i++)
        {
            j=i-1;
            strcpy(appoggio, a[i].nome);
            .....
    appoggio è un intero,
    a[i].nome
    dovrebbe essere una stringa: come fai a copiare una stringa in un intero?
    Poi perché dim_arr è un puntatore ad un intero? Non andava bene un intero e basta?
    Grazie per la risposta, si ora modifico anche dim_arr
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Attenzione: se fai cambiare il valore di dim_arr all'interno delle varie funzioni, il puntatore ha un senso (ma non mi sembra che tu lo cambi).
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Andrea Quaglia ha scritto:


    Attenzione: se fai cambiare il valore di dim_arr all'interno delle varie funzioni, il puntatore ha un senso (ma non mi sembra che tu lo cambi).
    Il valore cambia solo nella funzione acquisizione poiché viene incrementato ad ogni acquisizione, per il resto no Ragionando e analizzando le varie situazioni potrei lasciare *dim_arr solo per la funzione di acquisizione, e passare alle altre la variabile last essendo che è stata modificata e quindi non sarà più 20 ma 21-22 e così via. Il mio ragionamento è sbagliato?
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Dim_arr è in sostanza l'indice dell'ultimo elemento dell'array Dizionario. Quando aggiungi un elemento incrementi dim_arr: il modo più semplice per far "circolare" il nuovo valore è farlo ritornare dalla funzione "compilazione_dizionario":
    int compilazione_dizionaro(Dizionario *a ,int dim_arr){
    [...]
    		dim_arr = dim_arr + 1;
    [...]
        while(n != 1); // Chiusura del ciclo do while
        cout=0;
        ordinamento(a, dim_arr);
        return(dim_arr);
    }
    
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Andrea Quaglia ha scritto:


    Dim_arr è in sostanza l'indice dell'ultimo elemento dell'array Dizionario. Quando aggiungi un elemento incrementi dim_arr: il modo più semplice per far "circolare" il nuovo valore è farlo ritornare dalla funzione "compilazione_dizionario":
    int compilazione_dizionaro(Dizionario *a ,int dim_arr){
    [...]
    		dim_arr = dim_arr + 1;
    [...]
        while(n != 1); // Chiusura del ciclo do while
        cout=0;
        ordinamento(a, dim_arr);
        return(dim_arr);
    }
    

    Di nuovo grazie per la pazienza ma sopratutto per il tempo che mi stai dedicando.
    Ho levato da mezzo tutti i puntatori come da lei indicato. Ora il mio problema rimane solo come ordinare in ordine alfabetico le parole per poter cercare la parola dell'utente, mi spiego meglio se cerco la parola di default la trova mentre se cerco quella inserita dall'utente no, come indicato da un altro utente in precedenza, ho cercato di implementare un algoritmo di ordinamento, in modo tale che la parola inserita non andava in coda, mi saprebbe dare altre indicazioni? Grazie ancora, ecco il codice aggiornato.
    
    // Includiamo le librerie
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>
    
    // Definiamo il Min e il Max
    
    #define Min 50
    #define Max 500
    
    // Definiamo la struct composta da 4 campi "lettera, nome, significato e sinonimi"
    
    typedef struct {
    	char lettera;
    	char nome[Min];
    	char significato[Max];
    	char sinonimo[Min][Min];
    } Dizionario;
    
    // Prototipi funzioni
    
    int ric_bin_ricTF(Dizionario *a, int first, int last, char chiave[]);
    void riempi_dizionario(Dizionario *a);
    int compilazione_dizionaro(Dizionario *a , int dim_arr);
    void stampa_dizionario(Dizionario *a, int comp);
    void ordinamento(Dizionario *a, int comp);
    
    int main ()
    {                                                   // Parte dichiarativa
        Dizionario a[120];
        int indice_ricerca, first=0;
        int dim_arr=20, comp=20;
        int scelta_caso, uscita_dal_menu=0;
        char chiave [20];
        riempi_dizionario(a);                           // Procedura che permette di riempire il dizionario
        do                                              // Ciclo do while, permette la creazione di un menù
        {
        system("CLS");
        system("COLOR 2");
        printf("%d", comp);
        printf("\t\t\t\t********************************************\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t*     Dizionario della lingua Italiana     *\n");
        printf("\t\t\t\t*                                          *\n");
        printf("\t\t\t\t********************************************\n");
        printf("\n --- ATTENZIONE --- : Nel dizionario sono escluse le lettere straniere\n");
        printf("\n Selezionare una delle seguenti scelte:");
        printf("\n\n [1] Se si vuole ricercare una parola \n [2] Se si vuole aggiungere una parola all\'interno del vocabolario \n [3] Se si vuole stampare il dizionario \n [4] Se si vuole chiudere il programma.\n\n Scelta: \t");
        scanf("%d", &scelta_caso);
        if (scelta_caso == 1)      // Costrutto di selezione permette di selezionare la prima scelta del menù
        {
            system("CLS");
            fflush(stdin);
            printf("\n Inserire la parola da ricercare:\t");
            gets(chiave);                                          // Acquisizione chiave
            indice_ricerca=ric_bin_ricTF(a, first, comp, chiave);  // Chiamata algoritmo di ricerca binaria ricorsiva
            if (indice_ricerca>=0)        // Se la ricerca fornisce esito positivo allora si procede con quanto segue
                {
                    printf("\n\n Il significato della parola %s e' :\n\n%s", a[indice_ricerca].nome, a[indice_ricerca].significato);
                    printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[indice_ricerca].sinonimo[0], a[indice_ricerca].sinonimo[1], a[indice_ricerca].sinonimo[2], a[indice_ricerca].sinonimo[3], a[indice_ricerca].sinonimo[4]);
                    system("Pause");
                }
            else                          // altrimenti viene selezionata la seguente opzione
                {
                    printf("\a\n La parola non e\' stata trovata nel dizionario\n\n ");
                    system("Pause");
                }
        }
        else if (scelta_caso == 2)     // Costrutto di selezione permette di selezionare la seconda scelta del menù
        {
            comp=compilazione_dizionaro(a, dim_arr); // Procedura che permette l'inserimento di nuovi elementi all'interno della struct Dizionario
        }
        else if (scelta_caso== 3){          // Costrutto di selezione permette di selezionare la terza scelta del menù
        	stampa_dizionario(a, comp); // Chiamata alla procedura che permette di stampare il dizionario
        	system("Pause");
    	}
        else                           // Costrutto di selezione permette di selezionare la quarta scelta del menù
        {
            printf("\n\n ---------- Grazie per aver usato il nostro programma ---------- \n\n");
            printf("\n\n");
            uscita_dal_menu++;               // Contatore che permette l'uscita dal menù
        }
        }
        while (uscita_dal_menu != 1);        // Chiusura del ciclo do while, permette l'uscita dal menù
        system("Pause");
        return 0;
    }
    
    void riempi_dizionario(Dizionario *a)   // Inizializzazione della struct dizionario
    {
        a[0].lettera='a';
        strcpy (a[0].nome, "antico");
        strcpy (a[0].significato, "Di eta\' passata da gran tempo, che risale a molti anni o a molti secoli fa.");
        strcpy (a[0].sinonimo[0], "vecchio");
        strcpy (a[0].sinonimo[1], "preistorico");
        strcpy (a[0].sinonimo[2], "primitivo");
        strcpy (a[0].sinonimo[3], "remoto");
        strcpy (a[0].sinonimo[4], "arcaico");
    
        a[1].lettera='b';
        strcpy (a[1].nome, "banca");
        strcpy (a[1].significato, "Istituto che compie operazioni monetarie e creditizie.");
        strcpy (a[1].sinonimo[0], "istituto di credito");
        strcpy (a[1].sinonimo[1], "istituto di emissione");
        strcpy (a[1].sinonimo[2], "istituto finanziario");
        strcpy (a[1].sinonimo[3], "cassa");
        strcpy (a[1].sinonimo[4], "cassa di risparmio");
    
        a[2].lettera='c';
        strcpy (a[2].nome, "conchiglia");
        strcpy (a[2].significato, "Involucro che protegge il corpo dei molluschi.");
        strcpy (a[2].sinonimo[0], "valva");
        strcpy (a[2].sinonimo[1], "guscio");
        strcpy (a[2].sinonimo[2], "nicchio");
    
        a[3].lettera='d';
        strcpy (a[3].nome, "dizionario");
        strcpy (a[3].significato, "Raccolta delle parole di una determinata lingua.");
        strcpy (a[3].sinonimo[0], "lessico");
        strcpy (a[3].sinonimo[1], "vocabolario");
        strcpy (a[3].sinonimo[2], "glossario");
    
        a[4].lettera='e';
        strcpy (a[4].nome, "enoteca");
        strcpy (a[4].significato, "Raccolta, in genere a scopo commerciale, di bottiglie di vini pregiati di vario tipo.");
        strcpy (a[4].sinonimo[0], "bottiglieria");
        strcpy (a[4].sinonimo[1], "cantina");
        strcpy (a[4].sinonimo[2], "fiaschetteria");
        strcpy (a[4].sinonimo[3], "vineria");
        strcpy (a[4].sinonimo[4], "liquoreria");
    
        a[5].lettera='f';
        strcpy (a[5].nome, "ferro");
        strcpy (a[5].significato, "Elemento chimico dal simbolo Fe, presente nei minerali da cui viene estratto (ossidi, solfuri, carbonati).");
        strcpy (a[5].sinonimo[1], "lama");
        strcpy (a[5].sinonimo[2], "catene");
        strcpy (a[5].sinonimo[3], "ceppi");
        strcpy (a[5].sinonimo[4], "manette");
    
        a[6].lettera='g';
        strcpy (a[6].nome, "golfo");
        strcpy (a[6].significato, "Avanzamento piu\' o meno accentuato e aperto del mare entro la terraferma, con profondita\' varia ma con prevalenza di fondali bassi o medi.");
        strcpy (a[6].sinonimo[0], "baia");
        strcpy (a[6].sinonimo[1], "insenatura");
        strcpy (a[6].sinonimo[2], "cala");
        strcpy (a[6].sinonimo[3], "fiordo");
    
        a[7].lettera='h';
        strcpy (a[7].nome, "hotel");
        strcpy (a[7].significato, "Parola di uso internazionale, e s\'intende di solito un albergo di lusso o comunque di buona categoria.");
        strcpy (a[7].sinonimo[0], "pensione");
        strcpy (a[7].sinonimo[1], "motel");
        strcpy (a[7].sinonimo[2], "locanda ");
        strcpy (a[7].sinonimo[3], "rifugio");
        strcpy (a[7].sinonimo[4], "riparo");
    
        a[8].lettera='i';
        strcpy (a[8].nome, "isole");
        strcpy (a[8].significato, "Porzione di terraferma completamente circondata dalle acque di un oceano, mare, lago, fiume, palude.");
        strcpy (a[8].sinonimo[0], "area staccata");
        strcpy (a[8].sinonimo[1], "oasi");
        strcpy (a[8].sinonimo[2], "territorio isolato");
    
        a[9].lettera='l';
        strcpy (a[9].nome, "libro");
        strcpy (a[9].significato, "Complesso di fogli della stessa misura, stampati o manoscritti, e cuciti insieme cosi da formare un volume, fornito di copertina o rilegato.");
        strcpy (a[9].sinonimo[0], "tomo");
        strcpy (a[9].sinonimo[1], "registro");
        strcpy (a[9].sinonimo[2], "manuale");
        strcpy (a[9].sinonimo[3], "opera");
        strcpy (a[9].sinonimo[4], "trattato");
    
        a[10].lettera='m';
        strcpy (a[10].nome, "monologo");
        strcpy (a[10].significato, "Scena drammatica in cui un attore parla e recita da solo.");
        strcpy (a[10].sinonimo[0], "soliloquio");
    
        a[11].lettera='n';
        strcpy (a[11].nome, "noleggiare");
        strcpy (a[11].significato, "Contratto di locazione di un mezzo di trasporto o di beni mobili: pagare il noleggio; noleggio di un pianoforte, di una tenda.");
        strcpy (a[11].sinonimo[0], "tariffa della locazione ");
        strcpy (a[11].sinonimo[1], "affitto");
        strcpy (a[11].sinonimo[2], "locazione");
        strcpy (a[11].sinonimo[3], "nolo");
    
        a[12].lettera='o';
        strcpy (a[12].nome, "oroscopo");
        strcpy (a[12].significato, "In senso originario, punto dell\'eclittica, o costellazione dello zodiaco, che sorge in un dato momento all\'orizzonte.");
        strcpy (a[12].sinonimo[0], "predizione");
        strcpy (a[12].sinonimo[1], "pronostico");
        strcpy (a[12].sinonimo[2], "previsione");
    
        a[13].lettera='p';
        strcpy (a[13].nome, "pelle");
        strcpy (a[13].significato, "In senso generico, organo di rivestimento esterno del corpo dell\'uomo o degli animali, detta anche cute e facente parte, con i cosiddetti annessi cutanei, del sistema tegumentario.");
        strcpy (a[13].sinonimo[0], "epidermide");
        strcpy (a[13].sinonimo[1], "derma");
        strcpy (a[13].sinonimo[2], "carnagione ");
        strcpy (a[13].sinonimo[3], "cuoio");
        strcpy (a[13].sinonimo[4], "rivestimento");
    
        a[14].lettera='q';
        strcpy (a[14].nome, "quadro");
        strcpy (a[14].significato, "Dipinto di forma quadrangolare.");
        strcpy (a[14].sinonimo[0], "tela");
        strcpy (a[14].sinonimo[1], "dipinyo");
        strcpy (a[14].sinonimo[2], "tavola");
    
        a[15].lettera='r';
        strcpy (a[15].nome, "ragno");
        strcpy (a[15].significato, "Nome comune di alcune specie di acari della famiglia trombididi.");
        strcpy (a[15].sinonimo[0], "aracnide");
        strcpy (a[15].sinonimo[1], "treppiede");
    
    
        a[17].lettera='t';
        strcpy (a[17].nome, "terreno");
        strcpy (a[17].significato, "Genericamente, lo strato superficiale della crosta terrestre.");
        strcpy (a[17].sinonimo[0], "ampo");
        strcpy (a[17].sinonimo[1], "suolo");
        strcpy (a[17].sinonimo[2], "area");
        strcpy (a[17].sinonimo[3], "lotto");
        strcpy (a[17].sinonimo[4], "superfice");
    
        a[18].lettera='u';
        strcpy (a[18].nome, "ulivo");
        strcpy (a[18].significato, "Albero sempreverde di media altezza, ha foglie ovali di colore verde scuro nella pagina superiore e verde argenteo in quella inferiore, frutti a drupa verdastri o neri, da cui si estrae l1'olio.");
        strcpy (a[18].sinonimo[0], "Sinonimi non presenti");
    
        a[19].lettera='v';
        strcpy (a[19].nome, "vigneto");
        strcpy (a[19].significato, "Esteso appezzamento di terra coltivato a vite.");
        strcpy (a[19].sinonimo[0], "vigna");
    
        a[20].lettera='z';
        strcpy (a[20].nome, "zebra");
        strcpy (a[20].significato, "Denominazione comune di vari mammiferi, diffusi nelle savane africane, simili al cavallo e dotati di un mantello a strisce trasversali bianche e nere.");
        strcpy (a[20].sinonimo[0], "Sinonimi non presenti");
    }
    
    int ric_bin_ricTF(Dizionario *a, int first, int comp, char chiave[]) // Algoritmo ricerca binaria ricorsiva
    {                                                                     // Ha come parametri in ingresso Array in cui cercare
        int med;                                                          // Indice first da cui partire, inizializzato nel main
        if (first > comp)                                                 // Indice last a cui fermarsi nella ricerca, anchesso inizializzato nel main
          return -1;                                                      // Chiave ovvero l'elemento da cercare
        else
        {
          med = (first + comp) / 2;
        if (strcmpi(chiave,a[med].nome)==0)                               // I valori in uscita sono
          return med;                                                     // Successo della ricerca ed posizione dell'elemento nell'array
        else if (strcmpi(chiave,a[med].nome)>0)                           // Un numero negativo può essere considerato un insucesso
          return ric_bin_ricTF(a, med+1, comp, chiave);
        else
          return ric_bin_ricTF(a, first, med-1, chiave);
        }
    }
    
    int compilazione_dizionaro(Dizionario *a ,int dim_arr) // Procedura per l'acquisizione dei nuovi dati
    {                                                        // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
        int opzione, i, numero_sinonimi=0, num, n=0, o;    // I parametri in uscita sono gli ultimi 3 campi della struct
        int cout=0;
        char ch;
        do
        {
            printf("\n Selezionare una delle seguenti scelte:");
    	    printf("\n\n [1] Se si vuole inserire una nuova parola \n [2] Se si vuole ritornare al menu\' principale\n\n Scelta: \t");
            scanf("%d",&opzione);
    
            if(opzione==1)                    // Costrutto di selezione che permette di creare nuovamente un menù
            {
                system("CLS");
                fflush(stdin);
                printf("\n\n Digitare il primo carattere della parola da memorizzare:\t");
                scanf("%c",&ch);
                for(i=0; i < dim_arr; i++)
                    {
                        if (a[i].lettera==ch)
                        {
                            cout++;
                        }
                    }
    
                if (cout<=5) // Costrutto che permette di selezione la seguente alternativa finchè le parole per ogni lettera non siano maggiori di 5
                {
                	dim_arr= dim_arr+1;
                    fflush(stdin);
                    printf("\n\n Inserire la nuova parola da memorizzare:\t");
                    gets(a[dim_arr].nome);                                        // Acquisizione parola
                    printf("\n\n Inserire il significato della parola:\n\n ");
                    gets(a[dim_arr].significato);                                 // Acquisizione significato
                    printf("\n\n Inserire il numero dei sinonimi:\t");
                    scanf("%d", &numero_sinonimi);
                    if(numero_sinonimi<=5)
                    {
                        o=0;
                        for(num=0;num<numero_sinonimi;num++)
                            {
                                fflush(stdin);
                                printf("\nInserire il sinonimo:\t");
                                gets(a[dim_arr].sinonimo[o]);                     // Acquisizione sinonimi
                                o=o+1;
                            }
                    }
                    else
                    {
                        printf("\a\n\n Possono essere inseriti massimo 5 sinonimi per ogni parola\n\n");
                    }
                }
                else
                {
                    system("CLS");
                    printf ("\a\n\n Non puoi memorizzare piu\' parole con questa lettera\n\n");
                    system("Pause");
                }
            }
            else
            {
                printf("\n\n");
                n++;    // Contatore che permette di uscire dal menù e tornare al menù principale
            }
        }
        while(n != 1); // Chiusura del ciclo do while
        cout=0;
        ordinamento(a, dim_arr);
        return (dim_arr);
    }
    
    void ordinamento(Dizionario *a, int dim_arr)
    {
        int i, j;
        char appoggio[Min], appoggio1[Max], appoggio_s_0[Min], appoggio_s_1[Min], appoggio_s_2[Min], appoggio_s_3[Min], appoggio_s_4[Min];
        for(i=1;i<dim_arr;i++)
        {
            j=i-1;
            strcpy(appoggio, a[i].nome);
            strcpy(appoggio1, a[i].significato);
            strcpy(appoggio_s_0, a[i].sinonimo[0]);
            strcpy(appoggio_s_1, a[i].sinonimo[1]);
            strcpy(appoggio_s_2, a[i].sinonimo[2]);
            strcpy(appoggio_s_3, a[i].sinonimo[3]);
            strcpy(appoggio_s_4, a[i].sinonimo[4]);
            while (j>=0 && strcmp(appoggio, a[j].nome))
            {
               strcpy(a[j+1].nome, a[j].nome);
               strcpy(a[j+1].significato, a[j].significato);
               strcpy(a[j+1].sinonimo[0], a[j].sinonimo[0]);
               strcpy(a[j+1].sinonimo[1], a[j].sinonimo[1]);
               strcpy(a[j+1].sinonimo[2], a[j].sinonimo[2]);
               strcpy(a[j+1].sinonimo[3], a[j].sinonimo[3]);
               strcpy(a[j+1].sinonimo[4], a[j].sinonimo[4]);
               j--;
            }
            strcpy(a[j+1].nome, appoggio);
            strcpy(a[j+1].significato, appoggio1);
            strcpy(a[j+1].sinonimo[0], appoggio_s_0);
            strcpy(a[j+1].sinonimo[1], appoggio_s_1);
            strcpy(a[j+1].sinonimo[2], appoggio_s_2);
            strcpy(a[j+1].sinonimo[3], appoggio_s_3);
            strcpy(a[j+1].sinonimo[4], appoggio_s_4);
        }
    
    }
    
    void stampa_dizionario(Dizionario *a, int comp) // Procedura per la stampa dei dati
    {                                                   // Ha come parametri in ingresso la struct Dizionario e la dimensione dell'array
     	int i;
     	for(i=0; i<= comp; i++)
            {
                printf("\n\n Parola : %s", a[i].nome);
                printf("\n\n Significato :\n %s", a[i].significato);
                printf("\n\n I sinonimi sono:\t %s \t %s \t %s \t %s \t %s \n\n", a[i].sinonimo[0], a[i].sinonimo[1], a[i].sinonimo[2], a[i].sinonimo[3], a[i].sinonimo[4]);
    	    }
    }
    
  • Re: Problema ricerca binaria ricorsiva Dizionario della lingua italiana

    Ragazzi grazie a tutti voi che mi avete aiutato, senza di voi sarei rimasto ad un punto morto. Ho aggiustato anche l'algoritmo di ordinamento, ed ora va una bellezza trova anche le parole inserite dall'utente. Potrei chiedere un'ultima cosa? Il secondo punto mi dice di inserire massimo 5 parole per ogni lettera mi sapreste dirmi se va bene così o si deve modificare? Grazie a tutti di nuovo per il tempo e la pazienza.
Devi accedere o registrarti per scrivere nel forum
14 risposte