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]);
}
}