In questa lezione vedremo come effettuare la ricerca di un elemento in un array.
Nella programmazione, spesso è necessario cercare un elemento all’interno di un array. In questo articolo, esploreremo due metodi per affrontare questo problema utilizzando il linguaggio C. Il primo metodo sarà implementato senza l’uso di funzioni, mentre il secondo sfrutterà funzioni per rendere il codice più modulare e leggibile.
Ricerca di un elemento in un array – Metodo Senza Funzioni
In questa prima soluzione, affronteremo il problema senza l’ausilio di funzioni.
Il programma consente all’utente di inserire una serie di numeri in un array e dopo di cercare un numero specifico all’interno di quell’array. Alla fine, viene visualizzato il numero di volte che il numero cercato compare nell’array.
Ecco in dettaglio i passaggi che effettueremo:
- Viene dichiarato un array
a
di interi con dimensioneMAX
. - Vengono dichiarate le variabili
n
(per memorizzare il numero di elementi dell’array),i
(per contare gli elementi durante il loop),x
(il numero da cercare nell’array) ecount
(per contare quante volte il numero compare nell’array). - Dapprima l’utente inserisce il numero di elementi dell’array tramite
scanf()
e lo memorizza nella variabilen
. - Dopo l’utente inserisce gli elementi dell’array utilizzando un loop
for
, dovei
varia da 0 an-1
. Ogni elemento viene memorizzato nell’arraya
. - L’utente inserisce il numero da cercare nell’array che sarà memorizzato in una variabile
x
. - Poi viene eseguito un loop
for
per attraversare tutti gli elementi dell’array. Ogni elemento viene confrontato con il numero cercatox
. Se l’elemento è uguale ax
, incrementacount
. - Alla fine del loop, il programma determina se
count
è uguale a zero. Se è così, il numero cercato non è stato trovato nell’array e viene stampato un messaggio appropriato. Altrimenti, viene stampato il numero di volte che il numero cercato appare nell’array. - Il programma restituisce
0
per indicare il completamento senza errori.
Algoritmo per la ricerca
Ecco dunque l’implementazione dell’algoritmo:
#include <stdio.h>
#define MAX 100
int main() {
int a[MAX];
int n, i, x, count = 0;
printf("Inserisci il numero di elementi nell'array: ");
scanf("%d", &n);
printf("Inserisci gli elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("Elemento %d: ", i + 1);
scanf("%d", &a[i]);
}
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
for (i = 0; i < n; i++) {
if (a[i] == x) {
count++;
}
}
if (count == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, count);
}
return 0;
}
Questo metodo è semplice e diretto ma può diventare inefficiente per array molto grandi, poiché richiede un confronto con ogni elemento dell’array.
Potremmo infatti tener conto di varie ottimizzazioni, ad esempio potremmo utilizzare una tabella di frequenza, invece di attraversare l’array ogni volta per contare quante volte appare un numero. Inizializziamo un array di frequenza con dimensione pari al valore massimo possibile (ad esempio, se il massimo è 100, l’array di frequenza sarà di dimensione 101) e quindi attraversiamo l’array una volta sola, incrementando il contatore corrispondente all’indice dell’array di frequenza per ogni numero incontrato. Questo riduce la complessità temporale da O(n^2) a O(n).
#include <stdio.h>
#define MAX 100
int main() {
int a[MAX] = {0}; // Inizializza l'array con zeri
int freq[MAX] = {0}; // Tabella di frequenza
int n, i, x;
printf("Inserisci il numero di elementi nell'array: ");
scanf("%d", &n);
printf("Inserisci gli elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("Elemento %d: ", i + 1);
scanf("%d", &a[i]);
freq[a[i]]++; // Incrementa la frequenza del numero inserito
}
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
if (freq[x] == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, freq[x]);
}
return 0;
}
Ricerca di un elemento in un array – Metodo con le Funzioni
Sviluppiamo adesso una soluzione, utilizzando le funzioni per suddividere il codice in blocchi più gestibili e leggibili.
Svilupperemo alcune funzioni:
- Funzione
inserisciArray
: Questa funzione consente all’utente di inserire elementi nell’array. Chiede all’utente quanti elementi vuole inserire, quindi utilizza un ciclofor
per leggere ciascun elemento dall’input e memorizzarlo nell’arraya[]
. Restituisce il numero totale di elementi inseriti. stampaArray
: Questa funzione stampa tutti gli elementi dell’array. Utilizza un ciclofor
per scorrere l’array e stampare ciascun elemento su una riga separata.- Funzione
ricercaElemento
: Questa funzione cerca quante volte un certo numero appare nell’array. Chiede all’utente di inserire il numero da cercare e quindi utilizza un ciclofor
per scorrere l’array e contare quante volte il numero cercato appare. Alla fine, stampa il numero di occorrenze del numero cercato nell’array. main
: La funzione principale del programma si occupa di dichiarare un arraya[]
di dimensioneMAX
e una variabilen
per memorizzare il numero di elementi inseriti. Dopo chiama la funzioneinserisciArray
per inserire gli elementi nell’array, quindi chiama la funzionestampaArray
per stampare gli elementi dell’array. Infine, chiama la funzionericercaElemento
per cercare il numero specificato nell’array e stampare il risultato.
Ecco dunque il codice completo:
#include <stdio.h>
#define MAX 100
int inserisciArray(int a[]) {
int n, i;
printf("Quanti elementi vuoi inserire nell'array?: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Inserisci elemento %d: ", i + 1);
scanf("%d", &a[i]);
}
return n;
}
void stampaArray(int a[], int n) {
int i;
printf("Elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void ricercaElemento(int a[], int n) {
int x, i, count = 0;
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
for (i = 0; i < n; i++) {
if (a[i] == x) {
count++;
}
}
if (count == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, count);
}
}
int main() {
int a[MAX], n;
n = inserisciArray(a);
stampaArray(a, n);
ricercaElemento(a, n);
return 0;
}
Quindi, questo programma fornisce un’interfaccia semplice per manipolare gli array, permettendo all’utente di inserire elementi, visualizzare gli elementi dell’array e cercare quanti volte un certo numero appare nell’array.
Ricerca di un elemento in un array – Tabella di frequenza
Possiamo usare una soluzione che utilizza una tabella di frequenza per tenere traccia delle occorrenze di ciascun elemento presente nell’array.
Introduciamo quindi un array di frequenza freq
, inizializzato con tutti gli elementi a 0. Ogni volta che incontriamo un elemento nell’array, incrementiamo il contatore corrispondente nell’array di frequenza. Alla fine, controlliamo il valore di frequenza per l’elemento cercato e stampiamo il risultato. Questo approccio riduce la complessità della ricerca a O(1), poiché stiamo semplicemente accedendo direttamente alla frequenza dell’elemento anziché scorrere l’intero array per contare le occorrenze.
Ecco dunque il codice completo:
#include <stdio.h>
#define MAX 100
#define MAX_ELEMENT 1000
int inserisciArray(int a[]) {
int n, i;
printf("Quanti elementi vuoi inserire nell'array?: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("Inserisci elemento %d: ", i + 1);
scanf("%d", &a[i]);
}
return n;
}
void stampaArray(int a[], int n) {
int i;
printf("Elementi dell'array:\n");
for (i = 0; i < n; i++) {
printf("%d\t", a[i]);
}
printf("\n");
}
void ricercaElemento(int a[], int n) {
int freq[MAX_ELEMENT] = {0}; // Array di frequenza
int x, i;
printf("Inserisci il numero da cercare nell'array: ");
scanf("%d", &x);
// Calcola la frequenza di ciascun elemento nell'array
for (i = 0; i < n; i++) {
freq[a[i]]++;
}
// Controlla se l'elemento è presente e stampa la sua frequenza
if (freq[x] == 0) {
printf("Il numero %d non è stato trovato nell'array.\n", x);
} else {
printf("Il numero %d è stato trovato %d volte nell'array.\n", x, freq[x]);
}
}
int main() {
int a[MAX], n;
n = inserisciArray(a);
stampaArray(a, n);
ricercaElemento(a, n);
return 0;
}
Conclusioni
In questa lezione abbiamo esplorato un semplice programma in linguaggio C che consente agli utenti di ricerca elementi in un array. Nelle prossime lezioni continueremo a lavorare con gli array in C.
Link utili: