La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

INFORMATICA Il linguaggio C. © Piero Demichelis 2 Alfabeto Il vocabolario base del C è costituito dai seguenti simboli: tutte le lettere dellalfabeto.

Presentazioni simili


Presentazione sul tema: "INFORMATICA Il linguaggio C. © Piero Demichelis 2 Alfabeto Il vocabolario base del C è costituito dai seguenti simboli: tutte le lettere dellalfabeto."— Transcript della presentazione:

1 INFORMATICA Il linguaggio C

2 © Piero Demichelis 2 Alfabeto Il vocabolario base del C è costituito dai seguenti simboli: tutte le lettere dellalfabeto inglese maiuscole e minuscole: A÷Z, a÷z le dieci cifre decimali 0 ÷ 9 un insieme di caratteri speciali, tra cui: + * / = ( ) [ ] { }., ; : ? ! % # & ˜ ˆ

3 © Piero Demichelis 3 Identificatori Si riferiscono ad una delle entità del linguaggio: ­ costanti ­ variabili ­ funzioni ­ ecc. Iniziano con un carattere alfabetico oppure con _ (underscore) e possono contenere solamente caratteri alfabetici, cifre e _ Il C standard prevede che solo i primi 31 caratteri dell'identificatore sono significativi, anche se possono essere usati nomi più lunghi.

4 © Piero Demichelis 4 Commenti Sono testi liberi inseriti allinterno del programma dal programmatore per descrivere cosa fa il programma. Non sono processati dal compilatore: servono al programmatore, non al compilatore! Formato: ­ Racchiuso tra i simboli: /* */ ­ Non è possibile annidarli. Esempi: /* Questo è un commento corretto! */ /* Questo /* risulterà un */ errore */

5 © Piero Demichelis 5 Istruzioni Le istruzioni devono essere scritte rispettando alcune regole sintattiche e di punteggiatura. Listruzione deve sempre essere conclusa con un ; (punto e virgola). Si può scrivere più di unistruzione per riga purché ognuna sia conclusa col ;. Unistruzione può occupare più di una riga.

6 © Piero Demichelis 6 Parole chiave Riservate! Nel C standard sono 32: autodoubleintstruct breakelselongswitch caseenumregistertypedef charexternreturnunion constfloatshortunsigned continueforsignedvoid defaultgotosizeofvolatile doifstaticwhile

7 © Piero Demichelis 7 Struttura di un programma C Struttura generale: Direttive e parte dichiarativa globale main () { Parte dichiarativa locale Parte esecutiva }

8 © Piero Demichelis 8 Struttura di un programma C Tutti gli oggetti, con le loro caratteristiche, che compongono il programma devono essere preventivamente dichiarati. Molto meglio se vengono dichiarati tutti insieme allinizio del programma (prima delle istruzioni eseguibili!). main ­ è la parola chiave che indica il punto di ingresso del programma quando viene eseguito dal S.O.; ­ il suo contenuto è delimitato da parentesi graffe { … }

9 © Piero Demichelis 9 Struttura di un programma C Parte dichiarativa locale: ­ elenco degli oggetti che compongono il main ognuno con le proprie caratteristiche. Parte esecutiva: ­ sequenza di istruzioni, ovvero ciò che descriviamo con il diagramma di flusso oppure con lo pseudocodice!

10 © Piero Demichelis 10 Struttura di un programma C Programma minimo: main() { } main() { } START STOP file prova.c

11 I dati

12 © Piero Demichelis 12 Definizione dei dati In C, tutti i dati devono essere dichiarati e definiti prima di essere usati! Definizione di un dato: 1. riserva spazio in memoria; 2. assegna un nome. 3. identifica gli operatori leciti su quel dato Richiede lindicazione di: ­nome (identificatore); ­tipo; ­modalità di accesso (variabile/costante).

13 © Piero Demichelis 13 Tipi Il tipo definisce l'insieme dei valori che possono essere assunti, la rappresentazione interna e l'insieme degli operatori che possono agire su quel dato. Il linguaggio C richiede di definire il tipo dei dati e possiede regole rigide per la loro manipolazione (tipizzazione forte ). Permette inoltre al programmatore di definire nuovi tipi astratti. Contemporaneamente permette di vedere gli oggetti interni al calcolatore: i registri, la memoria, gli indirizzi (puntatori), ecc.

