#include - unina.it

21
Espressioni matematiche #include <math.h> 1

Transcript of #include - unina.it

Page 1: #include  - unina.it

Espressioni matematiche

#include <math.h>

1

Page 2: #include  - unina.it

C funzioni matematiche

FUNZIONE MATEMATICA FUNZIONE CÖx radice quadrata di x (restituisce un valore ≥0) double sqrt (double x);

sen x seno di x (con x reale) double sin (double x);

cos x coseno di x (con x reale) double cos (double x);

tg x tangente di x (con x reale) double tan (double x);

arcsen x arcoseno di x (con x nell’intervallo [-1 ;+1]) double asin (double x);

arccos x arcoseno di x (con x nell’intervallo [-1 ;+1]) double acos (double x);

arctg x arcotangente di x (con x reale) double atan (double x);

ex e elevato ad x (con x reale) double exp (double x);

10x 10 elevato a x (con x reale) double pow10 (double x);

ln x logaritmo in base e di x (con x reale ≥0) double log (double x);

log x logaritmo di base 10 di x (x reale positivo) double log10 (double x);

|x| valore assoluto di x double fabs (double x);

calcolo ipotenusa di un triangolo rettangolo i di catetix ed y (con x,y numeri reali)

double hypot (double x, double y);

arctg x/y arcotangente di y/x. Il valore restituito è compreso fra –p e +p estremi compresi

double atan2 (double y, double x);

yx x elevato ad y (con x,y numeri reali) double pow (double x, double y);

calcola mantissa ed esponente di x double frexp (double x, int* esp);

Page 3: #include  - unina.it

C funzioni matematiche

3

Tutte le funzioni in C restituiscono dei valori double invece che float; il tipo double rappresenta ancora un numero decimale ma con un maggior grado di precisione. Le due espressioni matematiche seguenti sono tradotte in C

13

23

4

53

--

=

-=

xxz

abxaxy

L’espressione si scrive con l’istruzione di assegnazione seguente:y = (a* pow(x,3) - 3*pow(x,5)) /(2*a*b) oppurey = (a* pow(x,3) - 3*pow(x,5)) /2/a/b

L’espressione si scrive con l’istruzione di assegnazione seguente:z = sqrt(pow(x,4) – 3) /fabs(x-1)

Page 4: #include  - unina.it

4

Tradurre in C le seguenti formule.

Scrivere in C i seguenti programmi.1) CALCOLO DEL PERIMETRO DI UN TRIANGOLOCalcolare il perimetro di un triangolo qualsiasi supponendo assegnati i tre lati a,b,c.3) CALCOLO MEDIA E SOMMA DEI VALORI ASSOLUTI DEGLI SCARTIInserire in ingresso tre numeri reali a, b, c e applicare le formule (M=Media, S=scarto medio:

4) SOMMARE DUE NUMERI INTERIDare in input i numeri interi a e b e far scrivere il risultato.Provare i valori a = 2 000000000 , b= 1 000000000 oppure a = b = 2 000000000.

)ln()6;)5;

)5(3)4

;2)()3;

2)2;

2)1

22

44

223

34

23

babah

babcabca

fbxaxxy

xxcbxasenacbAcbap

++

=-+-

=+-

=

--

=××

=++

=

3cbaM ++

=3

cMbMaMS

-+-+-=

Esercizi

Page 5: #include  - unina.it

Variabile = Variabile operazione Espressione;

che traduce esempi come

i = i + 1 i = i – 1 somma = somma + i p = p * h

questi possono essere scritti in modo compatto, rispettivamente, come

Variabile operatore = espressione;

i++ i-- somma += i p *= h

In particolare i primi due termini i = i + 1 ed i = i – 1, sono detti rispettivamente operatori di incremento e decremento.

Tali operatori hanno due forme:

una forma postfissa (i++, i--) e la forma prefissa (++i , --i).

C operatori di incremento

Page 6: #include  - unina.it

C operatori di in(de)cremento

Gli operatori di incremento ++ o decremento -- aumentano o diminuiscono di un'unità il valore dell'operando (l-value di tipo standard)

var++; equivale a var = var + 1;

++var; equivale a var = var + 1;

la forma incremento (o decremento) conviene perché è più compatta e soprattutto perché consente di ridurre il numero di istruzioni

– Nella forma prefisso l'incremento (o il decremento) viene eseguito prima che la variabile sia utilizzata nell'espressione,

– nella forma suffisso avviene il contrario.

