Fondamenti di programmazione parte 2 Elementi di informatica IGLP
Questo insieme di trasparenze è stato ideato e realizzato dai ricercatori e professori del Dipartimento di Informatica e Sistemistica dell Università di Napoli. Esse possono essere impiegate liberamente per fini didattici esclusivamente senza fini di lucro, a meno di un esplicito consenso scritto degli Autori. Nell uso dovrà essere esplicitamente riportata la fonte e gli Autori. Gli Autori non sono responsabili per eventuali imprecisioni contenute in tali trasparenze né per eventuali problemi, danni o malfunzionamenti derivanti dal loro uso o applicazione
Istruzioni di assegnamento Esistono anche altri operatori che hanno come effetto collaterale l'assegnazione di un valore La maggior parte di essi sono delle utili abbreviazioni Esempi: Pippo += 5; // equivale a Pippo = Pippo + 5; Pippo -= 10; // equivale a Pippo = Pippo - 10; Pippo *= 3; // equivale a Pippo = Pippo * 3; si tratta cioè di operatori derivanti dalla concatenazione dell'operatore di assegnamento con un altro operatore binario
Autoincremento e autodecremento Gli altri operatori che hanno come effetto laterale l'assegnamento sono quelli di autoincremento e autodecremento Esempi Pippo++; // cioè Pippo += 1; ++Pippo; // sempre Pippo += 1; Pippo--; // Pippo -= 1; --Pippo; // Pippo -= 1; Questi due operatori possono essere utilizzati sia in forma prefissa (righe 2 e 4) che in forma postfissa (righe 1 e 3) Il risultato comunque non è proprio identico poiché la forma postfissa restituisce come risultato il valore della variabile e poi incrementa tale valore e lo assegna alla variabile, la forma prefissa invece prima modifica il valore associato alla variabile e poi restituisce tale valore
Esempio
Esercizi Scambio del valore di due variabili Esempio Input: a = 10, b = 20 Output: a = 20, b = 10 Scambio del valore di tre variabili Esempio Input : a = 10, b = 20, c = 30 Output: a = 20, b = 30, c = 10
Il tipo bool bool serve a rappresentare i valori di verità: «true (vero) «false (falso) bool = {true, false} Originariamente il tipo booleano non faceva parte del C++. I valori di verità venivano rappresentati tramite valori interi: 0 (zero) indicava falso e un valore diverso da 0 indicava vero
Il tipo bool Su di esso sono definite le usuali operazioni logiche && per l'and per l'or! per la negazione
Il tipo bool Non bisogna confondere le operazioni logiche (&&,,!...) con le operazioni logiche su bit (rispettivamente &,, ~...) Gli operatori di relazione sono applicabili a tutti gli operandi di tipo ordinato e producono quale risultato un valore di tipo booleano In sostanza, le relazioni definiscono un valore booleano
Il tipo char Il tipo char è utilizzato per rappresentare singoli caratteri e piccoli interi (e quindi su di esso si possono eseguire le usuali operazioni aritmetiche) I caratteri sono rappresentati con il codice ASCII a 8 bit permette di rappresentare 2^8 = 256 caratteri (=cardinalità del tipo) tipo carattere = {A,B,,Z,0,1..,9,/,x,+,-,.} Il tipo può essere considerato ordinato secondo le tradizionali convenzioni dell ordinamento alfabetico, ampliato per considerare anche la presenza delle cifre e dei simboli speciali (+,-,*,/, ) Esempi di costanti char: A, =, a
Il tipo wchar_t wchar_t serve a memorizzare caratteri non rappresentabili con char (ad esempio i caratteri unicode)
Il tipo intero Per rendere finita la cardinalità del tipo intero si fissano due estremi m e M I valori di m e M dipendono dal particolare tipo di compilatore Es.: interi a 16 bit m = -2^15 = - 32768; M = 2^15 1 = 32767; La cardinalità del tipo intero è dunque 65536 Nella maggior parte dei linguaggi esistono differenti tipi interi caratterizzati da un diverso intervallo (m, M): i qualificatori unsigned, short, long impostano tali valori
Il tipo reale Un elaboratore non tratta l insieme di tutti i numeri reali, ma soltanto un sottoinsieme finito di questi, ovvero un sottoinsieme discreto dei numeri reali Un tipo reale concreto è definito da un intervallo (m,m) e da un valore prefissato epsilon che rappresenta l errore di rappresentazione
Il tipo reale Il tipo reale concreto è dunque in grado di fornire valori approssimati dei numeri reali appartenenti all intervallo (m, M) ammettendo un certo un errore L eguaglianza tra due numeri reali va definita entro i limiti di tale errore di approssimazione In quasi tutti i linguaggi di programmazione sono disponibili più tipi reali caratterizzati da differente precisione (float, double, long double) La cardinalità del tipo reale non è definita al livello del linguaggio, in quanto il numero di valori distinti rappresentabili dipende dalla specifica implementazione (m, M, epsilon )
Il tipo reale Ad esempio, in una determinata implementazione float i; I dati di questo tipo (32 bit) sono compresi nell intervallo (3.4x10^-38, 3.4 x10^+38 ) con epsilon = 2^-25 double i; I dati di questo tipo (64 bit) sono compresi nell intervallo (1.7x10^-308, 1.7 x10^+308 ) con epsilon = 2^-54 Le costanti reali possono essere espresse nella notazione decimale o in quella cosiddetta scientifica: 1.0, 138.25, -0.101145E-2 (= -0.10145 10-2)
Overflow ed underflow Gli insiemi di numeri rappresentabili su di un calcolatore hanno cardinalità finita. Il tentativo di rappresentare un numero esterno all intervallo di numeri rappresentabili si dice overflow Nel caso di numeri reali oltre alla limitatezza dell intervallo è presente anche l approssimazione epsilon. Se, a causa dell approssimazione, il numero viene rappresentato da uno 0 pur non essendo nullo, si ha una situazione di underflow
Operatori bit a bit Il C++ può, a differenza da altri linguaggi, operare sulle variabili intere a livello del bit L'operatore binario >> produce lo scorrimento a destra (right-shift) dei bit del left-operand, in quantità pari al right-operand. In pratica esegue una divisione intera (con divisore uguale a una potenza di 2) Es. a >> n equivale a a / 2 n L'operatore binario << produce lo scorrimento a sinistra (left-shift) dei bit del left-operand, in quantità pari al rightoperand. In pratica esegue una moltiplicazione per una potenza di 2 Es. a << n equivale a a * 2 n
Operatori bit a bit Gli operatori binari &,, e ^ eseguono operazioni logiche bit a bit fra i due operandi, e precisamente: & esegue l'and fra i corrispondenti bit dei due operandi esegue l'or inclusivo fra i corrispondenti bit dei due operandi ^ esegue l'or esclusivo (XOR) fra i corrispondenti bit dei due operandi L'operatore unario ~ inverte i bit dell'operando, cioè calcola il suo complemento a uno
Esempio
Esercizi Calcolo del fattoriale di un intero Somma degli elementi di una sequenza terminata dallo 0 Conversione da numero binario a numero decimale