05 1 intro-struttura

42
1 Introduzione al C++ e al C Storia del linguaggio, struttura dei programmi, funzioni, librerie, compilazione e collegamento, macchina astratta, variabili, istruzioni, commenti, assegnamento, espressioni aritmetiche elementari

description

 

Transcript of 05 1 intro-struttura

Page 1: 05 1 intro-struttura

1

Introduzione al C++ e al CStoria del linguaggio, struttura dei

programmi, funzioni, librerie, compilazione e collegamento, macchina astratta, variabili,

istruzioni, commenti, assegnamento, espressioni aritmetiche elementari

Page 2: 05 1 intro-struttura

2

Breve storia del linguaggio C• Il linguaggio C:

– Evoluzione (Dennis Ritchie) di linguaggi precedenti (tra cui il B)

– Usato per sviluppare il sistema operativo UNIX• Motivo iniziale del suo successo

– Gran parte dei sistemi operativi oggi sono scritti in C (C)

– Portabile tra calcolatori differenti– Consolidato già intorno agli anni ’70

• Standardizzazione (importante in Informatica):– Anni ’80: molte varianti leggermente diverse e

incompatibili– 1989: comitato per la standardizzazione

(aggiornato ’99)

Page 3: 05 1 intro-struttura

Breve storia del C++• 1979 Bjarne Stroustrup

ispirato dal linguaggio Simula67 inventa "C with Classes"

• 1983 nasce il nome C++• 1985 pubblicato "The C++

Programming Language"• 1990 "The Annotated C++,

Reference Manual" esce Borland Turbo C++

• 1998: "C++ ISO/IEC 14882:1998" standard

• 2011 nuovo standard C++ (C++11)

3

http://www.cplusplus.com/info/history/

Page 4: 05 1 intro-struttura

Principali differenze tra C e C++• Il linguaggio C offre tutto ciò che serve per codificare

algoritmi• I suoi concetti riflettono da vicino l'architettura del

calcolatore• Il principale obiettivo del C è garantire l'esecuzione

efficiente dei programmi, lo sfruttamento completo delle potenzialità del calcolatore

• Il C++ offre primitive di programmazione più astratte, meno aderenti alle caratteristiche della macchina

• Contiene caratteristiche più potenti, ma talvolta anche più complesse

• Mira a non sacrificare l'efficienza in nome della maggior astrazione e potenza espressiva

4

Page 5: 05 1 intro-struttura

Le differenze principaliC C++

Stile di programmazione procedurale Più di uno stile: procedurale e ad oggetti

Basso livello (vicino all'architettura) Basso e alto livello

Orientamento alle funzioni Orientamento alle funzioni e agli oggetti

Tipi predefiniti e definiti dall'utente Tipi predefiniti, definiti dall'utente e classi

Dati accessibili Meccanismo di protezione dei dati

Funzioni e dati definiti separatamente Funzioni e dati definibili congiuntamente

Operatori di significato fisso Operatori "sovracaricati"

Input output di basso livello Input output ad oggetti

Tipi reference

Gestione delle eccezioni predefinita

Gestione dei nomi tramite namespace

E molte altre ancora di minor entità…

Page 6: 05 1 intro-struttura

Il nostro primo programma C++

> !!Hello World!!

// The first C++ program

#include <iostream>

using namespace std;

int main() {

cout << "!!Hello World!!" << endl; // prints !!Hello World!!

return 0;

}

Page 7: 05 1 intro-struttura

// The first C++ program

• Si tratta di un commento• Commento = parte di un programma ignorata

dal compilatore• Serve per migliorare la leggibilità• Due formati

– Multilinea /* … */– Mono linea //

• Prestare attenzione nell'innestarli

Page 8: 05 1 intro-struttura

#include <iostream>• # denota istruzioni dirette (direttive) al preprocessore• Sono eseguite prima di compilare il programma• I programmi C++ consistono di moduli chiamati funzioni, il

programmatore può:– creare egli stesso le sue funzioni– usare le funzioni già offerte dall'ambiente di programmazione (dette

"di libreria")– organizzare le proprie funzioni in librerie

• #include dichiara l'uso di una libreria di funzioni – <iostream> è una libreria che contiene oggetti e funzioni per

comunicare con l'utente• Le funzioni di libreria sono scritte con accuratezza, sono efficienti e

sono portabili– se esiste già una funzione, è inutile riprogrammarla

