Tabelle di Ricerca in C: Una Guida per Principianti

Ciao, aspiranti programmatori! Oggi esploreremo il mondo affascinante delle tabelle di ricerca in C. Non preoccuparti se sei nuovo alla programmazione - ti guiderò attraverso questo concetto passo per passo, proprio come ho fatto per centinaia di studenti durante gli anni di insegnamento. Quindi, mettiamoci in cammino insieme!

C - Lookup Tables

Cos'è una Tabella di Ricerca?

Prima di immergerci negli esempi, capiremo cos'è una tabella di ricerca. Immagina di essere in una biblioteca e, invece di cercare ogni libro per trovare ciò di cui hai bisogno, usi un catalogo che ti dice esattamente dove si trova ogni libro. Questo è essenzialmente ciò che fa una tabella di ricerca in programmazione - è una struttura dati che sostituisce i calcoli a runtime con una più semplice operazione di indexing array.

Ora, esploriamo questo concetto attraverso alcuni esempi pratici.

Esempio 1: Giorni della Settimana

Iniziamo con un esempio semplice - una tabella di ricerca per i giorni della settimana.

#include <stdio.h>

int main() {
const char *giorni[] = {"Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"};
int numero_giorno;

printf("Inserisci un numero di giorno (0-6): ");
scanf("%d", &numero_giorno);

if (numero_giorno >= 0 && numero_giorno <= 6) {
printf("Il giorno è: %s\n", giorni[numero_giorno]);
} else {
printf("Numero di giorno invalido!\n");
}

return 0;
}

In questo esempio, abbiamo creato un array giorni che memorizza i nomi dei giorni della settimana. Quando un utente inserisce un numero tra 0 e 6, possiamo rapidamente recuperare il nome del giorno corrispondente utilizzando l'indexing array. Questo è molto più veloce e pulito rispetto all'uso di una serie di istruzioni if-else!

Esempio 2: Traduttore di Codice Morse

Ora, proviamo qualcosa di più complesso - un traduttore di codice Morse.

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
const char *morse[] = {
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
char testo[100];
int i;

printf("Inserisci una parola in maiuscolo: ");
scanf("%s", testo);

for (i = 0; i < strlen(testo); i++) {
if (isalpha(testo[i])) {
printf("%s ", morse[testo[i] - 'A']);
}
}
printf("\n");

return 0;
}

Qui, abbiamo creato una tabella di ricerca per il codice Morse. Ogni lettera del codice Morse è memorizzata nell'array morse. Quando un utente inserisce una parola, traduciamo ogni lettera nel suo equivalente in codice Morse utilizzando il valore ASCII della lettera come indice della nostra tabella di ricerca.

Esempio 3: Conversione di Temperatura

Creiamo una tabella di ricerca per la conversione rapida da Fahrenheit a Celsius.

#include <stdio.h>

#define TABLE_SIZE 101

int main() {
float celsius_table[TABLE_SIZE];
int i;

// Popoliamo la tabella di ricerca
for (i = 0; i < TABLE_SIZE; i++) {
celsius_table[i] = (i - 32) * 5.0 / 9.0;
}

int fahrenheit;
printf("Inserisci la temperatura in Fahrenheit (0-100): ");
scanf("%d", &fahrenheit);

if (fahrenheit >= 0 && fahrenheit <= 100) {
printf("%.2f°C\n", celsius_table[fahrenheit]);
} else {
printf("Temperatura fuori intervallo!\n");
}

return 0;
}

In questo esempio, pre-calcoliamo i valori Celsius per le temperature Fahrenheit da 0 a 100 e li memorizziamo in una tabella di ricerca. Questo ci permette di effettuare conversioni di temperatura istantanee senza la necessità di calcoli a runtime.

Esempio 4: Funzioni Trigonometriche

Le tabelle di ricerca sono particolarmente utili per operazioni computazionalmente costose come le funzioni trigonometriche. Ecco un esempio di una tabella di ricerca per il seno:

#include <stdio.h>
#include <math.h>

#define TABLE_SIZE 360
#define PI 3.14159265

int main() {
float tabella_seno[TABLE_SIZE];
int i;

// Popoliamo la tabella di ricerca
for (i = 0; i < TABLE_SIZE; i++) {
tabella_seno[i] = sin(i * PI / 180);
}

int angolo;
printf("Inserisci un angolo in gradi (0-359): ");
scanf("%d", &angolo);

if (angolo >= 0 && angolo < 360) {
printf("sin(%d°) = %.4f\n", angolo, tabella_seno[angolo]);
} else {
printf("Angolo fuori intervallo!\n");
}

return 0;
}

Questo esempio pre-calcola i valori del seno per angoli da 0 a 359 gradi. Utilizzando questa tabella di ricerca, possiamo rapidamente recuperare i valori del seno senza eseguire la funzione seno computazionalmente costosa a runtime.

Tabelle di Ricerca in Display a LED a 7 Segmenti

Infine, vediamo come le tabelle di ricerca possono essere utilizzate in una applicazione pratica - pilotare un display a LED a 7 segmenti.

#include <stdio.h>

#define SEGMENTS 7

int main() {
// Tabella di ricerca per il display a 7 segmenti (0-9)
const unsigned char seven_seg_digits[10][SEGMENTS] = {
{1, 1, 1, 1, 1, 1, 0},  // 0
{0, 1, 1, 0, 0, 0, 0},  // 1
{1, 1, 0, 1, 1, 0, 1},  // 2
{1, 1, 1, 1, 0, 0, 1},  // 3
{0, 1, 1, 0, 0, 1, 1},  // 4
{1, 0, 1, 1, 0, 1, 1},  // 5
{1, 0, 1, 1, 1, 1, 1},  // 6
{1, 1, 1, 0, 0, 0, 0},  // 7
{1, 1, 1, 1, 1, 1, 1},  // 8
{1, 1, 1, 1, 0, 1, 1}   // 9
};

int cifra;
printf("Inserisci una cifra (0-9): ");
scanf("%d", &cifra);

if (cifra >= 0 && cifra <= 9) {
printf("Display a 7 segmenti per %d:\n", cifra);
for (int i = 0; i < SEGMENTS; i++) {
printf("%c ", seven_seg_digits[cifra][i] ? '*' : ' ');
}
printf("\n");
} else {
printf("Cifra invalida!\n");
}

return 0;
}

In questo esempio, utilizziamo una tabella di ricerca 2D per memorizzare i pattern dei segmenti per i numeri da 0 a 9 su un display a 7 segmenti. Ogni riga rappresenta un numero, e ogni colonna rappresenta un segmento (1 per acceso, 0 per spento). Questo ci permette di recuperare rapidamente il pattern corretto per qualsiasi numero.

Conclusione

Le tabelle di ricerca sono uno strumento potente nell'arsenale di un programmatore. Possono migliorare significativamente le prestazioni sostituendo la memoria per la velocità, specialmente in situazioni in cui i calcoli sono complessi o ripetuti frequentemente. Mentre continui il tuo viaggio nella programmazione, troverai molte altre applicazioni per le tabelle di ricerca.

Ricorda, la pratica fa la perfezione! Prova a creare le tue tabelle di ricerca per diversi scenari. Buon coding, e non esitare a contattarmi se hai domande!

Credits: Image by storyset