Lezione 3

Finora abbiamo appreso le basi della programmazione, in che modo scrivere una funzione e come iniziare a cercare i bug del codice. Questa volta inizieremo a conoscere i diversi tipi di dati e i modi per memorizzarli e farli girare.

Con la manipolazione diretta si possono fare solo un tot di cose come return 1 + 1; che è il motivo per cui abbiamo le variabili in programmazione. Una variabile è semplicemente un contenitore per conservare l’informazione, e come qualsiasi contenitore reale, può avere diverse forme, dimensioni, e utilizzo. La creazione di una variabile è semplicemente una questione di dichiarazione della sua esistenza, come si vede qui sotto:

#include <stdio.h>

int main(void)
{

// Dichiarazione di una variabile intera di nome a
int a;

// Dichiarazione di due in una volta: b e c
int b, c;

a = 1;
b = 2;
c = 3;

// stampa i valori delle nostre variabili
printf("a is %d, b is %d, and c is %d.\n",a,b,c);

return a + b + c;
}

Le variabili possono essere dichiarate una alla volta, come la nostra variabile a, o più in una volta sola, come b e c. Oltre a dichiarare le variabili per il nostro uso nelle funzioni, molte volte ci arriveremo automaticamente poiché molte funzioni richiedono dati di input per fare il loro lavoro. Queste variabili sono chiamate parametri o argomenti.

I parametri della funzione sono dichiarati sia nella dichiarazione della funzione che nella definizione. Essi sono elencati in una lista separata da virgole. Le funzioni che non richiedono nessun argomento utilizzano la parola void per dirlo.

//Dichiarazione di una funzione con due argomenti.
int SomeFunction(int someNumber, int anotherNumber);

// Definizione di una funzione con due argomenti.
int MultiplyNumbers(int value, int secondValue)
{
return value * secondValue;
}

// Una funzione che non ha bisogno di nessun argomento. Deve essere una davvero tranquilla.
int main(void)
{
return MultiplyNumbers(2,3);
}

Quando chiamiamo una funzione con parametri, come ad esempio MultiplyNumbers() nell’esempio precedente, non elenchiamo il tipo accanto a ciascuna di esse. Il compilatore registra i tipi e ci avverte quando facciamo errori.

Parlando dei tipi, ci sono più tipi di dati in C++ non solo gli interi. Ogni tipo richiede una diversa quantità di spazio nella memoria, misurata in byte. E’ importante ricordarlo perché il numero di byte che occupa una variabile ha un impatto diretto sulla quantità di informazioni che può contenere. Questa differenza è evidente nella gamma di valori che contiene un char paragonato a uno short. Le dimensioni dei tipi variano da piattaforma a piattaforma, ma ecco un elenco abbastanza buono per Haiku su un processore a 32-bit.

Tipo Dimensione (bytes) Gamma Descrizione
char 1 -128 a 127 Lettere – ogni variabile char contiene solo una lettera
unsigned char 1 0 a 255 Lettere – ogni variabile char contiene solo una lettera
short 2 -32768 a 32767 Numeri interi
unsigned short 2 0 a 65535 Numeri interi
int 4 -2147483648 a 2147483647 Numeri interi
unsigned int 4 0 a 4294967295 Numeri interi
long 4 -2147483648 a 2147483647 Numeri interi
long long 8 -9223372036854775808 a 9223372036854775807 Numeri interi
unsigned long long 8 0 a 18446744073709551615 Numeri interi
float 4 3.4E +/- 38 (7 digits) Numeri con una parte frazionaria (floating point)
double 8 1.7E +/- 308 (15 digits) Numeri con una parte frazionaria (floating point)
long double 12 Numeri con una parte frazionaria (floating point)
bool 1 True or false Vero o falso
wchar_t 2 o 4 Come short o int Caratteri “ampi”, che possono gestire caratteri internazionali. Come per il char ogni variabile contiene una lette


Utilizzo di printf()

Vi ricordate la stranezza di printf() vista un po di tempo fa? Diamoci un’altra occhiata.

#include <stdio.h>

int main(void)
{
int a;
int b, c;

a = 1;
b = 2;
c = 3;

printf("a is %d, b is %d, and c is %d.\n",a,b,c);

return a + b + c;
}

printf è una delle poche funzioni che accettano un numero variabile di argomenti, Il suo primo parametro è sempre una stringa. A seconda del numero dei segnaposto nella stringa, però, può o meno avere parametri addizionali che seguono la stringa. Per esempio, nel nostro esempio precedente, la stringa ha tre segnaposto %d, uno per ogni a,b e c. Tre segnaposto, tre parametri “extra”. Ecco alcuni degli altri segnaposto possibili per printf che useremo in seguito. Notate che questo non è un elenco esaustivo per printf – ci sono molte altre opzioni, ma queste per ora sono sufficienti.