Page 9: 05 1 intro-struttura

int main() { … corpo … }• I programmi C++ contengono la definizione di una o più funzioni,

una delle quali deve essere il main()– Nell'esempio, c’è la definizione della sola funzione main()

• L'esecuzione del programma coincide con l'esecuzione della funzione main()

• Le parentesi tonde ( ) dopo il nome "main" indicano che è una funzione

• Le funzioni “restituiscono” un valore– int significa che il main restituisce un valore intero• Ogni funzione ha un corpo che costituisce la definizione della

funzione. Raccoglie le istruzioni che specificano il “comportamento” della funzione

• Il corpo è incluso in un blocco, racchiuso in parentesi graffe

9

Page 10: 05 1 intro-struttura

10

La comunicazione con l'utente• cout << "!!!Hello World!!!" << endl;• È una istruzione di stampa

– L’intera riga si chiama istruzione (o statement), termina con ;– L'istruzione visualizza la sequenza di caratteri tra "…" e va a capo

• cout rappresenta lo stream di output – Normalmente associato al terminale video, dove il programma stampa le

informazioni• L’operatore << inserisce informazioni nello standard output

– "!!!Hello World!!!" è una sequenza di caratteri– endl è un simbolo speciale (manipulator) che assicura che

tutti i caratteri generati dal programma fino a quel punto siano emessi in output e provoca l’andata a capo

• cout, << e endl sono definiti nella libreria iostream

Page 11: 05 1 intro-struttura

Il valore di ritorno di una funzione• return 0;

– È un modo di terminare una funzione– Indica il valore “restituito” come effetto

dell’esecuzione– È compatibile con la dichiarazione int main() – return 0 in questo caso significa che il programma

è terminato senza anomalie• È una convenzione: 0 indica la fine di una esecuzione

corretta. Normalmente, con un valore di ritorno -1 si indica invece la terminazione in caso di errori

• È una convenzione tipica della funzione main(). Per le altre funzioni normalmente si usano valori di ritorno legati al significato della funzione

Page 12: 05 1 intro-struttura

Prime considerazioni

• C++ è un linguaggio complesso• Ci si può fermare alla comprensione del suo

funzionamento "pratico"• Si può cercare di capire a fondo perché

funziona in un certo modo• Perfino il programma Hello World ha aspetti

non banali

Page 13: 05 1 intro-struttura

Gli operatori di input-output• Perché << è un operatore?• "+" è un operatore, ma "<<" ??• E' invece proprio cosi

– cout << "!!!Hello World!!!" – cout è l'operando di sinistra (un oggetto)– "!!!Hello World!!!" è l'operando di destra– cout << "!!!Hello World!!!" è un'espressione – Come tale ha un valore, che è …. l'oggetto cout stesso– Per questo si può scrivere << endl dopo l'espressione cout <<

"!!!Hello World!!!" – E come scrivere 1+2+3 che equivale a (1+2)+3– NB: il ";" finale trasforma l'espressione in un'istruzione !

• facile da capire eh ;-)

Page 14: 05 1 intro-struttura

Check this out!#include <iostream>

using namespace std;

int main() {

(cout << "!!!Hello World!!!" ) << endl;

return 0;

}

Le parentesi funzionano come per un operatore

aritmetico!!

Page 15: 05 1 intro-struttura

15

