• Non ci sono risultati.

Silvia Rossi2

N/A
N/A
Protected

Academic year: 2021

Condividi "Silvia Rossi2"

Copied!
40
0
0

Testo completo

(1)

Lezione n.

Silvia Rossi

2

Informatica

Programmazione I

silvia.rossi@unina.it

C elementi di un programma

(2)

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

(3)

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)

4

PROGRAMMA SORGENTE

Programma scritto in un linguaggio di alto livello

PROGRAMMA OGGETTO

Risultato della compilazione di un programma sorgente

Programma

(5)

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

(6)

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

(7)

Ciclo di vita di un programma

7

Problema

Programma Algoritmo di risoluzione

(8)

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

(9)

C ambiente di sviluppo

Tra i tanti ambienti di sviluppo C utilizzeremo NetBeans/Eclipse

(10)

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;

}

(11)

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;

}

(12)

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

(13)

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

(14)

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)

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

(16)

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

(17)

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)

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

(19)

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

(20)

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

(21)

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;

(22)

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)

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)

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)

25

C espressioni

Gli operatori possono essere

– di assegnazione – aritmetici

– binari

– relazionali – logici

– incremento e decremento

– condizionali

(26)

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

(27)

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

(28)

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)

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)

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).

(31)

REGOLA

Non adoperare espressioni in cui sono presenti

variabili di tipo diverso.

(32)

Esempio -> Area del cerchio

(33)

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.

(34)

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)

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

(36)

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

(37)

Esercizi

Scrivere in pseudo codice un algoritmo per il

calcolo del MCD usando l’algoritmo di Euclide.

(38)

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)

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)

(40)

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.

Riferimenti

Documenti correlati

La variabile di assegnazione deve essere dello stesso tipo del valore dell’espressione?. Se però le variabili presenti nell’espressione sono tutte variabili

 Quando un tipo è dichiarato con typedef su strutture aggregate anonime (struct e union senza tag), le variabili di quel nuovo tipo sono considerate dello stesso tipo.

Se la condizione è true, viene eseguita l’istruzione di stampa e il programma prosegue con la prossima istruzione. Se la condizione è false, l’istruzione di stampa è ignorata e

CODICE PROFILO DESCRIZIONE PROFILO.. AT

CODICE PROFILO DESCRIZIONE PROFILO.. CS

■ Quindi il vero argomento della prima funzione non é la seconda funzione, ma un normale valore, che può avere qualsiasi origine (variabile, espressione ecc...), e in particolare

I: il tipo di operazione da effettuare sulla coda; valori da inserire nella coda Pi: non è possibile inserire elementi se la coda è piena; non è possibile estrarre elementi se

• Un puntatore contiene l’indirizzo della locazione di memoria assegnata ad una variabile (che conterrà i valori di tale variabile).. • Si dice che il puntatore ‘punta’