Esercizio Late For Work

Salve! Sono incapace e vorrei iniziare ad usare C++ a partire da questo esercizio (scelto a caso), qualcuno saprebbe aiutarmi? Grazie mille.

Per approcciarti al C++ ci sono vari video su youtube che spiegano le basi in modo semplice e chiaro, poi se vuoi andare un po più nello specifico questa è la reference del C++ http://www.cplusplus.com/ però se non conosci ancora niente può essere un po confusionario.

Per quanto riguarda il problema “Late For Work” ti do un piccolo consiglio: prova a trasformare i dati e ragionare in secondi invece di ore e minuti.

Ciao!
È una vita che non scrivo qui, spero di avere qualche consiglio utile da darti.

Io imparai a programmare da autodidatta negli anni del liceo e, anche se è probabile che tu abbia un modo di apprendere completamente diverso dal mio, ti dirò quello che secondo me potrebbe essere un ottimo modo per imparare a scrivere codice come si deve conscio degli errori che feci.

Piccola nota: C++ aggiunge varie comodità al C ma anche tantissime complicazioni (non per niente i libri “seri” su linguaggi ad oggetti fanno sembrare il testo dei fondatori del C un libretto da leggere prima di andare a nanna quando si confrontano le dimensioni) quando si va a studiare classi template etc, saper sfruttare bene le classi e le gerarchie che permettono di realizzare è estremamente utile nella scrittura di programmi di grosse dimensioni, ma per imparare a risolvere problemi di algoritmi come quelli presenti su questo sito ti basta sapere che l’unica differenza in C++ tra classi e strutture (se non sai cosa sono capirai quando le studierai) è che le prime sono private di default e mentre le seconde sono public di default. Se vorrai verrà più avanti il tempo di addentrarsi nel magnifico e perverso mondo della OOP, ma avere fretta subito può essere solo controproducente.

Allora, “breve” premessa (salta pure al prossimo spazio), la prima cosa che serve per scrivere codice è avere le idee chiare su cosa si vuole fare:
ti sconsiglio assolutamente di iniziare a seguire corsi su internet del tipo “impariamo a fare cose grafiche e bla bla bla” perché imparare a programmare significa dato un problema capire autonomamente come risolverlo, quali passi seguire, ma quei corsi non servono a niente se non a confondere le idee.
Imparare a risolvere i problemi su questo sito invece è utilissimo e a me e molti altri ha insegnato tantissimo, molto di più di decine di ore di lezione al liceo o all’università (sono “vecchio” oramai).
Diffida anche dei tizi che dicono che il linguaggio X permette di fare più cose del linguaggio Y, le differenze (fatta eccezione per casi davvero estremi) stanno praticamente solo nella sintassi e in quali funzioni sono già incorporate in un linguaggio e quali vanno implementate in mano o aggiunte scaricando librerie già pronte.

Allora, arriviamo a come imparare C o C++. Secondo me le prime cose da imparare sono, nell’ordine (mi ispiro a dei libri che ho letto):

  1. Più o meno, in maniera estremamente semplificata, come funziona un programma (nella ram ci sono le istruzioni e i dati, la CPU le esegue legge, le esegue, accede ai dati e in pratica tutto)
  2. Avere una vaga idea di cosa fa il sistema operativo (io all’epoca non lo sapevo e non riuscii mai a capire perché nei vari linguaggi di programmazione non ci fossero comandi per leggere da tastiera e scrivere a video “allo stesso modo di come si fa un’addizione” ma bisognasse sempre chiamare funzioni già pronte), ovvero occuparsi di fare tutte quelle cose che direttamente un programma utente non potrebbe mai fare per ragioni di sicurezza (accedere autonomamente al disco, alle altre periferiche e interagire con gli altri processi) e sapere che in ogni istante O lavora il tuo programma O lavora il sistema operativo (che non è un “fantasma” che di nascosto controlla tutto quello che succede! Entra in gioco solo quando viene attivato, tipo quando avviene un Segmentation Fault). Se sei curioso puoi approfondire quanto ti pare l’argomento, ma per ora questo ti dovrebbe bastare ed è anche di più di quello che sapevo io all’epoca.
  3. Iniziare a vedere quali sono i tipi presenti nel linguaggio: i vari tipi interi (qualcuno li chiama integrali) da bool a long long passando per i char e i tipi in virgola mobile (float e double) e relative regole di casting (conversione)
  4. Vedere cosa sono gli array, come si usano e dare un’occhiata alle “stringhe in stile C” (array di caratteri terminati da 0, il cui carattere corrispondente è ‘\0’)
  5. Imparare quali sono gli operatori (l’utilizzo di alcuni ti sarà chiaro più avanti), in sintesi i principali sono: + - * / < > <= => = == ?: (ternario, estremamente utile per risparmiare righe) & && | || ^ eccetera eccetera e in che ordine vengono eseguiti. Per molti di loro ti basterà avere idea che esistano, li userai solo parecchio più avanti.
  6. Strutture di controllo: if-else, while, do while, for, switch, break, continue, goto (non dare troppo ascolto ai, come li definisce il mio prof di Calcolatori, “talebani della programmazione strutturata” che lo dipingono come causa di tutte le nefandezze di questo mondo, talvolta è estremamente utile)
  7. Se vuoi già iniziare a dare un’occhiata veloce a cosa siano i puntatori, all’inizio ti potranno sembrare ostici ma poi riveleranno la loro enorme utilità e, se vuoi sfruttare sin da subito una cosa di C++ e non di C, i riferimenti.
  8. Imparare a scrivere funzioni e come passarci argomenti per copia o riferimento. (Consiglio: se è possibile e questo non inficia troppo l’efficienza del tuo programma, suddividere il codice in funzioni di poche righe, in modo da poterle vedere tutte senza scorrere la finestra.)
  9. Come funzionano e come si usano le strutture

