Ultima modifica:
LEGGI QUESTO PRIMA DI CONTINUARE
Se non hai già letto le avvertenze/istruzioni presenti nella LEZIONE 1 ti invito a leggerle (puoi farlo da questo link: Lezione 1 ) , ho evitato di fare copia e incolla delle varie avvertenze/istruzioni poiché mi sembrava inutile aggiungere a ogni post tutto quel testo.
FILE ZIP DEL CORSO :
Vedi: https://drive.google.com/file/d/1sPuNna2S3b0sqmFHK448j4vKg1MVUlSM/view?usp=sharing
NOTA PER I LETTORI: Mi spiace per ever pubblicato questa lezione un pò in ritardo però alla fine eccola qui, vi anticipo che la quantità di informazioni è parecchio grossa, e di conseguenza non escludo possibili errori e/o imprecisioni, ovviamente sarà mia premura rivedere e aggiornare questa lezione nei prossimi giorni: aggiungendo eventuali informazioni e ascoltando come sempre i consigli degli utenti più esperti che già si sono rivelati di grande aiuto nel segnalare errori e imprecisioni nelle altre lezioni. Alcune cose dovete prenderle così come sono (come la "printf") ma non dovete preoccuparvi perché nella prossima lezione spiegherò tutto, per il momento è importante che voi capiate la teoria e poi passeremo alla pratica vera e propria. In questa lezione non evidenzierò in verde le parole chiave perché ci vorrebbe troppo tempo (ovviamente i PDF e i file su obsidian sono evidenziati), però non escludo di evidenziare poco alla volta la lezione nei prossimi giorni.
1- Data types
Un data type è un attributo che viene applicato ai dati che permette al programmatore e al computer di capire in che modo essi vanno interpretati.
In C abbiamo due tipi di data types:
- Object types(che rappresentano i dati)
- Basic types (tipi di dato base).
- Derived types (tipi creati a partire dai Basic types, appunto dei derivati).
- Basic types (tipi di dato base).
- Function types (per le funzioni).
2 - Variabili
Una variabile è uno spazio di memoria (memoria RAM), che può contenere un valore di un certo tipo (data-type) , e a cui possiamo assegnare un nome identificativo, il nome della variabile non potrà essere cambiato, mentre il valore contenuto dalla variabile si , mantenendo però costante il tipo.
2.1 - Il nome di una variabile
Il nome di una variable ("identificatore") per essere assegnato ad una variabile deve rispettare una serie di regole:
- Un identificatore può essere formato da:
- lettere maiuscole
- lettere minuscole
- numeri da 0 a 9
- simbolo _ (underscore)
- lettere maiuscole
- Un identificatore non può avere come primo carattere del nome un numero.
- Non può avere come nome una keyword (parola chiave) predefinita del linguaggio.
- Il C è case-sensitive (una parola scritta con lettere maiuscole è diversa da una con lettere minuscole, es: "Casa" e "casa" sono considerate parole diverse).
2.2 - Dichiarazione di una variabile
Quando vogliamo usare una variabile dobbiamo prima dichiararla, per dichiarare una variabile si fa così:
C:
data-type identificatore;
//esempio:
int nome_variabile;
dove:
Codice:
data-type -> int (valore numerico intero)
identificatore -> nome_variabile
possiamo anche dichiarare più variabili in una singola istruzione:
C:
int var1,var2,var3;
/*
In questo caso abbiamo dichiarato 3 variabili:
- var1
- var2
- var3
*/
quando dichiariamo una variabile, chiediamo al compilatore di riservare ad essa uno spazio di memoria più o meno grande in base al tipo di essa.
2.3 - Inizializzazione delle variabili
Oltre a poter dichiarare le variabili possiamo richiedere al compilatore anche di assegnare loro un valore, quindi di "allocare" nella memoria riservata (assegnata alla variabile durante la sua dichiarazione) tale valore.
Dizionario:
Allocare
Destinare, assegnare, stanziare: delle risorse, decidere di farne un certo uso.
- In informatica, riservare una parte della memoria principale al calcolo di una variabile per mezzo del sistema operativo.
Questa azione è detta inizializzazione della variabile.
Possiamo inizializzare una variabile in più modi:
- Inizializziamo e dichiariamo con un'unica istruzione:
C:
data_type nome_variabile = valore;
//esempio:
int var1 = 10;
- Inizializziamo la variabile dopo la dichiarazione:
C:
variabile = valore;
//esempio
var1 = 10;
- Inizializziamo più variabili in una sola istruzione:
Codice:
variabile1 = valore1, variabile2 = valore2, variabile3 = valore3;
//esempio
var1 = 10,var2 = 20, var3 = 30;
- Inizializziamo e dichiariamo con un'unica istruzione più variabili:
C:
int variabile1 = valore1, variabile2 = valore2, variabile3 = valore3;
//esempio
int var1 = 10,var2 = 20, var3 = 30;
Per spiegare cosa accade durante l'inizializzazione di una variabile facciamo un esempio:
- vogliamo dichiarare una variabile di tipo int e la chiamiamo "my_var", poi assegniamo alla variabile "my_var" il valore 120.
- Al momento della dichiarazione il compilatore riserverà uno spazio di memoria abbastanza grande da contenere un dato di tipo int (4 byte/32 bit) e assegnerà a questa area di memoria il nome my_var.
- Quando inizializziamo la variabile assegnandogli il valore 120 ,verrà allocato nello spazio di memoria corrispondente alla variabile my_var la codifica binaria di 120.
Possiamo assegnare ad una variabile anche il risultato di un'operazione aritmetica o il "valore di ritorno di una funzione" (di cui parleremo in seguito).
C:
int a = 120 + 10;
int b = funzione();
2.4 - Variabili costanti
Quando dichiariamo una variabile e assegniamo ad essa un valore, possiamo cambiare il valore contenuto nella variabile in un secondo momento tramite un'altra assegnazione:
C:
//Dichiarazione e inizializzazione della variabile:
int a = 10;
//Assegnamento di un nuovo valore alla variabile:
a = 20;
Se questo è vero per una variabile, non è invece lo stesso quando si parla di costanti. Una costante si dichiara proprio come una variabile, anteponendo però la parola chiave "const" davanti al data-type della costante:
C:
//dichiarazione variabile normale:
data-type nome_variabile;
//dichiarazione costante:
const data-type nome_variabile;
come possiamo vedere a livello di dichiarazione la sintassi è quasi identica ad una classica dichiarazione, si aggiunge solamente la parola chiave const.
- Una volta dichiarata e inizializzata una costante non è possibile cambiare il valore assegnatogli.
C:
//Proviamo a modificare il valore della costante dopo la sua inizializzazione:
const int costante = 20;
costante = 30; //ERRORE DI COMPILAZIONE
- Dichiarazione e inizializzazione devono avvenire nella stessa istruzione:
C:
//Metodo corretto
const int costante1 = 20;
//Metodo errato :
const int costante; //ERRORE DI COMPILAZIONE
constante = 20; //ERRORE DI COMPILAZIONE
Accade qualcosa di simile a quello che accade durante la dichiarazione e inizializzazione di una variabile classica, tuttavia in questo caso l'area di memoria che ospiterà la nostra costante sarà read-only cioè non saranno permesse operazioni di scrittura su di essa, ma solo di lettura.
3 - Int
Iniziamo a conoscere i primi data-types di tipo basic types, e iniziamo vedendo il data-type int. Il tipo int serve a dichiarare variabili che possono contenere valori numerici interi (quindi non sono ammessi numeri con la virgola).
Tali valori numerici potranno essere positivi o negativi. Il tipo int può essere anche usato come "signed int" anche se non cambia nulla (il "signed" sta ad indicare che i valori sono con segno), di solito si usa int in quanto è uguale a signed int.
C:
//Dichiarazione variabile con data-type int:
int variabile;
signed int variabile; //il significato è lo stesso
La quantità di memoria per una variabile di tipo int è generalmente di:
- 64 bit (8 byte)
- 32 bit (4 byte) <-- su GCC 64 bit è generalmente questa
- 16 bit (2 byte)
- Eventuali istruzioni date al compilatore (che per il momento non vedremo)
- Versione e tipo del compilatore
- Tipo di hardware del computer
- Sistema operativo in uso
Il motivo per cui ci interessa la grandezza della memoria assegnata alla variabile è che al variare di essa cambia anche il numero massimo che essa può contenere (ti ricordo che un numero salvato in una variabile è convertito in binario usando la tecnica del complemento a 2).
3.1 - Modificatori di int:
3.1.1 - Unsigned int
Come abbiamo detto il tipo int può accettare valori sia positivi che negativi, tuttavia ciò limita il numero di valori rappresentabili infatti per rappresentare i valori positivi e negativi si usa la tecnica del complemento a 2 , questa limitazione è però superflua quando abbiamo la certezza che non utilizzeremo numeri negativi.
In questi casi ci viene in aiuto il tipo "unsigned int" che altro non è che un int che però accetta solo valori positivi. Non utilizzando valori negativi abbiamo il massimo dello spazio utilizzabile.
C:
unsigned int variabile;
3.1.2 - Short int
Se sappiamo che NON utilizzeremo valori troppo grandi allora è possibile usare una variabile con meno bit a disposizione in modo da risparmiare memoria, per farlo ci basta dichiarare la variabile con il tipo "short int".
C:
short int variabile;
è possibile anche omettere la parola "int" e scrivere solamente "short" il significato sarà lo stesso.
C:
short variabile; //equivalente a short int
3.1.3 - Unsigned short int
Anche per il tipo "short int" esiste una variante che ammette solo valori positivi, questa variante dello short int è utilizzabile inserendo la parola chiave "unsigned" davanti al tipo della variabile:
Codice:
unsigned short int variabile;
//oppure
unsigned short variabile;
3.1.4 - Long int:
Se sappiamo che utilizzeremo valori troppo grandi per un normale int allora è possibile usare una variabile con più bit a disposizione, per farlo ci basta dichiarare la variabile con il tipo "long int".
C:
long int variabile;
//oppure
long variabile; //equivalente a short int
Una "long int" ha generalmente il doppio dei bit di una int a disposizione.
3.1.5 - Unsigned long int:
Anche per il tipo long int esiste una variante che ammette solo valori positivi, questa variante del long int è utilizzabile inserendo la parola chiave "unsigned" davanti al tipo della variabile:
C:
unsigned long int variabile;
//oppure
unsigned long variabile;
3.1.6 - Long long int:
Se sappiamo che utilizzeremo valori troppo grandi anche per un long int allora è possibile usare una variabile con ancora più bit a disposizione, per farlo ci basta dichiarare la variabile con il tipo long long int.
C:
long long int variabile;
è possibile anche omettere la parola "int" e scrivere solamente "long long" il significato sarà lo stesso.
C:
long long variabile; //equivalente a long long int
LINK:
3.1.7 - Unsigned long long int:
Anche per il tipo long long int esiste una variante che ammette solo valori positivi, questa variante del long long int è utilizzabile inserendo la parola chiave "unsigned" davanti al tipo della variabile:
Codice:
unsigned long long int variabile;
//oppure
unsigned long long variabile;
3.2 - Literal interi
Per "literal interi" ci riferiamo ai "valori letterali" che possiamo utilizzare per rappresentare i nostri dati di tipo int.
Volendo possiamo salvare un numero in una variabile anche senza usare per forza il sistema di numerazione decimale.
Possiamo usare i seguenti tipi di literal:
- Decimali:
- Cifre da 0 a 9 .
- Ottali:
- Cifre da 0 a 7 .
- Lo 0 deve essere messo all'inizio del numero.
- Cifre da 0 a 7 .
- Esadecimali:
- Cifre da 0 a 9 e caratteri da A a F
- Lo 0 e la "X" (nella forma "0x... ") devono essere messi all'inizio del numero (la "X" e le lettere che compongono il numero possono essere maiuscole o minuscole).
- Cifre da 0 a 9 e caratteri da A a F
- Binari:
- Cifre da 0 a 1 .
- Lo 0 e la "B" (nella forma "0b... ") devono essere messi all'inizio del numero (la "B" può essere maiuscola o minuscola).
- Cifre da 0 a 1 .
CODICE:
C:
int decimale = 123;
int ottale = 0173;
int esadecimale = 0x7b; //oppure 0X7B o anche 0X7b ecc...
int binario = 0b1111011 //oppure 0B1111011
3.2.1 - Literal interi espliciti
Possiamo aggiungere ai literal anche dei caratteri che specificano il tipo di valore che essi rappresentano (unsigned,long,long long ecc...) essi prendono il nome di "literal interi espliciti":
C:
unsigned int variabile = 150;
unsigned int variabile = 150u;
//sono la stessa cosa.
4 - Float
I data-type floating point (virgola mobile) usano la parola chiave float, i numeri con la virgola vengono rappresentati dal calcolatore con una | tecnica che si chiama "floating point (virgola mobile)" secondo lo standard IEE754, per dichiarare una variabile di tipo float si fa così:
C:
float variabile;
4.1 - Modificatori di float:
In questo caso i tipi alternativi al float non servono a contenere valori più grandi (sebbene occupino comunque più memoria del classico float) ma servono per contenere numeri con la virgola più precisi, cioè con più cifre dopo la virgola, quindi meno approssimati.
4.1.1 Double
Memoria usata: 8 byte
Il tipo double come si può intuire dal nome per rappresentare i numeri con la virgola , fornisce il doppio delle cifre dopo la virgola di un normale float, in questo modo il numero sarà il doppio più preciso:
4.1.2 Long double
Memoria usata: variabile (di solito è 12 byte ma può anche essere 10 o 16) nel mio caso è 16 byte.
Il tipo long double per rappresentare i numeri con la virgola fornisce molte più cifre (anche del double) dopo la virgola di un normale float, in questo modo il numero sarà il ancora più preciso:
CODICE:
C:
float int variabile;
double varibile;
long double variabile;
4.2 - Floating-point literal
Per "floating-point literal" ci riferiamo ai valori letterali che possiamo utilizzare per rappresentare i nostri dati di tipo floating-point.
Quando vogliamo indicare un numero usando i floating-point literal dobbiamo scrivere il numero nella seguente forma :
possiamo anche usare una forma alternativa chiamata "e-notation", essa consiste nello scrivere i numeri nella seguente forma:
4.3 - Floating-point literal espliciti
Possiamo aggiungere ai floating-point literal anche dei caratteri che specificano il tipo di valore che essi rappresentano (float,double,long double) essi prendono il nome di floating-point literal espliciti.
C:
float variabile;
variabile = 15.10f //la f finale può essere maiuscola o minuscola
Si può fare una cosa simile anche per i long double:
C:
long double variabile;
variabile = 15.10l //la l finale può essere maiuscola o minuscola.
5 - Char
Il tipo char è molto particolare, infatti questo data type è usato per i caratteri, tuttavia una variabile di tipo char è grande 1 solo bit e contiene valori di tipo numerico intero con segno, questo perché i valori che saranno contenuti in una variabile char sono codificati usando lo standard ASCII che permette di codificare dei caratteri in valori numerici.
Tramite l'uso dello standard ASCII è possibile anche memorizzare "caratteri non stampabili" come ad esempio la tabulazione o lo spazio.
5.1 - Char type literal
Per "char type literal" ci riferiamo ai valori letterali che possiamo utilizzare per rappresentare i nostri dati di tipo char, per rappresentare un dato di tipo char si usa la seguente notazione:
come possiamo vedere basta usare i singoli apici e inserire tra di essi il carattere.
C:
char variabile = 'a';
//oppure
char variabile = '1';
//(inteso come carattere stampabile e non come valore numerico)
//oppure
char variabile = '/n';
//si può anche assegnare un numero (ti ricordo che il char è praticamente un int con meno memoria)
char variabile = 120;
5.2 - Inizializzazione di una variabile char
Una variabile di tipo char può essere inizializzata nei seguenti modi:
C:
//Metodo classico
char variabile = 'X';
//Assegnazione di intero
char variabile = 15;
Il compilatore in questo caso non dovrebbe dare problemi, infatti possiamo usare la variabile char come un una variabile per interi (int) che però può contenere valori molto piccoli (infatti ha solo 1 byte di memoria).
5.3 - Modificatori di char
5.3.1 - Unsigned char
Come abbiamo detto il tipo char può accettare valori sia positivi che negativi, tuttavia ciò limita il numero di valori rappresentabili (ne abbiamo parlato anche per gli unsigned int).
In questi casi ci viene in aiuto il tipo unsigned char che altro non è che un char che però accetta solo valori numerici positivi (unsigned int più piccolo) e caratteri (che alla fine sono comunque numeri).
Non utilizzando valori negativi abbiamo il massimo dello spazio utilizzabile.
6 - tipo Boolean
Il tipo boolean si usa tutte quelle volte in cui dobbiamo rappresentare delle condizioni che hanno solo due stati.
Infatti il tipo boolean può assumere solo due valori:
- 1 (true -> Vero)
- 0 (false -> Falso).
C:
_Bool variabile;
HO RAGGIUNTO IL LIMITE MASSIMO DI FILE CHE POSSO ALLEGARE
FARÒ UN ALTRO POST CON IL CONTINUO
Messaggio unito automaticamente:
Ho un pò esagerato , comunque ho pubblicato il continuo.