14 © Piero Demichelis 14 Tipi base (primitivi) Sono quelli forniti direttamente dal C. Sono identificati da parole chiave! ­ charcaratteri ASCII; ­ intinteri (complemento a 2); ­ floatreali (floating point singola precisione); ­ doublereali (floating point doppia precisione). La dimensione precisa di questi tipi dipende dallarchitettura (non definita dal linguaggio). ­ char = 8 bit sempre Attenzione: le parole chiave dei tipi base vanno scritte in minuscolo!

15 © Piero Demichelis 15 char Il tipo char (character) definisce un carattere (attenzione: un solo carattere!) espresso su 8 bit (1 byte) in codice ASCII. I valori sono interpretati come numeri interi con segno su 8 bit (-128 ÷ +127). Un carattere deve essere indicato tra apici, così: a

16 © Piero Demichelis 16 int Il tipo int (integer) definisce i numeri interi con segno. La rappresentazione interna e l'intervallo dei valori assunti dipende dal compilatore e dalla macchina usata. Quasi sempre si tratta del complemento a 2 e i valori assunti sono compresi nellintervallo ÷ su 16 bit oppure, per le macchine a 32 bit, nellintervallo ÷ Vanno indicati semplicemente così come siamo abituati a scriverli sulla carta, col loro valore (senza il punto decimale): -2453

17 © Piero Demichelis 17 float e double Sia il tipo float che il tipo double sono rappresentazioni di numeri reali (frazionari). Sono rappresentati secondo la notazione floating-point, rispettivamente in singola (32 bit) e doppia (64 bit) precisione. I valori assunti (rappresentabili) sono: float ± 3.4E+38 (7 cifre decimali) double ± 1.7E+308 (16 cifre decimali) La rappresentazione è normalmente riferita allo standard IEEE P754.

18 © Piero Demichelis 18 float e double I valori di tipo float o double vanno indicati con il punto decimale, ad esempio: E ammessa anche una notazione simile alla notazione scientifica con il carattere E al posto di 10, così: E-02 In alternativa, si può ancora scrivere il numero senza punto decimale ma seguito dal suffisso F oppure f (ad esempio, 10F, 10f e 10.0 sono equivalenti). Il compilatore concepisce questi valori sempre come di tipo double.

19 © Piero Demichelis 19 Modificatori dei tipi base Sono previsti dei modificatori, identificati da parole chiave, da premettere ai tipi base: short long signed unsigned

20 © Piero Demichelis 20 short / long Il qualificatore short si applica al tipo int e impone che la rappresentazione degli interi sia su 16 bit (valori assunti: ÷ 32767); il qualificatore long si applica sia al tipo int che al tipo double; ­long int impone la rappresentazione degli interi su 32 bit (valori assunti: ÷ ); ­long double forza la rappresentazione dei reali su 80 bit (± 1.7E+308 aumentando la precisione a 19 cifre decimali).

21 © Piero Demichelis 21 signed / unsigned I qualificatori signed e unsigned si applicano ai tipi char e int. signed è ridondante e serve solo a ricordare che un valore è inteso con segno (ma per int e char è già così!); unsigned permette di estendere l'intervallo dei valori non-negativi. ­Il tipo unsigned char può assumere valori nell'intervallo 0 ÷ 255 e il tipo unsigned int valori nell'intervallo 0 ÷ I qualificatori possono apparire da soli: nel qual caso si assume che sia sottinteso il tipo int. E lecito, ad esempio, il tipo unsigned short che viene interpretato come unsigned short int, ecc.

22 © Piero Demichelis 22 Altri valori interi Per un dato intero, i valori di variabili e costanti possono anche essere espressi in esadecimale (specificati col prefisso 0x oppure 0X, ad esempio, 0xFF = ) oppure ottale (prefisso 0 (zero), ad esempio 0377 = ); per il formato long si usa il suffisso L oppure l (255L o 255l esprimono entrambi un long int con valore ); per l'unsigned si usa il suffisso U oppure u (255U e 255u esprimono un unsigned int = ). I suffissi u ed l possono apparire entrambi, con ovvio significato.