Segnaposto Tipo Esempio di output
%c Carattere a
%d,%i Intero decimale con segno 234
%e,%E Notazione scentifica usando e/E 1.7e+5, 1.7E+5
%f Numero in virgola mobile 3.14
%g Numero in doppia precisione 3.14
%o Intero in notazione ottale (base 8) 711
%u Intero senza segno 255
%x, %X Intero in notazione esadecimale (base 16) 0xff, 0xFF
%% Segno percentuale %


Operatori

Gli operatori ci danno la possibilità di lavorare con variabili e numeri senza chiamare funzioni. +, -, e * sono tutti esempi di operatori, ma C++ ne ha molti altri. Ecco gli operatori aritmetici che ci occorrono per ora.

Operatori Operazione Descrizione
a+b addizione somma b ad a
a-b sottrazione sottrae b ad a
a*b moltiplicazione moltiplica a per b
a/b divisione divide a per b

 

Operatori Operazione Descrizione
a%b modulo il resto di a diviso b
a=b assegnazione assegna ad a il valore di b
++a pre-incremento aggiunge 1 ad a prima che il resto dell’espressione sia valutato
a++ post-incremento aggiunge 1 ad a dopo che il resto dell’espressione è stato valutato
–a pre-decremento sottrae 1 da a prima che il resto dell’espressione sia valutato
a– post-decremento sottrae 1 da a dopo che il resto dell’espressione è stato valutato
a += b assegnazione con somma forma abbreviata per a = a + b
a -= b assegnazione con sottrazione forma abbreviata per a = a – b
a *= b assegnazione con moltiplicazione forma abbreviata per a = a * b
a /= b assegnazione con divisione forma abbreviata per a = a / b
a %= b assegnazione con resto forma abbreviata per a = a % b

Gli operatori — e ++ hanno bisogno di un ulteriore spiegazione di quella possibile nella tabella. Diamo un’occhiata al codice per spiegarlo meglio.

#include <stdio.h>

int main(void)
{
int a = 1;
int b = 2;

// I risultato qui è 3 perché aggiungiamo 1 ad a
// Dopo viene calcolato a + b
printf("a++ + b = %d\n",a++ + b);

// Poiché abbiamo aggiunto 1 ad a, questo stampa un 4
printf("a + b = %d\n",a + b);

// Questo è 5 perché il compilatore aggiunge 1 ad a prima di effettuare il calcolo
printf("++a + b = %d\n",++a + b);

return 0;
}

Wow! Abbiamo visto un sacco di cose in questa lezione, ma utilizzandole tutte possiamo fare ogni sorta di cosa. Mettiamolo in pratica.

#include <stdio.h>

// math.h ci dà accesso a un sacco di funzioni matematiche. Lo stiamo
// includendo qui così possiamo accedere a sqrt(), che calcola le
// radici quadrate.
#include <math.h>

double hypotenuse(int a, int b)
{
return sqrt((a*a) + (b*b));
}

int main(void)
{
int a = 3;
int b = 4;

printf("For the triangle with legs %d and %d, the hypotenuse will be %g\n",
a,b,hypotenuse(a,b));

return 0;
}

hypotenuse() restituisce un double perchè vogliamo una precisione al di là dei numeri interi. Questo è anche il tipo che ritorna sqrt().

Caccia al bug

Caccia #1

Codice

int sum(int first, int second, int third)
{
return first + second + third;
}

int main(void)
{
int a = 3;
int b = 4;
printf("The sum is %d\n", sum(a,b,c));
return 0;
}

Errori
foo.cpp: In function ‘int main()’:
foo.cpp:14: error: ‘c’ was not declared in this scope


Caccia #2

Codice

#include <stdio.h>

double distance(int x1, int y1, int x2, int y2)
{
int deltax = x2 - x1;
int deltay = y2 - y1;

return sqrt((deltax * deltax) + (deltay * deltay));
}

int main(void)
{
int x1,y1,x2,y2;

x1 = 3;
y1 = 3;

x2 = 8;
y2 = 3;

printf("The distance between (%d,%d) and (%d,%d) is %g\n", x1,y1, x2,y2,
distance(x1,y1,x2,y2));

return 0;
}

Errori

foo.cpp: In function ‘double distance(int, int, int, int)’:
foo.cpp:8: error: ‘sqrt’ was not declared in this scope

Progetto
Utilizzando l’equazione Interesse = Capitale iniziale * tasso di interesse * unità di tempo, calcolate e stampate l’interesse semplice sostenuto per un capitale iniziale di 20.000 $ ad un tasso del 5% al mese per 24 mesi. Utilizzate una funzione per fare i calcoli dell’interesse attuale.