RISOLTO [C++] Macchinetta distributore bibite

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Per il typedef, dico la verità, l'ho scoperto oggi mentre appunto sfogliavo guide online, mai usato in vita mia.. pensavo di fare cosa gradita per il professore. In merito alla Lista L avrei voluto provare con un oggetto Lista, ma poi mentre mi documentavo ho pensato che in fondo non mi cambiava poi molto utilizzare gli strumenti che già conosco. Forse avrei potuto uscire un po' dalla comfort zone.

Il problema con il typedef in questo caso è quello che ha fatto notare anche bigendian qui sopra. Già dando nomi chiari alle variabili però la situazione migliora.

Giuro, lo faccio sempre sempre, credo sia stato lo "stress" visto che è la prima volta che ci viene assegnato un compito così lungo e complesso (per gli standard a cui siamo abituati in classe). Do subito un occhio alla guida comunque perché mi piace approfondire.

Va bene, in caso avessi domande relative a quello che stai leggendo, puoi domandare tranquillamente in quel topic. ?

Ecco qui mi sono un attimo perso, non credo di aver capito bene questo punto. Perché stampare direttamente dalla funzione è un errore logico? ?

Ti porto un paio di esempi. Immagina di dover utilizzare ad esempio la funzione che restituisce il prezzo del prodotto e dover stampare il simbolo del $, piuttosto che gli €. Se hai un una stampa sul terminale del prezzo, come fai?
La funzione che hai scritto ha come scopo restituire il prezzo; il modo in cui è formattato/mostrato a video, non dipende da quella funzione.

Secondo esempio. Ipotizza che il programma che hai scritto debba avere 2 interfaccie: una da terminale, che è quella che hai realizzato - magari immaginala interattiva, con input da parte dell'utente - e una seconda con una GUI (grafica). Avresti quella funzione che continua a scrivere su terminale.

Un altro esempio? Immagina di mettere quelle funzioni in un file separato dal main(), e ipotizza che un altro programma/esercizio che scriverai domani abbia bisogno di richiamare quelle funzioni. Se ti viene chiesto dal docente di stampare "QUANTITA': ..." invece di quello che stampi a schermo ora, come faresti?

Ancora un esempio, prendiamo la funzione che hai scritto che torna true/false (funzione4). Lo scopo della funzione dovrebbe essere quello di restituire true o false, non il messaggio. Quello verrà stampato a schermo da chi richiama la funzione, in base a quello che torna.
Immagina sempre, se ti è più comodo, di dover richiamare questa funzione più volte nel tuo programma. E se una di queste volte vuoi solo sapere se è true/false, senza avere del testo stampato a video?

Questi sono solo alcuni esempi che mi sono venuti in mente ora.
Le uniche eccezioni sono quelle funzioni che vai a scrivere apposta per "stampare" a schermo. Per dire, puoi avere una funzione che ritorna un void e riceve come parametro la matrice, e che poi stampa a video la matrice. Però in quel caso la funzione avrebbe quello come scopo, ovvero mostrare il contenuto (ed è sicuramente meglio fare così, piuttosto che copiare e incollare gli stessi 2 cicli for per stampare il contenuto ogni qual volta ti serve).


Non abbiamo ancora affrontato questi argomenti a scuola, puoi linkarmi qualche guida in merito a ciò di cui parli?

E' qualcosa che penso puoi trovare su tutti i libri. Guarda il libro di testo che utilizzate, quando parla degli array e dell'allocazione statica (statica perchè hai scelto tu la dimensione in fase di compilazione, ovvero N).

Poi ti accorgi che non tutte le locazioni di memoria sono inizializzate facendo: R x C = 3x3 = 9.
Tu stai facendo:
C++:
    M[0][1] = Fila(0,10);
    M[1][1] = Fila(1,0);
    M[2][1] = Fila(1,4);
    M[1][2] = Fila(0,5);

significa che ti mancano:
C++:
M[0][0]
M[0][2]
M[1][0]
M[2][0]
M[2][1]