23 © Piero Demichelis 23 Valori speciali Il codice ASCII comprende alcuni caratteri non stampabili. Per rappresentarli viene utilizzata la sequenza di escape (backslash seguito da un altro carattere). SequenzaCarattereSequenzaCarattere \a allarme \ apostrofo \b backspace \ doppio apice \f pagina nuova \\ backslash \n new line \ddd ottale \r return \xddd esadecimale \t tabulatore orizz. \0 null \v tabulatore vert.

24 © Piero Demichelis 24 Tabella riassuntiva TipoIntervallo dei valori char, signed char -128 ÷ 127 int, signed, signed int ÷ short, short int, signed short ÷ signed short, signed short int ÷ long, long int, ÷ signed long, signed long int ÷ unsigned, unsigned char, unsigned short0 ÷ 255 unsigned int, unsigned short int0 ÷ unsigned long, unsigned long int0 ÷ float3.4E±38 (7 cifre) double1.7E±308 (16 cifre) long double1.7E±308 (20 cifre)

25 © Piero Demichelis 25 Direttive Il C prevede che nel programma, oltre alle istruzioni, possano esserci anche delle direttive che devono essere interpretate ed eseguite dal compilatore stesso (inserzione di macro, compilazioni condizionate, inclusione di altri sorgenti, ecc.); il compilatore C esegue una preelaborazione del programma, detta Preprocessing, per riconoscere ed eventualmente eseguire le direttive; le direttive si distinguono dalle istruzioni perché sono inserite sempre in righe individuali e iniziano con il carattere # seguito da una parola chiave; ad esempio: #include #define

26 © Piero Demichelis 26 Definizione di variabili Sintassi: ; Più in generale (definizioni multiple): ; ­ : lidentificatore che rappresenta il nome della variabile; ­ : lista di identificatori separati da, (virgola).

27 © Piero Demichelis 27 Definizione di variabili Esempi: int x; char ch; long int x1,x2, x3; double pi; short int stipendio; long y,z; Usiamo nomi significativi! Esempi:int RitenuteOperate, StipendioBase; float OreLavorate; Esempi errati: float Ore Lavorate ; /* cè uno spazio */ int Stip?base; /* cè un carattere speciale */

28 © Piero Demichelis 28 Inizializzazione delle variabili E possibile inizializzare una variabile, ovvero attribuirgli un valore prima che venga utilizzata per la prima volta, in fase di dichiarazione della stessa. Esempio: int x = 24; char ch = m; double pi = ;

29 © Piero Demichelis 29 Definizione di costanti Sintassi: const = ; Esempi: const double pigreco = ; const char separatore = $; const float aliquota = 0.2; Convenzione: ­ Identificatori delle constanti tipicamente in MAIUSCOLO (ma è una convenzione!). const double PIGRECO = ;

30 © Piero Demichelis 30 La direttiva define E un'altra possibilità di definire valori costanti : si introduce un identificatore come sinonimo di una costante: #define identificatore testo Deve comparire sempre in testa al programma, prima di main(), e all'inizio della riga. E elaborata dal preprocessore del compilatore, che sostituirà in tutto il programma, ovunque appare l'identificatore, il testo di cui è sinonimo.

31 © Piero Demichelis 31 La direttiva define Non essendo un'istruzione non termina con il punto e virgola. Esempi: #define PIGRECO #define DOMENICA 7 #define VERO 1 #define Carattere p

32 © Piero Demichelis 32 Stringa Definizione: ­ sequenza di caratteri terminata dal carattere NULL (\0); non è un tipo di base del C. memorizzata in posizioni adiacenti di memoria. Formato: ­ Esempi: Ciao! abcdefg\n

33 © Piero Demichelis 33 Visibilità delle variabili Ogni variabile è definita allinterno di un preciso ambiente di visibilità (scope). Variabili globali ­ definite allesterno al main sono visibili da tutti i moduli. Variabili locali ­ definite allinterno del main (sono visibili solo allinterno del main); ­ più in generale, definite allinterno di un blocco (sono visibili solo allinterno del blocco).

