Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in...

84
fondamenti di informatic a 1 parte 3 D.U. 1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica, a.a. 2000-2001 di anna maria carminelli gregori

Transcript of Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in...

Page 1: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

1

fondamenti di informatica parte 3

appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica, a.a. 2000-2001dianna maria carminelli gregori

Page 2: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

2

Struttura dei programmiGia’ nei programmi presentati si possono notare

parti differenti, composte da frasi di commento, dichiarazioni e definizioni, comandi esecutivi.

I commenti servono come documentazione del programma, essenziale per far capire a chi lo legge cosa fa il programma e come lo fa;

le dichiarazioni e definizioni permettono al compilatore di interpretare e tradurre tutte le frasi del programma correttamente come appare negli esempi indicati nel seguito.

Page 3: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

3

Dichiarazioni e comandi (frasi, istruzioni) di tipo esecutivo

Le dichiarazioni relative alle funzioni, per es. servono per segnalare al compilatore le funzioni create dal programmatore e usate nella parte esecutiva del prg. il loro tipo e quello dei loro argomenti se presenti. Si tratta di dichiarazioni simili a quelle che sono nei file header. Con tali indicazioni il compilatore riconosce e traduce le funzioni che incontra successivamente.

Con le frasi “esecutive” infine si esprime l’ algoritmo: il compilatore traduce ogni frase nel numero di istruzioni del linguaggio macchina, necessario e sufficiente per la sua corretta esecuzione.

Page 4: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

4

A proposito delle funzioniQualcuno e’ tentato di scrivere in C o C++ i

programmi alla maniera dei programmi Pascal dove la funzione principale (ossia il main) si pone alla fine dell’ intero programma facendola precedere dalle altre funzioni. In tal modo si possono omettere le dichiarazioni delle funzioni dato che il compilatore le riconosce via via che le incontra.

In C e C++ e’ bene NON seguire questo metodo.

Perche’ ?

Page 5: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

5

Impostazione scorretta con 2 possibili tipi di errore

Il primo tipo e’ che ogni funzione puo’ attivare anche funzioni definite successivamente e quindi, se non dichiarate, ignote al compilatore che non le sa riconoscere;

il secondo riguarda la modularita’ tipica del C, C++ che permette di compilare separatamente le varie funzioni (per es. su file diversi come le funzioni di libreria). Cio’ e’ realizzabile (cfr.+oltre) solo se si dichiarano inizialmente al compilatore le funzioni che il programma richiede.

Page 6: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

6

C++: Definizione di Variabili

Come gia’ indicato, il corpo di ogni funzione C e C++ ha frasi dichiarative (che possono porsi nella parte dichiarativa iniziale) ed esecutive, col significato di istruzioni, comandi (che producono la parte esecutiva). Comunque, in ogni funzione deve essere presente la dichiarazione (in C++ si dice definizione) delle variabili usate con il loro nome (o identificatore) ed il loro tipo, PRIMA o “contemporaneamente” al loro uso.

Page 7: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

7

Perche’ ?

La definizione di ogni variabile ha lo scopo di indicare al compilatore di prenotare spazio in C.M.

Quanto spazio? Dipende dal tipo di dato che la variabile dovra’ identificare e contenere.

Il tipo di dato determina la codifica del dato: fixed, floating, char ...

Page 8: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

8

Gli Identificatori del C e C++sono associati alle entita’ del linguaggio

come: variabili, costanti, funzioni, tipi derivati (vedere avanti).

Regole di composizione: ogni identificatore deve iniziare con un carattere alfabetico (o con l’ underline _ , ma quest’ ultimo e’ pertinente agli identificatori del Sistema); internamente puo’ contenere caratteri alfanumerici ed anche l’ underline _ , ma non lo spazio bianco.

Page 9: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

9

Totale liberta’ di scelta ?… quasi ! In ogni linguaggio esistono alcune

parole riservate (keyword) con significato preciso per il compilatore del linguaggio e quindi non usabili come identificatori normali.

Ecco le parole riservate comuni al C e C++ auto break case char const

continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void while

In C++ ce ne sono ancora una ventina:

Page 10: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

10

keywords asm catch class delete friend

handle inline new operator private protected public template this throw try unsigned virtual volatile

Nota: non esistono parole riservate come array e pointer nonostante entrambe le entita’ siano realizzabili in C e C++ . La loro creazione avviene usando altri costrutti tipici del linguaggio.

Da qui in poi le keyword saranno scritte in grassetto.

Page 11: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

11

Tipi di datiTutti i linguaggi di programmazione hanno alcuni tipi

di dati predefiniti (fondamentali); in C e C++ sono:

int per variabili di tipo intero (di almeno 2 byte);float “ “ “ “ floating-point (almeno 4byte);char “ “ “ “ carattere (1byte x car.);double “ “ “ “ float, ma in doppia precisione

, ossia di almeno 8 byte.Questi sono tipi standard. Oltre a questi tipi di dati

fondamentali, in C e C++ ci sono gli indirizzi di variabili (meglio: di posizioni di C.M. dove si trovano i dati identificati dalle variabili).

Page 12: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

12

Il C++ e’ a forte tipizzazioneossia ad ogni entita’ del linguaggio e’

associato un tipo di dato che ne determina lo spazio di memoria necessario e il possibile uso (per es. aritmetica intera o floating-point ? cfr. Parte 1)

