Variabili e Costanti. Esempio Programma C++ Lezione 1. Direttive al Preprocessore

Documenti analoghi
Variabili e Costanti

Dati due punti sul piano calcolare la loro distanza

Struttura dei programmi e Variabili

Introduzione al linguaggio C

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Le variabili nel linguaggio C

Struttura di un programma C++

Lezione 5: Introduzione alla programmazione in C

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

I Fondamenti del Linguaggio

L AMBIENTE CODE BLOCKS E L IO

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

Laboratorio di Informatica I

Introduzione alla programmazione in linguaggio C

Dichiarazioni e tipi predefiniti nel linguaggio C

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

L AMBIENTE CODE BLOCKS E L IO

Introduzione al linguaggio C Primi programmi

1

Variabili e Funzioni. Informatica 1 / 19

Variabili. Tipi di dati di base. Variabili. Variabili

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Il linguaggio C. Puntatori e dintorni

Primi programmi in C

La sintassi del C APPENDICE H

Puntatori in C Lucidi della Pof.ssa Pazienza

Il linguaggio C. Notate che...

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 5 31/10/2013

Quando è necessario elaborare una certa quantità di dati omogenei si possono usare variabili indicizzate: int a0, a1, a2;

Informatica. Stefano Lodi. 16 novembre in linguaggio C

Linguaggio C - sezione dichiarativa: costanti e variabili

Introduzione alla programmazione. Alice Pavarani

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Manualistica 01 Variabili e costanti

Costanti e Variabili

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

Perché il linguaggio C?

Sintassi: Per la dichiarazione di variabili dei tipi fondamentali:

Manualistica 1 Variabili e costanti

Variabili e input/ Alessandra Giordani Lunedì 18 marzo

Laboratorio di Informatica

Qualsiasi programma in C++ segue lo schema:

Informatica Applicata

Laboratorio di informatica Ingegneria meccanica

Il C nel C++ Struttura di un linguaggio. regole per la definizione i simboli. regole per la composizione dei simboli

Struttura di un linguaggio

Verso i puntatori: Cosa è una variabile?

Informatica/ Ing. Meccanica/ Ing. Edile/ Prof. Verdicchio/ 02/04/2014/ Appello straordinario/ Foglio delle domande / VERSIONE 1

ciclo di vita della soluzione (informatica) di un problema

Tipi di dato semplici

Qualsiasi programma in C++ segue lo schema: Variabili

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

Corso Programmazione

Perché il linguaggio C?

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Introduzione al linguaggio C Puntatori

Introduzione al Linguaggio C

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

Caratteristiche di un linguaggio ad alto livello

Precisazione sui tipi in ANSi C

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

I puntatori. DD Cap.7 pp KP Cap.6 pp

Cominciamo ad analizzare la rappresentazione delle informazioni... di Cassino. C. De Stefano Corso di Fondamenti di Informatica Università degli Studi

Corso di Informatica A.A

I/O da tastiera e direttive processore. Alessandra Giordani Lunedì 3 maggio

C++ funzioni Alberto Ferrari. Alberto Ferrari Programmazione di applicazioni SW

Assegnazione di una variabile

Il linguaggio C. Notate che...

Corso di Fondamenti di Informatica Università degli Studi di Cassino

Identificatori. Fondamenti di Informatica e laboratorio Intro C

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Introduzione al C. Lezione 1 Elementi. Rossano Venturini. Pagina web del corso

Il primo programma C. Un programma utile. Compilazione & linking con il compilatore GNU. Introduzione alla programmazione in linguaggio C

Unità Didattica 1 Linguaggio C. Fondamenti. Struttura di un programma.

Programmazione C. Puntatori Array come puntatori

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

Linguaggio C Variabili e tipi di dato

Per fare riferimento ad un elemento, specificare il nomedel vettore. numerodi posizione(indice)

Primi esempi di programmi. Il tipo int Le variabili Altri tipi interi Operatori di assegnazione

Variabili e assegnazione

C: panoramica. Violetta Lonati

Sono variabili il cui valore corrisponde ad un indirizzo di memoria. Puntatori

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Tipi e Valori. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Esercizi Programmazione I

Alfabeto ed elementi lessicali del linguaggio C

#include <stdio.h> /* l esecuzione comincia dalla funzione main */ int main()

Tipi di dato semplici

Variabili intere, funzioni e input/ Alessandra Giordani Lunedì 19 marzo

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo

Il primo programma C++

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

