edutecnica

Linguaggio C++

     

Ogni programma C++ deve possedere una funzione principale,chiamata main(),contenente le istruzioni da eseguire.

int main(){
cout<<”Temp.[C]=”;
cin>>c; cout<<”Temp.[F]=”<<c*9/5+32;
return 0;
}

La parola chiave int davanti a main() indica che il valore ritornato (in questo caso 0) è un intero.

Identificatori

     

Gli identificatori sono nomi che consentono l'individuazione delle entità presenti in un programma C++.

Un identificatore può contenere solo caratteri dell'alfabeto inglese (minuscoli e maiuscoli ), le 10 cifre decimali e il carattere underscore _ .
Non sono consentiti spazi ed altri caratteri. L' identificatore deve iniziare con una lettera o con il carattere underscore.

Il C++ distingue le lettere minuscole da quelle maiuscole (è case sensitive ).
Identificatori con lo stesso nome,ma con il formato di una o più lettere diverso, sono distinti;per esempio: l'identificatore Dato è considerato diverso dall' identificatore dato.

Variabili e costanti simboliche

     

Servono per memorizzare dei valori.
Le variabili consentono la modifica del loro valore durante l'esecuzione del programma, le costanti non lo cosentono .

Variabili

     

Le variabili di un programma devono possedere un nome, un tipo e un valore. Prima di essere utilizzate vanno dichiarate.
Esempi:
int K;
double x =1.2345;

La seconda riga,oltre a dichiarare la variabile x, di tipo double, la inizializza con il valore 1.2345.

Tipi fondamentali

     

I tipi fondamentali sono:
char, per i caratteri;
bool, per le espressioni booleane;
int ,short, long, long long (signed e unsigned), per gli interi;
float,double,long double,per i numeri reali.

Il tipo char

     

Le variabili di tipo char servono a contenere caratteri stampabili (per esempio 'a', 'X', '1', '*') e, solitamente, occupano 1 byte di memoria.
Ogni carattere è rappresentato internamente con un codice numerico. La codifica più usata è quella ASCII.

Il tipo int

     

Il tipo int serve a memorizzare numeri interi compresi in un intervallo che dipende dall'implementazione del compilatore.
In quelle dove un int è rappresentato internamente con 16 bit (2 byte), l'intervallo è:

-32768 ÷ 32767

Con 32 bit (4 byte), invece, i valori memorizzabili sono:

-2147483648 ÷ 2147483647

I tipi short, long e long long

     

Le variabili di tipo short si impiegano quando si desidera memorizzare delle quantità intere nel minore spazio di memoria possibile.
Solitamente occupano 16 bit, e possono pertanto rappresentare numeri interi compresi nell'intervallo:

-32768 ÷ 32767

Una variabile di tipo long, invece, generalmente occupa 32 bit e serve a rappresentare numeri interi più grandi.
Il tipo long long serve a memorizzare grandi quantità d'interi e, di solito, occupa 64 bit

-9223372036854775808 ÷ 9223372036854775807

Il tipo unsigned

     

La parola chiave unsigned, anteposta ai tipi interi fondamentali (int, short, long e long long), specifica che le corrispondenti variabili possono memorizzare solo valori positivi:
Esempi:

Una variabile di tipo unsigned short può memorizzare valori: 0 ÷ 65535 se di tipo unsigned long, invece: 0 ÷ 4294967295 .

Tipi reali: float, double e long double

     

Le variabili di tipo reale possono contenere valori appartenenti a un sottoinsieme dei numeri reali.
A seconda della precisione desiderata, è possibile scegliere tra i seguenti tipi:
float 6-7 cifre
double 15-16 cifre
long double 18-19 cifre

Costanti letterali

     

I valori costanti impiegati in un programma sono spesso chiamati letterali (o costanti senza nome). Possono essere di tipi:
costanti carattere (singoli caratteri);
costanti stringa (sequenze di caratteri);
costanti booleane;
costanti numeriche intere;
costanti numeriche reali .

Costanti carattere

     

