Lezione n.
Silvia Rossi
2
Informatica
Programmazione I
silvia.rossi@unina.it
C elementi di un programma
Programma
2
Una sequenza di istruzioni che il calcolatore esegue per produrre i risultati richiesti per la soluzione di un dato
problema.
E’ Un algoritmo scritto in un
LINGUAGGIO DI PROGRAMMAZIONE
Linguaggio di Programmazione
Un insieme di simboli, parole, regole usate per istruire il calcolatore.
Linguaggio macchina: il reale linguaggio attraverso il quale il calcolatore esegue le istruzioni di un programma
.
Linguaggio Assembler: un linguaggio che usa specifiche istruzioni per indicare al
calcolatore le operazioni da eseguire le azioni da intraprendere, è dipendente dal
calcolatore usato.
Linguaggio di alto livello: un linguaggio che possiede istruzioni e
regole vicine ai linguaggi naturali ed è indipendente dal calcolatore
usato.
4
PROGRAMMA SORGENTE
Programma scritto in un linguaggio di alto livello
PROGRAMMA OGGETTO
Risultato della compilazione di un programma sorgente
Programma
Il programma subisce diverse trasformazioni intermedie prima di diventare un programma oggetto (rilocabile)
Compilatore
Analisi lessicale
stringa di simboli
(tokens)
forma (AST)
Intermedia forma ottimizzata
Codice rilocabile (obj, exe)
Analisi
sintattica Analisi semantica
tabella di simboli
Ottimizza-
zione Generazione codice Programma
sorgente
Linker
Oggetti e librerie del
progetto Preprocessore
File di inclusione
…
0 1 1 1 1 0 1 1 0 1 1 0 1 0 0 1 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 0
Il programma oggetto generato dal compilatore se eseguito viene caricato dal loader in memoria per l’esecuzione
effettiva
– Ogni sezione del programma (codice, dati, memoria) viene allocata e assegnata ad intervalli di indirizzi di memoria assoluti
Codice rilocabile
1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 1 0 0 1 0 1 1 0 0
RAM
Loader
stack heap
dati text
Immagine del programma in
memoria
Compilatore: caricamento
Ciclo di vita di un programma
7
Problema
Programma Algoritmo di risoluzione
C un pò di storia
II linguaggio C si sviluppò dal B grazie a Dennis Ritchie, presso i Bell Laboratories nel 1972.
Il C fu noto inizialmente come linguaggio di sviluppo per sistemi operativi.
– Oggi la maggior parte dei sistemi operativi sono scritti in C e/o in C++
Il C è oggi disponibile sulla maggior parte dei computer ed è indipendente dall'hardware.
Nel 1990 si è giunti ad una definizione di standard per il C nota come ANSI/ISO 9899:1990 – aggiornato nel 1999 C99
C ambiente di sviluppo
Tra i tanti ambienti di sviluppo C utilizzeremo NetBeans/Eclipse
Il classico primo programma C
C elementi di un programma
// eser1.1.c: primo programma "Hello World"
#include <stdio.h>
int main () {
printf("Hello World\n”); // stampa messaggio return 0;
}
C elementi di un programma
#include <stdio.h>
int main ()
{ int integer1;
int integer2;
int sum;
printf(“inserisci primo intero\n”);
scanf(“%d”, &integer1);
…
sum = integer1 + integer2;
printf(“La somma e’ %d\n”, sum);
return 0;
}
Da un punto di vista lessicale, un programma è una sequenza di termini (detti tokens)
Il compilatore deve riconoscere i termini del linguaggio per le successive fasi di analisi
Tipi di termini
– Identificatori – Parole chiave – Costanti
– Espressioni – Operatori
– Simboli o segni speciali
Sono ignorati
– Spazi bianchi, tabulatori, newlines, e commenti
Termini operatori
C elementi del linguaggio
Identificatori costanti
parole chiave
variabili anonime
con nome
Simboli speciali
C identificatore
Un identificatore è un termine usato dal programmatore per indicare funzioni, variabili, oggetti, costanti, etc.
Ogni identificatore è formato da una sequenza di caratteri di tipo lettere o cifre o “_” (underscore)
– Il primo carattere deve essere una lettera o _ – Caratteri maiuscoli e minuscoli sono diversi – 31 caratteri
– Identificatori non validi:
• un amico (contiene uno spazio)
• un'amica (contiene un apostrofo)
• 7bello (il primo carattere non è una lettera)
• for (è una parola-chiave del C)
Gli identificatori devono ricordare mnemonicamente gli oggetti cui
si riferiscono
Algoritmo per il calcolo della circonferenza
1) Leggi il valore del raggio
2) Poni il valore della circonferenza uguale a 2 per 3,1415 per il raggio
3) Stampa il valore della circonferenza
___________________________________
leggi(raggio)
circonferenza <- 2* 3,1415 * raggio stampa(circonferenza)
14
15
C identificatori à parole-chiave
La parole chiave è un termine che ha un significato particolare per il compilatore C
– possono essere adoperati dal programmatore solo come previsto dal linguaggio
Esempi di parole chiave sono:
– main : indica che il testo che segue tra parentesi graffe rappresenta il codice sorgente del programma.
– const : definisce il nome che segue come dato costante.
– float : definisce il nome seguente come variabile a virgola mobile (singola precisione).
– if, then, else : definisce costrutti di controllo del linguaggio – …
Le parole chiave sono indicate in grassetto
C identificatori à variabili
Variabile: una locazione di memoria che può contenere diversi valori durante la computazione accessibile mediante un
identificatore unico
– nome: definisce un identificativo unico per la variabile
– tipo: l’insieme dei valori che può assumere e l’insieme delle operazioni che possono applicarsi a tali valori
– valore: valore corrente della variabile
C identificatori à variabili à tipo
Tipi standard
– char caratteri (es. ‘b’, ‘F’, ‘!’, ‘6’, ...) (1 B)
• usato anche per rappresentare valori numerici in [-128 ; 127]
– int numeri interi (short o long)
(es. 1, 2, 43, -89, 4324, ...) (4 B o almeno quanto short)
• ha valori in [-2.147.483.648 ; 2.147.483.647]
– float numeri decimali in virgola mobile a singola precisione (4 B)
Una parte intera ed una parte frazionale
• intervallo di valori assoluti [1,17 x 10-38 e 3,40 x 1038] (7 cifre significative)
– double numeri decimali in virgola mobile a doppia precisione (8 B)
• intervallo di valori assoluti [1,17 x 10-308 e 1,79 x 10308 ] (15 cifre significative)
– bool tipo valore booleano (1 B)
• con valori ‘vero’ e ‘falso’ ([0 ; 1])
18
Variabili
• Nome
• Tipo
– Operazioni – Dimensione
• Valore
• Indirizzo in memoria
int n = 0
&n
Left-value è il riferimento al suo indirizzo
Right-value è il riferimento al suo valore
Dichiarazione di tipo: informa il compilatore sul tipo assegnato ad un identificatore
specificatore ... qualificatore ... tipo ident
Definizione di tipo: è una dichiarazione che comporta l’allocazione di un’area di memoria per l’identificatore ma non l’inizializzazione del suo contenuto (indefinito)
Qualificatori: short, long, signed, unsigned
Specificatori: const, extern, static, volatile,...
C dichiarazione di identificatori
Dichiarazione di tipo di un identificatore
tipo standard Indica come deve essere
allocato il contenuto Fornisce altre caratteristiche
dell’identificatore
Inizializzazione: assegna un valore iniziale ad un identificatore già definito
ident = valore;
La dichiarazione di un identificatore deve precedere il suo primo utilizzo, e può essere in ogni parte del programma
E’ sempre consigliabile dichiarare tutte le costanti e le variabili nella parte iniziale del programma (o della funzione che le utilizza)
– È più facile identificare nel programma la sezione delle dichiarazioni
Dichiarazione e inizializzazione possono essere combinate
C dichiarazione di identificatori
Operatore di assegnazione
C identificatori à variabili
Dichiarazione di variabile:
int numero;
Dichiarazione di variabile e successiva inizializzazione
int numero;
...
numero = 54;
Dichiarazione di più variabili dello stesso tipo int numero, secondo_numero, terzo;
Dichiarazione di variabile con contestuale inizializzazione
int numero = 54 ;
Dichiarazione di più variabili e inizializzazione
int numero = 54, secondo_numero, terzo = 15;
Costante: una locazione di memoria che contiene sempre lo stesso valore durante la computazione
Alcune costanti possono essere riferite (nominate) da identificatori Altre constanti non sono associate ad alcun nome (anonime)
Dichiarazione di costante:
const float pi=3.1415;
L'uso dello specificatore const è fortemente consigliato piuttosto che scrivere più volte la stessa costante nelle istruzioni del programma;
– se il programmatore decide di cambiarne il valore, e ha usato const, è sufficiente che modifichi la sola istruzione di definizione.
C identificatori à costanti
23
Uno o anche due caratteri consecutivi che sono usati per scopi particolari come ad esempio
il punto e virgola (;) che serve ad indicare la fine di una istruzione, le parentesi graffe ({ })che indicano inizio e fine di una istruzione composta,
la virgola (,) che è usata come separatore.
es: float n, raggio; invece di float n;
float raggio;
Simboli speciali
24
C espressioni
Espressioni: rappresentano il valore che si ottiene applicando opportune operazioni ben definite ad uno o più operandi che possono essere costanti o variabili.
In una espressione le operazioni vengono indicate con particolari simboli detti operatori
Gli operatori possono essere
– unari : agiscono su un solo operando !a ++i
– binari : agiscono su due operandi (destro e sinistro) a+b a<=b
25
C espressioni
Gli operatori possono essere
– di assegnazione – aritmetici
– binari
– relazionali – logici
– incremento e decremento
– condizionali
C espressioni di assegnazione
L'operatore di assegnazione = copia il contenuto
dell’operando destro (detto r-value) nell’operando sinistro (detto l-value)
• r-value è una qualsiasi espressione con valore un tipo standard
• l-value è una variabile
• Il tipo di r-value deve essere lo stesso o implicitamente convertibile nel tipo di l-value
• Il valore dell’espressione assegnazione è r-value
• Esempio: a = b + 3
r-value l-value
a = b
Gli operatori matematici eseguono le principali operazioni matematiche
+ - * /
Se la divisione è fra due numeri interi, il risultato dell'operazione è ancora un numero intero (troncamento).
– Esempio: 27 / 4 dà come risultato 6 (anziché 6.75).
Il resto di una divisione fra numeri interi si calcola con l'operatore binario %
– Esempio: 27 % 4 dà come risultato 3
C espressioni aritmetiche
C espressioni aritmetiche
Operazione Simbolo algebrico
Simbolo in C
Espressione algebrica
Espression e in C
Addizione + + a+b a+b
Sottrazione - - a-b a-b
Moltiplicazione x * ab a*b
Divisione : / a:b a/b
Modulo mod % a mod b a%b
29
Regole di precedenza
5 + 3 * 2
Risultato = 16 o 11?
1. Svolgere le parentesi
2. Moltiplicazione, divisione e modulo 3. Addizione e sottrazione
Più operazioni dello stesso tipo vanno risolte da sinistra a
destra.
30
Se le costanti e le variabili sono tutte dello stesso tipo allora anche il valore dell’espressione sarà dello stesso tipo.
Se tutte le grandezze presenti nell’espressione sono di tipo numerico, anche se diversi, sarà il compilatore ad effettuare tutte le opportune conversioni di tipo.
Ad esempio se le variabili n, f, d sono rispettivamente di tipo
int, float e double allora nell’espressione (n+f)*d, n è convertito a float, successivamente la somma n+f è convertita a double
per poter effettuare la moltiplicazione con d (conversione
implicita).
REGOLA
Non adoperare espressioni in cui sono presenti
variabili di tipo diverso.
Esempio -> Area del cerchio
REGOLA
E’ sempre consigliabile dichiarare tutte le costanti e le variabili nella parte iniziale del programma (o della function che le utilizza).
In questo modo chi legge il programma sa dove reperire le
informazioni sul tipo delle variabili e delle costanti.
Gli operatori relazionali sono:
> >= < <= == !=
eseguono il confronto fra i valori dei due operandi (di qualsiasi tipo standard) e restituiscono un valore booleano:
a > b restituisce true se a é maggiore di b
a >= b restituisce true se a é maggiore o uguale a b a < b restituisce true se a é minore di b
a <= b restituisce true se a é minore o uguale a b a == b restituisce true se a é uguale a b
a != b restituisce true se a é diverso da b
Esempio:
bool bvar = (7 > 3); (in bvar viene memorizzato true) bool bvar = (7 == 3); (in bvar viene memorizzato false)
C espressioni relazionali
35
Espressione booleana semplice: è rappresentata da un confronto tra i valori di due espressioni. La forma sintattica di una espressione
booleana semplice è la seguente:
espressione1 op espressione2 dove op è un operatore relazionale.
L’espressione booleana assume il valore true (vero) se il valore di espressione1 è nella relazione op con il valore di espressione2 .
Nell’esempio si suppone che le variabili assumono i seguenti valori:
a=3 ; b=5 ; c1=’E’ ; c2=’G’ ;
< Minore di a<b 3<5 Vero
<= Minore o uguale di a+3<=b 6<=5 Falso
== Uguale a c1==c2 ‘E’==’G’ Falso
!= Diverso da c1!=c2 ‘E’!=’G’ Vero
>= Maggiore o uguale di ‘a’>=c1 ‘a’>=’E’ Vero
> Maggiore di a>b+2 3>7 Falso
Operatore relazionale
Espressioni booleane semplici
Attenzione!
Se si pone uno spazio tra gli operatori (es = =), si commette un errore di sintassi
Non confondere = con ==
– Assegnazione pi=3.1415
– Uguaglianza x==y
Esercizi
Scrivere in pseudo codice un algoritmo per il
calcolo del MCD usando l’algoritmo di Euclide.
Si trovi il MCD tra i numeri 10881 e 1488
Algoritmo per il Massimo Comun Divisore (Euclide)
• Dividiamo 10881 per 1488: avremo quoziente 7 e resto 465
• il nuovo dividendo è 1488 mentre il nuovo divisore è 465
• dividiamo 1488 per 465: avremo quoziente 3 e resto 93
• il nuovo dividendo è 465 mentre il nuovo divisore è 93
• dividiamo 465 per 93: avremo quoziente 5 e resto 0
• l’algoritmo termina quando il resto è zero; il MCD è l’ultimo
divisore: 93
39
1. Leggi A 2. Leggi B 3. Se A>B
Dividendo=A Divisore=B Altrimenti
Dividendo=B Divisore=A
4. Resto=Dividendo%Divisore
5. Mentre Resto>0 esegui le seguenti istruzioni Dividendo=Divisore
Divisore=Resto
Resto=Dividendo%Divisore
6. Stampa Divisore (una volta che il quoziente è 0 il divisore prende il valore del MCD)