Oltre ai tipi fondamentali predefiniti, in C++ si possono definire tipi di dato derivati ottenuti dai tipi fondamentali con vari meccanismi per manipolare oggetti complessi: matrici, solidi tridimensionali, numeri complessi ….

Page 13: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

13

Definizioni: es. in programmi E:/carmin/duinf2000/program1-2 Tutte le variabili utilizzate nei C++ program (o

function) in fase di costruzione devono essere definite per garantirne l’ allocazione in memoria: non usarle senza definizione !

La definizione puo’ avere la forma seguente:tipo nomi di variabili separate da virgola: es.int i, j, k, leo, lilla;float x, y, z, sup, inf, set1;Nota: il tipo intero puo’ essere anche indicato

come short int, long int, unsigned.

Page 14: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

14

Inizializzazione delle var. inunostamp.cpp-quastamp.cpp

Puo’ avvenire in 3 modi (cfr. fasi traduz. Parte2):1) alla definizione: es. int a = 7; e’ il compilatore

che pone il valore 7 nella zona di memoria identificata dalla variab. a (fase di compilazione);

2) con una frase di assegnazione: es. int a; e all’ inizio della parte esecutiva del programma a=7; frase di assegnazione eseguita durante l’ esecuzione del programma (fase di esecuzione);

3) con frase di lettura di un valore da porre in a (ancora fase di esecuzione).

Page 15: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

15

RiflessioneFra le 3 possibilita’ quale scegliere ?La scelta dipende dalle condizioni, pero’ la

definizione di a come variabile significa che il suo valore e’ soggetto a cambiare nel corso del programma (altrimenti cosa sarebbe ???!) Inizializzarla a 7 significa che al primo giro del programma il suo valore deve essere 7 e quindi se e’ il compilatore ad inizializzarla si risparmia tempo in fase esecutiva.

Page 16: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

16

Il progetto di unostamp.cppe’ praticamente indicato nelle frasi di

documentazione del programma, ma quale puo’ essere il suo diagramma di flusso ???!

MODIFICHE SUGGERITE: usare gli operatori aritmetici del linguaggio ossia:

+ addizione - sottrazione - cambio segno* moltiplicazione / divisione %restoper modificare i contenuti delle variabili per

es. come segue:

Page 17: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

17

Modifiche di unostamp.cpp in program2: esaminare tutto

Avendo definito:i = 12345;si puo’ modificare il suo contenuto cosi’:i = -i; // e visualizzare i oppure:i = i*2; // “ “ “ ed anche: i = i+1; // “ “ “ ed anche:i = i / 3; // “ “ “ “ “i = i % 4; // in i verra’ posto il resto della

divisione fra l’ intero i e l’ intero 4 da visualizzare.

Page 18: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

18

Espressioni aritmeticheAlla destra dell’ operatore di assegnazione

puo’ esserci per esempio un’ espressione aritmetica, formata da variabili e costanti collegate tra loro da operatori aritmetici che il compilatore considera con le priorita’ seguenti:

- (cambio segno)* / %+ -=

Page 19: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

19

Nota : left-right dell’ operatore di assegnazione =

C e C++ nella loro precisione, indicano sempre 2 valori lvalue ed rvalue associati alle variabili di tipo int e float con il significato di:

lvalue: indirizzo della locazione di memoria identificata dalla variabile

rvalue: contenuto della locazione di memoria identificata

Scrivendo: i = i+1; alla destra (right) di = (op. di assegnazione) e’ usato rvalue di i ossia per es. 12345; alla sinistra (left) e’ usato lvalue di i ossia il suo indirizzo.

Page 20: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

20

La valutazionedi ogni espressione, procede secondo la

priorita’ degli operatori presenti e se essi hanno la stessa priorita’ da sinistra a destra. Il valore cosi’ ottenuto e’ “assegnato alla variabile posta alla sinistra” dell’ operatore di assegnazione. Ossia, ad assegnazione avvenuta, la zona di memoria identificata dalla variabile (dal suo lvalue) conterra’ il valore (rvalue) calcolato dell’ espressione

NOTA: nelle espressioni si possono usare parentesi tonde (anche annidate) per modificare la priorita’ degli operatori.

Page 21: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

21

Ma sono tutte accessibili le variabili ?

Quando la definizione delle variabili viene fatta all’ esterno di tutte le funzioni, le variabili sono dette globali: ad esse si puo’ accedere con qualunque istruzione di una qualsiasi funzione componente l’ intero programma C o C++.

Invece se le variabili sono definite all’ interno di una funzione sono dette locali alla funzione: ad esse si puo’ accedere solo dall’ interno della funzione (es. in leggisec.cpp, ma ... +avanti).

Page 22: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

22

Costanti = “invariabili”Le entita’ fisse del linguaggio sono le

costanti: per es. “buonasera” e’ una costante tipo testo (stringa delimitata da “); altra costante di tipo numerico floating-point e’ 3.1415923 usata in unostamp.cpp (controllare). Ci sono poi costanti di tipo intero in base 10 (per es. 365), in base 8 (per es. 077 col valore ottale preceduto da zero), in base 16 (per es. 0xff oppure 0Xff oppure 0XFF col valore esadecimale preceduto da zero e da X o x).

Page 23: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

23

Altre costantidi tipo carattere delimitate da ‘(per es.’a’ o ‘\n’ =

line feed) Chi e’ line feed ? Nel codice ASCII e’ il decimo carattere con significato di andare a capo.