Puntatori. Fondamenti di Programmazione

Transcript:

Esempio Programma C++ Lezione 1 Variabili e Costanti Gestione archivio di una libreria. Il programma deve periodicamente aggiornare il file di magazzino e fornire dati sulle vendite. legge la lista dei volumi venduti ordina la lista per autore e titolo conta il numero di copie vendute di ciascun volume e cancella duplicati aggiorna il file di magazzino stampa i risultati LASD 1 Blundo Carlo LASD 2002/03 4 Struttura di un Programma C++ Un programma descrive una sequenza di azioni ogni azione è descritta da una espressione un insieme di espressioni seguite da ; è un istruzione fiespressione = più piccola unitàdi programma di significato autonomo Esempi di espressioni fidichiarazioni (int i;) fiassegnamento (i = 7+1;) fiinput/output (cout << i;) ficontrollo di flusso (for, while, if, etc.) Blundo Carlo LASD 2002/03 2 Esempio Programma C++ #include <iostream> using namespace std; void leggi() { cout << sto leggendo ; } void ordina() { cout << sto ordinando ; } void conteggia() { cout << sto contando ; } void stampa() { cout << sto stampando ; } int main() { leggi(); ordina(); conteggia(); stampa(); return 0; } Blundo Carlo LASD 2002/03 5 Struttura di un Programma C++ Istruzioni raggruppate in unità logiche dette funzioni Una funzione consiste di quattro parti tipo di dati da restituire nome della funzione lista degli argomenti corpo della funzione Ogni programma deve contenere una funzione main() Direttive al Preprocessore #include <iostream> è una direttiva al preprocessore include il contenuto del file iostream.h nel file del programma prima della compilazione Se il file da includere non ha estensione fa parte della libreria standard le direttive al preprocessore sono istruzioni eseguite prima della compilazione #include, #define, #ifdef, #ifnotdef, #else, #endif, #pragma sono tutte direttive al preprocessore # deve essere il primo carattere della linea non c è ; al termine dell istruzione Blundo Carlo LASD 2002/03 3 Blundo Carlo LASD 2002/03 6 1

Spazi dei nomi Ogni variabile è definita all interno di un namespace Il nome della variabile è formato dal nome del namespace e dall identificatore della variabile Dati Un dato ha un tipo ed un indirizzo L indirizzo specifica dove il dato risiede in memoria Il tipo di un dato specifica come il dato è memorizzato e quali sono le operazioni legali su di esso std::cout << ciao ; L istruzione using namespace std specifica il namespace di default Se non specificato l identificatore della variabile viene ricercato all interno del namespace di default indirizzo tipo int: 4 byte rappresentazione in complemento a 2 Blundo Carlo LASD 2002/03 7 Blundo Carlo LASD 2002/03 10 Compilazione ed Esecuzione di un Programma C++ Per compilare g++ (-g) (-o out) (-c) file1.c file2.c file3.cpp (-llib) -g ---> debugger -o ---> eseguibile in out (per default in a.out) -c ----> compila ma non linka i file.o -l ----> linka libreria lib -I ----> modifica path di ricerca nel file system Il compilatore opera due passi compilazione linkaggio Il compilatore esegue controlli lessicali e sintattici sul codice del programma Blundo Carlo LASD 2002/03 8 Indirizzo di un Dato La memoria è una sequenza di celle un bit per cella Le celle sono raggruppate in gruppi byte (8 bit) e word (4-8 byte) ad ogni byte è assegnato un numero d ordine (indirizzo) il byte è la minima unità di memoria indirizzabile L indirizzo di un dato è l indirizzo del primo byte in cui è contenuta la rappresentazione del dato Dati e istruzioni sono memorizzati nella stessa memoria (modello di Von Neumann) Blundo Carlo LASD 2002/03 11 Elementi Essenziali del Linguaggio Dati su cui operare Operazioni per manipolare i dati Istruzioni per controllare il flusso del programma Librerie per implementare operazioni non predefinite Tipo di un Dato Il Tipo di un dato specifica quanti byte sono necessari a rappresentarlo come il dato è rappresentato quali operazioni sono possibili su quel dato come tali operazioni sono realizzate Blundo Carlo LASD 2002/03 9 Blundo Carlo LASD 2002/03 12 2

