Occorrenze di parole

di il
1 risposte

Occorrenze di parole

Salve a tutti,
sono alle prese con un algoritmo da questa mattina e non riesco a trovare la soluzione finale. Non capisco se è un problema di logica oppure mi manca qualche "funzione" del linguaggio C che mi possa facilitare il compito.
Vi posto il testo dell'esercizio e il codice che ho fatto io sperando che possiate darmi una dritta o qualche consiglio!

Testo:Si scriva un programma in grado di contare le occorrenze di ogni parola, appartenente a un insie-me specificato, all’interno di un generico testo.
Più in dettaglio, l’elenco delle parole da ricercare è memorizzato in un file di testo, in ragione di una parola per riga del file. La lunghezza delle singole parole è limitata a 20 caratteri, e inoltre il numero totale di tali parole è indicato sulla prima riga del file stesso.
Le parole così specificate devono essere ricercate in un testo memorizzato in un secondo file. Il numero di righe di questo file è indefinito, ma si può assumere che la lunghezza di ogni riga sia al più pari a 100 caratteri.
Come output, il programma deve riportare su video l’elenco delle parole contenute nel primo file, ciascuna seguita dal numero di occorrenze con cui compare nel testo contenuto nel secondo file. Si noti che i due file devono essere letti una volta sola.
Si trascurino i possibili problemi derivanti dall’uso della punteggiatura (ovvero si considerino le stringhe “parola”, “parola.”, “parola!”, etc., come diverse).

#include <stdio.h>
#include <stlib.h>

#define ROW 100
#define COL 20+2  /* 20 + \n + \0 */

int load(char words[ROW][COL]); /* definizione funzione per caricare le occorrenze */
int find(char words[ROW][COL]);// definizione funzione per trovare le occorrenze nel 2file

// main con chiamata alle funzioni
int main (void)
{
    char words[ROW][COL];
    
}
//funzione che legge dal primo file e carica le occorrenze da trovare in un vettore "words"
int load(char words[ROW][COL]
{ 
    FILE *fp;
    int n, i;
    
    fp=fopen("occorrenze.txt", "r");
    if (fp == NULL) {
      printf("Error opening the occorrenze file!\n");
      return 0;
  }
    fscanf(fp, "%d" &n);
     for (i=0; i<n; i++) 
       fscanf (fp, "%s", words[n]);
     
     fclose(fp);  
       
       return 1;
}

//funzione che confronta le occorrenze con il 2 file
 int find(char words[ROW][COL]
{
   FILE *fpr, *fpw;
   char buf[ROW];
   int id, k;
   
   fpr = fopen("citazioni.txt", "r");
  if (fpr == NULL) {
    printf("Error opening the input text file!\n");
    return 0;
  }
  fpw = fopen("output.txt", "w");
  if (fpw == NULL) {
    printf("Error opening the output text file!\n");
    return 0;
  }  
  
  
  while (fgets(buf, ROW, fpr) != NULL) {
        k=0;
     while (buf[k] != '\0') {            
      if (buf[k] != ' ') {
                 strcmp(
???
      
  
  
  
  
  
  fclose(fpr);
  fclose(fpw);

  return 1;
}
Dunque il mio problema è: come faccio a confrontare una parola contenuta in un array con tutte le parole della riga contenute nel 2 array?
Oppure devo ragionare in maniera diversa?

Esempio:
Sia il file con l’elenco delle parole da ricercare il seguente:
4
edison
e’
genio
citazione

e il file con il testo il seguente:
il genio non e’ altro che una grande attitudine alla pazienza, Buffon
il Genio e’ la punta estrema della saggezza, Cocteau
il GENIO e’ 10% ispirazione e 90% sudore, Edison
Io un genio? Non diciamo sciocchezze..., Anonimo
NON occorre essere un GeNiO per risolvere questo esercizio

Il programma deve dunque visualizzare il messaggio:
edison – 1 occorrenza/e
e’ – 3 occorrenza/e
genio – 4 occorrenza/e
citazione – 0 occorrenza/e

1 Risposte

  • Re: Occorrenze di parole

    Intanto comincerei a semplificare. Per leggere le stringhe usa la fscanf con %s. Così, leggerai le stringhe una per una.
    Poi, progetta le strutture dati necessarie con attenzione.
    In ultimo, non aprire troppi file se la traccia ti dice di mostrare i risultati a schermo.
    Prova.
    Ciao
Devi accedere o registrarti per scrivere nel forum
1 risposte