Altri caratteri speciali:’\0’ NUL=fine stringa; ‘\g’ BEL=bip; ‘\t’ horizontal tab; altri …

usare il programma ripeleg.c per vedere le codifiche ASCII di tutti i caratteri … provare anche CTRL Z ...

NOTA: anche una costante puo’ essere identificata da un identificatore e avere un tipo, preceduto da const.

Page 24: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

24

L’ esempio in leggisec.cppmette in luce anche la globalita’ e la localita’

dell’ ambiente di una funzione o programma.L’ ambiente locale si intende formato da tutte

le entita’ dichiarate e definite dentro la funzione.

In leggisec.cpp l’ ambiente locale al main si compone della sola const char* benvenuto che e’ usabile, visibile solo all’ interno del main, mentre la const char* bene e le var. car e num esterne al main e a tutte le altre funzioni formano l’ ambiente globale e sono visibili e usabili in ogni funzione.

Page 25: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

25

Scope di un’ entita’

Scope puo’ essere tradotto con raggio d’ azione e significa l’ insieme di codice in cui una variabile o una costante e’ visibile e quindi usabile in modo corretto.

=> lo scope dell’ ambiente globale comprende il main, le funzioni, tutto il codice che sta sullo stesso file del main;

=> lo scope dell’ ambiente locale si esaurisce nella funzione di appartenenza.

Page 26: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

26

( … ma a chi giova la modularita’ dei programmi ?

Il problema della globalita’ e della localita’ delle variabili di un programma non esisterebbe se il programma non fosse strutturato a moduli, ma monoblocco: pero’ questo modello non va.

Esempi di programmi monoblocco sono i primi ed il prg. monocod.cpp che effettua le stesse cose del programma codifibl.cpp che invece e’ strutturato a moduli.

Dagli esempi elementari appare poco la convenienza della modularita’ che diventa essenziale se aumenta la complessita’ dei programmi.

Di tutto cio’ si parlera’ +avanti.)

Page 27: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

27

Una pausa di riflessioneUno degli scopi del corso e’ imparare a

programmare usando il linguaggio C++. Ossia l’ accento va su imparare a programmare.

Per questo e’ necessario capire come deve essere fatto un programma e la lettura e analisi di programmi scritti da altri aiuta a capirlo.

L’ organizzazione a moduli dei programmi vuole evidenziare le funzionalita’ di ogni programma: lettura dati, loro elaborazione, stampa risultati.

Di cio’ bisogna ricordarsi quando si scrive un programma.

Page 28: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

28

La riflessione termina con un nuovo programma in C++

da fare usando le sole frasi finora presentate.Progetto logico: il prg. deve:leggere 2 valori interi da assegnare alle

variabili Base e Altezza e visualizzarli;calcolare le aree del rettangolo, triangolo

(Base * Altezza/2) del quadrato costruito sulla Base e del quadrato costruito sull’ Altezza;

visualizzare le aree. Fare un programma monoblocco ed uno strutturato a moduli

(funzioni).

Page 29: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

29

Il tipo puntatoreappare nell’ esempio della stringa di

leggisec.cpp const char* benvenuto = “sono una stringa per il main”. In C o C++ una stringa di caratteri delimitata da 2 virgolette viene memorizzata con una costante stringa formata da una successione di caratteri (codice ASCII): essa termina col carattere ‘\0’ che e’ inserito automaticamente dal compilatore. Nell’esempio l’ indirizzo del primo carattere e’ posto dal compilatore in benvenuto che e’ il puntatore alla stringa.

Page 30: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

30

PuntatoriLa loro importanza specialmente per il C++ e’

notevole.Il puntatore indica un indirizzo di C.M. ed e’

rappresentato simbolicamente da una freccia.Una variabile di tipo puntatore e’ destinata a

identificare e contenere solo indirizzi.Per indicare al compilatore che la variabile e’

di tipo puntatore non si usa una nuova parola riservata, ma il tipo del valore puntato seguito da un asterisco e dal nome del puntatore: es. char* benvenuto

Page 31: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

31

Esempi delle varie codificheScrivendo: int kika = 5; si definisce kika come

una variabile intera e si inizializza con 5. Un puntatore ad un intero si definisce: int *pk; col significato che pk puo’ contenere solo indirizzi di variabili intere; con char *pl; si definisce pl come un puntatore a carattere (per es. come benvenuto) e cosi’ via.

Inizializzare un puntatore non e’ cosi’ semplice come inizializzare un intero: per farlo si puo’ usare l’ operatore unario & col significato di indirizzo di

Page 32: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

32

Esempi degli operatori & e * Avendo: int kika = 5, j; int *pk; si puo’ porre: pk = & kika;

assegnando cosi’ a pk l’ indirizzo di kika. A questo punto pk identifica kika che a sua

volta identifica la zona di memoria contenente 5: c’e una sorta di catena ! Quindi per ritrovare 5 si puo’ usare kika, ma anche usare pk purche’ preceduto dall’ operatore * che attiva un’ operazione di indirezione sul puntatore pk permettendo l’ accesso al valore puntato 5. Quindi sono “equivalenti”: j = kika; j = *pk; => => a j e’ assegnato 5

Page 33: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

33

110001004

100A

Addr.16 C.M.Schemino dello stato di C.M. dopo:kika = 5; pk = &kika;

Kika 100A

0000000000000101

Pk 1004

