[Impariamo il C] Lezione 2

Buongiorno.

Prosegue il corso collaborativo di programmazione.

Dopo il primo capitolo di introduzione, in cui dovreste aver preparato l'ambiente con cui fare esercizi, entriamo nel vivo dell'argomento parlando di:


  • sintassi del C
  • la programmazione strutturata



Sintassi del linguaggio C

Riprendiamo un attimo il codice del tanto discusso ( ) hello world proposto la lezione precedente:


void main()
{
printf("Hello World!\n");
system("pause");
}

cosa possiamo dire? il programma è succinto, ma funziona.

Abbiamo detto che il C è un linguaggio imperativo, dunque ad ogni riga corrisponde un comando alla CPU (che poi sappiamo essere tradotto dal compilatore in linguaggio a lei comprensibile).

Cosa significa "ad ogni riga"? Nel linguaggio naturale, facciamo corrispondere una riga ad una sequenza di parole fino al ritorno a capo. Tuttavia, sappiamo che una frase normalmente non si conclude col ritorno a capo ma con un punto. In C il discorso è simile: ogni riga di comando si conclude con il punto e virgola ";".

Infatti, osserviamo che due righe su cinque hanno il punto e virgola alla fine: quelli sono effettivamente gli unici due comandi che abbiamo impartito. In base a questa regola sintattica, nulla ci vieta di scrivere così:


void main()
{
printf("Hello World!\n"); system("pause");
}
e infatti questo codice funziona in maniera identica a quello di prima. Possiamo strutturare il testo come preferiamo, l'unica cosa che conta è inserire un punto e virgola alla fine di ogni comando (altrimenti il compilatore da errore).

Cos'altro osserviamo? la prima riga dice qualcosa di criptico:

void main()cos'è void? è presto per dirlo - parleremo dei tipi di dato più avanti - ma void in sostanza rappresenta "il nulla"; vedremo più avanti il suo senso.

Il main, come anticipato nella lezione precedente, è il corpo principale del programma, ovvero da dove inizia l'esecuzione. In pratica, quando lanciamo l'esecuzione del programma, lui comincia proprio dal main. Il programma finisce quando raggiunge la conclusione del main.


La programmazione strutturata


Vediamo che il corpo del programma main è racchiuso da parentesi graffe. Questo è un punto importante: tutti i blocchi di istruzioni vanno racchiusi tramite queste parentesi e, quando si inizia ad eseguire un blocco, vengono svolti i comandi che contiene in ordine sequenziale.

Ad esempio, se io volessi fare un programma che prepara la frittata dovrei fare:


