- Saper iterare su un array di oggetti utilizzando il ciclo for
- Implementare algoritmi di ricerca lineare all'interno di una struttura a oggetti
- Gestire l'interazione tra input utente e metodi della classe
- Applicare i modificatori di accesso per garantire la sicurezza del dato durante la ricerca
L'Iterazione Programmata: Potenza del Ciclo For
Quando gestiamo un distributore con decine di scomparti, non possiamo interagire con ogni oggetto singolarmente. Il ciclo for ci permette di automatizzare compiti ripetitivi come il controllo delle scorte o la stampa del listino prezzi.
Algoritmo di Ricerca Lineare
Per permettere a un utente di trovare una merendina specifica tramite il nome, dobbiamo implementare una ricerca lineare:
- Scorriamo l'array dalla posizione 0 alla fine.
- Per ogni oggetto, confrontiamo il nome richiesto con quello salvato nell'attributo dell'oggetto.
- Se troviamo una corrispondenza, eseguiamo l'operazione (es. erogazione).
Nota tecnica: Poiché il nome della merendina è private, avremo bisogno di un metodo pubblico chiamato "getter" (es. getNome()) che ci restituisca il valore per poterlo confrontare nel main.
I Metodi Getter: La Finestra sui Dati Privati
Abbiamo stabilito che per proteggere i dati, gli attributi (come nome o prezzo) devono essere private. Tuttavia, il programma ha spesso bisogno di conoscere quei valori (ad esempio per stamparli o confrontarli).
Perché non rendere tutto public?
Se rendiamo un dato public, chiunque può sia leggerlo che modificarlo.
Il Getter ci permette di separare queste due azioni: creiamo una funzione che permette solo di "guardare" il dato senza poterlo toccare.
LABORATORIO
Ricerca e Vendita Intelligente
Obiettivo: Implementare un sistema di ricerca testuale per permettere l'acquisto di un prodotto tramite il suo nome all'interno di un array di oggetti.
- IDE C++ (Code::Blocks o Dev-C++)
- Libreria
<string>per il confronto testuale
1 Classe Merendina con Metodo di Lettura (Getter)
Aggiungiamo il metodo getNome() per permettere al main di leggere il nome privato durante la ricerca.
#include <iostream>
#include <string>
using namespace std;
class Merendina {
private:
string nome;
int quantita;
public:
void setup(string n, int q) {
nome = n;
quantita = q;
}
// GETTER: permette di leggere il nome privato dall'esterno
string getNome() {
return nome;
}
void eroga() {
if (quantita > 0) {
quantita--;
cout << "Erogazione di " << nome << " riuscita!" << endl;
} else {
cout << "Spiacente, " << nome << " e' esaurito." << endl;
}
}
};
2 Implementazione della Ricerca nel Main
Utilizziamo un ciclo for combinato con un'istruzione if per trovare il prodotto digitato dall'utente.
int main() {
Merendina scomparti[3];
scomparti[0].setup("Fonzies", 5);
scomparti[1].setup("KitKat", 2);
scomparti[2].setup("Mars", 0);
string ricerca;
bool trovato = false;
cout << "Quale prodotto vuoi acquistare? ";
cin >> ricerca;
// CICLO DI RICERCA
for (int i = 0; i < 3; i++) {
if (scomparti[i].getNome() == ricerca) {
scomparti[i].eroga();
trovato = true;
break; // Esco dal ciclo appena trovo il prodotto
}
}
if (!trovato) {
cout << "Prodotto non trovato nel catalogo." << endl;
}
return 0;
}
3 Esercizio
Applica le seguenti modifiche per completare il progetto:
- Rifornimento Completo: Crea una funzione che riporta tutte le merendine a 20 pezzi.
- Rifornimento Selettivo: Crea una funzione che chiede il nome di un prodotto e, se trovato, ne aumenta la quantità di 10 pezzi.
- Controllo Scorte: Usa un ciclo
forper stampare l'elenco di tutti i prodotti che hanno quantità pari a 0 (lista sottoscorta). - Case Insensitive (Difficile): Fai in modo che la ricerca funzioni anche se l'utente scrive "mars" tutto minuscolo mentre il prodotto è salvato come "Mars".