Page 34: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

34

Esempi delle varie codifiche per tipi diversi sono in

codifiche che e’ un programma in varie forme. La prima e’ monocod.cpp che e’ la versione

monoblocco del programma ed e’ subito da vedere e capire tramite i commenti inseriti.

Poi ci sono le versioni strutturate a blocchi con l’uso di funzioni che si vedranno piu’ avanti.

Per introdurre l’ uso di funzioni ci sono i programmi leggipri.cpp e leggisec.cpp anche se le funzioni li’ presentate lavorano su variabili globali. Vedere E:/carmin/duinf2000/program2 e E:/carmin/duinf2000/ program3.

Page 35: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

35

Printf: un esempio delle funzioni di libreria del C

E’ gia’ stata usata e come appare evidente dal suo uso ed effetto, si tratta di una funzione della libreria Lib del C ossia di un segmento di codice (che permette di usare il video per visualizzazioni) e quindi puo’ essere eseguito piu’ volte nel corso del programma. Questo segmento di codice e’ stato isolato dai Sistemisti della Borland ed il suo prototipo e’ disponibile nel file “header” <stdio.h> del C.

Page 36: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

36

Un altro esempio di funzione dichiarata in string.h del C++

e’ la function strcat che permette di concatenare 2 stringhe (cfr. leggiter.cpp)

In leggiter.cpp si vogliono porre 2 stringhe una di seguito all’ altra: questo lo fa la funzione strcat usando i puntatori alle due stringhe che sono passati alla funzione come suoi argomenti.

Nel programma leggiqua.cpp invece appare la funzione elabora di tipo int e con un tipo char come argomento: e’ il modo GIUSTO di scrivere funzioni diverso dai ….

Page 37: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

37

primi esempi di funzioni voidscritti come esempi di funzioni per strutturare

bene i PROGRAMMI come leggipri e leggisec. Queste sono le funzioni: void leggi(), void elabora(), void scrivi(), void attendi().

Si tratta di funzioni create dall' utente che lavorano su variabili globali (uso dell’ ambiente globale): non hanno ne’ argomenti ne’ tipo (sono indicate come void).

Si tratta di un uso improprio delle funzioni e dei sottoprogrammi in generale, adottato nei primi esempi soltanto per evidenziare le componenti funzionali di un programma.

Page 38: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

38

Indipendenza delle funzioniLa funzione o sottoprogramma in genere e’ lo

strumento che ha permesso lo sviluppo di quantita’ enormi di software (esempio tipico le librerie) e deve lavorare indipendentemente dall' ambiente globale e dal programmma che lo attiva (per capire almeno in parte tutto cio’ cfr. monocod.cpp e codifibl.cpp)

Per essere indipendente, il sottoprogramma ha bisogno di variabili e strutture dati in generale, per identificare i dati su cui deve lavorare al suo interno.

Page 39: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

39

Sottoprogrammi parametrici Il sottoprogramma per identificare e scambiare dati

con l’esterno usa il meccanismo degli argomenti (dichiarati nella sua intestazione) che prendono il nome di parametri formali. Le frasi componenti il suo corpo utilizzano questi parametri formali.

Quando il sottoprogramma e’ attivato per es. dal main i parametri formali diventano il veicolo di trasporto delle informazioni che il main vuole comunicare al sottoprogramma e/o ricevere da questo.

(Nel corpo del sottoprogramma possono essere usate anche altre variabili e strutture dati con compiti provvisori e circoscritte al solo sottoprogramma: queste appartengono all’ ambiente LOCALE al sottoprogr. definito e usabile solo al suo interno.)

Page 40: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

40

(… ma, perche’ sottoprogrammi ? )

La motivazione del nome sta nel loro uso. Si tratta in generale di programmi (software) che vanno in esecuzione solo se vengono attivati o richiamati da altri programmi.

Anche il main program va in esecuzione solo se qualcuno lo chiama, ma costui puo’ essere solo l’ utente o il S.O. non una qualsiasi funzione definita ad un livello a lui sottostante.

Invece qualsiasi sottoprogramma sottostante il main, puo’ attivare gli altri ed anche se’ stesso, (ricorsione !!!) ma non il main!

Page 41: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

41

Compiti dei sottoprogrammi Il programma che chiama o attiva un

sottoprogramma perche’ effettui il compito per cui e’ stato costruito (per es. visualizzare una variabile), deve fornire al sottoprogramma i dati da elaborare (per es. la variabile da visualizzare).

Cio’ viene effettuato nella frase di attivazione specificando, dopo il nome del sottoprogramma e tra parentesi tonde, i nomi dei dati al posto dei parametri formali: questi si dicono parametri effettivi e sostuiscono i parametri formali tramite un meccanismo Hard-Soft.

Page 42: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

42

Funzioni & Procedure Se il sottoprogramma e’ una funzione il

risultato di uscita e’ affidato al nome della funzione stessa. Ossia in ogni Funzione il NOME e’ il veicolo di attivazione e di trasporto del risultato in essa calcolato.

Se il sottoprogramma e’ piu’ generale (tipo procedura Pascal) il NOME e’ il veicolo di attivazione, ma i risultati di uscita possono essere posti nei parametri formali purche’ sia usato il passaggio per indirizzo (cfr.+avanti).

Page 43: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

43

funzioni e procedure: esempiLe funzioni del C o C++ sono monodrome