Questa distinzione non è importante quando li utilizziamo singolarmente. Ladistinzione è particolarmente significativa quando gli operatori di incremento edecremento sono usati in espressioni che coinvolgono altri operatori.

Page 7: #include  - unina.it

C operatori di in(de)cremento

var++ si dice in notazione postfissa– “usa il valore della variabile e poi incrementala di 1”

++var si dice in notazione prefissa– “incrementa di 1 la variabile e poi usa il valore”

Esempio: i++ i = i + 1somma-- somma = somma – 1int c = 5;a = c++; (a contiene 5, c

vale 6)b = ++c; (b contiene 7)

Page 8: #include  - unina.it

C operatori di in(de)cremento

Esempio: somma += i++;equivale a:somma = somma + i; i = i + 1;

poiché la forma è postfissa, i passi che vengono eseguiti sono:1. si prende il valore di i e si calcola somma +=i, cioè somma = somma + i;2. si incrementa il valore di i.

Esempio: somma += ++i;equivale a:i = i + 1; somma = somma + i;

scritta nella forma prefissa produce i seguenti risultati1. si incrementa il valore di i;2. si prende il valore di i e si calcola somma +=i, cioè somma = somma + i;

Gli operatori di incremento e decremento hanno la precedenza sugli altri operatori.

Page 9: #include  - unina.it

a) k = 8 e i = ++k quanto valgono k ed i ?

b) k = 8 e i = k++ quanto valgono k ed i ?

c) k =2 e h =3d) k += ++he) i = h++

Esercizio

Page 10: #include  - unina.it

C casting di tipo implicito

Il C esercita controllo sui tipi e dà messaggio di errore quando si tenta di eseguire operazioni fra operandi di tipo non ammesso

Durante l’esecuzione di un programma ci sono situazioni in cui viene cambiato il tipo di dato (casting implicito):– quando un valore di un tipo viene assegnato alla variabile di un

altro;– quando un’operazione contiene due elementi di tipo diverso

(per esempio la somma di un intero con un reale);

Ciò può provocare degli errori difficilmente individuabili

Page 11: #include  - unina.it

C casting di tipo implicito

I quattro operatori matematici si applicano a qualsiasi tipo standard, ma i tipi dei due operandi devono essere uguali.

Nel caso di due tipi diversi, il compilatore esegue una conversione di tipo implicita su uno dei due operandi

... seguendo la regola di promuovere il tipo più semplice (meno ampio in bytes) a quello più complesso (più ampio in bytes),

... secondo la seguente gerarchia (in ordine crescente di complessità):

char à unsigned char à short àunsigned short à long à unsigned long àfloat à double à long double

Esempio: 3.4/2 il secondo operando è trasformato in 2.0 e il risultato è correttamente 1.7

Page 12: #include  - unina.it

C casting di tipo implicito

Nelle assegnazioni, il tipo dell’operando di destra viene sempre convertito implicitamente nel tipo dell’operando di sinistra

Se il tipo dell’espressione ha una precisione minore del tipo della variabile, come in

Variabile-double = espressione-floatallora non c’è alcun problema; se, invece, accade il contrario, come in

Variabile-float = espressione-doublepotrebbero nascere due tipi di problemi:

1 - il risultato dell’espressione-double contiene un numero di cifre che il tipo floatnon gestisce, con una grave perdita di precisione;2 - il risultato dell’espressione-double supera il massimo valore rappresentabile come float: in tal caso non è prevedibile in generale il comportamento del programma.

Esempio: int c;double d;c = d (warning in fase di compilazione)

Page 13: #include  - unina.it

13

C casting di tipo implicito

Nelle operazioni fra tipi interi, se il valore ottenuto esce dal range (overflow), l'errore non viene segnalato

Anche il casting implicito può generare un overflow che non viene segnalato come errore

Es. short n = 32767;n++; (l'errore non viene segnalato,

ma in n si ritrova il numero -32768)

È bene non adoperare espressioni in cui sono presenti variabili di tipo diverso.

Page 14: #include  - unina.it

Se n1 ed n2 sono variabili di tipo int , r una variabile di tipo float e c una variabile di tipo chardire cosa stampa il computer allorché esegue le seguenti istruzioni:

n1= 11;n2=3 ;printf("n1*n2=%d \n",n1*n2);c=’H’;n2=n1%n2 ;printf("c=%c \n n2=%d \n",c,n2);r=n1/n2 ;n1=n1/n2;printf("n1=%d \n r=%f",n1,r);

Scrivere un programma completo che esegua questa sequenza di istruzioni.

Esercizio