34 © Piero Demichelis 34 Struttura a blocchi In C è possibile aggregare gruppi di istruzioni in blocchi racchiudendole tra parentesi graffe; significato: delimitazione di un ambiente di visibilità di oggetti (variabili). Esempio: { int a=2; int b; b=2*a; } a e b sono definite solo allinterno del blocco!

35 © Piero Demichelis 35 int n; double x; main() { int a,b,c; double y; { int d; double z; } Visibilità delle variabili - Esempio ­ n, x: visibili in tutto il file ­ a, b, c,y: visibili in tutto il main ­ d, z: visibili solo nel blocco

36 Le istruzioni

37 © Piero Demichelis 37 Assegnazioni Sintassi: = ; Non è unuguaglianza! ­ Significato: il risultato di viene assegnato a ; ­ e devono essere compatibili (ovvero dello stesso tipo); ­ deve essere stata precedentemente definita! Esempio: int x; float y; x = 3; y = ;

38 © Piero Demichelis 38 Assegnazioni In realtà lassegnazione (o assegnamento) non è unistruzione (come accade in tutti gli altri linguaggi); il simbolo = è un operatore che assegna alla variabile che si trova a sinistra il valore calcolato sullespressione di destra; nel caso più semplice lespressione di destra è un semplice valore. Sono pertanto lecite assegnazioni multiple: = = ;

39 © Piero Demichelis 39 Istruzioni di I/O Per ora consideriamo solo lI/O interattivo, quello cioè che si realizza con tastiera e monitor. Sono disponibili diverse forme in base al tipo di informazione letta o scritta: ­ I/O formattato ­ I/O di caratteri ­ I/O per righe

40 © Piero Demichelis 40 I/O formattato Standard output (scrittura su monitor) istruzione printf Standard input (lettura da tastiera) istruzione scanf Lutilizzo di queste funzioni richiede linserimento di una direttiva #include allinizio del file sorgente il cui significato è: includi il file stdio.h

41 © Piero Demichelis 41 Listruzione printf Visualizza sul monitor. La printf opera utilizzando una stringa, detta, nella quale si devono inserire i comandi che descrivono come devono apparire i dati sul monitor. Al deve seguire la lista di variabili che si vuol visualizzare. Sintassi: printf (,,..., );

42 © Piero Demichelis 42 Listruzione printf : stringa che determina il formato di visualizzazione per ognuno dei vari argomenti.,..., : lista degli argomenti da visualizzare. Gli argomenti (opzionali) possono essere costanti, variabili o espressioni. Se non ci sono argomenti (come quando si vuole visualizzare solo un messaggio) la funzione trasferisce sul video il testo della stringa di e il cursore si posiziona subito dopo l'ultimo carattere.

43 © Piero Demichelis 43 Listruzione printf Affinché il cursore vada a capo, occorre inserire nella stringa di format il carattere new-line (\n). Esempio: #include main() { printf ("Stampa di una riga\n"); printf ("Seconda riga\n"); }

44 © Piero Demichelis 44 Specificatori di formato Generalmente nel format sono indicati gli specificatori di formato per le variabili della lista. I principali specificatori di formato sono: ­%d o %i per il tipo int, stampa in notazione decimale; ­%o per il tipo int, stampa in ottale senza segno; ­%x per il tipo int, stampa in esadecimale senza segno; ­%u per il tipo int, stampa in decimale senza segno; ­%c per il tipo char, stampa un carattere; ­%f per il tipo float, stampa nella notazione virgola mobile nel formato -d.dddddd (6 cifre dopo la virgola); ­%e o %E per il tipo float, stampa nella notazione virgola mobile nel formato esponenziale -d.dddddde(E)±dd; ­%s per le sequenze di caratteri (stringhe).

45 © Piero Demichelis 45 Specificatori di formato Gli specificatori di formato sono costituiti dal carattere % seguito da un altro carattere che indica il formato da utilizzare per la stampa dell'argomento corrispondente (carattere, numero intero o reale, stringa, ecc.). Quando incontra il primo specificatore di formato il C preleva il primo argomento, effettua la conversione dal formato interno del dato ad una sequenza di caratteri ASCII seguendo le indicazioni del descrittore ed esegue infine l'ouput dei caratteri sul video. Prosegue poi con la stringa del format, ripetendo le azioni prima descritte per ogni specificatore incontrato e così fino ad esaurire l'intero format: il numero di specificatori di formato deve essere quindi pari al numero di argomenti.

46 © Piero Demichelis 46 Esempio Lassociazione tra variabili e specificatori di formato è di tipo ordinale: 1° specificatore 1ª variabile; 2° specificatore 2ª variabile, ecc. Esempi: int x = 2; float z = 0.5; char c = a; printf (%d %f %c\n, x, z, c); printf (%f***%c***%d\n, z, c, x); a _ ***a***2 _

47 © Piero Demichelis 47 Specificatori di formato Tra il carattere % e quello di specificazione può esserci uno o più elementi aggiuntivi: ­un intero, che fissa la larghezza minima (numero di caratteri) del campo su cui il dato è stampato; ­un punto seguito da un intero, che stabilisce la precisione con cui visualizzare il dato (numero di cifre frazionarie); ­uno di questi modificatori: h (per indicare che si tratta di un tipo short), l (per indicare che si tratta di un tipo long), L (per indicare che si tratta di un tipo long double).

48 © Piero Demichelis 48 Esempio (printf) #include int a=-57, b=2, c=450, d=33; float e=1.22E7, f= , g= , h=1.0; main() { printf ("a=%4d b=%3d c=%8d d=%1d\n", a, b, c, d); printf ("e=%9.3f f=%9.3f g=%9.3f h=%9.3f", e, f, g, h); } Sul video apparirà: a= -57 b= 2 c= 450 d=33 e= f= g= h= 1.00

49 © Piero Demichelis 49 Listruzione scanf Permette la lettura di dati da tastiera. La scanf, come la printf, opera utilizzando un format, cioè un descrittore del formato che devono avere i dati in ingresso e accetta vari tipi di argomenti: interi, reali, caratteri, stringhe, ecc. Sintassi: scanf (,,..., );

50 © Piero Demichelis 50 Listruzione scanf : è una stringa di caratteri dove compaiono solo specificatori di formato (è bene evitare di inserire degli spazi tra gli specificatori), gli stessi utilizzati per la printf;,..., : possono essere solo variabili il cui nome deve essere preceduto dal carattere &. ATTENZIONE!!! i nomi delle variabili vanno sempre precedute dalloperatore & che indica lindirizzo della variabile Esempio: int x; float z; scanf (%d%f, &x, &z);

51 © Piero Demichelis 51 Listruzione scanf Per comprendere il funzionamento della scanf si immagini che, man mano che vengono introdotti i caratteri dalla tastiera, il codice di ognuno venga accodato in un contenitore (un flusso). Si possono pensare così a delle sequenze di caratteri sulle quali il programma in esecuzione dispone di un cursore. Le modalità con cui opera la scanf sono alquanto complesse e dipendono dagli specificatori che compaiono nel.

52 © Piero Demichelis 52 Listruzione scanf Quando deve leggere un numero intero o reale, il cursore avanza fino al primo carattere diverso da spazio. Vengono poi letti tutti i caratteri successivi (cifre) fino a raggiungere un carattere di spazio oppure un delimitatore di riga (comunque un carattere non numerico), sul quale il cursore si ferma. Se la sequenza di caratteri così isolata è corretta, viene convertita nella rappresentazione interna e il valore è attribuito alla variabile, altrimenti le operazioni della scanf si bloccano.

53 © Piero Demichelis 53 Listruzione scanf Nel caso che la stringa contenga più di un descrittore, per ognuno viene attivato l'opportuno meccanismo di lettura e conversione: affinché la scanf si comporti correttamente ci devono essere tanti descrittori quanti argomenti. Tra un numero e il successivo possono essere inseriti quanti caratteri di spazio si desidera: vengono automaticamente ignorati (come ce ne fosse uno solo!). Se invece si leggono dati di tipo char viene letto un solo carattere, quello su cui è posizionato il cursore, il quale avanza di una sola posizione!

54 © Piero Demichelis 54 Listruzione scanf Per i dati più comuni (numeri e stringhe di caratteri) i valori devono essere introdotti separandoli tra loro da almeno un separatore (spazio, invio, ecc.). Lo specificatore %* provoca il salto della prossima conversione: viene effettuata la lettura ma il valore non viene assegnato all'argomento. Lo specificatore %* può risultare utile in pratica solo nel caso di lettura di dati da file (come si vedrà più avanti).

55 © Piero Demichelis 55 Esempio #include int dato1, dato2, dato3; main() { printf (\nIntroduci tre numeri interi: "); scanf ("%d%d%d", &dato1, &dato2, &dato3); }

56 © Piero Demichelis 56 Listruzione scanf I tre dati interi (da tastiera) possono essere introdotti indifferentemente separandoli tra loro con un semplice spazio oppure con il tasto di invio oppure ancora con il carattere tab, ecc. Ad esempio sono lecite ed equivalenti: (su una sola riga) (su tre righe distinte) 99000

57 © Piero Demichelis 57 I/O scanf e printf non sono le uniche possibilità che abbiamo per introdurre o visualizzare dati. Esistono numerose altre istruzioni di input sia per la lettura da tastiera, sia per leggere dati da altri periferici (come, ad es., il disco). Sono naturalmente diponibili le rispettive istruzioni di output. Il loro uso è però più complesso e verrà proposto più avanti.

58 © Piero Demichelis 58 Espressioni Sono combinazioni di variabili e operatori. Esistono varie categorie di operatori, applicabili a tipi di dati diversi: ­ operatori aritmetici; ­ operatori relazionali; ­ operatori logici; ­ operatori sui bit: ­ ecc.

59 © Piero Demichelis 59 Operatori aritmetici Quattro operatori comuni a tutti (numeri reali e interi): +-*/ Per i numeri interi, esiste anche loperatore % che ritorna il resto della divisione intera. Stesse regole di precedenza dellaritmetica ordinaria: ­( *, / ) > ( +, - ) ­le parentesi tonde alterano la gerarchia. Esempio: int x = 5, y = 2; q, r; q = x / y; /* (q = 2, variabili intere! troncamento) */ r = x % y; /* (r = 1), resto di 5 / 2 */ q = x + (y * (x – r)) /* 5 + (2 * (5 – 1)) = 13 */

60 © Piero Demichelis 60 Operatori aritmetici: esempi const double ENEPER = ; /* sezione variabili */ int dato, divintero; double risul,inizio; main() { dato = 12 * * 5; /* equivale a (12*3)-(4*5) = 16 */ dato = dato + 1; /* aggiunge 1 a dato: dato = 17 */ divintero = dato % 10; /* resto di 17 / 10 (= 7) */ inizio = dato; /* conversione di tipo */ risul = inizio / ENEPER; /* divisione tra numeri reali */ }

61 © Piero Demichelis 61 Conversione forzata di tipo (casting) Si può forzare la conversione di tipo anteponendo al dato che si vuole convertire il tipo posto tra parentesi, secondo questo schema: (tipo) espressione Esempio: int dato_1, dato_2; float dato_real; dato_real = (float)dato_1 / (float)dato_2; L'effetto della conversione mediante l'operazione cast è limitato all'espressione in cui appare: il dato su cui opera resta immutato.

62 © Piero Demichelis 62 Operatori di assegnamento composti E possibile combinare listruzione di assegnazione con gli operatori aritmetici. Sintassi: = ; Operatori: += -= *= /= %= ­ Significato: assegnazione + operazione. Esempi: x += 5;/* equivalente a x = x + 5 */ y -= x;/* equivalente a y = y – x */

63 © Piero Demichelis 63 Operatori di incremento e decremento Per le assegnazioni composte più comuni sono previsti degli operatori espliciti: Significato: ++ +=1 -- -=1 Esempi: x++; /* equivale a x = x + 1 */ valore--; /* equivale a valore = valore – 1 */

64 © Piero Demichelis 64 Operatori di incremento e decremento Possono essere utilizzati sia in notazione prefissa che in notazione postfissa Prefissa: la variabile viene modificata prima di essere utilizzata nellespressione Postfissa: la variabile viene modificata solo dopo averla utilizzata nellespressione Esempio: assumendo x=4 : ­Se si esegue y=x++, si otterrà come risultato x=5 e y=4; ­Se si esegue y=++x, si otterrà come risultato x=5 e y=5;

65 © Piero Demichelis 65 Operatori relazionali Operano su quantità numeriche o di tipo char e forniscono un risultato logico o booleano. >= == != Il risultato è sempre di tipo int: ­ risultato = 0 significa FALSO ­ risultato 0 significa VERO In C (C89) non esiste un tipo logico o booleano !

66 © Piero Demichelis 66 Esempio /* sezione variabili globali*/ float dato1, dato2; int inter1, inter2; short int switch1, flag; main() { dato1 = 10.5; dato2 = 3.7; inter1 = 2; inter2 = 1; switch1 = dato1 < (dato2 * 0.5); /* switch1 = 10.5 < 1.85 = FALSO (= 0) */ flag = inter1 != inter2; /* flag = VERO ( 0) */ }

67 © Piero Demichelis 67 Operatori logici Operano su espressioni booleane e forniscono un risultato logico o booleano. ! && || NOT AND OR Equivalenti agli operatori Booleani di base. ­ Stesse regole di precedenza NOT > AND > OR Esempi: ­ (x > 0) && (x < 10) (x compreso tra 1 e 9) ­ (x1 > x2) || (x1 == 3)

68 © Piero Demichelis 68 Esempio #define FALSO 0 #define VERO 1 /* sezione variabili */ int dato1, dato2; int inter1, inter2; short int test, flag, condiz; main() { dato1 = 5; dato2 = 3; flag = VERO; test = !flag; /* test = FALSO */ condiz = (dato1 >= dato2) && test; /* condiz = VERO AND FALSO = FALSO */

69 © Piero Demichelis 69 Operatori di manipolazione dei bit Il C possiede una serie di operatori che possono agire direttamente sui bit delle variabili e costanti di tipo intero o carattere dichiarate nel programma. Si tratta di 4 operatori derivati direttamente dalle operazioni booleane di base e di altri 2 che eseguono loperazione di shift (destra e sinistra) di un certo numero di bit. I primi si prestano a mascherare o commutare i bit, i secondi possono essere utili nelle operazioni di divisione e moltiplicazione per 2. Tranne uno, sono tutti operatori binari, che agiscono cioè su due espressioni.

70 © Piero Demichelis 70 Ripasso: operatori Booleani A B A AND B A01 10 A B A OR B NOT A A XOR B

71 © Piero Demichelis 71 Operatori su bit Operatori di manipolazione dei bit: AND bit a bit& Binario OR bit a bit| Binario XOR bit a bit^ Binario NOT bit a bit (complemento a 1) ~ Unario Shift a sinistra<< Binario Shift a destra>> Binario OperazioneOperatoretipo

72 © Piero Demichelis 72 Operatori su bit: esempi unsigned char z, x = 3, y = 13; z = x & y z = ~ x x y y x z x z AND NOT

73 © Piero Demichelis 73 Operatori su bit: esempi z = x | y z = x ^ y NOTA: Il significato decimale non è rilevante! OR EXOR

74 © Piero Demichelis 74 Operatori di shift Equivalenti alla divisione/moltiplicazione per le potenze di 2. Sintassi: >> Significato: fai scorrere a destra/sinistra di un numero di bit pari a Sia che devono essere valori interi.

75 © Piero Demichelis 75 Operatori di shift I due operatori operano diversamente a seconda del tipo numerico Dati unsigned : equivale allo shift logico; ­<< inserisce degli 0 nelle posizioni meno significative ­>> inserisce degli 0 nelle posizioni più significative Dati con segno: equivale allo shift aritmetico; ­<< aggiunge degli 0 nelle posizioni meno significative, e mantiene inalterato il bit più significativo (segno) ­>> inserisce un valore uguale al bit più significativo (bit di segno) mantenendo pertanto inalterato il segno;

76 © Piero Demichelis 76 Operatori di shift Esempio: unsigned char x = 15; /* x = */ x = x << 2 /* x = (15 x 2 2 = 60) */ x = x >> 2 /* x = (15 / 2 2 = 3) */ char x = -15 /* x = */ x = x << 2 /* x = (-15 x 2 2 = - 60) */ x = x >> 2 /* x = (-15 / 2 2 = - 4) */ Anche per questi operatori è consentita la scrittura abbreviata: x <<= 2 equivale a x = x << 2

77 © Piero Demichelis 77 Operatori di manipolazione dei bit Con questi operatori si possono eseguire operazioni complesse sui singoli bit delle variabili dei programmi. Esempio: unsigned char car = m, val = 1; car = car & ~ (val << 5 ); AND NOT left shift provoca la trasformazione del carattere m (il cui codice ASCII è 109) nel valore intero 77 corrispondente, in codice ASCII al carattere M.

78 © Piero Demichelis 78 Operatori bit-a-bit: esempio riassuntivo car = car & ~ ( val << 5 ) Codice binario del numero 1 su 8 bit (variabile val)

79 © Piero Demichelis 79 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operazione di shift a sinistra di 5 posizioni sulla variabile val (risultato = 32)

80 © Piero Demichelis 80 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operazione NOT sul risultato del precedente shift (risultato = 223 in binario puro)

81 © Piero Demichelis 81 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) In car vi è il codice di m, cioè

