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 12th December 2010, 14:14   #1
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
[Impariamo il C] Lezione 6

Buongiorno.

Nelle puntate precedenti del corso collaborativo di programmazione:
  1. installazione dell'IDE, cenni di architettura degli elaboratori
  2. sintassi del C, programmazione strutturata
  3. ancora sulla sintassi, i tipi di dato, le variabili
  4. variabili parte seconda: gli array
  5. introduzione delle funzioni
In questo capitolo:
  • operatori aritmetici
  • operatori logici

Operatori aritmetici

Abbiamo visto in precedenza che le variabili possono essere manipolate, per fare operazioni di vario tipo. Alcune sintassi per queste manipolazioni sono state subito intuitive (ad esempio, l'addizione usando il "+").

Ormai non ci preoccupa leggere cose tipo

Code:
a = b+1;

la semantica, ovvero il significato che diamo a questo pezzo di codice, è autoesplicativa: metti nella variabile "a" il contenuto di "b" più uno.

Il "+" è uno dei cosidetti operatori aritmetici. Vediamoli tutti:
  • addizione +
  • sottrazione -
  • moltiplicazione *
  • divisione /
  • modulo (cioè resto della divisione intera) %
Questi ultimi due operatori meritano un paio di parole in più. Primo, la divisione non ha senso se effettuata per zero. Il compilatore, quando se ne accorge, da errore; se il nostro utente inserisce zero durante l'esecuzione purtroppo succedono cose terribili. Va dunque evitata e, nel prossimo paragrafo, vediamo come.

La divisione ha comportamenti diversi se stiamo utilizzando numeri interi (cioè senza virgola) o numeri reali (float/double).

Dunque, a parità di divisione, avremo risultati diversi:

Code:
int a = 5;
int b = 2;
int c = a / b;       // c sarà uguale a 2

float x = 5;
float r = x / 2;     // r sarà uguale a 2.5
Dunque, in base al "numeratore", la divisione ritornerà diversi risultati. Stateci attentissimi.

Infine, il modulo (cioè il resto) ha senso solo per la divisione intera (perché nei reali non c'è il concetto di resto).


Tutti questi operatori sono detti binari, perché coinvolgono due elementi (cioè hanno due argomenti, ricordate le funzioni?). Per fare un esempio, scrivere

Code:
a = 1+1;
significa chiamare una funzione di questo tipo:

Code:
int sum(int valore1, int valore2) {
  return valore1+valore2;
}
Esistono anche operatori unari, che prendono un solo argomento. Ad esempio, in informatica capita spessissimo di dover incrementare una variabile (per esempio, un contatore). La sintassi potrebbe essere:

Code:
i = i+1;
Esistono operatori C specifici per gestire queste situazioni:
  • operatore incremento ++
  • operatore decremento --
questi operatori possono essere sia preposti che posposti, il che significa che la variabile viene incrementata prima di eseguire l'istruzione oppure dopo. Vediamo un esempio:

Code:
int a = 1;
int b = 1;

printf( "%d", ++a);    // stampa 2
printf( "%d", b++);    // stampa 1  (ma in b poi ci sarà 2)
Infine, tra gli operatori di questo tipo ci sono anche quelli compatti di assegnamento. Ad esempio le due seguenti sintassi sono equivalenti:

Code:
a = a + 3;

a += 3;
Questa notazione compatta si può utilizzare con uno qualunque degli operatori aritmetici.


Operatori Logici

Abbiamo visto nelle precedenti lezioni che il C fornisce costrutti di selezione/iterazione per gestire situazioni del tipo SE...ALLORA. Avremo quindi bisogno di una serie di operatori in grado di verificare certe espressioni. Tali operatori sono detti operatori logici, e ritornano un valore ZERO se la condizione è falsa, diverso da zero (usualmente 1) se è vera.
  • uguaglianza ==
  • diversità !=
  • minore <
  • maggiore >
  • minore o uguale <=
  • maggiore o uguale >=
si osservi l'operatore di uguaglianza: non è un semplice uguale, ma un doppio uguale. Il perché è presto detto: il singolo uguale si usa per l'assegnamento di una variabile! Il compilatore deve poter discernere tra le due istruzioni, e quindi il confronto di uguaglianza si effettua con "==".

Dunque, una scrittura

Code:
1 == 2
darà come risultato 0, cioè falso.


Chiunque abbia studiato logica sa che esistono poi operatori logici più avanzati, non di semplice confronto, come ad esempio NOT, AND ed OR.

Il primo è un operatore unario che "inverte" la logica della variabile cui lo anteponiamo. Ricordiamo l'esempio delle uova:

Code:
se ( uova == NOT buone ) allora ..
Il ramo "allora" sarà seguito se le uova NON sono buone.

Si usa il punto esclamativo "!" per indicare il not (infatti, notate, l'operatore di diversità è NON UGUALE, quindi "!=").


Il secondo operatore - AND - è un operatore binario che concatena due espressioni logiche e ritorna vero SE E SOLO SE queste due espressioni sono vere entrambe. Si indica con &&.

Ad esempio (pseudocodice):

Code:
"mi chiamo aresio" && "spammo su NGI"
ritornerà 1.


L'ultimo operatore logico che vedremo per ora - OR - è un altro operatore binario che concatena due espressioni logiche e ritorna vero SE ALMENO UNA DELLE DUE è vera. Si indica con ||.

Ad esempio (pseudocodice):

Code:
"mi chiamo aresio" || "c'ho le rotaie"
ritorna 1.


Ovviamente, tutti questi costrutti sono componibili e una espressione tipo

Code:
"mi chiamo aresio" && NOT "c'ho le rotaie"
ritorna 1.



Per ora mi fermerei quì con gli operatori. L'esercitatore vi fornirà degli esercizi con cui pasticciare (magari fornendo qualche spunto per introdurre la precedenza degli operatori ).
__________________
Lode a Bacco, in saecula saeculorum.
Emergent

Last edited by Arësius; 12th December 2010 at 19:15.
Arësius is offline   Reply With Quote
Old 12th December 2010, 14:22   #2
Kaehell
l33t school
 
Kaehell's Avatar
 
Join Date: Mar 2008
Location: Zìria
Posts: 14,633
abbè credo che la calcolatrice allora vada più che bene ancora
__________________
"...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 12th December 2010, 14:32   #3
nanomad
Dietro le sbarre
 
nanomad's Avatar
 
Join Date: Apr 2005
Location: Papia (olim Ticinum)
Posts: 5,221
Ti sei dimenticato di dire come si scrive il NOT in C (!)

Addendum per i pigri e i fanatici della leggibilità del codice:
Spoiler:

Se all'inizio del nostro codice aggiungiamo
Code:
#include<iso646.h>
Ci è possibile sostituire ! && || rispettivamente con not and or
__________________
Rivuoi i video nel forum? Usa questa estensione (chrome)
Source & firefox version
"(...) the three great virtues of a programmer: laziness, impatience, and hubris." -- LarryWall

Last edited by nanomad; 12th December 2010 at 14:38.
nanomad is offline   Reply With Quote
Old 12th December 2010, 15:57   #4
Ganker
<insert_team_name>
 
Ganker's Avatar
 
Join Date: Mar 2007
Location: Napoli
Posts: 5,365
mi tornerà utile
__________________
Is God willing to prevent evil, but not able? Then he is not omnipotent. ..........Is he able, but not willing? Then he is malevolent.
Is he both able, and willing? Then whence cometh evil? ..........Is he neither able nor willing? Then why call him God?
Epicurus
Ganker is offline   Reply With Quote
Old 12th December 2010, 16:01   #5
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
qua la mia calcolatrice:
http://pastebin.com/LmhnU9SN

chi mi spiega cosa vogliono dire i vari

Code:
double x = (double)a;
?

cioè, cosa fa?

PS: unistd.h non serve (mi sembra), l'ho commentato nel codice che ho "pastebinnato"
__________________
|||||||||| SoundCloud
La mia è una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri is offline   Reply With Quote
Old 12th December 2010, 16:31   #6
Kaehell
l33t school
 
Kaehell's Avatar
 
Join Date: Mar 2008
Location: Zìria
Posts: 14,633
in pratica se tu hai un double e un int, e ci fai una somma, il risultato verrà un int.

ad esempio se fai 3 + 4.0 il risultato sarà 7, un intero.

Perchè? Perchè quando fa calcoli, il c utilizza in automatico il tipo di dato più "limitato", quello meno generico.

Ecco quindi che si entra nella teoria dei così detti "cast". Per avere come risultato un numero con la virgola, ad esempio un double, è necessario che tutti i dati che fanno parte del calcolo siano di tipo double.

In pratica facendo double x = (double)a; si crea una nuova variabile x, di tipo double, che ha lo stesso valore di a ma convertita da int a double.

Cioè se a vale 3, x varrà 3.0. In questo modo facendo una divisione, una media, o comunque un'operazione che molto probabilmente darà come risultato un valore con la virgola si potrà fare (ad esempio) 3.0/2.0 = 1.5.

Se non usassimo il cast, sarebbe 3/2 = 1, perdendo l'informazione della virgola, come ho scritto nel commento del codice.

Per il discorso iniziale, se in c facciamo ad esempio 3.0/2 (cioè un double fratto un intero) in automatico c utilizzerà per il risultato il dato più limitante, e il risultato sarà 1.

se ad esempio addirittura facessimo double z = x/y, con x un double di valore 3.0 e y un int di valore 2, z assumerebbe come valore 1.0.
__________________
"...the three great virtues of a programmer: laziness, impatience, and hubris." - Larry Wall
The e.Ngineering Xperience
BattleNet - Kaeh#2263 || Diablo3 - Kaeh

Last edited by Kaehell; 12th December 2010 at 16:37.
Kaehell is offline   Reply With Quote
Old 12th December 2010, 16:35   #7
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
Quote:
Originally Posted by Kaehell View Post
in pratica se tu hai un double e un int, e ci fai una somma, il risultato verrà un int.

ad esempio se fai 3 + 4.0 il risultato sarà 7, un intero.

Perchè? Perchè quando fa calcoli, il c utilizza in automatico il tipo di dato più "limitato", quello meno generico.

Ecco quindi che si entra nella teoria dei così detti "cast".

In pratica facendo double x = (double)a; si crea una nuova variabile x, di tipo double, che ha lo stesso valore di a ma convertita da int a double.

Cioè se a vale 3, x varrà 3.0. In questo modo facendo una divisione, una media, o comunque un'operazione che molto probabilmente darà come risultato un valore con la virgola si potrà fare (ad esempio) 3.0/2.0 = 1.5.

Se non usassimo il cast, sarebbe 3/2 = 1, perdendo l'informazione della virgola, come ho scritto nel commento del codice.

Per il discorso iniziale, se in c facciamo ad esempio 3.0/2 (cioè un double fratto un intero) in automatico c utilizzerà per il risultato il dato più limitante, e il risultato sarà 1.

se ad esempio addirittura facessimo double z = x/y, con x un double di valore 3.0 e y un int di valore 2, z assumerebbe come valore 1.0.
ah ok capito.

per il resto la calc che ho messo è corretta?
a cosa dovrebbe servire unistd.h?
__________________
|||||||||| SoundCloud
La mia è una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri is offline   Reply With Quote
Old 12th December 2010, 17:45   #8
Kaehell
l33t school
 
Kaehell's Avatar
 
Join Date: Mar 2008
Location: Zìria
Posts: 14,633
unistd mi sa che l'avevo messo perchè utilizzavo non ricordo cosa, poi l'ho tolta per renderla più semplice e ho dimenticato l'include là per aria capita spesso

per il resto sì, non l'ho compilata ma dovrebbe funzionare senza problemi. Non l'hai provata?
__________________
"...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 12th December 2010, 18:29   #9
nanomad
Dietro le sbarre
 
nanomad's Avatar
 
Join Date: Apr 2005
Location: Papia (olim Ticinum)
Posts: 5,221
Quote:
Originally Posted by CCCComboFapper! View Post
a cosa dovrebbe servire unistd.h?
Ad accedere alle funzioni definite nello standard POSIX.
Le funzioni/macro sono spiegate qui

Così, a naso, direi che lo usava per la sleep()

edit: appena mi libero metto pure questa sul wiki
__________________
Rivuoi i video nel forum? Usa questa estensione (chrome)
Source & firefox version
"(...) the three great virtues of a programmer: laziness, impatience, and hubris." -- LarryWall

Last edited by nanomad; 12th December 2010 at 18:30.
nanomad is offline   Reply With Quote
Old 12th December 2010, 18:54   #10
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
Quote:
Originally Posted by nanomad View Post
Ti sei dimenticato di dire come si scrive il NOT in C (!)

Addendum per i pigri e i fanatici della leggibilità del codice:
Spoiler:

Se all'inizio del nostro codice aggiungiamo
Code:
#include<iso646.h>
Ci è possibile sostituire ! && || rispettivamente con not and or
bravo, corretto quello ed altri refusi (anche grammaticali )
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arësius is offline   Reply With Quote
Old 12th December 2010, 19:00   #11
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
Quote:
Originally Posted by Kaehell View Post
unistd mi sa che l'avevo messo perchè utilizzavo non ricordo cosa, poi l'ho tolta per renderla più semplice e ho dimenticato l'include là per aria capita spesso

per il resto sì, non l'ho compilata ma dovrebbe funzionare senza problemi. Non l'hai provata?
si l'ho provata, ma non si sa mai...

Quote:
Originally Posted by nanomad View Post
Ad accedere alle funzioni definite nello standard POSIX.
Le funzioni/macro sono spiegate qui

Così, a naso, direi che lo usava per la sleep()

edit: appena mi libero metto pure questa sul wiki
grazie per le info. mi chiedevo in particolare a cosa dovesse servire in quel codice lì... ma ho ricevuto la risposta
__________________
|||||||||| SoundCloud
La mia è una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri is offline   Reply With Quote
Old 12th December 2010, 19:09   #12
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
la mia calcolatrice e postata nella lezione 5 , sta lezione mi sembra semplice ..

Cmq vedete di mettere un riferimento a chi ha creato il file tra i commenti che con 2 tab aperti di pastebin non si capisce ..
Cece is offline   Reply With Quote
Old 12th December 2010, 19:14   #13
Arësius
Soft computer
 
Arësius's Avatar
 
Join Date: Feb 2000
Posts: 67,290
sì, è una lezione semplice. per qualcuno addirittura ovvia. però mi è funzionale per introdurre i costrutti di selezione e iterativi (argomento della prox lezione).
__________________
Lode a Bacco, in saecula saeculorum.
Emergent
Arësius is offline   Reply With Quote
Old 12th December 2010, 19:28   #14
Cece
- - - - - - - - - - - -
 
Cece's Avatar
 
Join Date: Apr 2002
Posts: 21,292
Quote:
Originally Posted by CCCComboFapper! View Post
qua la mia calcolatrice:
http://pastebin.com/LmhnU9SN
io non son esperto , ma:
-non mi piace come hai gestito il messaggio di errore della divisione per 0 , da come risultato -1 e noi che guardiamo il codice capiamo il perchè , ma se lo dovesse usare una persona esterna confonderebbe le cose.
- nella divisione usi un intero , quindi 5/2 da 2 ... e non va bene
- nella potenza stesso errore di sopra .. prova a fare 5^3 da 124 .. invece di 125
- nei num negativi c'è un errore , se y e x sono 0 , sono da considerarsi positivi


ho notato che io nella mia non avevo gestito il problema delle radici di numeri negativi

Last edited by Cece; 12th December 2010 at 19:32.
Cece is offline   Reply With Quote
Old 12th December 2010, 20:20   #15
spkbri
PiriPiri ( A molla )
 
spkbri's Avatar
 
Join Date: Feb 2010
Location: Torino - Valenza (AL)
Posts: 10,118
Quote:
Originally Posted by Cece View Post
io non son esperto , ma:
-non mi piace come hai gestito il messaggio di errore della divisione per 0 , da come risultato -1 e noi che guardiamo il codice capiamo il perchè , ma se lo dovesse usare una persona esterna confonderebbe le cose.
- nella divisione usi un intero , quindi 5/2 da 2 ... e non va bene
- nella potenza stesso errore di sopra .. prova a fare 5^3 da 124 .. invece di 125
- nei num negativi c'è un errore , se y e x sono 0 , sono da considerarsi positivi


ho notato che io nella mia non avevo gestito il problema delle radici di numeri negativi
se nella potenza metto double mi da sempre 1 come risultato
la divisione ora mi riconosce se y è 0 ma qualsiasi cosa faccia mi dà sempre 0 come risultato (ora ho messo double, anche se nello schema prefabbricato era int. pensavo andasse bene la divisone intera...)
quello dei numeri negativi... beh, non ci ho pensato: chiamala svista
__________________
|||||||||| SoundCloud
La mia è una logica ferrea e sempre coerente, basta riuscire ad entrare nei suoi meccanismi, poi alla fine la capisci ||||||||- Licher, 2016
spkbri 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 21:30.


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