Page 15: #include  - unina.it

C casting di tipo esplicito

l'operatore di casting (o di conversione esplicita), serve per forzare una conversione di tipo (ha due operandi)

(tipo) variabilein C equivale a: tipo (variabile)

consiste nell'indicazione del nuovo tipo fra parentesi davanti al nome della variabile da trasformare

Tutti i tipi standard consentono il casting– se la variabile da trasformare è operando di una certa

operazione, il tipo risultante deve essere fra quelli ammissibili (altrimenti viene generato un errore in compilazione)

Esempio: float(n) % 3 é errato in quanto l'operatore %ammette solo operandi interi

eser1.5.cpp

Page 16: #include  - unina.it

C casting di tipo esplicito

Esempio:

int i=32;

printf("il carattere %c , ha codice %d \n",(char)i,i;

l’intero i viene convertito in modo esplicito a carattere.

eser1.5.cpp

Page 17: #include  - unina.it

Gli operatori logici sono:&& || !

agiscono su operandi booleani e restituiscono un valore booleano:a && b esegue l'AND logico fra gli operandi; risultato: true se

entrambi a e b sono true; altrimenti: falsea || b esegue l'OR logico fra gli operandi; risultato: false se

entrambi a e b sono false; altrimenti: true!a esegue il NOT logico dell'operando: risultato: true se a

è false o viceversa

Esempio:5 && 2 restituisce true in quanto entrambi gli operandi sono

true (ogni intero diverso da zero è convertito in true)

C operatori logici

Page 18: #include  - unina.it

Le espressioni booleane composte si ottengono dalle espressioni booleane semplici precedentemente introdotte (a<b, a!=0,etc) adoperando i seguenti operatori:

Nome Inglese connettivo logico in C++Negazione NOT ¬A !(A)Congiunzione AND AÙB (A)&&(B)Disgiunzione OR AÚB (A)||(B)La negazione è un operatore unario prefisso, la congiunzione e la disgiunzione sono

due operatori binari infissi. Il valore di verità delle espressioni booleane nell’ultima colonna dipende dal valore di

verità di A e di B secondo la seguente tabella di verità:

C operatori logici

A B A && B | A B A || B | A ! A

Vero Vero Vero | Vero Vero Vero | Vero Falso

Vero Falso Falso | Vero Falso Vero | Falso Vero

Falso Vero Falso | Falso Vero Vero |

Falso Falso Falso | Falso Falso Falso |

Page 19: #include  - unina.it

Supponiamo che a e b siano due numeri interi; allora l’istruzione

if ((a==0) && (b==0))

scrive ‘a e b sono entrambi nulli’ soltanto se è vero che sia il valore contenuto in a che quello contenuto in b sono nulli; l’istruzione

if ((a==0) || (b==0))

dà la scritta ‘almeno uno dei due numeri a e b è nullo’ soltanto se almeno uno dei due numeri è uguale a 0.

È bene ricordare che le espressioni booleane semplici che compaiono in una espressione composta devono essere racchiuse tra parentesi tonde e che l’operatore di negazione ha la precedenza sugli altri due.

Due espressioni logiche si dicono equivalenti se esse assumono sempre lo stesso valore di verità, qualunque sia il valore di verità delle espressioni logiche semplici che la compongono

C operatori logici

Page 20: #include  - unina.it

Ricordiamo le leggi di De Morgan che risultano estremamente utili:!(A&&B) è equivalente a (!A)||(!B)!(A||B) è equivalente a (!A)&&(!B)

In C potremmo scrivere:

! ((A) &&(B) ) == !(A) ||! (B)! ((A) || (B) ) == !(A) && !(B)

C operatori logici

Page 21: #include  - unina.it

Si noti che l’espressione booleana (A1) && (A2) && …&&(An) è valutatanel seguente modo:

• appena si incontra una A che valuta a falso la computazionedell’espressione viene interrotta,

• le A successive non sono valutate e si ritorna il valore falso per l’interaespressione.

Analogamente per l’espressione A1 || A2 || … || An• si ritorna il valore vero non appena si incontra una A che valuta a vero.• In questo modo non solo si velocizza la computazione ma l’espressività

del linguaggio ne risulta potenziata.

Ad esempio si può scrivere:if((a!=0) && (b/a<c))…

Bisogna però fare attenzione:l’espressione ((b/a<c) && (a!=0)) pur essendo logicamente equivalente alla prima

darebbe un errore a runtime se a fosse nullo perché cerca di dividere unnumero per 0.

C operatori logici