SlideShare a Scribd company logo
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
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
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
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
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à…
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!!
// 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
#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
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
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
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
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
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 ;-)
Check this out!
#include <iostream>
using namespace std;

Le parentesi
funzionano come
per un operatore
aritmetico!!

int main() {
(cout << "!!!Hello World!!!" ) << endl;
return 0;
}
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
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
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
// 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
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
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
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)
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 <<
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”
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)...
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
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
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
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
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]
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
Le parole chiave del C++
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() {...}
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
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
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
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, ...
Check this out
/*
* comment pairs /* */ cannot nest.
* ''cannot nest'' is considered source code,
* as is the rest of the program
*/
int main()
{
return 0;
}
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
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
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
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;
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

More Related Content

PPTX
Assignment on Java logo
PPTX
Angular Components.pptx
PPTX
C# language
PDF
あなたも「違いが分かる人」になりましょう! ~ Azure, AzureStack, AzureStack HCI ~
PDF
Spring bootでweb セキュリティ(ログイン認証)編
PDF
AWS Summit Seoul 2023 | 바람을 예측하여 재생에너지 산업을 발전시키는 GS E&R의 새로운 여정
PDF
AWS Summit Seoul 2023 | 천만 사용자를 위한 카카오의 AWS Native 글로벌 채팅 서비스
PPTX
C++ on the Web: Run your big 3D game in the browser
Assignment on Java logo
Angular Components.pptx
C# language
あなたも「違いが分かる人」になりましょう! ~ Azure, AzureStack, AzureStack HCI ~
Spring bootでweb セキュリティ(ログイン認証)編
AWS Summit Seoul 2023 | 바람을 예측하여 재생에너지 산업을 발전시키는 GS E&R의 새로운 여정
AWS Summit Seoul 2023 | 천만 사용자를 위한 카카오의 AWS Native 글로벌 채팅 서비스
C++ on the Web: Run your big 3D game in the browser

Viewers also liked (6)

PPT
06 1 array_stringhe_typedef
PPT
03 1 alg_bool
PPTX
06 3 struct
PPTX
06 2 vector_matrici
PPTX
Fraternali concertation june25bruxelles
PPT
07 1 funzioni
06 1 array_stringhe_typedef
03 1 alg_bool
06 3 struct
06 2 vector_matrici
Fraternali concertation june25bruxelles
07 1 funzioni
Ad

Similar to 05 1 intro-struttura (20)

PDF
Lezione 5 (7 marzo 2012)
PPT
Corso c++
PPSX
Informatica di base
PDF
Laboratorio Programmazione: In - Out variabili
PPT
3 Linguaggioc
PDF
Lezione 3
PDF
Esercitazione 1 (27 febbraio 2012)
PDF
06 - Programmazione: Scope Variabili
PDF
13 - Programmazione: Compendio C - C++
PPT
05 2 integrali-conversioni-costanti-preproc-inclusione
PDF
PPT
05 3 istruzioni-selezione-iterazione-condizioni
PDF
Sistemi Operativi: Il kernel linux - Lezione 06
PDF
Lezione 12 (28 marzo 2012)
PDF
Lezione 12 (28 marzo 2012)
PDF
Gestione della memoria in C++
PPT
Riepilogo Java C/C++
PPT
Capitolo 7 elementi di programmazione c-c++
PDF
Corso di Basi e Fondamenti di Programmazione in C++ Lezione 1
PPTX
La metodologia Top - Down - applicazione al C++
Lezione 5 (7 marzo 2012)
Corso c++
Informatica di base
Laboratorio Programmazione: In - Out variabili
3 Linguaggioc
Lezione 3
Esercitazione 1 (27 febbraio 2012)
06 - Programmazione: Scope Variabili
13 - Programmazione: Compendio C - C++
05 2 integrali-conversioni-costanti-preproc-inclusione
05 3 istruzioni-selezione-iterazione-condizioni
Sistemi Operativi: Il kernel linux - Lezione 06
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
Gestione della memoria in C++
Riepilogo Java C/C++
Capitolo 7 elementi di programmazione c-c++
Corso di Basi e Fondamenti di Programmazione in C++ Lezione 1
La metodologia Top - Down - applicazione al C++
Ad

More from Piero Fraternali (16)

PPTX
Multimedia on the mountaintop: presentation at ACM MM2016
PPTX
presentation at European Utility Week, Vienna, Nov. 2015
PPTX
Crowsourcing (anche) per le aziende del settore tessile e della moda
PPTX
07 2 ricorsione
PPT
03 2 arit_bin
PPT
02 algo programmi
PPTX
Human computation and participatory systems
PDF
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
PPTX
So human presentation
PPTX
Human and social computation
PPT
Web technologies: Model Driven Engineering
PPT
Common Gateway Interface
PPTX
Web technologies: HTTP
PPTX
Web technologies: recap on TCP-IP
PPTX
Web technologies course, an introduction
PPTX
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadini
Multimedia on the mountaintop: presentation at ACM MM2016
presentation at European Utility Week, Vienna, Nov. 2015
Crowsourcing (anche) per le aziende del settore tessile e della moda
07 2 ricorsione
03 2 arit_bin
02 algo programmi
Human computation and participatory systems
Better society: Meet us at #ICT2013eu for #trustedsocialmedia http://bit.ly/1...
So human presentation
Human and social computation
Web technologies: Model Driven Engineering
Common Gateway Interface
Web technologies: HTTP
Web technologies: recap on TCP-IP
Web technologies course, an introduction
Informatica delle persone: reti sociali, giochi seri e scienza dei cittadini

05 1 intro-struttura

  • 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