• Non ci sono risultati.

unità centrale operazioni di controllo del flusso *** valori: Z R B Ch Ø Ø Ø Ø tipi C++: int double bool char float + insieme di operatori

N/A
N/A
Protected

Academic year: 2022

Condividi "unità centrale operazioni di controllo del flusso *** valori: Z R B Ch Ø Ø Ø Ø tipi C++: int double bool char float + insieme di operatori"

Copied!
15
0
0

Testo completo

(1)

unità centrale

• operazioni elementari:

- lettura/scrittura * - aritmetico-logiche **

- modifica memoria **

• operazioni di controllo del flusso ***

(* lucidi precedenti, ** questi lucidi, *** in seguito)

valori: Z R B Ch

Ø Ø Ø Ø

tipi C++: int double bool char float

tipo di dato = insieme di valori +

insieme di operatori

(2)

int:

insieme di valori Z = { … , -2, -1, 0, 1, 2, …}

operatori + : Z x Z Æ Z (somma) - : Z x Z Æ Z (sottrazione)

* : Z x Z Æ Z (prodotto)

/ : Z x Z Æ Z (divisione intera)

% : Z x Z Æ Z (resto)

++ : Z Æ Z (incremento di 1) -- : Z Æ Z (decremento di 1)

5/-2 Æ -2 10/3 Æ 3 -5/2 Æ -2 5%-2 Æ 1 12%5 Æ 2 -5%2 Æ -1 esempio: quante ore e minuti in 375 minuti?

375/60 Æ 6 (ore) 375%60 Æ 15 (minuti)

++ e -- si applicano solo a variabili : (++5 Æ errore)

int i, j;

i -7 ++i Æ i - 6

j 6 --j Æ j 5

(3)

double (oppure float ):

insieme di valori R

operatori + : R x R Æ R (somma)

- : R x R Æ R (sottrazione)

* : R x R Æ R (prodotto) / : R x R Æ R (divisione) 5.0/2.0 Æ 2.5 5.0/3.0 Æ 1.66…67

(approssimazione! quante cifre?

dipende dalla macchina …)

char :

insieme di valori Ch = { 'a', 'b', 'c', …}

operatori : nessuno …

(4)

bool :

insieme di valori B

operatori && : B x B Æ B (and,

congiunzione logica)

|| : B x B Æ B (or,

disgiunzione logica) ! : B Æ B (not,

negazione logica)

bool a, b ;

a b a&&b a b a||b

V V V V V V

V V F V F V

F V F F V V

F F F F F F

a !a

V F

F V

(5)

operatori di relazione :

uguaglianza ==

differenza !=

minore <

minore-uguale <=

maggiore >

maggiore-uguale >=

: T x T Æ B

dove T sta per : Z, R, Ch, B

=================================

espressione Æ combinazione di :

operatori operandi chiamate di funzione

Ø Ø Ø

di relazione, valori espliciti non ancora viste associati a nomi di variabili

tipi di dato nomi di costanti

una espressione ha:

• un valore

• un tipo (Œ int, double, char, bool)

(6)

esempio:

double x, y ; int i, j ;

char c ;

x 5.34

y 2.0

i 2

j 12

c 'A'

valore tipo

Ø Ø

x/y+3.0 5.67 double

i+j*(i+j) 170 int

i+j*i+j 38 int

regole di precedenza: usuali

% * / precedono + -

i*j+i/2 equivale a (i*j)+(i/2)

(7)

si possono anche usare operandi di tipo diverso nella stessa espressione

double x, y ; int i, j ;

char c ; x/i+3

i*j-3.14 'A'+j/i c+j*y

il tipo di queste espressioni è quello “più alto” tra i tipi degli operandi presenti

meno più

bool, char Æ int Æ double

ha senso sommare caratteri e numeri?

la macchina C++ lo fa …

(8)

comando di assegnamento (lettura/scrittura:

inizializzano/rendono noto il valore di variabili) come modificare il valore di una variabile?

sintassi nomevar = espressione ; fl

nomevar ¨valore(espress.)

A valA A valB+valC

B valB A = B+C; Æ B valB

C valC C valC

(9)

nota: il tipo di una espressione viene convertito nel tipo della variabile destinazione prima di fare l’assegnamento

double x, y ; int i, j ;

char c ;

i = 25; nessuna conversione

x = 0.5; " "

c = 'b'; " "

x = 4; conversione in 4.0

i = 3.2; conversione in 3 (perdita di informazione)

