prof. Nunzio Brugaletta Programmazione e linguaggio C

EnneBi - Programmazione
Avanti Indietro Inizio


3.8 Array di stringhe

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.



Avanti Indietro Inizio

http://ennebi.solira.org ennebi@solira.org