Tipi di Dati Predefiniti Variabili Simboliche Tipo char int short long float double long double Dimensione 1 byte 1 word dipende dalla macchina dipende dalla macchina 1 word 2 word 3-4 word Utilizzo caratteri o piccoli interi interi reali in singola precisione reali in doppia precisione reali in multipla precisione Dato memorizzato ed indirizzabile tramite l indirizzo si può recuperare il dato e modificarlo Si definisce anche oggetto Una variabile è identificata da un nome (identificatore) fornito dal programma Ad un identificatore sono associati un indirizzo ed un tipo specificati al momento della definizione del dato char ch; ch identifica il valore di un area di memoria lunga 1 byte, localizzata ad un certo indirizzo memorizzata come un carattere (codice ASCII) Blundo Carlo LASD 2002/03 13 Blundo Carlo LASD 2002/03 16 Costanti Letterali Dato memorizzato ma non indirizzabile ha comunque un tipo int i = 2; // 2 costante letterale Costanti letterali intere sono signed int per default fi possono essere rappresentate in decimale, ottale o esadecimale fi possono anche essere di altro tipo 12, 010, 0xFF, 128u, 3e1, 1024Ul Costanti letterali in virgola mobile sono double per default (possono anche essere di altro tipo) 1.0f, 3.14l, 3e1, 1.4E-2 Blundo Carlo LASD 2002/03 14 Identificatori Il nome della variabile può contenere lettere, cifre o _ Il compilatore distingue tra maiuscole e minuscole Il primo carattere deve essere una lettera oppure _ Nessun limite di lunghezza Stili più diffusi variabili in minuscolo, tipi con iniziale maiuscola, costanti in maiuscolo nomi composti voti_esame votiesame Blundo Carlo LASD 2002/03 17 Costanti Letterali L indica che a è un wide-character Costanti letterali carattere stampabile sono scritte tra apici A, b,.,?, L a I caratteri non stampabili, gli apici ed il backslash sono rappresentate da sequenze di escape \n, \t, \, \\, \0 (null), \12 (return) Costanti letterali stringhe sono scritte tra doppi apici ciao mondo, L città Una stringa è un array di caratteri seguito dal carattere \0 Blundo Carlo LASD 2002/03 15 Variabili Simboliche Ad ogni variabile sono associati R-value valore della variabile L-value indirizzo della variabile ch = ch + 0 ; l espressione a destra dell operatore considera il valore della variabile l espressione a sinistra dell operatore considera l indirizzo della variabile. È possibile specificare la stessa variabile su entrambi i lati di un assegnamento Blundo Carlo LASD 2002/03 18 3

Definizione di Variabili Simboliche introduce il nome ed il tipo di una variabile il compilatore alloca memoria sufficiente a contenere il dato ed assegna l indirizzo di questa memoria all identificatore della variabile char ch; nome tipo indir. ch char Una variabile può essere definita una sola volta in tutto il programma Blundo Carlo LASD 2002/03 19 Definizioni ed Inizializzazioni Il valore assegnato ad una variabile al momento della definizione è arbitrario È possibile assegnare un valore iniziale alla variabile risultato di una qualunque espressione char ch = a ; int i(10); double prezzo_vendita(prezzo*sconto); char c = c; // cosa fa? È possibile concatenare più definizioni sulla stessa linea di codice double prezzo = 100.5, sconto = 0.15; Blundo Carlo LASD 2002/03 22 Dichiarazione di Variabili Simboliche introduce il nome di una variabile che è stata definita da qualche altra parte nel programma il compilatore non alloca memoria extern char ch; nome tipo indir. ch char ---- Una variabile può essere dichiarata più volte nello stesso programma Blundo Carlo LASD 2002/03 20 Inizializzazioni di Default È pericoloso definire una variabile senza inizializzarla È vietato definire oggetti di tipo classe non inizializzati Le variabili globali definite al di fuori delle funzioni sono inizializzate per default a 0 Le variabili locali non sono inizializzate Tutti i tipi predefiniti possono essere inizializzati a 0 da un costruttore di default int ival = int(); // inizializza ival a 0 vector<int> ivec(10); /* definisce un vettore di 10 interi inizializzati a 0 */ Blundo Carlo LASD 2002/03 23 Dichiarazioni e header file In un progetto strutturato su più file in ogni file vengono dichiarate (o definite) tutte le variabili utilizzate La stessa variabile è dichiarata in file diversi Se modifichiamo il tipo della variabile dobbiamo modificare tutte le dichiarazioni Per agevolare la manutenzione del codice conviene concentrare le dichiarazioni delle variabili in un solo file Le variabili sono dichiarate in un header file Tutti i file del progetto includono l header file Per modificare il tipo di una variabile basta modificare l header file Blundo Carlo LASD 2002/03 21 Costanti Simboliche Dati memorizzati ed indirizzabili che non possono essere modificati (variabili a sola lettura). const int buffersize = 512; L uso delle costanti simboliche aumenta notevolmente la leggibilità del codice Il compilatore non permette di modificare il valore di una costante simbolica definire una costante simbolica non inizializzata assegnare l indirizzo di una costante simbolica ad un puntatore che non sia puntatore a costante Blundo Carlo LASD 2002/03 24 4