ossia restituiscono un singolo valore, come in matematica y=log(x), e quindi il nome della funzione (che e’ un identificatore come quello delle variabili) puo’ identificare il risultato.

Le procedure del C o C++ iniziano e sono attivabili come le funzioni, ma restituiscono alcuni valori ad es. somma, media e varianza di un gruppo di dati: 3 valori che non possono essere identificati da una sola entita’, ma da 3 che quindi devono essere poste tra i parametri di scambio.

Page 44: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

44

I motivi per l' introduzione dei sottoprogrammi. 1)

1) Si inserisce una sola volta il codice del sottoprogramma (per es. la printf e’ un pezzo di codice di circa 1000 istruzioni che se si dovessero scrivere al posto del richiamo printf .... porterebbero i programmini di stampa a lunghezze grandiose!) Cio provoca: RIDUZIONE di codice sorgente ed eseguibile con conseguente maggior velocita’ di esecuzione.

Page 45: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

45

I motivi per l' introduzione dei sottoprogrammi. 2) 3)

2) Il proprio sottoprogramma una volta scritto in modo appropriato, risulta indipendente da qualsiasi programma e puo’ essere utilizzato tante volte e da tanti programmi. (INDIPENDENZA)

3) Un sottoprogramma realizzato da professionisti ad alto livello (e quindi in modo ottimale !!) puo’ venire usato da milioni di utenti e milioni di volte. (OTTIMALITA’)

Page 46: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

46

I motivi per l' introduzione dei sottoprogrammi. 4)

4) I meccanismi di attivazione e le rigide regole di utilizzo del sottoprogramma, di cui solo il nome ed i tipi dei parametri formali sono visibili all' esterno, permettono PULIZIA CONCETTUALE E SOSTANZIALE nella costruzione di software: cio’ significa che con l'uso corretto dei sottoprogrammi si ottiene un codice di buona qualita’, facile interpretazione ed uso. E' il primo passo verso la chiarezza e facilita’ di documentazione che sono gli obiettivi dell' Ingegneria del Software.

Page 47: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

47

Meccanismi HardwareL' importanza di questi benefici ha fatto si’ che

tutti gli elaboratori, fin dalla prima generazione, contengano istruzioni macchina per eseguire l' attivazione, il richiamo di un sottoprogramma. Questa in linguaggio macchina e’ realizzata tramite un salto dal MODULO chiamante a quello chiamato lasciando pero’ MEMORIA del punto di ritorno a cui diventa possibile tornare dopo aver eseguito il modulo attivato. Queste istruzioni pero’ riguardano il linguaggio macchina che sara’ trattato in seguito (cenni in parte 5).

Page 48: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

48

Frasi di “va e torna”Semplificando si tratta di istruzioni macchina di

salto al sottoprogramma chiamato e di ritorno al (sotto)programma chiamante. Ma nei linguaggi avanzati come il C, C++, Fortran, Pascal l’ attivazione di sottoprogrammi ha frasi diverse. Qui interessano le frasi del C e C++ per la definizione dei moduli e la loro attivazione che il Compilatore traduce nelle opportune istruzioni macchina di salto a e ritorno da sottoprogramma.

Page 49: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

49

Definizione del modulo funzione in C e C++

La definizione inizia con l’ intestazione (prima frase) nel modo seguente:

[type] function name (arguments list){declarations; function body (with the arguments) [return[(expression)];] /* type function = type expression */ }La funzione che NON usa il suo nome per

restituire valori e’ di tipo void ( => procedura), le altre di tipo int, float, … ecc.

Page 50: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

50

Esempio di funzione: (leggiqua.cpp)

int elabora (char carattere) /*in questa intestaz. la lista degli argomenti e’ di un solo

argomento se no sarebbero separati da virgole */{ int n; //variabile locale di elabora n=(int) carattere; return(n); /* oppure return n che e’ int come

elabora: elabora diventa il veicolo per restituire il valore calcolato. Invece per funzioni di tipo void niente return */

}

Page 51: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

51

Regole del C e C++Un sottoprogramma (subroutine) non puo’

essere attivato se non e’ stato dichiarato all’ inizio: la dichiarazione si effettua indicando il seguente prototipo del sottoprogramma:

[type] subroutine name (type argument); NOTA: tipo non nome !! es. per le funzioni: int elabora (char); per le procedure: void calcola(int, float*,float*); o anche float valcalcol(int, int*, float*);

I parametri effettivi e formali del sottoprogr. devono corrispondere in numero e tipo agli argomenti indicati nel prototipo.

Page 52: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

52

RiflessioneQuando si usera’ una procedura come void

calcola(int, float*, float*) e quando si usera’ una procedura come float

valcalcol(int, int*, float*)e quando si usera’ una procedura come int

valori(int*, float*,float, float)??? (Vedere anche gli esercizi proposti in

diapo66.)A queste domande sara’ +facile rispondere

dopo la descrizione del trasporto_valori.

Page 53: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

53

Attivazione in C e C++ Chi attiva il sottoprogramma?qualsiasi altro [sotto]programma: il

main per es. ma non solo il main, anche le altre funzioni si possono attivare tra loro.

Come si attiva un sottoprogramma? scrivendo nel programma chiamante il

nome del sottoprogramma seguito dai parametri effettivi separati da virgola e racchiusi tra parentesi tonde.

Page 54: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

54

FunzionamentoQuando l'istruzione contenente l’ attivazione

