prof. Nunzio Brugaletta | Programmazione e linguaggio C |
Una applicazione interessante delle matrici è l’array di stringhe. La stringa è un array di caratteri e quindi potremmo dire che un array di stringhe è un array di array di caratteri. Per chiarire la gestione di questo tipo di array si propone un programma che si occupa di cercare delle parole in un vocabolario e riferisce, per ognuna, se è contenuta nel vocabolario stesso
/* Cerca parole in un vocabolario */ #include <stdio.h> #include <string.h> /*1*/ main(){ char vocab[10][20], parcerc[20]; /*2*/ int i,trovata; /* Acquisisce parole da inserire nel vocabolario */ for (i=0;i<10;i++) { printf("\nParola %d ",i); gets(vocab[i]); /*3*/ } /* Acquisisce la parola da cercare */ printf("\n\nParola da cercare (Invio per finire) "); gets(parcerc); while (strcmp(parcerc,"")) { /*4*/ /* Cerca la parola */ trovata=0; /*5*/ for (i=0;i<10;i++) { if (!strcmp(parcerc,vocab[i])) { /*6*/ trovata=1; /*7*/ break; /*8*/ } } if (trovata) /*9*/ printf("\nParola trovata"); else printf("\nParola non trovata"); /* Prossima parola da cercare */ printf("\n\nParola da cercare (Invio per finire) "); gets(parcerc); } }
La dichiarazione della riga 1 permette l’utilizzo all’interno del programma delle funzioni per il trattamento delle stringhe.
Nella riga 2 viene dichiarato l’array di caratteri vocab[10][20]. Il vocabolario del programma di esempio conterrà quindi un massimo di 10 parole ognuna composta di un massimo di 20 caratteri. La prima parola è contenuta in vocab[0] e con vocab[2][7], qualora dovesse interessare, si individuerebbe l’ottavo carattere della terza parola del vocabolario. Ogni riga della tabella conterrà una parola e in ogni colonna ci sono i caratteri che compongono le parole. L’array parcerc[20] servirà per contenere la parola da cercare.
Nella riga 3 si acquisiscono le parole da inserire nel vocabolario: la prima volta l’istruzione si leggerà gets(vocab[0]), quindi gets(vocab[1]) e infine gets(vocab[9]) in relazione ai diversi valori assunti dal contatore i. L’uso di un solo indice dipende dal fatto che, con la gets, si acquisisce una stringa e quindi nel caso esaminato una intera riga della matrice. Se si fosse voluto acquisire le stringhe un carattere per volta, si sarebbero dovuti gestire due cicli: uno annidato nell’altro, così come nell’esempio della tavola pitagorica, contenenti l’istruzione scanf("%c",&vocab[i][j]). Alla fine, come ultimo carattere, sarebbe stato necessario aggiungere il carattere null.
Nella riga 4 si gestisce la condizione di uscita dal ciclo. La stringa ricevuta dall’input viene comparata con la stringa vuota (due doppi apici consecutivi): se alla richiesta di input della stringa da cercare si risponde premendo solamente il tasto Invio, viene acquisita una stringa contenente solo il carattere terminatore null. Ciò rende falsa la condizione e quindi il ciclo ha termine (strcmp in questo caso restituisce 0).
La variabile trovata che viene azzerata nella riga 5 registrerà l’eventuale ritrovamento della stringa all’interno del vocabolario. Il valore assegnato non ha il senso di un valore numerico a tutti gli effetti ma il senso di un valore logico (0 = falso, un valore non nullo=vero). Una variabile usata in questo modo viene chiamata solitamente variabile logica, switch o flag.
Nella 6 si confronta la parola da cercare via via con le parole contenute nel vocabolario. L’equivalenza delle due stringhe, quella da cercare e la parola del vocabolario esaminata, rende vera la condizione. In questo caso, riga 7, si rende vera la variabile trovata assegnandole un valore non nullo e con il break della riga 8 si forza l’uscita dal ciclo poiché è inutile continuare a confrontare la parola cercata con il resto delle parole del vocabolario: la ricerca viene sospesa.
Nella riga 9 si esegue un test sul flag trovata: se è vero (cioè è stata eseguita l’istruzione della riga 7) la parola è stata trovata, se è falso (è rimasto inalterato il valore assegnato nella istruzione della riga 5) la ricerca ha avuto esito negativo.
http://ennebi.solira.org | ennebi@solira.org |