silvia rossi - unina.it
TRANSCRIPT
![Page 2: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/2.jpg)
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
![Page 3: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/3.jpg)
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 calcolatoreusato.
![Page 4: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/4.jpg)
4
PROGRAMMA SORGENTE
Programma scritto in un linguaggio di alto livello
PROGRAMMA OGGETTO
Risultato della compilazione di un programma sorgente
Programma
![Page 5: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/5.jpg)
Il programma subisce diverse trasformazioni intermedie prima di diventare un programma oggetto (rilocabile)
Compilatore
Analisilessicale
stringa di simboli(tokens)
forma (AST)Intermedia
formaottimizzata
Codicerilocabile(obj, exe)
Analisisintattica
Analisisemantica
tabella di simboli
Ottimizza-zione
Generazionecodice
Programmasorgente
Linker
Oggetti e librerie del progetto
Preprocessore
File di inclusione
![Page 6: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/6.jpg)
…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
Codicerilocabile
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 delprogramma in
memoria
Compilatore: caricamento
![Page 7: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/7.jpg)
Ciclo di vita di un programma
7
Problema
Programma
Algoritmo di risoluzione
![Page 8: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/8.jpg)
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
![Page 9: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/9.jpg)
C ambiente di sviluppo
Tra i tanti ambienti di sviluppo C utilizzeremo NetBeans/Eclipse
![Page 10: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/10.jpg)
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 messaggioreturn 0;
}
![Page 11: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/11.jpg)
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;
}
![Page 12: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/12.jpg)
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
Terminioperatori
C elementi del linguaggio
Identificatoricostanti
parole chiave
variabilianonime
con nome
Simboli speciali
![Page 13: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/13.jpg)
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
![Page 14: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/14.jpg)
Algoritmo per il calcolo della circonferenza
1) Leggi il valore del raggio2) Poni il valore della circonferenza uguale a 2
per 3,1415 per il raggio3) Stampa il valore della circonferenza___________________________________leggi(raggio)
circonferenza <- 2* 3,1415 * raggio
stampa(circonferenza)
14
![Page 15: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/15.jpg)
15
C identificatori à parole-chiave
La parole chiave è un termine che ha un significato particolareper 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
![Page 16: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/16.jpg)
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
![Page 17: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/17.jpg)
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])
![Page 18: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/18.jpg)
18
Variabili
• Nome• Tipo
– Operazioni– Dimensione
• Valore• Indirizzo in memoria
int n = 0&n
Left-value è il riferimento al suo indirizzoRight-value è il riferimento al suo valore
![Page 19: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/19.jpg)
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 caratteristichedell’identificatore
![Page 20: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/20.jpg)
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
![Page 21: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/21.jpg)
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;
![Page 22: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/22.jpg)
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
![Page 23: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/23.jpg)
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
![Page 24: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/24.jpg)
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
![Page 25: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/25.jpg)
25
C espressioni
Gli operatori possono essere– di assegnazione– aritmetici – binari– relazionali – logici– incremento e decremento– condizionali
![Page 26: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/26.jpg)
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-valuel-value
a = b
![Page 27: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/27.jpg)
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
![Page 28: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/28.jpg)
C espressioni aritmetiche
Operazione Simboloalgebrico
Simbolo in C
Espressionealgebrica
Espressione in C
Addizione + + a+b a+bSottrazione - - a-b a-bMoltiplicazione x * ab a*bDivisione : / a:b a/bModulo mod % a mod b a%b
![Page 29: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/29.jpg)
29
Regole di precedenza
5 + 3 * 2Risultato = 16 o 11?
1. Svolgere le parentesi2. Moltiplicazione, divisione e modulo3. Addizione e sottrazione
Più operazioni dello stesso tipo vanno risolte da sinistra a destra.
![Page 30: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/30.jpg)
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 doubleper poter effettuare la moltiplicazione con d (conversione implicita).
![Page 31: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/31.jpg)
REGOLA
Non adoperare espressioni in cui sono presentivariabili di tipo diverso.
![Page 32: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/32.jpg)
Esempio -> Area del cerchio
![Page 33: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/33.jpg)
REGOLA
E’ sempre consigliabile dichiarare tutte le costanti e levariabili nella parte iniziale del programma (o della functionche le utilizza).
In questo modo chi legge il programma sa dove reperire leinformazioni sul tipo delle variabili e delle costanti.
![Page 34: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/34.jpg)
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 ba >= b restituisce true se a é maggiore o uguale a ba < b restituisce true se a é minore di ba <= b restituisce true se a é minore o uguale a ba == b restituisce true se a é uguale a ba != 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
![Page 35: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/35.jpg)
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 espressione2dove 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
![Page 36: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/36.jpg)
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
![Page 37: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/37.jpg)
Esercizi
Scrivere in pseudo codice un algoritmo per il calcolo del MCD usando l’algoritmo di Euclide.
![Page 38: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/38.jpg)
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
![Page 39: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/39.jpg)
39
1. Leggi A2. Leggi B
3. Se A>BDividendo=ADivisore=B
AltrimentiDividendo=BDivisore=A
4. Resto=Dividendo%Divisore
5. Mentre Resto>0 esegui le seguenti istruzioniDividendo=DivisoreDivisore=RestoResto=Dividendo%Divisore
6. Stampa Divisore (una volta che il quoziente è 0 il divisore prende il valore del MCD)
![Page 40: Silvia Rossi - unina.it](https://reader034.vdocuments.site/reader034/viewer/2022050600/6272abc4cdd8d66f064f20f4/html5/thumbnails/40.jpg)
40
Esercizi
Tenendo presente il programma per il calcolo della circonferenza scrivere dei programmi che calcolano:
1) area e perimetro del quadrato;2) area del trapezio.