viene eseguita il controllo delle operazioni passa dal programma chiamante al prg.chiamato che viene eseguito

o fino alla fine o fino al primo return. (....ce ne possono

essere piu’ di uno!)In C, C++ (a differenza di altri linguaggi come

il Pascal) le funzioni non possono essere innestate una dentro l' altra: sono tutte allo stesso livello che si puo’ considerare sottostante il livello del main. => E’ impossibile attivare il main da un suo sottoprogramma!

Page 55: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

55

Funzionamento e regoleAl main il controllo delle operazioni arriva all'

inizio (per es. dal S.O.); dal main passa al primo sottoprogramma chiamato; da questo puo’ passare ad un altro sottoprogramma o tornare al main per effetto di un return o della fine del sottoprogramma stesso, e cosi’ via.

Gli argomenti presenti nell’ intestazione del sottoprogramma (i parametri formali) sono nomi di variabili separati da virgole e preceduti dal tipo. Per scrivere il corpo del sottoprogr. si usano i suoi parametri formali (ricordare l’ uso dei parametri %1 %2 %3 … dei file batch !) I parametri effettivi devono corrispondere in numero, ordine e tipo ai parametri formali che sostituiscono all’ attivazione.

Page 56: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

56

Visibilita’SOLO il NOME del sottoprogramma ed il TIPO

dei suoi parametri formali sono VISIBILI al main e (naturalmente!) al sottoprogramma: rappresentano l' INTERFACCIA del sottoprogr. !

INVISIBILI all' esterno del sottoprogr. sono i NOMI delle variabili locali e dei parametri formali del sottoprogr.: meccanismo di PROTEZIONE. CONSEGUENZA:=>Variabili del sottoprogram. con lo stesso nome di quelle del main sono diverse.

Page 57: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

57

Il trasporto_valori tra moduli non si basa sul nome

dei parametri formali, ma sulla loro posizione !! Il passaggio dei parametri effettivi da chiamante a chiamato puo’ avvenire:

1) per valore: non sono le variabili ad essere trasferite, ma il loro CONTENUTO (rvalue) che e’ copiato nel parametro formale corrispondente Da cio’ segue che i valori delle variabili del programma chiamante non vengono modificati dall' attivita’ del sottoprogram. che lavora sui suoi parametri formali contenenti una copia dei parametri effettivi. E’ il passaggio standard, ma...

Page 58: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

58

Il passaggio per valore e’ un MECCANISMO pulito, ma sprecone:

duplicazione di variabili ! Se venisse applicato anche a tabelle (array) di 10000 e piu’ elementi ci sarebbe uno spreco enorme di memoria… Si ottiene nel modo descritto dall’ esempio:

es. prototipo: int elabora (char); intestazione (prima frase del sottoprogramma):

int elabora (char carattere) attivazione (nel prg. chiamante): num=elabora (car);con: carattere = parametro formale di elabora; car e

num = variabili definite da: char car; int num; nel prg. chiamante.

Page 59: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

59

Il passaggio di parametri 2) per indirizzo: non sono le variabili ad

essere trasferite, ma il loro INDIRIZZO che e’ copiato nel parametro formale corrispondente. Da cio’ segue: il sottoprogramma lavora sempre sui suoi parametri formali, ma questi ora contengono gli indirizzi delle variabili (i loro lvalue) e quindi l' attivita’ del sottoprogram. puo’ modificare l' originale e/o inserire dati! ogni modifica si riflette sull' originale! E’ un MECCANISMO meno pulito, ma non duplica variabili! In C e C++ e’ obbligatorio per array.

Page 60: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

60

Il passaggio per indirizzosi ottiene nel modo descritto dall’ esempio: es. prototipo: int cambia ( char *); // l’ argom. e’

un puntatore a carattere intestazione: int cambia (char * puntacar) // il

parametro formale puntacar e’ un puntatore a char attivazione: num = cambia(&car);

con le var. car e num definite nel prg. chiamante da: char car; int num; e con &car indirizzo di car indirizzo copiato nel param. puntacar di tipo puntatore a char.

In C++ c’e’ anche il passaggio per riferimento concettualmente simile a quello per indirizzo.

Page 61: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

61

I/O di un sottoprogrammaIl passaggio di parametri evidenzia il ruolo dei

parametri stessi: un sottoprogramma per lavorare deve ricevere in ingresso i dati da elaborare e deve restituire in uscita i risultati prodotti. (NOTARE CHE questo principio vale per ogni tipo di programma o sottoprogramma ! Si vedra’ che anche il main ha possibili argomenti.)

Tra i parametri si distinguono dunque quelli di ingresso e quelli di uscita, di Input e di Output: i primi sono i valori dati e sono passati di norma per valore, i secondi per indirizzo: sono i risultati

Page 62: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

62

REMEMBERIn ogni Funzione il NOME e’ il veicolo della sua

attivazione e di trasporto del risultato in essa calcolato.

Esempi in program3: leggiqua, leggiqui, codifibl, codifich

In ogni Procedura il NOME e’ il veicolo della sua attivazione: il trasporto dei risultati in essa calcolati e’ generalmente affidato a parametri passati per indirizzo.

Esempi in program4: Scambio, Cambia1, ed anche cambiapr, camfunz e cambia.h (es. compilazione Separata =>)

Page 63: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

63

Perche’ compilazione separata?ogni modulo compilato separatamente diventa

