Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
GLI OPERATORI DI CONFRONTO TIPI INTERI
uguale == esempio: espr1 == espr2 → vale 1 se espr1 è uguale a espr2, altrimenti 0
diverso != esempio: espr1 != espr2 → vale 1 se espr1 è diverso da espr2, altrimenti 0
• nel caso di tipi diversi valgono le regole di promozione del casting
• il risultato dell'espressione è un valore intero: 1 se il confronto risulta vero e 0 se il confronto è falso
un'operazione che
OPERATORE CAST: ( ) Sintasi (tipo) espr → converte il tipo di espr in tipo ed e'
converte il valore di un'espressione in un valore di tipo diverso
esempio:
int a=11, b=2;
double r = a/(double)b; → il cast qui fa che l'operazione verra svolta tra numeri in virgola
mobile siccome ho il double invece che tra interi
uguagle e diverso esempi:
if (conteggio == 10) { /* istruzioni */ } → il blocco di istruzioni viene eseguito se il valore della variabile conteggio vale 10
if (conteggio != 100) { /* istruzioni */ }→
il blocco di istruzioni viene eseguito se il valore della variabile conteggio è diverso da
100
int value = index == 10; → assegnare i valori 1 oppure 0 alla variabile value, in base al valore di index, uguale o diverso da 10
il confronto ha priorità maggiore dell'assegnamento, perciò viene valutato prima
NOTE: > >= < <=
Disugauglianza
> >=
espr1 > espr2 espr1 >= espr2 → ritorna 1 nel caso in cui espr1 sia maggiore (maggiore uguale) di espr2, altrimenti 0
< <=
espr1 < espr2 espr1 <= espr2 → ritorna 1 nel caso in cui espr1 sia minore (minore uguale) di espr2, altrimenti 0
Esempi:
int bollente = temp_acqua >= 100; → alla variabile bollente viene assegnato il valore 0 o 1 a seconda che, rispettivamente, il
valore della variabile temp_acqua sia minore oppure maggiore/uguale di
100 Confronto tra valori in virgola mobile
• gli operatori di uguaglianza e diversità andrebbero evitati quando sono coinvolti valori in virgola mobile
• in particolare se tali valori costituiscono il risultato di una espressione o di una chiamata a funzione, piuttosto
che costanti scritte esplicitamente nel programma
Gli operatori logici (1=VERO, 0=FALSO)
gli operatori logici sono analoghi agli operatori di confronto il risultato dell'espressione è 1 o 0 per indicare
rispettivamente i risultati "vero" e "falso", il loro uso più comune è nella composizione di più confronti
AND LOGICO &&
esper1 && esper2 → il risultato vale 1 solo se entrambi gli operandi sono veri (cioè diversi da 0), altrimenti il
risultato è 0 se falsi
gli operandi esper1 e esper2 possono essere tipi numerici o puntatori, vengono valutati come veri o falsi senza
convertirli a rappresentazione intera (cioè, 0.5 è considerato vero)
Proprieta' del AND logico:
è commutativa, per cui il risultato numerico non cambia invertendo i due operandi
la valutazione di una espressione con AND logico avviene sempre da sinistra a destra QUINDI se il primo
operando è falso, il secondo operando non viene mai valutato
alcuni esempi sono i seguenti:
0 && 0 -> 0
1 && 0 -> 0
5 && 1 -> 1
2 && 8 -> 1
0 && 9 -> 0
l'operatore AND può essere utilizzato per verificare se un valore è contenuto in un intervallo:
((x >= a) && (x <= b)) → L’espressione vale 1 se x è in [a, b] e 0 altrimenti
OR LOGICO ||
espr1 || espr2 → il risultato vale 1 se almeno uno degli operandi è vero (cioè diverso da zero), altrimenti il
risultato è zero
i tipi degli operandi di || sono tipi numerici o puntatori, secondo le stesse regole appena descritte per l'operatore
&&, anche || ha un ordine di valutazione imposto da sinistra a destra , se il primo operando è vero il secondo
operando non viene valutato, in quanto il risultato dell'intera espressione è già determinato (cioè è vero)
alcuni esempi numerici sono i seguenti:
0 || 0 -> 0
1 || 0 -> 1
5 || 1 -> 1
2 || 8 -> 1
0 || 9 -> 1
if ((mese < 1) || (mese > 12)) { → INTERVALLO VALORI VALIDI>1 OPPURE <12
→
printf("Numero del mese non valido.\n"); SE IL VALORE E' <1 OR >12 CIOE'VALORE NON VALIDO VIENE STAMPATO NUMERO
DEL MESE NON VALIDO
/* ... gestione della condizione ... */
}
il costrutto if si occupa di verificare se il numero del mese memorizzato nella variabile mese appartiene
all'intervallo di valori validi
in caso il valore non sia contenuto nell'intervallo corretto viene eseguito il corpo del costrutto che contiene le
istruzioni per la gestione della condizione
int a = 3, b = 0;
if (a || b++){ → se a e' vera oppure b++ eseguo istruzione qui ho a (primo espressione vera) quindi non guarda
neanche b++
/* eseguo istruzioni */
}
a è una espressione vera (in quanto a vale 3 CIOE' diverso da 0), b e' falsa siccome =0
l'espressione b++ non verrà valutata
il valore di b rimarrà inalterato
NEGAZIONE LOGICA !
→
!espr negazione logica dell'espressione espr
l'operatore ! nega l'operando (espr) alla sua destra, restituendone il valore logico invertito
l'operando(espr) è di tipo numerico o un puntatore e viene valutato come per && e ||
se l'operando è falso (cioè 0) il risultato sara' invertito quindi 1
se l'operando è vero (diverso da zero) il risultato sara' invertito quindi 0
Operazioni sui tipi
( )
(tipo) espr → converte il tipo di espr in tipo (si chiama operazione di cast)
sizeof
sizeof espr oppure sizeof(tipo ad esempio tipo int) → ritorna la dimensione in byte di espr o tipo ad
esempio tipo int
l'operatore sizeof ha risultato intero cioe' restituisce la dimensione del tipo o dell'espressione specificato
alla sua destra,
come in sizeof(int)
Operatori di controllo(di solito si usano i cicli e non questi operatori!!!
? :
espr1 ? espr2 : espr3→ se espr1 è vera, valuta espr2 come risultato dell'operazione, altrimenti valuta espr3
L'espressione condizionale
le istruzioni che seguono assegnano il massimo e il minimo di due valori a e b alle due variabili max e min
rispettivamente, utilizzando l'operatore ternario per il confronto e la selezione del valore da assegnare:
max = (a > b) ? a : b;
min = (a < b) ? a : b;
lo stesso risultato può essere ottenuto utilizzando il costrutto condizionale if (che e' meglio da usare)
,
espr1 , espr2 →valuta l'espressione espr1 ignorandone il risultato, poi valuta l'espressione espr2 il cui risultato
è usato come risultato complessivo cioe' (il risultato dell'espressione complessiva è dato dal risultato
della valutazione della sola espr2)
esempi:
a = ( espr1 , espr2 ) ; → che ha il significato di assegnare ad a il valore risultante dal calcolo di espr2 dopo aver
comunque valutato espr1
a = ( b = 0 , 10 * 40 ) ; → valuta b=0 assegnando quindi 0 a b, e poi calcola il risultato dell'espressione 10*40 e lo assegna
alla variabile a LETTURA DATI
Funzioni per la lettura fgets e scanf
due funzioni di lettura: fgets(sempre con atoi o atof) e scanf
• fgets legge una sequenza di caratteri e li memorizza in una stringa. (qualsiasi cosa letta da tastiera e' una
stringa anche se sono numeri)
• atoi converte una stringa in intero • atof converte una stringa in virgola
mobile
esempio: la stringa "125" viene convertita nel valore intero 125
• scanf legge da tastiera dei caratteri e li converte nel formato specificato
Lettura con fgets:
la funzione fgets richiede di specificare
• il vettore in cui memorizzare i caratteri letti,
• la sua dimensione (operatore sizeof che restituisce la dimensione in byte
del suo operando)
• la periferica di input (tastiera) → stdin
sintasi:
char s[80];→la variabile s viene utilizzata per contenere una stringa inserita dall'utente
fgets(s, sizeof(s), stdin);
NOTE: la variabile s[80] viene utilizzata per contenere una stringa inserita dall'utente il numero tra parentesi quadre indica
il numero massimo di caratteri che possono essere contenuti nella stringa, che può essere di 79 caratteri, ovvero uno in meno
di quanto dichiarato
Funzioni di conversione: atoi e atof
atoi: viene usata per trasformare una stringa in un numero intero • per utilizzarla occorre includere il file
di intestazione stdlib.h (#include <stdlib.h> se non scrivo questo non saro' in grado di usare atoi)
esempio
"24" → 24
int a = atoi("24"); // cosi avro' che a= 24
allora la funzione atoi converte in intero tutti i caratteri che appaiono dall'inizio della stringa fino al primo
carattere che non è una cifra, oppure fino alla fine della stringa e se non ci sono caratteri da convertire, restituisce
0
esempi di conversione:
a = atoi("1"); // a = 1
b = atoi("uno"); // b = 0 perche' non ci sono dei caratteri da convertire
c = atoi("44 gatti"); // c = 44 perche' gatti non e' una cifra
atof: serve per convertire stringhe in numeri in virgola mobile la logica di funzionamento è identica a
quella di atoi
esempi di conversione:
double a, b, c, d, e; .
. .
a = atof("3 14"); // a = 3 14 da notare che il seperatore per i numeri in virgola mobile e'
.
b = atof("314e-2"); // b = 3 14
. .
c = atof(" 00314e+3"); // c = 3 14
d = atof("3,14"); // d = 3 (attenzione alla virgola che non e' un seperatore e non e' una cifra)
e = atof("pigreco"); // e = 0 perche' non ci sono caratteri da convertire perche' la lettera p non e' cifra
esempio codice: Lettura con fgets
commento il codice:
• la variabile s serve per memorizzare l’input da tastiera come sequenza di caratteri a
• il contenuto della stringa viene poi convertito in numero attraverso la atoi che viene assegnato uno ad e l'altro
b
a
• in entrambi i casi il valore letto da fgets viene memorizzato nella variabile s
• con la seconda chiamata a fgets il valore precedentemente contenuto in s viene perduto, ma questo non è un
problema, perche' la variabile a contiene il valore
Funzioni per la lettura: scanf
la funzione scanf richiede il formato del dato da acquisire e l’indirizzo della variabile in cui memorizzarlo, si usa &
per indicare indrizzio
%d oppure %i : fromato per tipi interi
%ld: formato per long int
%lld: formato per long long int
%f : formati per float/double
%c: formato per caratteri
%s: formqto per stringhe
s