x = 11/5; ? x = 11.0/5; ?

(10)

conversione di tipo esplicita : operazione di

“casting”

sintassi:

static_cast<nometipo>(espressione)

vecchia sintassi: nometipo (espressione)

Ø

int, bool, …

(converte la rappresentazione di espressione nella rappresentazione del tipo nometipo)

double x ; int i, j ; i = 1;

j = 3;

x = (i+j)/j; ?

x = static_cast<double>(i+j)/j; ?

x = static_cast<double>((i+j)/(j)); ?

x = 3.7;

i = static_cast<int>(x);

i = static_cast<int>(x+0.5);

(11)

errori comuni:

double x, y ; int i, j ;

char c ;

x = x%y; errori sintattici (rilevati dal c = F; compilatore)

i = 5; errore “run time” (segnalato j = 0; dalla macchina durante

x = i/j; l’esecuzione)

x = x*y+1; errore semantico, se si voleva calcolare x(y+1) x = i/j; errore semantico, se si

voleva un risultato reale

gli errori semantici non vengono segnalati !!!

(12)

funzioni

in una espressione possono comparire “funzioni”

sintassi: nomefun(argomenti)

semantica: valore ottenuto applicando una

“legge di trasformazione” agli argomenti

per ora usiamo solo funzioni predefinite raccolte in librerie

esempio:

funzioni matematiche nella libreria cmath (tra cui sqrt, fabs, sin, log, …)

double x, y ; x = 3.4 ;

y = log(x) + sqrt(x+2.5)) ; (assegna a y il valore lnx+ x+2.5 )

(13)

per usare una funzione predefinita in un programma:

#include <nome libreria>

(esempio: #include <cmath>)

e inoltre dobbiamo conoscere il prototipo della funzione:

tipo nomefun (tipoarg)

Ø  

del valore  

restituito Ø 

nome della

funzione Ø

numero e tipo degli argomenti

esempio:

double sqrt (double)

double pow (double, double)

(14)

esempio: conversione da gradi Fahreneit in gradi Celsius

(Celsius = 5(Fahreneit-32)

9 )

input: un reale che indica una temp. in °F output: un reale che indica una temp. in °C

versione “scarna”:

#include <iostream>

using namespace std;

main()

{double tempFah, tempCel;

cin >> tempFah;

tempCel = (5.0*(tempFah-32))/9.0;

cout << tempCel;

return 0 }

(15)

versione “ricca”:

/*programma di conversione da

gradi Fahreneit in gradi Celsius*/

#include <iostream>

using namespace std;

main()

{double tempFah, tempCel;

cout<<"scrivere temp. in gradi Fahreneit : ";

cin >> tempFah;

tempCel = (5.0*(tempFah-32))/9.0;

cout<<tempFah<<" gradi Fahreneit

equivalgono a "<<tempCel<<" gradi Celsius \n";

return 0;

}

________________________________

versione scarna:

130

54.4444

________________________________

versione ricca:

scrivere temp. in gradi Fahreneit : 130

130 gradi Fahreneit equivalgono a 54.4444 gradi Celsius

Riferimenti

Documenti correlati

DN6 Single nozzle type / Tipo monougello (DN6) 44 Ø Single nozzle / Diametro monougello (Ø44) 086 Single nozzle length / Lunghezza monougello (L=86) 1 Tip type / Tipo puntale

Le dimensioni sono espresse in millimetri salvo diversa indicazione Altre opzioni

Gli studi più recenti concordano nuovamente ad assegnare all’artista fiorentino il celebre ciclo ispirato alle storie di San Francesco, condotto tra 1290 e il 1296... Il dono

El aire de alimentación debe estar libre de cuerpos extraños y de humedad para proteger la máquina de usura precoz de las partes en movimiento, se aconseja el uso de un grupo de

Warning: The current product information complies with law n.126 of the 10th of April 1991 “Regulations for consumer information” and to ordinance n.101 of the 8th of February

a) Carenze esistenti di Specialisti AR a fine 2021 (incrementando le attività aggiuntive in media dal 10% attuale (equivalente a circa 1.500 Unità) al 15% (equivalente nel

La zona dell’interro risulterà essere pedonabile, e potrà essere resa carrabile o camionabile solo con la realizzazione di strutture idonee, che dovranno essere calcolate da

Se il funzionamento corretto è confermato al di sopra di questo valore, il carico sul cilindro rappresentato solo dalla resistenza della spinta e può essere considerato come se