c = 2.
Transcript
c = 2.
Fondamenti di Programmazione Variabili e memoria Cos’ è il linguaggio C (1) Sviluppato a partire dal linguaggio B ideato da Thompson Creato all’inizio degli anni ’70 da D. Ritchie ed è diventato uno standard ANSI (American National Standard Institute) nel 1983 (terminato nel 1990) È un linguaggio di programmazione general purpose imperativo a blocchi. È un linguaggio di uso generale ma da sempre legato al sistema operativo UNIX, sul quale è stato sviluppato. Cos’ è il linguaggio C (2) È considerato un linguaggio di alto livello ma non troppo, nel senso che fornisce un insieme ristretto di costrutti di controllo e di parole chiave, ma un insieme ricco di operatori e strutture dati avanzate – − – Offre al programmatore potenza e flessibilità di dimensioni ridotte, può essere appreso velocemente I principali vantaggi sono efficienza, sinteticità e portabilità Cos’ è il linguaggio C (3) Il linguaggio non prevede funzionalità esplicite di I/O, non esistono funzioni READ e WRITE (devono essere incluse tramite specifiche chiamate a funzioni di libreria) Lo standard ANSI ha definito una libreria standard associata al C la quale specifica le funzioni (estensione .h) per l’accesso al sistema operativo (es: leggere e scrivere su file), l’allocazione di memoria, il trattamento delle stringhe. – Le direttive del processore permettono di includere porzioni di codice sorgente esterne ad un dato file Il lessico Alfabeto: utilizzato per scrivere i programmi UNICODE Parole chiave: parole riservate che hanno un significato particolare e non possono essere ridefinite Parole chiave definite dallo standard ANSI auto break case char const continue default do • double • else • enum • extern • float • for • goto • if • int • long • register • return • short • signed • sizeof • static struct switch typedef union unsigned void volatile while Il lessico Identificatori: nomi usati per indicare variabili, funzioni etc. Separatori: caratteri che permettorno di separare o raggruppare parti di codice: ( ) { } [ ] ; , . Operatori: denotano operazioni Letterali: sequenze di caratteri per rappresentari valori di tipi primitivi : 1234 “questa è una stringa” Note sulla sintassi del linguaggio (2) − − − − Nomi (o identificatori): Il C è un linguaggio case sensitive. Ad esempio il carattere “A” è diverso dal carattere “a”, sono due entità diverse e distinte. Un nome può iniziare con una lettera alfabetica e continuare con lettere, cifre numeriche, simbolo di sottolineatura NON inziare un nome con il simbolo di sottolineatura (nomi di sistema) La lunghezza può essere un elemento critico; generalmente la dimensione max è di 32 caratteri Note sulla sintassi del linguaggio (1) Il C è un linguaggio strutturato e la caratteristica che più contraddistingue un linguaggio di questo tipo è rappresentato dai blocchi di codice. Un blocco è un insieme di istruzioni logicamente collegate delimitato da parentesi graffe { } <istruzione>; {<istruzione>; <istruzione>;} Ogni istruzione per essere valida deve essere terminata da un carattere “ ; ” Il lessico Commenti: devono essere aperti e chiusi attraverso l’uso dei simboli /* e */ oppure se di una sola riga preceduti da // Ancora sulla compilazione: Norme di buona programmazione scrivere istruzioni chiare, una per riga evidenziare blocchi di istruzioni con le parentesi graffe anche se consistente di un solo comando utilizzare l’indentazione dei diversi blocchi del programma per una più facile lettura del codice stesso. Programmazione Concetti base: − − Dati: − − − Dati (numeri interi o “reali”; caratteri alfanumerici; dati booleani) Istruzioni (operazioni di input/output, artimetiche o logiche,strutture di controllo) Variabili e costanti (variabilità nel tempo) Tipi (elementari o strutturati) classi di memoria (visibilità) Istruzioni: − istruzioni base strutture di controllo − moduli − Variabili e tipi Variabile: locazione di memoria a cui è dato un nome con cui chiamarla ed utilizzarla (contenitore di dati) programmatore usa il nome senza necessariamente sapere che esso faccia riferimento ad una locazione di memoria Tipo: ogni variabile ha un tipo che indica che genere di dati la variabile può contenere − una variabile può contenere dati di tipo intero (ad es., 15 o 2038), oppure dati di tipo carattere (ad es., ‘a’ o ‘£’) Le dimensioni delle variabili numeriche dipendono dall’architettura dell’elaboratore sottostante Classe di memoria: determina la durata di vita della variabile. Istruzioni base Assegnazioni ed espressioni: − comandi per assegnare un valore ad una variabile direttamente o come valutazione di sequenze di operatori e operandi esempio: interest = amount * 0.07; Moduli I programmi sono spesso abbastanza complessi da dover essere scomposti in “pezzi” più maneggevoli Un modulo consiste di istruzioni per svolgere un certo compito raggruppate insieme in un’unità a cui è dato un nome il nome può essere usato come sostituto dell’intero insieme di istruzioni Vantaggi: risparmio di scrittura, organizzazione, riutilizzo L'inizio del programma main (non Main o MAIN) è una funzione speciale che indica l’inizio dell’esecuzione del programma e deve pertanto essere presente in ogni programma. Le parentesi vuote dopo main significano che la funzione non prende nessun parametro in input. Creazione di variabili Tutte le variabili devono essere dichiarate prima di poterle utilizzare Una dichiarazione di variabile associa un nome alle locazioni di memoria ad essa corrispondenti e specifica il tipo di dati che la variabile conterrà: Tipo Variabile_1, Variabile_2, …; Per esempio, per creare tre variabili che memorizzino il numero di cesti, il numero di uova per cesto ed il numero totale di uova: int numberOfBaskets, eggsPerBasket, totalEggs; Esempio: definire una variabile Inizializzazione di una variabile Operatore di assegnamento è: = int count; count=0 Oppure int count=0; il compilatore non segnala errore se si inizializza una variable con un valore fuori range La parola chiave typedef typedef int integer; crea integer sinonimo di int non crea un nuovo tipo! Costanti Una costante è una locazione di memoria di un dato Il valore immagazzinato non può variare durante l’esecuzione di un programma Costanti carattere : ‘A’ Costanti intere : 23 Costanti con virgola (double) :123.456 , 1.23e2, 100. Costanti stringa: “cane” Costanti simboliche Una costante simbolica è una costante che è rappresentata da un nome Una variabile con valore fissato const float PI=3.14159265; #define PI 3.14159265 Variabili e costanti a = 2; b = 3.5; c = 2.; 0xffffa000 0xffffa001 0xffffa002 0xffffa003 0xffffa004 0xffffa005 0xffffa006 0xffffa007 00000010 Variabili e costanti a = 2; b = 3.5; c = 2.; 0xffffa000 0xffffa001 0xffffa002 0xffffa003 Nota: per brevità le variabili intere 0xffffa004 sono rappresentate 0xffffa005 usando solo 8 bit 0xffffa006 0xffffa007 00000010 Variabili e costanti a = 2; b = 3.5; c = 2.; 0xffffa000 0xffffa001 0xffffa002 00000010 0xffffa003 01000000 0xffffa004 01100000 3.5 = (1 + 0.75)*21 0xffffa005 NOTA: l’esponente è 0xffffa006 rappresentato in eccesso (cap.1,p.19) 0xffffa007 00000000 00000000 Variabili e costanti a = 2; b = 3.5; c = 2.; 2. = (1 + 0)*21 0xffffa002 00000010 0xffffa003 01000000 0xffffa004 01100000 0xffffa005 00000000 0xffffa006 00000000 0xffffa007 01000000 0xffffa008 00000000 0xffffa009 00000000 Variabili e costanti a b c d = = = = 2; 3.5; 2.; ‘f’; f ↔ 102 (6616) 0xffffa003 01000000 0xffffa004 01100000 0xffffa005 00000000 0xffffa006 00000000 0xffffa007 01000000 0xffffa008 00000000 0xffffa009 00000000 0xffffa00a 00000000 Modificatori di tipo I tipi di dato primitivi possono essere estesi con l’uso di alcuni modificatori: − − Di dimensione: short, long Di “valutazione”: unsigned Tipo Abbreviazione Descrizione char Tipo char usato numericamente unsigned char short int unsigned short int short unsigned short long int Tipo short senza segno Intero normale int unsigned int Intero più breve unsigned long unsigned long unsigned long Intero senza segno Intero più lungo Tipo long senza segno Operatori Un operatore è un simbolo che istruisce C di eseguire una operazione su uno o più operandi. Esistono tre classi di operatori: − − − aritmetici (o matematici) logici e relazionali bit a bit. Operatori matematici c = a + b; 0xffffa002 00000010 0xffffa003 01000000 0xffffa004 01100000 0xffffa005 00000000 0xffffa006 00000000 0xffffa007 01000000 0xffffa008 00000000 0xffffa009 00000000 Operatori matematici c = a + b; Nota: nel registro della CPU il numero 2 viene “promosso” a float 0xffffa002 00000010 0xffffa003 01000000 0xffffa004 01100000 0xffffa005 00000000 0xffffa006 00000000 0xffffa007 01000000 0xffffa008 00000000 0xffffa009 00000000 Operatori matematici c = a + b; 0xffffa002 00000010 0xffffa003 01000000 0xffffa004 01100000 0xffffa005 00000000 0xffffa006 00000000 0xffffa007 01000000 0xffffa008 00000000 0xffffa009 00000000 Operatori matematici c = a + b; 0xffffa002 00000010 0xffffa003 01000000 0xffffa004 01100000 0xffffa005 00000000 5.5 = (1 + 0.375)*22 0xffffa006 00000000 0xffffa007 01000000 0xffffa008 10110000 0xffffa009 00000000 Operatori aritmetici unari Opertore Simbolo Azione esempio Incremento ++ Incrementa l’operando di 1 ++x, x++ Decremento -- Decrementa l’operando di 1 --x, x-- Esempio x=10; y=++x; (x=11 e y=11) è diverso da x=10; y=x++; In cui (x=11 e y=10). Precedenze ++, -- massima *, /, % intermedi a +, minima Espressioni con operatori dello stesso livello sono valutati da sinistra verso destra w*x/y*z; w*x/y+z/y; w*x/++y+z/y; Usare le parentesi per rendere chiaro l’ordine di valutazione dell’espressione Non sovraccaricare l’espressione − − Spezzare un espressione complessa in più espressioni Soprattutto se si utilizzano gli operatori (+ +) o (--) Assegnazione: priorità • x=(25-2*(10+(8/2))); • i=j=k=0; = ha priorità più bassa rispetto agli altri operatori ed associa da destra a sinistra Poiché anche l’assegnazione è un operatore si possono scrivere contrazioni: • z=(x=1)+(y=2); Operatori speciali a = 2; b = ++a; 0xffffa002 0xffffa003 00000010 Operatori speciali a = 2; b = ++a; 0xffffa002 00000011 0xffffa003 00000011 Operatori speciali a = 2; b = ++a; 0xffffa002 a = 2; b = a++; 0xffffa003 00000010 Operatori speciali a = 2; b = ++a; a = 2; b = a++; 0xffffa002 00000011 0xffffa003 00000010 Operatori relazionali <op1> = = <op2> <op1> != <op2> 1 se gli operatori sono uguali/ 0 se diversi 1 se gli operatori sono diversi/ 0 se uguali <op1> < <op2> 1 se il 1O è minore del 2o operatore/ 0 altrimenti <op1> > <op2> 1 se il 1O è maggiore del 2o operatore/ 0 altrimenti <op1> <= <op2> 1 se il 1O è minore o uguale del 2o operatore/ 0 altrimenti <op1> >= <op2> 1 se il 1O è maggiore o uguale del 2o operatore/ 0 altrimenti Precedenze: <,<=,>,>= hanno precedenza su = =,!= Operatori logici e precedenze Operatore Precedenz a Valutazione 1, se esp è falsa/0, se vera massima (espr1)&&(espr2) 1, se espr1 e espr2 sono vere/ 0, altrimenti intermedia (espr1)||(espr2) 1, se espr1 o espr2 è vera/ 0, altrimenti minima (!espr) Gli operatori logici binari hanno precedenza inferiore a tutti gli altri operatori binari Programmi e variabili main() { float tc, tf = 90., conv; float offset = 32.; conv = 5./9.; tc = (tf – offset) * conv; } ? 90. ? tc tf conv Programmi e variabili main() { float tc, tf = 90., conv; float offset = 32.; conv = 5./9.; tc = (tf – offset) * conv; } ? 90. ? 32. tc tf conv offset Programmi e variabili main() { float tc, tf = 90., conv; float offset = 32.; conv = 5./9.; tc = (tf – offset) * conv; } ? 90. tc tf 0.555 conv 32. offset Programmi e variabili main() { float tc, tf = 90., conv; float offset = 32.; conv = 5./9.; tc = (tf – offset) * conv; } 32.22 tc 90. tf 0.555 conv 32. offset Test Cosa accade se eseguo il programma? Nulla, perché non ci sono istruzioni di output! Input/Output scanf(“%f”, &tf); Input/Output scanf(“%f”, &tf); 90 Input/Output scanf(“%f”, &tf); 90 = (1+0.40625)26 010000101011010000000000... (1/4 + 1/8 + 1/32) Input/Output scanf(“%f”, &tf); 90 = (1+0.40625)26 010000101011010000000000... 90. Input/Output printf(“%f F = %f C\n”, tf, tc); Input/Output printf(“%f F = %f C\n”, tf, tc); Input/Output printf(“%f F = %f C\n”, tf, tc); 90.000000 F = ... Input/Output printf(“%f F = %f C\n”, tf, tc); 90.000000 F = 32.222222 C... Input/Output printf(“%f F = %f C\n”, tf, tc); 90.000000 F = 32.222222 C > Importanza della rappresentazione tf =(tc – offset) * 5./ 9.; (tc – offset) * 5./ 9; (tc – offset) * 5 / 9; tf = 5 / 9 * (tc – offset); Direttive #include Consente di includere il contenuto di un altro file #define Definisce un simbolo (Attenzione!!!) #ifdef, #ifndef, #else Compilazione condizionale #include #include <stdio.h> per input/output #include <stdlib.h> generazione numeri casuali, exit, time #include <math.h> libreria matematica (con opzione –lm ) − sin(x), cos(x), sqrt(x), exp(x), pow(x,y), log(x), fabs(x), iabs(x)