un’ unita’ a se’ stante attivabile da qualsiasi altro modulo. Si puo’ compilare ogni programma e sottoprogramma su un file a se’ stante anche se e’ bene compilare insieme quelli che fanno parte di una libreria, come per es. in camfunz.cpp.

Nell’ esempio (cambiapr.cpp, camfunz.cpp, cambia.h), i sottoprogrammi in camfunz.cpp possono essere attivati non solo dal main a cui erano legati in partenza, ma da qualunque altro programma o sottoprogramma che li voglia usare. Per farlo basta includervi cambia.h e aggiungerli nel project relativo.

Page 64: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

64

header fileSi considerino le differenze tra Cambia1 e cambiapr:

in Cambia1 sono inclusi gli header file stdio.h e iostream.h, mentre in cambiapr e’ incluso solo cambia.h che pero’ contiene l’ inclusione di stdio.h di iostream.h e le dichiarazioni dei moduli usati come void leggi(&int,&int); ...scrivi…, etc.

cambia.h si puo’ intendere come un file header “personalizzato”: deve essere incluso in cambiapr e in camfunz per indicare al compilatore i prototipi di tutti i sottoprogrammi usati.

cambiapr e camfunz sono cosi’ compilabili separatamente.

Page 65: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

65

ProjectPer indicare poi al linker che il programma e’

strutturato su alcuni file contenenti il main e i sottoprogrammi occorre costruire il project. Questo e’ un file con extension prj contenente i nomi di tali file. Per costruirlo porsi sul menu’ alto del compilatore sotto Project e fare clik su Open Project. Si apre la finestra con i nomi dei file prj: dare al nuovo project un nome che apparira’ su una nuova finestra in basso. Un clik su Add item di Project e un altro clik sui file che si vogliono inserire fa costruire il project Un clik su Run manda in esecuzione il project aperto: ad esecuzione conclusa Close Project

Page 66: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

66

Esercizi e ...Scrivere un programma in C++ in cui la

funzione elaborativa consiste nella lettura e somma di 3 valori numerici (letti da Input). Il totale restituito dalla funzione elaborativa deve essere visualizzato. I valori numerici possono essere interi o Floating_point. Scrivere un altro programma ove, letti 2 valori float, la funzione elabora calcoli le somme per difetto e per eccesso dei 2 valori e le restituisca al main.

….e se i valori numerici fossero 100 ?….e se il numero dei valori numerici fosse

incognito ?

Page 67: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

67

Elaborazione ciclica (iterativa)Le domande precedenti servono ad introdurre

le frasi iterative che permettono di realizzare cicli ossia di ripetere una frase o un blocco di frasi (nell’ es. precedente: lettura e somma di valori numerici in numero variabile).

Le frasi sono:for …; while … ; do … while;Seguono sintassi e diagrammi di while … ; do

… while; e per il for …; quale diagramma ?

Page 68: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

68

La sintassidi un tipo di frase stabilisce la forma generale,

il costrutto cui occorre attenersi nello scrivere frasi di quel tipo.

Per il for la sintassi e’ la seguente: for(<espress.1>;<espress.2>;<espress.3>) <frase>;dove: <espress.1> inizializza la var. di controllo del

ciclo; <espress.2> condizione di fine ciclo; <espress.3> incrementa la var. di controllo del

ciclo; <frase> e’ la singola istr. o il blocco di istruzioni da ripetere. Esempi in tutte le versioni di codifiche.

Page 69: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

69

Il for si usa quando il numero di ripetizioni e’ noto: esempio

int somma =0, inc =3, max =23, i;for (i=0; i<max; i=i+1) somma = somma+inc;cout << “\nla somma e’: “ << somma;L’ addizione di inc a somma e’ ripetuta max volteIn C e C++ ogni espressione del tipo i=i+1; si

puo’ scrivere con i++; (analogamente i--;) le espressioni del tipo somma = somma+inc; si possono scrivere con somma += inc; (analogamente x*=n; invece di x=x*n; e cosi’ pure le altre operazioni.)

Page 70: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

70

Sintassi e significato del while … esempi in while1-2

while (<Condizione>) <Frase>fintantoche’ la condizione e’ vera la frase viene

eseguita: si esce dal ciclo passando alla FraseSucc. quando la condizione diventa falsa;

si utilizza quando non si conosce il numero di ripetizioni da effettuare, per es. conoscendo che x >0 ma non quanto vale si puo’ scrivere:

while (x >0) {cout<<“\nx ancora>0”; x--; }la condiz. e’ esaminata prima dell’ esecuzione

della frase.

Page 71: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

71

Sintassi e significato del do ... while

do <Frase> while (<Condizione>)la frase viene eseguita per tutto il tempo che

la condizione e’ vera: si esce dal ciclo quando la condizione diventa falsa.

si utilizza quando non si conosce il numero di ripetizioni da effettuare, per es. conoscendo che x >1 ma non quanto vale si puo’ scrivere:

do {cout<<“\nx ancora>0”; x--; } while (x >0)

la condiz. e’ esaminata dopo l’ esecuzione della frase: ecco perche’ nell’ es. deve essere x>1.

Page 72: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

72

Diagramma di: while(Condiz.) {Frase}

Condiz.False

True

FraseSucc.

Frase

Diagramma di: do{Frase} while (Condiz.)

Condiz.False

FraseSucc.

FraseTrue

Page 73: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

73