Puntatori Una variabile di tipo puntatore contiene un indirizzo fitramite una variabile puntatore si può referenziare indirettamente una variabile nome tipo indir. ptr char* Un puntatore può contenere l indirizzo di un oggetto o di una funzione Blundo Carlo LASD 2002/03 25 Inizializzazioni Illegali Il C++ è un linguaggio strongly typed Il compilatore controlla che in ogni assegnazione o inizializzazione l R-value del lato destro sia dello stesso tipo dell L-value del lato sinistro Sono errate tutte le istruzioni che assegnano ad un puntatore l R-value di una variabile o l indirizzo di una variabile di tipo diverso int i = 24; int *ip1 = &ip; /* ERRORE */ char *cp = ip; int *ip2 = i; // Errato ma consentito da molti compilatori Blundo Carlo LASD 2002/03 28 Puntatori Un puntatore viene definito facendo precedere l identificatore dall operatore di dereferenziazione (*) int *ip1, *ip2; // ip1 e ip2 puntano ad int unsigned char *ucp; // ucp punta ad un char senza segno float fp, *fp1; // fp è un float, fp1 punta ad un float char* cp, cp1; // cp punta a char, cp1 è un char La dimensione di un puntatore ad un oggetto è sufficiente a contenere un indirizzo fi 4 byte su macchine a 32 bit Il tipo di un puntatore ad un oggetto è il tipo della variabile puntata fi tutti i puntatori ad oggetti hanno la stessa dimensione Blundo Carlo LASD 2002/03 26 Indirizzamento Indiretto (Lettura) Accede al valore di un oggetto tramite un puntatore che indirizza l oggetto. Si usa l operatore (*) int i = 1024; // ip contiene l indirizzo di i int k = *ip; // k = 1024 k = ip; ip = i; Blundo Carlo LASD 2002/03 29 Inizializzazioni di Puntatori Un puntatore può essere inizializzato con l indirizzo (L-value) di una variabile dello stesso tipo Per ottenere l L-value di una variabile si applica l operatore di indirizzo (&) int i = 1024; int *p = &i; int *ip = p; char *cp = 0; // inizializza a NIL Indirizzamento Indiretto (Scrittura) Tramite l operatore di indirizzamento indiretto è possibile assegnare un valore ad un oggetto indirettamente int i = 1024; // ip punta ad i *ip = k; // i = k *ip = abs(*ip); // i = abs(i) *ip = *ip + 1; // i = i + 1 Blundo Carlo LASD 2002/03 27 Blundo Carlo LASD 2002/03 30 5