A questo punto hai visto tutti gli argomenti del C
Le novità che all’inizio ti interesseranno ci C++ sono:

  • Come scrivere e utilizzare classi semplici
  • Come ridefinire gli operatori per i tipi (class o struct) che definisci tu (cin >> e cout << non fanno altro che ridefinire gli operatori << e >> per evitare di scrivere più prolisse ma equivalenti chiamate a funzione)
  • Come scrivere e usare i template
  • Potrebbe esserti utile capire che significano i termini iterabile e iteratore e cosa sia il range-for di C++11.
  • Dai un’occhiata a cosa siano le eccezioni, concettualmente sono semplici, giusto per capire il perché di alcuni errori che potresti incontrare

Fatto questo, o anche nel mentre in realtà, dovrai iniziare a vedere la libreria standard di C e C++.
All’inizio si tende a trascurare questa parte ma in realtà è fondamentale perché entrambe (quella di C++ in particolare) mettono a disposizione tantissime classi e funzioni già pronte che permettono di risparmiare tantissimo codice nella risoluzione dei problemi (std::sort dentro è l’esempio più lampante di ciò) e, soprattutto, di leggere e scrivere file (vedi <stdio.h> per C o per C++).

Fatto questo viene la parte di imparare a scrivere algoritmi.
Prima di partire facendo il passo più lungo della gamba ti consiglio, se non hai proprio esperienza, di partire da easy 1, 2 e 3, giusto per capire come leggere e scrivere da file, e poi proseguire con esercizi in teoria molto facili finché non prendi la mano.
Quando penserai di avere abbastanza dimestichezza con il linguaggio sarà il momento di mettersi a inventare o a imparare algoritmi sempre più complicati. Un po’ è istruttivo cercare di cavarsela da soli, poi inizia a divenire conveniente iniziare a studiare seriamente da qualche testo di competitive programming, un tempo consigliavano Competitive Programming 3, se vuoi, se lo trovo, ti mando il link a un altro testo della Springer al momento distribuito gratuitamente in questo periodo, sono in inglese ma, se non hai molta esperienza a leggere testi in inglese, sono un’ottima occasione per fare pratica.

È parecchia roba quella che ho scritto ma per imparare a fare le cose bene ci vuole tempo e pazienza, tempo perché le cose da vedere sono tante, pazienza perché alla decima segfault di fila è facile sbroccare, ma alla fine è estremamente soddisfacente.
Potrebbe essere comodo imparare a usare a livello base un debugger ma non serve avere fretta, all’inizio i famosissimi cout << “AAAAAAAAAA”; cout << “BBBBBBBBBB”; basteranno (a me sono bastati sostanzialmente per anni), anche perché per saperli usare bene bisogna sapere come lavora dentro il processore.

Temo di aver scritto troppo.
Spero di non aver dimenticato nulla.
Se serve altro chiedi pure.
Spero di trovare il tempo per rispondere.

EDIT:
Tutti noi abbiamo iniziato facendo errori che oggi riterremmo “imbarazzanti”, quasi certamente li farai anche tu, è più che normale. Il mio consiglio in proposito è imparare a leggere l’output del compilatore, è facile e ti risparmierà parecchie arrabbiature.

8 Mi Piace

13 OK UN SALUTO AL GRANDE BUGATTI E AL NUOVO PRESIDENTE
RC CAL2 CI VEDIAMO NEL 2021 A REGGIO CALABRIA LICEO LEONARDO DA VINCI DARò UNA MANO DI AIUTO ALLA NUOVA COLLEGA
RITA MIRITELLO EX CAL2 REFERENTE TERRITORIALE

1 Mi Piace