Ripensando al ciclo del DOS ...Operazioni svolte:1) Accensione & bootstrapping2) Ricerca e caricamento DOS3) Esecuzione di autoexec.bat (visionarlo !!)

4) Prompt e attesa di un comando6) Esecuzione del comando7) Ritorna a 4)

4) 6) 7) => CICLO INFINITO !!!

Page 74: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

74

UN CICLO INFINITO come si scrive in C o in C++ ? …..La frase 7) Ritorna a 4) potrebbe essere scritta

con un goto quattro; con quattro posto come etichetta della frase 4) ossia cosi’:

quattro: Esegui(prompt); //qui quattro = label Aspetta(comando); Esegui(comando); goto quattro; ...ma il goto NON E’ una frse BEN VISTA dai...

“Programmatori Strutturati” ! Meglio usarla solo per andare a segnalare errori …. e allora?

Page 75: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

75

Risposte possibili ed … altro1) For (;;)2) while (1) { ... } 3) do { ... } while (1) … ma perche’ ?? RIFLETTERE !… e poi avendo alcuni cicli infiniti nel

proprio programma invece di ripetere per ogni ciclo una delle 3 frasi cosa si puo’ fare ? Ricordare #define ….

ES. #define forever For (;;)

Page 76: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

76

Elaborazione condizionale

La condizione che appare nella frase while e’ tipica delle scelte che intervengono nello svolgimento di programmi.

Una scelta permette di interrompere la sequenzialita’ delle operazioni: in base al valore della condizione un blocco di frasi puo’ essere eseguito o no; tra 2 blocchi puo’ essere scelto uno per l’esecuzione e saltato l’ altro; ci puo’ anche essere un annidamento di scelte…

Page 77: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

77

Scelte e frase if … sintassi, significato ed esempi

if (< condizione >) frase1;se la condizione e’ vera esegui la frase1 che

puo’ essere semplice o composta; es. di frase semplice:

if (n>0) cout << “n e’ positivo”;if (< condizione >) frase1; else frase2;se la condizione e’ vera esegui Frase1,

altrimenti esegui Frase2; poi prosegui con la Frase in sequenza, come indicato nel diagramma seguente.

es. if (n>0) cout << “n e’ positivo”; else cout << “n e’ minore o =0”;

Page 78: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

78

Diagramma: if(condiz.) {Frase1} else {Frase2}

Condiz.

… se manca l’else la freccia da Frase1 porta a Frase2Esempi in program5: if1.cpp e while1 - while2.cpp

Frase1True

False

Frase

Frase2

Page 79: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

79

Frasi if annidate: selezione multlipla, ma ...

if (< condizione 1>) <frase 1>; else if (< condizione 2>) <frase 2>;else if (< condizione 3>) <frase 3>;…..else if (< condizione n>) <frase n>;else frase n+1; // qui puo’ andare male …Ricordare che <frase i> e’ una singola istr. o

in generale un blocco di istruzioni: segue esempio … ma usare con cautela if annidati !!!

Page 80: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

80

Esempio con operatori != (diverso) e == (uguale)

{ // ricordare: EOF = CTRL-Z per il DOS

char c;while ((c=getchar()) != EOF) if (c==‘a’) cout<< “ primo carattere\n”; else if (c==‘b’) cout<< “secondo car.\n”; else if (c==‘c’) cout<< “terzo car. \n”; else if (c>‘c’) cout “carattere imprevisto\n”;} //vedere prg. if1.cpp in program5, ma

meglio usare switch.

Page 81: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

81

Operatori relazionali

== il primo operando e’ uguale al secondo!= “ “ “ “ diverso dal “> “ “ “ “ maggiore del “>= “ “ “ “ “ o uguale al “< “ “ “ “ minore del secondo<= “ “ “ “ “ o uguale al “ATT.ne operatore di uguaglianza: NON

confonderlo con l’ operatore di assegnazione!!

Page 82: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

82

Selezione multipla e frase switch: sintassi ed esempio switch (<espressione>){ case <costante 1>: <frase 1>; break; case <costante 2>: <frase 2>; break; ...case <costante n>: <frase n>; break;default: <frase> }Ricordare che <frase i> e’ una singola

istr. o in generale un blocco di istruzioni

Page 83: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

83

Significato anche di default e break: prg. switch1-switch5

E’ calcolata (<espressione>) che ha la funzione di selettore e deve essere integrale (int o char)

se il risultato e’ il valore <costante i> viene eseguita la <frase i> associata e quindi break fa uscire dal blocco di switch; se mancasse break verrebbero eseguite tutte le frasi seguenti la i-esima: un perdi-tempo assurdo !

Invece se il risultato non corrisponde ad alcuna <costante i> viene eseguita la frase associata a default: questa e’ una clausola opzionale, ma comoda.

Page 84: Fondamenti di informatica 1 parte 3 D.U.1 fondamenti di informatica parte 3 appunti per il D.U. in Ingegneria Informatica, di Telecomunicazioni e di Meccanica,

fondamenti di informatica 1 parte 3 D.U.

84

Esercizio

Utilizzando la frase switch …. case rifare il programma richiesto alla diapo 28 con le funzioni scritte per calcolare le aree di alcune figure geometriche inserendo pero’ anche una funzione di scelta che chieda all’ utente quale area vuole e restituisca al main l’indicazione ottenuta. Il main deve quindi attivare solo la funzione che calcola l’area voluta e visualizzarla.