Ripasso: contatore di frequenza delle parole
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 63 di 63.
Sfida
FacileCrea un programma in C che implementi un contatore della frequenza delle parole per analizzare il testo in input. Il programma deve:
- Scrivere una funzione chiamata
countWordOccurrencesche:- Accetti due parametri
char*:sentenceetargetWord - Restituisca un intero che rappresenta il numero di volte in cui la parola target appare nella frase
- Utilizzi un ciclo per elaborare la frase carattere per carattere
- Individui i confini delle parole usando gli spazi come delimitatori
- Estragga ogni parola dalla frase e la confronti con la parola target usando
strcmp() - Conteggi le corrispondenze esatte (confronto con distinzione tra maiuscole e minuscole)
- Accetti due parametri
- Scrivere una funzione chiamata
extractWordche:- Accetti una frase
char*, un indice interostartIndexe un parametro parolachar* - Restituisca un intero che rappresenta l'indice successivo alla parola estratta
- Estragga una singola parola a partire da
startIndex, fino a trovare uno spazio o un terminatore null - Memorizzi la parola estratta nel parametro
word - Aggiunga un terminatore null per completare la parola estratta
- Accetti una frase
- Scrivere una funzione chiamata
analyzeTextche:- Accetti un parametro frase
char* - Restituisca un intero che rappresenta il numero totale di parole nella frase
- Conteggi le parole individuando gli spazi come separatori
- Gestisca correttamente più spazi consecutivi (considerandoli come un unico separatore)
- Accetti un parametro frase
- Nella funzione principale:
- Dichiari un array di caratteri
inputSentencedi dimensione 200 - Dichiari un array di caratteri
searchWorddi dimensione 50 - Legga una frase dall'input (può contenere più parole separate da spazi)
- Legga una parola target da cercare
- Chiami la funzione
analyzeTexte stampi il conteggio totale delle parole esattamente in questo formato:Total words: [count] - Chiami la funzione
countWordOccurrencese stampi il risultato esattamente in questo formato:Occurrences of '[searchWord]': [count] - Calcoli e stampi la frequenza della parola come percentuale con esattamente 1 cifra decimale, esattamente in questo formato:
Frequency: [percentage]% - Determini e stampi la categoria di frequenza:
- Se la frequenza è 0.0%: stampi
Category: Not found - Se la frequenza è maggiore di 0.0% ma minore di 20.0%: stampi
Category: Rare - Se la frequenza è compresa tra 20.0% e 50.0% (inclusi): stampi
Category: Common - Se la frequenza è maggiore di 50.0%: stampi
Category: Frequent
- Se la frequenza è 0.0%: stampi
- Dichiari un array di caratteri
Questa sfida mette alla prova la tua padronanza della manipolazione delle stringhe, della tokenizzazione e dell'elaborazione del testo. Ti eserciterai a suddividere le frasi in singole parole, confrontare stringhe per trovare corrispondenze esatte e implementare più funzioni che collaborano per analizzare i dati testuali. Il programma illustra tecniche di elaborazione del testo usate nel mondo reale, essenziali per molte applicazioni in C.
Provalo tu
#include <stdio.h>
#include <string.h>
// TODO: Scrivi qui la tua funzione extractWord
// TODO: Scrivi qui la tua funzione countWordOccurrences
// TODO: Scrivi qui la tua funzione analyzeText
int main() {
char inputSentence[200];
char searchWord[50];
// Leggi la frase in input
fgets(inputSentence, sizeof(inputSentence), stdin);
// Rimuovi il carattere di nuova riga, se presente
inputSentence[strcspn(inputSentence, "\n")] = '\0';
// Leggi la parola da cercare
scanf("%s", searchWord);
// TODO: Scrivi il tuo codice qui sotto
// Chiama la funzione analyzeText e memorizza il numero totale di parole
// Chiama la funzione countWordOccurrences e memorizza il numero di occorrenze
// Calcola la percentuale di frequenza
// Determina la categoria di frequenza
// Visualizza i risultati nel formato richiesto
// printf("Total words: %d\n", totalWords);
// printf("Occurrences of '%s': %d\n", searchWord, occurrences);
// printf("Frequency: %.1f%%\n", frequency);
// printf("Category: %s\n", category);
return 0;
}Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni8Struct e puntatori
Puntatori a structL’operatore freccia (->)Passare le struct per valorePassare puntatori a structAllocazione dinamica delle structRiepilogo: modifica di una struct - puntatore11Sfide finali di ripasso
Ripasso: concatenazione dinamica di stringheRipasso: array di structRipasso: contatore di frequenza delle parole3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online