82 © Piero Demichelis 82 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate. bit car (val << 5) 1

83 © Piero Demichelis 83 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) 0 1 bit 1

84 © Piero Demichelis 84 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) bit 2

85 © Piero Demichelis 85 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) bit 3

86 © Piero Demichelis 86 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) bit 4

87 © Piero Demichelis 87 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) bit 5

88 © Piero Demichelis 88 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) bit 6

89 © Piero Demichelis 89 Operatori bit-a-bit: esempio car = car & ~ (val << 5 ) Operatore AND (&): esegue loperazione logica AND tra i bit corrispondenti delle due variabili interessate car (val << 5) bit 7

90 © Piero Demichelis 90 Operatori bit-a-bit: esempio Valore finale di car car = car & ~ (val << 5 ) In pratica si è spento il bit in posizione 5 di car car (val << 5)

91 © Piero Demichelis 91 Operatore sizeof Quando si realizzano programmi per i quali deve essere garantita la trasportabilità, può sorgere la necessità di conoscere quanti byte occupa un certo tipo di dato su una particolare macchina: ad esempio, il tipo int può impegnare 2, 4 o 8 byte. L'operatore sizeof può agire o su un tipo, ad esempio, sizeof (double) o su una variabile, un vettore, unespressione, (una struct), ad esempio, sizeof (dato_real) in ogni caso restituisce un intero corrispondente al numero di byte occupato dallargomento. In seguito vedremo numerose e importanti applicazioni di questo operatore.