Librerie e collegatore• Quando si usa una funzione o un operatore (<<

nell' esempio), il collegatore (linker) la cerca nelle librerie– nella libreria standard, ed eventualmente in quelle

indicate da una apposita direttiva al preprocessore• La funzione è copiata dalla libreria e inserita nel

programma oggetto• Se c’è un errore nel nome della funzione o

dell'operatore il collegatore lo rileva (non riesce a trovarla)

Page 16: 05 1 intro-struttura

Visibilità e spazio dei nomi• Quando un programma è grande, può capitare che lo stesso

"nome" venga dichiarato più volte, con significati diversi• E' importante capire in che parte del codice del programma o delle

librerie un nome è visibile• TERMINOLOGIA

– scope = parte di codice in cui un nome ha un determinato significato– namespace: un particolare tipo di scope che può raccogliere anche

nomi definiti in diverse librerie• Il nome cout appartiene al namespace delle librerie standard • Andrebbe scritto come std::cout (è un po' come specificare il

"cognome" del "nome proprio" cout)• La dichiarazione using namespace std; permette di usare il nome

cout senza specificare il namespace di appartenenza

Page 17: 05 1 intro-struttura

Somma di due interi

• Requisiti: scrivere un programma che chiede all’utente due numeri interi e ne stampa la somma

• Strategia di risoluzione– Dati: i due numeri e la loro somma– Algoritmo: chiedere in sequenza all’utente i dati e

poi stampare la somma

Page 18: 05 1 intro-struttura

> Enter first integer> 45> Enter second integer> 72> Sum is 117

Somma interi// Sum of two integers #include <iostream>using namespace std;

int main(){ int integer1, integer2, sum; // declaration cout << "Enter first integer" << endl; // prompt cin >> integer1; // read an integer cout << "Enter second integer" << endl; // prompt cin >> integer2; // read an integer sum = integer1 + integer2; // assignment cout << "Sum is: " << sum << endl; // print sum return 0; // successful end }

Page 19: 05 1 intro-struttura

Le variabili• int integer1, integer2, sum;

• Dichiarazione delle variabili– locazioni di memoria dove sono memorizzati i dati manipolati dal

programma• int

– specifica il tipo delle variabili– le variabili conterranno numeri interi (int)

• integer1, integer2, sum – nomi di variabili definiti dal programmatore

• Le dichiarazioni devono apparire prima delle istruzioni che usano le variabili– le variabili prima si dichiarano, poi si usano

Page 20: 05 1 intro-struttura

La comunicazione con l'utente• cin >> integer1;

– L'oggetto CIN rappresenta lo stream di input– Normalmente è collegato con la tastiera, cioè contiene i caratteri che

l'utente digita– L'operatore >> denota la lettura (estrazione) di caratteri dallo stream di

input– La lettura è "formattata" cioè ignora spazi bianchi e tabulazioni, termina

con l'invio del carattere di ritorno (return)

• integer1 indica la variabile che contiene il valore inserito dall'utente– cin >> interrompe il flusso di esecuzione (bloccante)– L’utente risponde digitando un numero e premendo enter

(invio) per far ripartire l’esecuzione

Page 21: 05 1 intro-struttura

• = (operatore di assegnamento )– Assegna un valore a una variabile

• È un operatore binario (cioè che ha due operandi):– Operando 1: il valore di sinistra (lvalue)– Operando 2: il valore di destra (rvalue)

• sum = integer1 + integer2;– sum è l'lvalue e assume il valore dell'rvalue (l'espressione

integer1 + integer2)

Assegnamento

Page 22: 05 1 intro-struttura

Ancora sull’output• cout << "Sum is: " << sum;• sum indica la variabile il cui valore sarà visualizzato a terminale• Intere espressioni possono essere argomenti di <<

– Ad esempio, si poteva stampare direttamente il calcolo:cout << "Sum is: " << integer1+integer2;

• L'operatore << può avere un numero qualsiasi di parametri, sia variabili, sia sequenze di caratteri (literal)

• Ad esempio, si poteva fare:– cout << "Sum of " << integer1 << "and" << integer2 << "is: " << integer1+integer2;

• Le espressioni che si vogliono stampare si concatenano nell'ordine desiderato mediante l'operatore <<

Page 23: 05 1 intro-struttura

Il “livello” del linguaggio • Il C++ è un linguaggio di livello più alto rispetto al

linguaggio assembler– L’uso di funzioni è il segno della maggiore astrazione

• Permette di non dettagliare ogni volta tutte le operazioni• Permette di scrivere algoritmi sintetici

– Un algoritmo sintetico è tipicamente più comprensibile per il lettore umano

– Compromesso tra la pedante esattezza del linguaggio macchina e la sintesi estrema dell’intuizione umana

• (x+y)-(z+w)• Molte istruzioni di basso livello che “fanno perdere di vista

l’obiettivo”

Page 24: 05 1 intro-struttura

Il programma (x+y)-(z+w) in C++ e in assembler

0 READ X 1 READ Y 2 READ Z 3 READ W 4 LOADA Z 5 LOADB W 6 ADD 7 STOREA RIS 8 LOADA X 9 LOADB Y10 ADD11 LOADB RIS12 DIF13 STOREA RIS14 WRITE RIS15 HALT16 ...int....(X).....17 ...int....(Y).....18 ...int....(Z).....19 ...int....(W).....20 ...int...(RIS)...

int main(){

int x, y, z, w;cin >> x >> y >> z >> w;cout << "Risultato: " << (x+y)-(z+w);return 0;

}

La variabile ausiliaria RIS in C++ non è esplicitata: è il compilatore che si fa carico della gestione dei risultati intermedi della valutazione dell’espressione(linguaggio di livello più alto)

Page 25: 05 1 intro-struttura

La macchina astratta C++

Standard Output

di solito è il video

di solito è la tastiera

CPUStandard Input

BUS

RAM

aBplutosomma_1...

Algoritmi e programmi sono definiti in funzione del loro esecutore

L’esecutore dei programmi C++ è una macchina astratta

Page 26: 05 1 intro-struttura

Standard I/O

• Un programma ha due periferiche “standard” di ingresso e uscita– stdin : standard input (tastiera)– stdout : standard output (terminale video)

che possono essere viste come “sequenze” (stream) di byte, normalmente interpretati come caratteri

Page 27: 05 1 intro-struttura

Memoria• Divisa in celle elementari• Ogni cella può contenere un dato• I dati possono essere

– Numeri– Caratteri– Stringhe (sequenze di caratteri in celle adiacenti)– …

• Semplificazioni / idealizzazioni / approssimazioni / astrazioni– Nessun limite al numero delle celle– Nessun limite ai valori numerici contenuti

Page 28: 05 1 intro-struttura

Le variabili in memoria centrale

• Variabili: corrispondono a locazioni di memoria– Ogni variabile ha

• un nome (identificatore)• un tipo (insieme dei valori e delle operazioni ammissibili)• una dimensione• un indirizzo (individua la cella [o le celle] di memoria)• un valore

– La lettura non modifica i valori delle variabili– Inserendo un nuovo valore in una variabile (per

assegnamento o con una cin >>), si sostituisce (e quindi si distrugge) il vecchio valore

45integer1

cella di memoria

nome della variabile(il suo identificatore) valore della

variabile

Page 29: 05 1 intro-struttura

Le variabili• Rappresentano i dati su cui lavora il programma• Sono denotate mediante identificatori:

a, B, pluto, somma_1, …• Variabili diverse devono avere identificatori diversi• A una variabile ci si riferisce sempre con lo stesso

identificatore• Durante l’esecuzione del programma le variabili hanno

sempre un valore– Può essere significativo o non significativo, ma c’è– Perciò le variabili devono essere sempre inizializzate in

modo opportuno [per evitare errori e sorprese]

Page 30: 05 1 intro-struttura

Identificatori e parole chiave• I nomi di variabili sono identificatori:

– Sequenze di lettere, cifre, underscore ‘_’,– Case sensitive

• cioè “sensibili al maiuscolo”: ‘A’ è diverso da ‘a’– Il primo carattere deve essere una lettera o underscore– Esempi:

• h12 i a_modo_mio identificatoreValidoPerUnaVariabileC DopoDomani nonce2senza4 v01 v09 v10 v17 V17 h7_25 lasciapassareA38 b8ne

• Ci sono “parole-chiave” (o keyword) associate a elementi del linguaggio– Non si possono usare come nomi di variabili– Occorre ricordarle a memoria

• non sono tantissime, non è difficile

Page 31: 05 1 intro-struttura

Le parole chiave del C++

Page 32: 05 1 intro-struttura

Struttura di un programma inclusione librerie / per poter invocare funzioni utili (i/o, ...) /dichiarazione di variabili globali e funzioni

int main ( ) {

dichiarazione di variabili locali

istruzione 1; / tutti i tipi di operazioni, e cioè: /istruzione 2; / istr. di assegnamento / istruzione 3; / istr. di input / output /istruzione 4; / istr. di controllo (condizionali, cicli) /...istruzione N;

}

parte esecutiva

parte dichiarativa locale

parte dichiarativa globale

Ogni programma deve contenere un modulo int main() {...}

Page 33: 05 1 intro-struttura

Struttura di un programma• Parte dichiarativa: le dichiarazioni degli elementi del

programma– Dati, ed eventualmente funzioni (ma solo nella parte globale)

• Parte esecutiva: le istruzioni da eseguire, che ricadono nelle categorie:– Istruzioni di assegnamento ()– Strutture di controllo:

• Condizionali (if-then-else e switch)• Iterative, o cicli (while, do e for)

– Istruzioni di Input/Output (<<, >>, ...)• In C++ (a differenza del C) la dichiarazione di una

variabile può avvenire anche nella parte esecutiva– Di solito appena prima del PRIMO uso della variabile

Page 34: 05 1 intro-struttura

> Enter first integer> 45> Enter second integer> 72> Sum is 117

Somma interi V2// Sum of two integers #include <iostream>

int main(){ int integer1, integer2; // declaration cout << "Enter first integer" << endl; // prompt cin >> integer1; // read an integer cout << "Enter second integer" << endl; // prompt cin >> integer2; // read an integer int sum; // declaration sum = integer1 + integer2; // assignment cout << "Sum is: " << sum; // print sum return 0; // successful end }

Page 35: 05 1 intro-struttura

Variabili globali e locali• Le variabili globali sono dichiarate fuori dalle funzioni

– Sono utilizzabili da tutte le funzioni del modulo (file) in cui sono dichiarate

– per convenzione: poste all’inizio, dopo le direttive #include• Le variabili locali sono dichiarate internamente alle

funzioni• In caso di programmi mono-funzione (cioè contenenti

solo la funzione main()), variabili globali e locali sono (quasi)equivalenti– Ma è una situazione che vale solo per programmi elementari,

quindi non realistica• La differenza si ha nei programmi con più di una funzione

e/o di un modulo (file)• Le variabili globali servono per memorizzare informazioni

che vengono usate da varie funzioni, anche definite in file diversi

Page 36: 05 1 intro-struttura

Commenti• Porzioni di testo racchiuse tra /* e */• Se un commento si estende da un certo punto fino alla fine di

una sola riga si può anche usare // riga di commento/* Programma che non fa nulla ma mostra i due modi per inserire commenti in C++ */int main { int valore; // Dich. inutile: variabile mai usata return 0;}

• I commenti sono ignorati dal compilatore• Servono per aumentare la leggibilità e la facilità di modifica di

un programma– A distanza di tempo, per persone diverse dall’autore, ...

Page 37: 05 1 intro-struttura

Check this out/** comment pairs /* */ cannot nest.* ''cannot nest'' is considered source code,* as is the rest of the program*/

int main(){ return 0;}

Page 38: 05 1 intro-struttura

Istruzioni semplici e composte

• Sequenze di istruzioni semplici– Ogni istruzione semplice termina con ;– ; è detto il “terminatore” dell’istruzione

• Si possono raggruppare più istruzioni in sequenza tra { e } a costituire un blocco– Il blocco costituisce una “super-istruzione”

• Non è necessario il ; dopo }, in quanto il blocco è già una istruzione– non necessita del terminatore per diventare istruzione

Page 39: 05 1 intro-struttura

Assegnamento<variabile> = <espressione> ;• Dove • = è l'operatore di assegnamento

• da non confondere con quello di uguaglianza ==• <espressione> può essere

– Un valore costante – Una variabile – Un'espressione costruita mediante operatori (p.e.

aritmetici +, , *, /, %) e parentesi– L’invocazione di una funzione f()

• ; è il terminatore, che rende l'espressione di assegnamento, p.e. x=3, un'istruzione

Page 40: 05 1 intro-struttura

Esempi di assegnamento

x = 23;w = 'a'; //assegnamento del carattere ‘a’w = a; //assegnamento del contenuto della variabile ay = z;alfa = x + y;r3 = ( alfa * 43 – xgg ) * ( delta – 32 * j );x = x + 1;y = sqrt(99); // invocazione della funzione sqrt() – // radice quadrata

Page 41: 05 1 intro-struttura

Forme abbreviate• Abbreviazioni (operatori di assegnamento):• Istruzioni della forma

– variabile = variabile operatore espressione;• si possono scrivere come:

– variabile operatore = espressione;– a = a + 7; a = a * 5; – a += 7; a *= 5;

• L’incremento e il decremento hanno ulteriori abbreviazioni– a = a + 1; a = a - 1;– ++a; --a;

Page 42: 05 1 intro-struttura

Domande

• Per ora senza risposta– Perché l’assegnamento è un operatore?– Se l’assegnamento è un operatore, allora si può usare in

un’espressione?– Qual è il valore di un’espressione che contiene un

assegnamento?– Qual è la precedenza dell’operatore di assegnamento

rispetto agli altri?– Le regole di associatività valgono anche per

l’assegnamento come per gli operatori aritmetici?• 3+4+5 = (3+4)+5