Your SlideShare is downloading. ×
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
05 1 intro-struttura
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

05 1 intro-struttura

77

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
77
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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 1
  • 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) 2
  • 3. 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) http://www.cplusplus.com/info/history/ 3
  • 4. 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
  • 5. Le differenze principali C 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à…
  • 6. Il nostro primo programma C++ // The first C++ program #include <iostream> using namespace std; int main() { cout << "!!Hello World!!" << endl; // prints return 0; } > !!Hello World!! !!Hello World!!
  • 7. // 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
  • 8. #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
  • 9. 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
  • 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 10
  • 11. 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
  • 12. 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
  • 13. 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 ;-)
  • 14. Check this out! #include <iostream> using namespace std; Le parentesi funzionano come per un operatore aritmetico!! int main() { (cout << "!!!Hello World!!!" ) << endl; return 0; }
  • 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) 15
  • 16. 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
  • 17. 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
  • 18. // Sum of two integers #include <iostream> using namespace std; Somma interi int main() { int integer1, integer2, sum; cout << "Enter first integer" << endl; cin >> integer1; cout << "Enter second integer" << endl; cin >> integer2; sum = integer1 + integer2; cout << "Sum is: " << sum << endl; return 0; } > > > > > Enter first integer 45 Enter second integer 72 Sum is 117 // // // // // // // // declaration prompt read an integer prompt read an integer assignment print sum successful end
  • 19. 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
  • 20. 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
  • 21. Assegnamento • = (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)
  • 22. 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 <<
  • 23. 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”
  • 24. Il programma (x+y)-(z+w) in C++ e in assembler 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) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 READ X READ Y READ Z READ W LOADA Z LOADB W ADD STOREA RIS LOADA X LOADB Y ADD LOADB RIS DIF STOREA RIS WRITE RIS HALT ...int....(X)..... ...int....(Y)..... ...int....(Z)..... ...int....(W)..... ...int...(RIS)...
  • 25. La macchina astratta C++ Algoritmi e programmi sono definiti in funzione del loro esecutore L’esecutore dei programmi C++ è una macchina astratta BUS CPU RAM Standard Input a B pluto somma_1 ... di solito è la tastiera Standard Output di solito è il video
  • 26. 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
  • 27. 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
  • 28. 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 cella di memoria nome della variabile (il suo identificatore) integer1 45 valore della variabile
  • 29. 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]
  • 30. 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
  • 31. Le parole chiave del C++
  • 32. Struttura di un programma parte dichiarativa globale inclusione librerie /∗ per poter invocare funzioni utili (i/o, ...) ∗/ dichiarazione di variabili globali e funzioni int main ( ) { parte dichiarativa locale dichiarazione di variabili locali istruzione 1; istruzione 2; istruzione 3; istruzione 4; ... istruzione N; /∗ tutti i tipi di operazioni, e cioè: ∗/ /∗ istr. di assegnamento ∗/ /∗ istr. di input / output ∗/ /∗ istr. di controllo (condizionali, cicli) ∗/ parte esecutiva } Ogni programma deve contenere un modulo int main() {...}
  • 33. 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
  • 34. Sum of two integers nclude <iostream> Somma interi V2 t main() int integer1, integer2; cout << "Enter first integer" << endl; cin >> integer1; cout << "Enter second integer" << endl; cin >> integer2; int sum; sum = integer1 + integer2; cout << "Sum is: " << sum; return 0; > > > > > Enter first integer 45 Enter second integer 72 Sum is 117 // // // // // // // // // declaration prompt read an integer prompt read an integer declaration assignment print sum successful end
  • 35. 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
  • 36. 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, ...
  • 37. Check this out /* * comment pairs /* */ cannot nest. * ''cannot nest'' is considered source code, * as is the rest of the program */ int main() { return 0; }
  • 38. 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
  • 39. 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
  • 40. Esempi di assegnamento x = 23; w = 'a'; //assegnamento del carattere ‘a’ w = a; //assegnamento del contenuto della variabile a y = z; alfa = x + y; r3 = ( alfa * 43 – xgg ) * ( delta – 32 * j ); x = x + 1; y = sqrt(99); // invocazione della funzione sqrt() – // radice quadrata
  • 41. 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;
  • 42. 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

×