Se sommi i casi che ti ho mostrato io e quello che hai tu, sono infatti 9. Ricordati che questa è una matrice, puoi vederla come una "griglia" (un quadrato in questo caso, essendo 3x3). Provo anche a "disegnartela", così ti è più facile. ?

---------------------------
M[0][0] | M[0][1] | M[0][2]
---------------------------
M[1][0] | M[1][1] | M[1][2]
---------------------------
M[2][0] | M[2][1] | M[2][2]
---------------------------


Il verde sono le celle che hai inizializzato, a cui hai dato un valore; le rosse sono quelle ignorate.

Qui però devo correggere me stesso, visto che siamo con C++: quando dichiari la matrice (con quel typedef in cima etc etc) in realtà viene richiamato il costruttore di default, quasi sicuramente. Quindi se al termine del tuo programma accederai alla posizione M[0][0] accedendo a uno dei membri (quantità o indice), vedrai i valori che avrai nel costruttore, segno che l'oggetto è in realtà stato comunque istanziato.
Puoi fare una prova, ma probabilmente è così. Quindi vedrai -1 se stampi indice, o 0 se stampi quantità (come se avessi richiamato esplicitamente il costruttore vuoto).

In generale però tieni presente questo aspetto, potrebbero capitarti situazioni diverse.
Poi con il tempo - e magari quanto affronterete altri argomenti o altri ilnguaggi, come C - vedrai che avrai molti più tasselli a comporre il disegno che ti stai formando ora, su come funzionano le cose. ?

Ha detto che potevamo tranquillamente utilizzare staticamente i valori che ci ha "consigliato" nella consegna dell'esercizio, dunque ho usato il #define senza problemi.
Allora hai fatto bene.

Grazie mille, apprezzo molto! Calcola che sono uno studente di seconda superiore, dunque se il codice è un po' "immaturo" è anche perché non è che abbiamo affrontato chissà quali argomenti.. Per il resto cerco di documentarmi online.
Comunque è del tutto normale, anzi. Non è un brutto codice. Per altro è bello vedere un pò di curiosità e interesse in chi sta iniziando ora.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Mi unisco al coro anche io per farti i complimenti, hai fatto un buon lavoro. Concordo sulle critiche fatte, che reputo costruttive.
Bravo.
 
  • Mi piace
Reazioni: bigendian

giammo82

Utente Attivo
1,210
525
Concordo con tutto quello che è stato detto finora, ma un pensiero mi viene in mente , se un professore ti dice di andare a vedere su internet come si fa una cosa che senso ha andare a scuola ? A questo punto me ne stavo a casa ed imparavo con i video corsi come Udemy ecc ecc


Inviato dal mio iPhone utilizzando Toms Hardware Italia Forum
 

Andretti60

Utente Èlite
6,440
5,091
.. se un professore ti dice di andare a vedere su internet come si fa una cosa che senso ha andare a scuola ? ...
lo spiegai in precedenza:

La scuola ti insegna i concetti base, ma poi non ti può andare a spiegare uno ad uno tutte le funzioni di una libreria. L’insegnante ti potrà dire che in un certo linguaggio esiste una libreria per eseguire certe operazioni, l’esempio che altri ti hanno già citato qui in C++ esiste la std::vector, che è vasta, spetta a te informarti, andare a leggere il suo manuale,

Uno studente deve imparare a leggere i manuali (feci il tecnico industriale, ai suoi tempi) perche' e' quello che poi si continuera' a fare per lavoro.
 
  • Mi piace
Reazioni: bigendian

bigendian

Utente Attivo
749
432
OS
Linux
si, cercare le cose in internet e' la prassi del lavoro, io lavoro nell'embedded, quasi ogni giorno mi imbatto i qualche chip nuovo, che devo studiare, cercando in internet sia come funziona il chip, se ci sono gia dei driver, magari simili, etc.

Cmq, se fosse non preparatissimo ma un prof di un istituto tecnico forse lo perdonerei, se si tratta di un prof universitario pero' deve conoscere perfettamente la materia.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!