Vengono rappresentate racchiudendo fra apici il corrispondente carattere esempi: '*', '3' .
L'ultima costante rappresenta il carattere stampabile 3 e non il valore decimale 3.
I caratteri non stampabili (caratteri di controllo) possono essere rappresentati da combinazioni speciali dette sequenze di escape.
Una sequenza di escape inizia con una barra rovesciata (backslash, \) anche chiamata slash retroverso.

Sequenze di escape

     


Nome Abbreviazioni Sequenza di escape
Nuova riga NL(LF + CR) \n
Tabulazione orizzontale HT \t
Tabulazione verticale VT \v
Spazio indietro BS \b
Ritorno carrello CR \r
Avanzamento modulo FF \f
Segnale acustico BEL \a
Barra rovesciata \ \\
Apice ' \'
Virgolette " \"

Costanti stringa

     

Una costante stringa è costituita da una sequenza di caratteri racchiusa tra una coppia di virgolette (" ").
Esempio:    "Spazio di frenata: "

In una costante stringa possono essere presenti anche delle sequenze di escape.
Esempio : "\aCalcolo spazio di frenata\n"

Due costanti stringhe separate da "spazi bianchi" equivalgono a una sola costante stringa.

Esempio:

"\aCalcolo spazio"
"di frenata\n"

equivale alla costante stringa dell'esempio precedente.

Spazi bianchi

     

Sono caratteri che si chiamano così perché hanno lo stesso scopo degli spazi bianchi dei testi su carta stampata, ovvero servono a separare gli elementi e le righe di un programma.

Esempi:
spazi;
tabulazioni;
caratteri di ritorno a capo.

Costanti booleane

     

Esistono solo due costanti di questo tipo: true e false; possono essere impiegate per assegnare dei valori a variabili di tipo bool.

Esempio: bool oK=false;

Costanti numeriche intere

     

Le costanti numeriche intere sono rappresentate da una sequenza di cifre, che vengono interpretate.
in base ottale se iniziano con zero;
in base esadecimale se iniziano con 0x (oppure 0X);
in base decimale negli altri casi (default) .

Esempi:
1234 costante ottale
0x12ABF costante esadecimale
658973 costante decimale

La rappresentazione interna di una costante numerica intera dipende dal suo valore. Il compilatore utilizzerà automaticamente il tipo più adatto .
E' possibile definire una costante di tipo long facendo seguire dalla lettera L.
Se seguita da LL è interpretata come long long.
12345678L //long
1234567812345678LL //long long

Costanti numeriche reali

     

Una costante numerica reale (in virgola mobile) viene rappresentata facendo uso del punto decimale e della lettera e (oppure E) per separare la parte in virgola fissa dall'esponente.
Esempio: 12.3456e2 equivale a 1234.56
Le costanti numeriche reali sono memorizzate come double, ma è possibile modificare questo comportamento predefinito facendo seguire le cifre numeriche dal suffisso F o da suffisso L.
Nel primo caso la costante sarà memorizzata come float nel secondo come un long double.

Costanti simboliche

     

Per rendere più leggibile un programma, nelle espressioni è possibile sostituire le costanti letterali (o senza nome) con nomi simbolici. L'associazione nome-valore avviene con una sintassi molto simile a quella impiegata per dichiarare le variabili:

const tipo identificatore = exp;

La parola chiave const non permette che il valore di identificatore possa essere modificato da altre istruzioni del programma. exp può essere un valore oppure un'espressione il cui valore deve poter essere calcolato in fase di compilazione.
Dopo questa dichiarazione , identificatore può essere impiegato ovunque sia possibile usare il letterale corrispondente.
Esempio:
#include<iostream>
using namespace std;
main(){
  const double pi =3.1415;
  const double _2pi= 2 * pi;
  float r=1,c;
  c= _2pi * r;
  cout<<c;
}

Espressioni operandi e operatori

     

Le espressioni sono combinazioni di operandi e operatori. Gli operandi sono i valori che intervengono nel calcolo e possono essere rappresentati da nomi di variabili e costanti. Gli operatori sono caratteri e loro combinazioni che servono a indicare quale tipo di calcolo va eseguito.
+ · - · * · / · % · ^ · & · | · ~ ·
! · = · < · > · += · - = · * = · /= · %=·
^=· &=·|=·<<·>>·>>=·<<=·==·!=·<=·>=·&&·||·++·--·,·->*·->·.*·::·()·[]·?:

Priorità degli operatori

     

Ogni operatore è caratterizzato dalle seguenti priorità :
numero di operandi ( o parità);
posizione rispetto ai suoi operandi.
Un operatore si dice :
prefisso se precede gli argomenti;
suffisso se segue gli argomenti;
infisso se sta fra gli argomenti;

Precedenza (o priorità) nell'ordine di esecuzione delle operazioni.
Per esempio, l'espressione 65+37/5 viene calcolato come 65+(37/5) e non come (65+37)/5;
Associatività,ovvero l'ordine in cui vengono eseguiti i calcoli nel caso di operatori con la stessa priorità.
Gli operatori possono essere associativi a destra o a sinistra .

Operatori aritmetici

     


Operatore Significato
+ Addizione
- Sottrazione
* Moltiplicazione
/ Divisioni

Se gli operandi sono entrambi interi il risultato della divisione sarà intero e gli eventuali decimali saranno eliminati (troncamento).
Tra gli operatori aritmetici è compreso anche l'operatore resto% che calcola il resto della divisione tra due operandi interi.

Assegnazione composta Equivale a
A+=b A=a+b
A /= 3 A=A/3
A%=B A=A%B
A>>=3 A=A>>3
A |=B A=A |B

 

Operatori di incremento e decremento unitario

     

Sono operatori che hanno un solo operando. L'operatore di incremento aumenta di un'unità il valore del suo operando. È rappresentato da due segni + ravvicinati(++). L'operatore di decremento, indicato con due segni- consecutivi (--), diminuisce di un'unità il valore del suo operando.
La valutazione dell'espressione dove appaiono cambia in funzione della loro posizione rispetto all'operando: se lo precedono si parla di operatori prefissi, se lo seguono di operatori suffissi ( o postfissi).

Operazione Significato
i++ Incrementa i di 1. Il valore dell’espressione è quello di i prima dell’incremento.
++i Incrementa i di 1. Il valore dell’espressione è quello di i dopo l’incremento.
i-- Decrementa i di 1. Il valore dell’espressione quello di i prima del decremento
--i Decrementa i di 1. Il valore dell’espressione è quello di i dopo il decremento

Operatori sui bit

     


Operatore Esempio Significato
>> k>>n Shift a destra di n posizioni
<< K<<n Shift a sinistra di n posizioni
& A&B AND bit a bit tra a b
| A|B OR bit a bit tra a e b
^ A^B EXOR bit a bit tra a e b
~ ~a NOT, complemento di a bit a bit

 

Si suppongano a e b due interi unsigned di 8 bit

a 00001011
b 00001110

allora
a>>2   0000001011
a<<2 0000101100
a & b  00001010
a | b  00001111
a ^ b  00000101
~a     11110100

Operatori di assegnazione

     

Sintassi :    exp1=exp2

exp1 deve riferirsi ad una locazione di memoria modificabile, exp2 è il valore che sarà scritto in quella locazione.

int i;
i=1;

Il valore dell'espressione dopo l'assegnazione è quello di exp2.
Poiché l'operatore = è associativo a destra, exp2 può essere a sua volta un'espressione di assegnazione.

int i, j, k;
i=(j=(k=100));

Le parentesi non sono necessarie, ma possono servire a chiarire l'ordine delle operazioni.

Operatori di assegnazione composti

     

Sono operatori costituiti da un operatore aritmetico oppure bit a bit e da un operatore di assegnazione.

Assegnazione composta Equivale a
a += b a = a + b
a /= 3; a = a / 3
a %= b a = a % b
a >>= 3 a = a>> 3
a |= b a = a | b

Tra i due simboli che costituiscono un operatore di assegnazione composto non deve esserci alcuno "spazio bianco".

Operatore sizeof

     

E' valutato in fase di compilazione e restituisce un intero che rappresenta la dimensione in byte, del suo operando. Si può applicare a variabili, costanti e tipi.

Esempi:

sizeof i ;
sizeof "Il Linguaggio C++";
sizeof (double) ;

Le parentesi sono obbligatorie solo se sizeof è applicato a un tipo.