Puntatori a Puntatori Un puntatore può contenere l indirizzo di un puntatore Se dereferenziato restituisce un puntatore int i = 1024; // ip punta ad i int **ipp = &ip; **ipp = 100; // i = 100 ip = ipp; Cast Il cast cambia il tipo di una variabile il contenuto della memoria resta inalterato cambia la quantità di memoria letta e il modo in cui viene interpretata Il cast è un operazione pericolosa ed il compilatore non la esegue mai automaticamente int i = 1000; char c = *(char *)ip; double d = *(double *)ip; // legge solo primo byte di i // legge 4 byte oltre i Blundo Carlo LASD 2002/03 31 Blundo Carlo LASD 2002/03 34 Puntatori Generici Un puntatore generico è di tipo void* ad un puntatore generico possono essere assegnati indirizzi di oggetti di qualsiasi tipo Un puntatore generico non può essere utilizzato per accessi alla memoria non ha le informazioni sul tipo di oggetto indirizzato int *pi; double *pd; void *pv = pi; pv = pd; *pv = 3.14; I puntatori generici sono usati per passare ad una funzione puntatori di tipi differenti o confrontare indirizzi di memoria Blundo Carlo LASD 2002/03 32 Puntatori a Costante Un puntatore a costante può essere utilizzato solo per accedere indirettamente ad un oggetto in lettura non in scrittura const double *pc; L indirizzo di una costante simbolica può essere assegnato solo ad un puntatore a costante const double d = 3.14; pc = &d; // pc punta alla costante d *pc = *pc + 1;, cerca di modificare d double d1 = 1.2; pc = &d1; // pc punta alla variabile d1 *pc = d1*2; /* ERRORE, cerca di modificare d1 tramite pc */ Blundo Carlo LASD 2002/03 35 Aritmetica dei Puntatori È possibile effettuare delle manipolazioni sui valori dei puntatori L unità di misura nelle manipolazioni dei puntatori è la dimensione del tipo del puntatore int i = 100; // ip punta ad i *ip = *ip + 2; // i = i + 2 ip = ip + 2; // ip punta 8 byte più avanti di i int *ip2 = ip - 4; // ip2 punta 16 byte dietro ad ip int k = ip - ip2; // k = 4 Blundo Carlo LASD 2002/03 33 Puntatori Costanti Un puntatore costante non può essere modificato ma può essere utilizzato per modificare l oggetto puntato Un puntatore a costante può essere modificato ma non può essere usato per modificare il contenuto dell oggetto puntato int errnum; int *const err = &errnum; *err = *err + 1; err = err + 1; // incrementa il valore di errnum, modifica err Blundo Carlo LASD 2002/03 36 6

Puntatori Costanti a Costante Un puntatore costante a costante non può essere modificato e non può essere utilizzato per modificare l oggetto puntato const int passo = 1; const int *const ptr = &passo; Operazioni su Variabili Riferimento Ogni operazione sulla variabile riferimento equivale ad una operazione sull oggetto associato Equivale a definire un puntatore costante senza usare la sintassi dei puntatori ref = ref + 1; // incrementa i di 1 Non è possibile modificare la variabile a cui il riferimento è associato Blundo Carlo LASD 2002/03 37 Blundo Carlo LASD 2002/03 40 Utilizzo dei Puntatori Costanti I puntatori a costante vengono usati per indirizzare delle variabili che non devono essere modificate passaggio per riferimento ad una funzione senza side effect I puntatori costanti sono utilizzati per legare un puntatore ad un oggetto ed impedire che possa essere spostato indirizzamento di informazioni relative alla gestione degli errori Blundo Carlo LASD 2002/03 38 Utilizzo Variabili Riferimento Sono usate per passare argomenti ad una funzione per riferimento la funzione può operare sugli argomenti passati per riferimento senza usare la sintassi dei puntatori il codice è più chiaro e leggibile void scambia(int& x, int& y) { int tmp = x; x = y; y = tmp; } void scambia(int* x, int* y) { int tmp = *x; *x = *y; *y = tmp; } Blundo Carlo LASD 2002/03 41 Variabili Riferimento (Indirizzo) Una variabile di tipo riferimento fornisce un alias per il nome della variabile con cui è stata inizializzata int i = 1; int &ref = i nome tipo indir. i ref int int& Costanti Riferimento È possibile definire variabili riferimento costanti non consentono di modificare il valore dell oggetto associato const int& cri = i; cri = cri + 1; Una variabile riferimento deve essere inizializzata Blundo Carlo LASD 2002/03 39 Blundo Carlo LASD 2002/03 42 7

Definizioni di Variabili Riferimento In una lista di definizioni ogni riferimento deve essere preceduto da (&) int i; int &ip1 = i, &ip2 = i; int &ip3 = i, ip4 = i; // ip4 non èun riferimento Un riferimento ad una variabile è inizializzato con l L-value di una variabile dello stesso tipo int& ri = i; char c = a ; int& ri2 = c; Blundo Carlo LASD 2002/03 43 Inizializzazione di Riferimenti con Variabili Temporanee Un riferimento costante può essere inizializzato con costanti letterali e variabili di tipo diverso ma compatibile Gli oggetti non indirizzabili vengono memorizzati in variabili temporanee prima di essere utilizzati per l inizializzazione La variabile temporanea può essere convertita Le operazioni hanno effetto solo sulla variabile temporanea const int &ir = 1024; double d1, d2; // int temp = 1024; const int &ir = temp; // double temp = d1+d2; const double &d = d1 + d2; // const double &d = temp; const int &ci = d1; // int temp = d1; const int &ci = temp; Blundo Carlo LASD 2002/03 44 8