92 © Piero Demichelis 92 Operatore sizeof Esempio: programma che calcola il massimo valore positivo esprimibile con un numero intero. Con sizeof si ricava il numero di byte su cui è espresso l'intero da cui si risale al numero n di bit e quindi al massimo valore che può essere rappresentato. L'espressione che fornisce il risultato maxint produce un'overflow che non viene segnalato durante l'esecuzione del programma a patto che la compilazione venga effettuata senza attivare opzioni di controllo sulle operazioni aritmetiche.

93 © Piero Demichelis 93 Operatore sizeof #include int num_byte, num_bit, maxint; main() { num_byte = sizeof ( int ); printf (\nSu questa macchina un intero e' espresso su "); printf ("%d byte", num_byte); num_bit = num_byte * 8; maxint = (1 << (num_bit - 1)) - 1; printf (\nIl massimo positivo e' %d", maxint); }

94 © Piero Demichelis 94 Istruzione composta Una sequenza di istruzioni può essere racchiusa tra le parentesi graffe per costituire quella che è nota come istruzione composta Il C considera il blocco di istruzioni che costituiscono l'istruzione composta come se si trattasse di una sola istruzione. { float coeff; int scala, dato1, dato2; printf (\nIntroduci dati interi da elaborare:"); scanf ("%d%d", &dato1, &dato2); coeff = 10.5; scala = 3; } Lo stesso corpo di un programma può essere considerato come un'unica istruzione composta.


Scaricare ppt "INFORMATICA Il linguaggio C. © Piero Demichelis 2 Alfabeto Il vocabolario base del C è costituito dai seguenti simboli: tutte le lettere dellalfabeto."

Presentazioni simili


Annunci Google