Conversioni di tipo

     

Se in un'espressione si usano operandi di tipo diverso, come per esempio:

int d= 10;
double pi = 3.14159, c;
c = d * pi;

è sempre necessaria una conversione di tipo, che può essere implicita o esplicita.

Conversioni implicite

     

Vengono realizzate in fase di compilazione. Gli operandi numerici sono convertiti nel tipo dell'operando di dimensione maggiore. Per esempio, nella moltiplicazione:

10 * 3.14159

Il numero 10 (int) è implicitamente convertito in 10.0, ovvero nel tipo dell'operando di dimensione maggiore, 3.14159 (double). Solo a quel punto viene effettuata la moltiplicazione. L'operazione di assegnazione costituisce un'eccezione a questa regola. Il tipo dell'operando di sinistra:

int k;
k = 3.14159

Dopo l'operazione di assegnazione nella variabile k (int) si troverà il valore 3.

Conversioni esplicite (casting)

     

int IVA=20;
double p=156.32, totale;
totale=p*(1+IVA/100);

L'espressione IVA/100 darà come risultato 0 perché entrambi gli operandi sono interi.
Il problema si risolve richiedendo la conversione esplicita (casting) di uno dei due operandi in double.

totale=p*(1+(double)IVA/100);

Adesso il valore del secondo operando è 100.0, pertanto IVA sarà semplicemente convertito in double e il risultato della divisione sarà coretto.
Una sintassi alternativa è la seguente :

tot = p*(1+double(IVA)/100);

Stream

     

Uno stream (flusso) è un canale virtuale mediante il quale un programma comunica con l'esterno. Può essere pensato come una struttura logica costituita da una sequenza di caratteri che fluiscono da una periferica di input verso il programma (stream d'ingresso) oppure dal programma verso una periferica di output (stream d'uscita). Per funzionare ogni stream deve essere associato alla corrispondente periferica fisica (tastiera, video, stampante ecc.). In C++ esistono degli stream standard, ovvero già associati alle corrispondenti periferiche fisiche:

cin (ingresso: tastiera);
cout (uscita: video);
cerr (errore: video);
clog (errore: video).

Per utilizzare questi stream occorre impiegare oggetti e funzioni presenti in un'apposita libreria di ingresso/uscita. A questo fine, nel programma sorgente bisogna inserire la direttiva:

#include <iostream>

Stream di ingresso

     

Lo stream di ingresso standard, cin , è quello da cui il programma legge i dati, ed è tipicamente associato alla tastiera. Per prelevare i dati si usa la seguente sintassi:

cin >> variabile;

L'operatore di estrazione >> preleva dallo stream i caratteri battuti sulla tastiera prima di invio e li converte nel tipo di variabile. Da uno stream di ingresso è possibile leggere anche piu di un dato :

cin >>i>>d>>c;

se i,d e c sono tre variabili, rispettivamente di tipo int, double e char e sulla tastiera si batte la sequenza di caratteri 123 456.78 k, al termine di questa istruzione i, d e c conterranno rispettivamente i valori: 123, 456.78 e 'k'.

Stream di uscita

     

Lo stream di uscita standard, cout, è quello su cui il programma scrive i dati, ed è tipicamente associato allo schermo. Per scrivere dati si usa la seguente sintassi:

cout << espressione;

L'operatore di inserzione << converte il valore di espressione in una sequenza di caratteri che viene inviata sullo schermo. espressione è un insieme di operandi e operatori, o più semplicemente una variabile o una costante.
Mediante lo stream cout è possibile inviare allo schermo anche più lavori contemporaneamente :

cout<< "Valore:" <<x<<endl;

In questo caso saranno visualizzati la stringa costante e il valore della variabile x. Il manipolatore endl produce sullo schermo gli stessi effetti della sequenza di escape '\n', ovvero un ritorno a capo

Commenti

     

I commenti servono a documentare un programma sorgente e sono considerati come "spazi bianchi" dal compilatore. I caratteri che costituiscono un commento possono essere racchiusi fra le coppie di caratteri /* e */ o tra la coppia // e la fine della riga.

Esempi:

/* Questo commento può occupare più righe */
// Questo commento solo una