NGI.Home > Forum
  EOLO HOME  OFFERTE INTERNET WIRELESS EOLO  FORMULA ADSL
   
   
WEBMAIL
   
 
  > Register  
  > FAQ  
  > Members List  
 
  > Calendar  
  > Today's Posts  
   
 

Go Back   NGI Forum > Tech & Tech > Developer's Zone

Reply
 
Thread Tools Rate Thread
Old 2nd December 2010, 14:41   #1
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
[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:

Code:
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ģ:

Code:
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:

Code:
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:

Code:
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):

Code:
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.

Code:
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?
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arėsius; 2nd December 2010 at 14:47.
Arėsius is offline   Reply With Quote
Old 2nd December 2010, 15:06   #2
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
mai vista una frittata fatta con le patate

Quote:
Come si potrebbe modificare il codice affinché non ci sia questo doppione?
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:
Spoiler:

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

Last edited by Cece; 2nd December 2010 at 15:29.
Cece is offline   Reply With Quote
Old 2nd December 2010, 15:06   #3
Niymiae
Five Leaf Clover
 
Niymiae's Avatar
 
Join Date: Mar 1999
Location: Magrathea
Posts: 3,166
Sempre detto che si mangia male da quelle parti
__________________
the e.UGO Xperience
The HyperIntelligent Shade of the color Green™
Who the hell do you think I am?
Niymiae on X360 Live and Steam

••
Niymiae is online now   Reply With Quote
Old 2nd December 2010, 15:09   #4
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
Quote:
Originally Posted by Cece View Post
mai vista una frittata fatta con le patate


č buonissima
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 2nd December 2010, 15:11   #5
Gioz
viso alla parete
 
Gioz's Avatar
 
Join Date: Jan 2009
Location: Autogrill
Posts: 5,295
uova e porro

ok basta fare le testine di cazzo dai
__________________
(12:08) Gioz: ieri primo ban su agorą, un coppino di 24h
(12:09) Mr_MiMe: perchč? hai detto che dio esiste?

Gioz is offline   Reply With Quote
Old 2nd December 2010, 15:18   #6
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
bravo Cece! ecco, magari mettiamo in spoiler le risposte, cosģ non roviniamo il gioco agli altri che vogliano provare
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 2nd December 2010, 15:34   #7
[En][gma]
Registered User
 
[En][gma]'s Avatar
 
Join Date: Dec 2001
Posts: 2,929
Quote:
Originally Posted by Cece View Post
mai vista una frittata fatta con le patate

Spoiler:

Code:
    se ( uova != buone ) {
        compra_nuove_uova;
    }
    sbatti_uova;
quoto tutto...dal primo byte all'ultimo.
__________________
.: NoS - Nitrous Oxide System :.
[En][gma] is offline   Reply With Quote
Old 2nd December 2010, 15:54   #8
Kaehell
l33t school
 
Kaehell's Avatar
 
Join Date: Mar 2008
Location: Zģria
Posts: 14,633
Non stai correndo troppo con gią la seconda online?
__________________
"...the three great virtues of a programmer: laziness, impatience, and hubris." - Larry Wall
The e.Ngineering Xperience ••
BattleNet - Kaeh#2263 || Diablo3 - Kaeh
Kaehell is offline   Reply With Quote
Old 2nd December 2010, 15:57   #9
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
Quote:
Originally Posted by Kaehell View Post
Non stai correndo troppo con gią la seconda online?
forse sģ... č che la prima lezione si riassumeva con

installate un IDE
funziona? bella.
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 2nd December 2010, 16:00   #10
Pier4R
Ex falso quodlibet
 
Pier4R's Avatar
 
Join Date: Jul 2004
Location: equgpbc.r2.Frisia
Posts: 18,664
Quote:
Originally Posted by Arėsius View Post

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?
Spoiler:

Code:
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.
__________________
Ngi the e.FlameeXperience • • • .Fe • • • ! • • • ngi.agorą@twitter (sottoscrivi per essere incluso)
You must play online: warSow • • • EnemyTerritory + etpro • • • quake 4 + q4max & quake 3 + cpma & quakelive • • • Teeworlds! • • • hoi2series

Ringrazio i grammar nazi che mi fanno comprendere gli errori ; my.IL
; lettere porno
Pier4R is offline   Reply With Quote
Old 2nd December 2010, 16:02   #11
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
esponimi il dubbio nel thread della lezione 1
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 2nd December 2010, 16:28   #12
_kAr!
Pokemon skilled
 
_kAr!'s Avatar
 
Join Date: May 2005
Location: Tridentum
Posts: 4,051
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
__________________
skd.kAr
_kAr! is offline   Reply With Quote
Old 2nd December 2010, 16:40   #13
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
Quote:
Originally Posted by _kAr! View Post
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.
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Old 2nd December 2010, 16:43   #14
L3v1stus
Good Boy
 
L3v1stus's Avatar
 
Join Date: Mar 2010
Location: Shakeshakeshake
Posts: 16,651
Quote:
Originally Posted by _kAr! View Post
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
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:
Quote:
Originally Posted by Arėsius View Post
pregandoti di non chiamarmi professore , ti rispondo nella lezione 1.
eh ma allora dillo
__________________
Via del Lulz 1, 517569 Campobasso. 03/06/2010 I was there.
www.casualmanto.blogspot.it
Lode eterna
L3v1stus is offline   Reply With Quote
Old 2nd December 2010, 16:47   #15
Arėsius
Soft computer
 
Arėsius's Avatar
 
Join Date: Feb 2000
Posts: 67,351
Quote:
Originally Posted by L3v1stus View Post
eh ma allora dillo
dai, va benissimo anche la tua risposta
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arėsius is offline   Reply With Quote
Reply

Bookmarks

Thread Tools
Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +2. The time now is 20:44.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright 1998-2014 by NGI SpA