main {
sbatti_uova
taglia_patate
combina_ingredienti
scalda_su_fornello
}
(questo codice non è, ovviamente, in C: è detto pseudocodice, e si usa nelle discussioni tra programmatori per dare l'idea di quello che un programma fa).

In sostanza, il nostro programma "prepara_frittata" inizia sbattendo le uova e finisce dopo averle scaldate sul fornello. Un esempio di come le graffe facciano riferimento a "blocchi di codice" è il cosidetto costrutto iterativo. Ad esempio, potremmo dire che la procedura taglia_patate deve essere chiamata 3 volte (magari perché abbiamo tre patate da tagliare):

main() {
sbatti_uova;

ripeti 3 volte {
taglia_patate;
}

combina_ingredienti;
scalda_su_fornello;
}
Osserviamo che l'istruzione "ripeti tre volte" utilizza le graffe per delimitare il blocco di istruzioni che dobbiamo ripetere, perché altrimenti non sarebbe chiaro se dobbiamo ripetere solo il taglio delle patate, o anche il combinamento degli ingredienti, eccetera.


Un ulteriore esempio di blocco di istruzioni è la cosidetta selezione. Ad esempio, potremmo imporre un controllo sulla scadenza delle uova, prima di sbatterle.


main() {

se ( uova = buone ) {
sbatti_uova;
} altrimenti {
compra_nuove_uova;
sbatti_uova;
}

ripeti 3 volte {
taglia_patate;
}

combina_ingredienti;
scalda_su_fornello;

}
Analizziamo lo pseudocodice. Le condizioni (uova buone) sono racchiuse da parentesi; questo avviene anche in C, e il motivo sarà più chiaro quando vedremo le funzioni.

Osserviamo che la struttura è di tipo SE...ALLORA...ALTRIMENTI. In sostanza, eseguiremo il primo blocco tra graffe se la condizione è vera, il secondo nell'altro caso. La sezione "altrimenti" si può anche omettere, e in tal caso abbiamo un semplice SE...ALLORA


Dunque abbiamo visto: sequenza, iterazione e selezione. In base al teorema di Böhm-Jacopini, che abbiamo accennato nella lezione precedente, non ci serve nient'altro per programmare qualsiasi cosa. Qualunque programma abbiate visto nella vostra vita girare in un computer può essere realizzato con questi soli costrutti. Questa è la base della programmazione strutturata.


Esercizio: i più attenti avranno notato che, nello pseudocodice quì sopra, l'istruzione "sbatti_uova" è ripetuta in entrambi i blocchi del costrutto SE...ALLORA...ALTRIMENTI, perché le dobbiamo sbattere sia se usiamo quelle che abbiamo in frigo, sia se le compriamo nuove.

Come si potrebbe modificare il codice affinché non ci sia questo doppione?
mai vista una frittata fatta con le patate



Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


Spoiler


se ( uova != buone ) {
compra_nuove_uova;
}
sbatti_uova;

















Sempre detto che si mangia male da quelle parti




è buonissima
uova e porro

ok basta fare le testine di cazzo dai
bravo Cece! ecco, magari mettiamo in spoiler le risposte, così non roviniamo il gioco agli altri che vogliano provare


quoto tutto...dal primo byte all'ultimo.
Non stai correndo troppo con già la seconda online?


forse sì... è che la prima lezione si riassumeva con

installate un IDE
funziona? bella.



Spoiler



main() {


ripeti finchè ( uova = cacca ed in più "c'hai li sordi") {
compra_nuove_uova;
}

sbatti_uova;
ripeti 3 volte {
taglia_patate; mostra_trollface;
}

combina_ingredienti;
scalda_su_fornello;

}{




A parte questo, nella lezione 1 [1] ho notato un commento che mi ha lasciato un pochino .
Riguarda il chiamare una funzione prima di averla dichiarata. Posso esporr eil dubbio qui o aspetto?



[1]: nella mia vita sul web 2.0 ritengo che i forum siano lo strumento di comunicazione più potente, ma in caso di lezione diventano "pesanti" (infatti wiki + forum = uberpower). Un problema evidente è, ad esempio, il raccogliere tutte le buone cose dette nella discussione della lezione 1 senza dover far leggere 500 commenti pseudo-inutili (ai fini del topic ma non della discussione). Perchè lasciarle sparse nella discussione è un peccato (imo).
Io non ho tempo (ora, in futuro bhò) altrimenti settupperei una wiki e piano piano incollerei tutto lì sopra.
esponimi il dubbio nel thread della lezione 1
Professore mi scusi, le nozioni e gli esempi forniti sono molto chiari, trovo tuttavia delle difficoltà nella messa in pratica in quanto non capisco come stracazzo si usa DEV-CPP. Se potesse fornire delle semplici istruzioni pratiche Le sarei grato


pregandoti di non chiamarmi professore , ti rispondo nella lezione 1.


Beh si tratta di un ambiente di sviluppo senza tanti fronzoli
Crei un nuovo file con estensione .c lo salvi dove ti pare e, una volta scritto il codice nella finestra di editing testo Menu->Execute->Compile per vedere se non ci sono errori sintattici e si riesce a creare il file eseguibile, infine Menu->Execute->Run per eseguire il codice e vedere se ci sono errori logici

Per lo meno, il funzionamento di base è questo direi, purtroppo io programmo in linux dove è molto più comodo creare ed eseguire codice, ma non credo di aver sbagliato di molto

EDIT:

eh ma allora dillo


dai, va benissimo anche la tua risposta
consiglio vivamente di fermarvi e di aspettare che tutti abbiano il proprio ide funzionante, per poi proseguire.

io stesso ora posterò una piccola guida per procedere "alla vecchia maniera", tramite linee di comando e compilatore gcc.


quoto...

SE si sta ancora ampiamente discutendo nella lezione precedente aspetterei a proseguire...
ALTRIMENTI pubblichi la nuova


Bravo che impari! sei l'orgoglio del prof.Aresius

EDIT: Kahell ti vi bi lo volevo fare stasera ma gg
con calma che sto provando sul mio, io ho sempre usato linux per programmare in C