La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Fond. informatica1 parte 31 fondamenti di informatica parte 3 appunti per Nettuno a.a. 2004- 2005 di anna maria carminelli gregori.

Presentazioni simili


Presentazione sul tema: "Fond. informatica1 parte 31 fondamenti di informatica parte 3 appunti per Nettuno a.a. 2004- 2005 di anna maria carminelli gregori."— Transcript della presentazione:

1 fond. informatica1 parte 31 fondamenti di informatica parte 3 appunti per Nettuno a.a di anna maria carminelli gregori

2 fond. informatica1 parte 32 Struttura dei programmi zGia nei programmi presentati si possono notare parti differenti, composte da frasi di commento, dichiarazioni e definizioni, comandi esecutivi. zI commenti servono come documentazione del programma, essenziale per far capire a chi lo legge cosa fa il programma e come lo fa; zle dichiarazioni e definizioni permettono al compilatore di interpretare e tradurre tutte le frasi del programma correttamente come appare negli esempi indicati nel seguito.

3 fond. informatica1 parte 33 Dichiarazioni e comandi (frasi, istruzioni) di tipo esecutivo zLe 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. zCon 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.

4 fond. informatica1 parte 34 A proposito delle funzioni zA qualcuno piace 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, con alcuni compilatori (per es. Tc) si possono omettere le dichiarazioni delle funzioni dato che il compilatore le riconosce via via che le incontra. E conveniente ? Lo SEMBRA, ma e meglio NON seguire questo metodo. zPerche ?

5 fond. informatica1 parte 35 Impostazione scorretta per 2 motivi zIl primo motivo e che ogni funzione puo attivare anche funzioni definite successivamente e quindi, se non dichiarate, ignote al compilatore che non le sa riconoscere; zil 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 si puo facilmente realizzare se si dichiarano inizialmente al compilatore le funzioni che il programma richiede.

6 fond. informatica1 parte 36 C++: Definizione di Variabili zCome 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 ocontemporaneamente al loro uso.

7 fond. informatica1 parte 37 Perche ? zLe dichiarazione o definizioni di ogni variabile hanno anche lo scopo di indicare al compilatore di prenotare spazio in C.M. zQuanto spazio? Dipende dal tipo di dato che la variabile dovra identificare e contenere. zIl tipo di dato determina la codifica del dato: fixed, floating, char...

8 fond. informatica1 parte 38 Gli Identificatori del C e C++ zsono associati alle entita del linguaggio come: variabili, costanti, funzioni, tipi derivati (vedere avanti). zRegole 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.

9 fond. informatica1 parte 39 Totale liberta di scelta ? z… quasi ! In ogni linguaggio esistono alcune parole riservate (keyword) con significato preciso per il compilatore del linguaggio e quindi non usabili come identificatori normali. zEcco le parole riservate comuni al C e C++ zauto 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 zIn C++ ce ne sono ancora altre per es….:

10 fond. informatica1 parte 310 keywords zasm catch class delete friend handle inline new operator private protected public template this throw try unsigned virtual volatile … ED ALTRE TIPICHE DI OGNI COMPILAT ORE zNota: 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. zDa qui in poi le keyword saranno scritte in grassetto.

11 fond. informatica1 parte 311 Tipi di dati zTutti i linguaggi di programmazione hanno alcuni tipi di dati predefiniti (fondamentali); in C e C++ sono: zint per variabili di tipo intero (di almeno 2 byte); zfloat floating-point (almeno 4byte); zchar carattere (1byte x car.); zdouble float, ma in doppia precisione, ossia di almeno 8 byte. zQuesti sono i tipi base 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).

12 fond. informatica1 parte 312 Il C++ e a forte tipizzazione zossia 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) zOltre ai tipi fondamentali predefiniti, in C++ si possono definire tipi di dato derivati ottenuti dai tipi fondamentali con vari meccanismi per elaborare oggetti complessi: matrici, solidi tridimensionali, numeri complessi ….

13 fond. informatica1 parte 313 Definizioni: es. in E:/carmin/ Nettuno2004/program1-2 zTutte 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 ! zLa definizione puo avere la forma seguente: ztipo nomi di variabili separate da virgola: es. zint i, j, k, leo, lilla; zfloat x, y, z, sup, inf, set1; zNota: il tipo intero puo essere anche indicato come short int, long int, unsigned.

14 fond. informatica1 parte 314 Inizializzazione delle var. zPuo avvenire in 3 modi (cfr. fasi traduz. Parte2): z1) 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); z2) con una frase di assegnazione nella parte esecutiva del programma eseguita durante l esecuzione del programma (fase di esecuzione): es. a=7; preceduta pero dalla frase int a; z3) con le frasi int a; ed una frase di lettura di un valore da porre in a (ancora fase di esecuzione).

15 fond. informatica1 parte 315 Riflessione zFra le 3 possibilita quale scegliere ? zLa 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.

16 fond. informatica1 parte 316 Nei programmi project4-5 appaiono le 3 possibilita ! zI progetti di questi programmi appaiono dalle frasi di commento dei programma, ma quali sono i loro diagrammi di flusso ???! Quando la logica e sequenziale e gia illustrata diventano superflui ! zSi noti nelle visualizzazioni l uso delle funz. setw(n) e setprecision(n) manipolatori di posiz. e precisione del C++. Altri sono: oct, hex …! zMODIFICHE SUGGERITE: per modificare i contenuti delle variabili usare gli operatori aritmetici di C e C++: z+ addizione - sottrazione - cambio segno z* moltiplicazione / divisione %resto zper es. come segue:

17 fond. informatica1 parte 317 Modifiche di project4-5 in program1: esaminare tutto zAvendo definito: i = 12345; zsi puo modificare il suo contenuto cosi: zi = -i; // in i e posto l opposto di i che si puo visualizzare i oppure: zi = i*2; // in i va il prodotto di i per 2 che si puo visualizzare ed anche: zi = i+1; // i e aumentato di 1 ed anche: zi = i / 3; // diviso per 3 oppure zi = i % 4; // viene fatta la divisione fra l intero i e l intero 4 ed il resto e posto in i.

18 fond. informatica1 parte 318 Espressioni aritmetiche zAlla 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: z- (cambio segno) (PRIMO) z* / % (SECONDO) z+ - z= ULTIMO ! OSSIA: prima e calcolata l espressione poi e assegnato il risultato! zLa valutazione di ogni espressione, procede secondo la priorita degli operatori presenti e se essi hanno la stessa priorita da sinistra a destra. Il valore cosi ottenuto eassegnato alla variabile posta alla sinistra dell operatore di assegnazione.

19 fond. informatica1 parte 319 Parentesi e Costanti zNelle espressioni zsi possono usare parentesi tonde (anche annidate) per modificare la priorita degli operatori … come nelle espressioni algebriche. zsi possono trovare entita fisse del linguaggio che sono le costanti: per es. buonasera e una costante tipo testo (stringa delimitata da ); altra costante di tipo numerico floating-point e usata in project4-5 (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).

20 fond. informatica1 parte 320 Altre costanti zdi 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. zAltri caratteri speciali:\0 NUL=fine stringa; \g BEL=bip; \t horizontal tab; altri … zusare il programma project71 per vedere le codifiche ASCII di tutti i caratteri … provare anche CTRL Z... zNOTA: anche una costante puo essere identificata da un identificatore e avere un tipo, preceduto da const.

21 fond. informatica1 parte 321 Ma sono tutte accessibili le variabili e le costanti? zQuando la definizione delle variabili (o costanti) 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++. zInvece 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 (esempi in program1, ma... +avanti).

22 fond. informatica1 parte 322 L esempio in project8 (program2) zmette in luce anche la globalita e la localita dell ambiente di una funzione o programma. zL ambiente locale si intende formato da tutte le entita dichiarate e definite dentro la funzione. zIn project8.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.

23 fond. informatica1 parte 323 Scope di un entita zScope 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. z=> lo scope dell ambiente globale comprende il main, le funzioni, tutto il codice che sta sullo stesso file del main; z=> lo scope dell ambiente locale si esaurisce nella funzione di appartenenza; z=> lo scope del precompilatore e tutto il file in cui si richiama !

24 fond. informatica1 parte 324 ( … ma a chi giova la modularita dei programmi ? zIl 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. zEsempi di programmi monoblocco sono i primi in program1.. zDagli esempi elementari appare poco la convenienza della modularita che diventa essenziale se aumenta la complessita dei programmi. zDi tutto cio si parlera +avanti.

25 fond. informatica1 parte 325 Una pausa di riflessione zUno degli scopi del corso e imparare a programmare usando il linguaggio C++. Ossia l accento va su imparare a programmare. zPer questo e necessario capire come deve essere fatto un programma e la lettura e analisi di programmi scritti da altri aiuta a capirlo. zL organizzazione a moduli dei programmi vuole evidenziare le funzionalita di ogni programma: lettura dati, loro elaborazione, stampa risultati. zDi cio bisogna ricordarsi quando si scrive un programma.

26 fond. informatica1 parte 326 La riflessione termina con un nuovo programma in C++ zda fare usando le sole frasi finora presentate. zProgetto logico: il prg. deve: zleggere 2 valori interi da assegnare alle variabili Base e Altezza e visualizzarli; zcalcolare le aree del rettangolo, triangolo (Base * Altezza/2) del quadrato costruito sulla Base e del quadrato costruito sull Altezza; zvisualizzare le aree. zFare un programma monoblocco ed uno strutturato a moduli (funzioni).

27 fond. informatica1 parte 327 Il tipo puntatore a carattere zappare nell esempio della stringa di project8.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. Nellesempio l indirizzo del primo carattere, dal compilatore e posto in benvenuto che diventa il puntatore alla stringa.

28 fond. informatica1 parte 328 Puntatori zLa loro importanza specialmente per il C++ e notevole. zIl puntatore indica un indirizzo di C.M. ed e rappresentato simbolicamente da una freccia. zUna variabile di tipo puntatore e destinata a identificare e contenere solo indirizzi. zPer 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

29 fond. informatica1 parte 329 Esempi zScrivendo: 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. Pulizia concettuale: un puntatore definito come puntatore ad un tipo deve sempre contenere indirizzi di varabili di quel tipo!!! zInizializzare un puntatore non e cosi semplice come inizializzare un intero: per farlo si puo usare l operatore unario & col significato di indirizzo di

30 30 Esempi degli operatori & e * zAvendo: int kika = 5, j; int *pk; si puo porre: pk = & kika; dando cosi a pk l indirizzo di kika. (Meglio sarebbe prenotare anche memoria per l intero puntato da pk con la funz. malloc, new… cfr. corso II) zMa posto pk = & kika; pk identifica kika che a sua volta identifica la zona di memoria contenente 5: ce una sorta di catena ! Quindi per arrivare a 5 si puo usare kika, ma anche usare pk purche preceduto dall operatore * che, sui puntatori, attiva un operazione di indirezione come indicato nello schema successivo da dove si deducono equivalenti: j = kika ; j = *pk; a j e assegnato 5

31 fond. informatica1 parte z1000 z1004 z100A zAddr. 16 C.M. zSchemino dello stato di C.M. dopo: zkika = 5; zpk = &kika; // & estrae l indirizzo, * estrae il contenuto Kika 10 0A Pk

32 fond. informatica1 parte 332 Esempi zdelle varie codifiche per tipi diversi sono in project6 e project11 di programm2 zproject6.cpp e la versione monoblocco del programma sulle codifiche ed e subito da vedere e capire tramite i commenti inseriti. zPer introdurre l uso di funzioni ci sono i programmi project7-8 e project71 anche se le funzioni li presentate lavorano su variabili globali. zLa versione project11 è strutturata a blocchi con luso di funzioni che si vedranno piu avanti. zVedere E:/carmin/Nettuno2004/program2 e E:/carmin/Nettuno2004/ program3.

33 fond. informatica1 parte 333 Printf: un esempio delle funzioni di libreria del C zE 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 del C.

34 fond. informatica1 parte 334 Primi esempi di funzioni void zscritti come esempi di funzioni per strutturare bene i PROGRAMMI sono in program2 project7- 8. Sono le funzioni: void leggi(), void elabora() void scrivi(), void attendi(). zSi tratta di funzioni create dall' utente che lavorano su variabili globali (uso dell ambiente globale): non hanno ne tipo (sono indicate come void), ne argomenti. zSi 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.

35 fond. informatica1 parte 335 Variabili globali zLambiente globale si puo schematizzare come lo strato piu esterno di un sistema ad anelli concentrici. zTutte le funzioni rappresentate dagli anelli interni lo possono vedere e usare, ma ne diventano dipendenti.

36 fond. informatica1 parte 336 Variabili locali zPer rendere indipendente ogni funzione occorre sganciarla dall ambiente globale e comunicarle i dati su cui lavorare ad ogni sua attivazione. zLo schema che si puo considerare e quello di 2 entita (scatole) che comunicano tra loro: la prima attiva la seconda inviandole i dati su cui lavorare e questa le restituisce il risultato che ha calcolato (per esempio con una sua variabile. locale). 1 2

37 fond. informatica1 parte 337 Indipendenza delle funzioni zLa 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. zPer essere indipendente, il sottoprogramma ha bisogno di variabili e strutture dati in generale, per identificare i dati su cui deve lavorare al suo interno.

38 fond. informatica1 parte 338 Sottoprogrammi parametrici zIl sottoprogramma per identificare e scambiare dati con lesterno 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. zQuando 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. z(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 del sottoprogr. definito e usabile solo al suo interno.)

39 fond. informatica1 parte 339 (… ma, perche sottoprogrammi ? ) zLa 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. zAnche 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. zInvece qualsiasi sottoprogramma sottostante il main, puo attivare gli altri ed anche se stesso, (ricorsione !!! cfr. corso II ) ma non il main!

40 fond. informatica1 parte 340 Compiti dei sottoprogrammi zIl 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). zCio 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.

41 fond. informatica1 parte 341 Funzioni & Procedure zIn C e C++ 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. zSe 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).

42 fond. informatica1 parte 342 funzioni e procedure: esempi zLe 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 di ogni variabile) puo identificare il risultato. zLe 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.

43 fond. informatica1 parte 343 I motivi per l' introduzione dei sottoprogrammi. 1) z1) 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.

44 fond. informatica1 parte 344 I motivi per l' introduzione dei sottoprogrammi. 2) 3) z2) 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) z3) 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)

45 fond. informatica1 parte 345 I motivi per l' introduzione dei sottoprogrammi. 4) z4) 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.

46 fond. informatica1 parte 346 Meccanismi Hardware zL' 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. Questo in linguaggio macchina e realizzato 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).

47 fond. informatica1 parte 347 Frasi di va e torna zSemplificando 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.

48 48 Regole del C e C++ ( gia viste !) zUn sottoprogramma (subroutine) non puo essere attivato se non e stato dichiarato all inizio: la dichiarazione si effettua indicando il seguente prototipo del sottoprogramma: z[type] subroutine name (arguments type ); zNOTA: tipi (non nomi degli argomenti) separati da virgola!! es. int elabora (char, int); oppure zvoid calcola(int, float*, float); zI tipi degli argomenti indicati nel prototipo sono condizionanti: i parametri effettivi e formali del sottoprogr. devono corrispondere a loro in numero, tipo e ordine.

49 fond. informatica1 parte 349 Attivazione in C e C++ zChi attiva il sottoprogramma? zqualsiasi altro [sotto]programma: il main per es. ma non solo il main, anche le altre funzioni si possono attivare tra loro. zCome si attiva un sottoprogramma? zscrivendo nel programma chiamante il nome del sottoprogramma seguito dai parametri effettivi separati da virgola e racchiusi tra parentesi tonde: es. calcola (100, p*, 3.14);

50 50 La definizione del modulo funzione in C e C++ zinizia con l intestazione (prima frase) dove arguments list e la sequenza dei parametri formali separati da virgola (tipo e nome); segue il corpo come indicato: ztype function name (arguments list) z{declarations; z function body with the use of the arguments z return(expression); z/* type function name = type expression */ z } zIl sottoprogram. che NON usa il suo nome per restituire valori e di tipo void ( => procedura), le funzioni sono di tipo int, float, … ecc.

51 fond. informatica1 parte 351 Es. funzione con nome elabora in project9.cpp di Program3 zint elabora (char carattere) z/*in questa intestaz. la lista degli argomenti e di un solo argomento se no sarebbero separati da virgole */ z{ z int n; // n e variabile locale di elabora z n=(int) carattere; // function body... z return(n); /* oppure return n che e int come elabora: il nome elabora diventa il veicolo per restituire il valore calcolato. Invece per funzioni di tipo void niente return */ z}

52 fond. informatica1 parte 352 Funzionamento zQuando l'istruzione contenente l attivazione viene eseguita, il controllo delle operazioni passa dal programma chiamante al programma chiamato che viene eseguito zo fino alla fine zo fino al primo return. (....ce ne possono essere piu di uno!) zIn 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!

53 fond. informatica1 parte 353 Funzionamento e regole zAl 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. zGli 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. I parametri effettivi devono corrispondere in numero, ordine e tipo ai parametri formali che sostituiscono all attivazione.

54 fond. informatica1 parte 354 Visibilita zSOLO il NOME del sottoprogramma ed il TIPO dei suoi parametri formali sono VISIBILI all esterno del sottoprogramma: rappresentano l' INTERFACCIA del sottoprogramma ! zINVISIBILI 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.

55 fond. informatica1 parte 355 Il passaggio_informazioni tra moduli non si basa sul nome zdei parametri formali, ma sulla loro posizione !! Il passaggio dei parametri effettivi da chiamante a chiamato puo avvenire: z1) per valore: non sono le variabili ad essere trasferite, ma il loro CONTENUTO 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...

56 fond. informatica1 parte 356 Il passaggio per valore e un zMECCANISMO pulito, ma sprecone: duplica i valori delle variabili ! Se venisse applicato anche a tabelle (array) di e piu elementi ci sarebbe uno spreco enorme di memoria… Si ottiene nel modo descritto dall esempio: zes. prototipo: int elabora (char); z intestazione ( prima frase del sottoprogramma ): int elabora (char carattere) con carattere = parametro formale di elabora; zattivazione ( nel prg. chiamante) : znum=elabora (car); con car e num = variabili definite da: char car; int num; nel prg. chiamante.

57 57 Il passaggio di parametri z2) per indirizzo: non sono trasferiti i valori delle variabili, 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 e quindi l' attivita del sottoprogram. puo modificare le var. originali e/o inserirci dati! ogni modifica si riflette sull' originale! E un meccanismo meno pulito, ma non sprecone! In C e C++ e obbligatorio per vettori, array e strutture.

58 fond. informatica1 parte 358 Il passaggio per indirizzo zsi ottiene come qui descritto per la funz. cambia zes. prototipo: int cambia ( char *); // l argom. e di tipo puntatore a carattere zintestazione: int cambia (char * puntacar) // il parametro formale puntacar e un puntatore a char zattivazione: 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. zIn C++ ce anche il passaggio per riferimento concettualmente simile a quello per indirizzo.

59 59 I/O di un sottoprogramma zIl 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.) zTra 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 …ma talora i parametri sono di Input e di Output insieme (cfr. project12 in programm3)

60 fond. informatica1 parte 360 REMEMBER zIn ogni Funzione il NOME e il veicolo della sua attivazione e di trasporto del risultato in essa calcolato. zIn 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. zEsempi in program3: project9-13

61 fond. informatica1 parte 361 Riflessione zQuando si usera una procedura con prototipo come void calcola(int, float*, float*) ze quando si usera una procedura con prototipo come float valcalcol(int, int*, float*) ze quando si usera una procedura con prototipo come int valori(int*, float*,float, float) z??? ( Vedere anche gli esercizi proposti nella diapo seguente.)

62 fond. informatica1 parte 362 Esercizi e... zScrivere 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. z ….e se i valori numerici fossero 100 ? z….e se il numero dei valori numerici fosse incognito ?

63 fond. informatica1 parte 363 Elaborazione ciclica (iterativa) zLe 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). zLe frasi sono: zfor …; while … ; do … while; z(del while è già stato presentato un esempio in project71) zSeguono sintassi e diagrammi di while … ; do … while; e per il for …; quale formato ?

64 fond. informatica1 parte 364 La sintassi zdi un tipo di frase stabilisce la forma generale, il costrutto cui occorre attenersi nello scrivere frasi di quel tipo. zPer il for la sintassi e la seguente: zfor( ; ; ) ; zdove: inizializza la var. di controllo del ciclo; condizione di fine ciclo; z incrementa la var. di controllo del ciclo; e la singola istr. o il blocco di istruzioni da ripetere. Ogni espressione puo mancare ! Esempi in project6 e project11 di program2-3 e...

65 fond. informatica1 parte 365 Esempio e significato zdella frase for: zfor (int i=1; i<=3; i=i+1) {cout << endl; … } zcin >> a; …. z1) assegna ad i il valore 1; z2) controlla che risulti i<=3; z3) se la condizione e vera: esegui la frase o il blocco di frasi tra le { } (qui vai a capo), aumenta i di 1 e riprendi ad operare dal punto 2); z4) altrimenti ( i>3 ) esci dal ciclo ed esegui la frase successiva al for (qui cin >> a).

66 66 Il for si usa quando il numero di ripetizioni e noto: esempio somma = i = 3 in C o C++ come segue: zint somma =0, inc =3, max =23, i; zfor (i=0; i

67 fond. informatica1 parte 367 Sintassi e significato del while … esempi in Program4 project14-16 zwhile ( ) zfintantoche la Condizione e vera la Frase viene eseguita: si esce dal ciclo passando alla FraseSucc. quando la Condizione diventa falsa; zsi utilizza quando non si conosce il numero di ripetizioni da effettuare, per es. conoscendo che x >0 ma non quanto vale si puo scrivere: zwhile (x >0) {cout 0; x--; } zla Condiz. e esaminata prima dell esecuzione della Frase.

68 68 Sintassi e significato del do... While esempio in Program4 project17 zdo while ( ) zla Frase viene eseguita per tutto il tempo che la Condizione e vera: si esce dal ciclo quando la Condizione diventa falsa. zsi utilizza quando non si conosce il numero di ripetizioni da effettuare, per es. conoscendo che x 1 ma non quanto vale si puo scrivere: zdo {cout 0; x--; } while (x >0) zla Condiz. e esaminata dopo l esecuzione della frase: ecco perche nell es. deve essere x 1.

69 fond. informatica1 parte 369 Diagramma di: while(Condiz.) {Frase} Condiz. False True FraseSucc. Frase Diagramma di: do{Frase} while (Condiz.) Condiz. False FraseSucc. Frase True Esempi in program4: project15-16 Esempio in program4: project17

70 fond. informatica1 parte 370 Ripensando al ciclo del DOS... zOperazioni svolte: z1) Accensione & bootstrapping z2) Ricerca e caricamento DOS z3) Esecuzione di autoexec.bat (inizializzaz. !!) z4) Prompt e attesa di un comando z6) Esecuzione del comando z7) Ritorna a 4) z4) 6) 7) => CICLO INFINITO !!!

71 fond. informatica1 parte 371 Ciclo Infinito: tipico della Shell dei S.O. zcome 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: zquattro: Esegui(prompt); //qui quattro = label z Aspetta(comando); z Esegui(comando); z goto quattro; z...ma il goto NON E una frase BEN VISTA dai... Programmatori Strutturati ! Meglio usarla solo per andare a segnalare errori …. e allora?

72 fond. informatica1 parte 372 CICLO INFINITO: possibilita ed … altro z1) For (;;) z2) while (1) {... } z3) do {... } while (1) z… ma perche ?? RIFLETTERE !… ze poi avendo alcuni cicli infiniti nel proprio progr. invece di ripetere per ogni ciclo una delle 3 frasi cosa si puo fare ? Ricordare #define ….

73 fond. informatica1 parte 373 Esempio di un ciclo infinito zEs. #define forever For (;;) zUna volta cosi definito si puo usare nel proprio programma forever invece di For (;;) … zcosi per il ciclo del DOS: zforever z{Esegui(prompt); zAspetta(comando); zEsegui(comando);} Un altro esempio in Programm4 project18…

74 fond. informatica1 parte 374 Elaborazione condizionale zLa condizione che appare nella frase while e tipica delle scelte che intervengono nello svolgimento di programmi. zLa scelta di una condizione 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 lesecuzione e saltato l altro; ci puo anche essere un annidamento di scelte…

75 fond. informatica1 parte 375 Scelte e frase if … sintassi, significato ed esempi zif ( ) frase1; zse la condizione e vera esegui la frase1 che puo essere semplice o composta; es. di frase semplice: zif (j>0) cout << j e positivo; zif ( ) Frase1; else Frase2; zse la condizione e vera esegui Frase1, altrimenti esegui Frase2; poi prosegui con la Frase in sequenza, come indicato nel diagramma seguente. zes. if (j>0) cout << j e positivo; else cout << j e minore o =0;

76 fond. informatica1 parte 376 Diagramma: if(condiz.) {Frase1} else {Frase2} Condiz. z zL else puo mancare: se manca l else, la freccia da Frase1 porta a Frase2. Esempio in program4: project14 Frase1 True False Frase Frase2

77 fond. informatica1 parte 377 Frasi if annidate: selezione multlipla, ma... zif ( ) ; zelse if ( ) ; z….. zelse if ( ) ; zelse frase n+1; // qui puo andare male … zRicordare che e una singola istr. o in generale un blocco di istruzioni: segue esempio … ma usare con cautela if annidati !!!

78 fond. informatica1 parte 378 Esempio con operatori != (diverso) e == (uguale) z{// ricordare: EOF = CTRL-Z = 1111 = ? zchar c; zwhile ((c=getchar()) != EOF) z if (c==a) cout<< primo carattere\n; z else if (c==b) cout<< secondo car.\n; z else if (c==c) cout<< terzo car. \n; z else if (c>c) cout carattere imprevisto\n; z} //vedere prg. project14 in programm4, ma meglio usare switch.

79 fond. informatica1 parte 379 Operatori relazionali z== il primo operando e uguale al secondo z!= diverso dal z> maggiore del z>= o uguale al z< minore del secondo z<= o uguale al zATT.ne operatore di uguaglianza: NON confonderlo con l operatore di assegnazione!!

80 fond. informatica1 parte 380 Selezione multipla e frase switch: sintassi ed esempio zswitch ( ) z{ case : ; break; z case : ; break; z... zcase : ; break; zdefault: z } zRicordare che e una singola istr. o in generale un blocco di istruzioni

81 fond. informatica1 parte 381 Significato anche di default e break: programm4 project19-23 zE calcolata ( ) che ha la funzione di selettore e deve essere integrale (int o char) zse il risultato e il valore viene eseguita la 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 ! zInvece se il risultato non corrisponde ad alcuna viene eseguita la frase associata a default: questa e una clausola opzionale, ma comoda.

82 fond. informatica1 parte 382 Esercizi zUtilizzando la frase break rifare il programma project14.cpp inserendola opportunamente; zUtilizzando la frase switch …. case e break 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 larea voluta e visualizzarla.


Scaricare ppt "Fond. informatica1 parte 31 fondamenti di informatica parte 3 appunti per Nettuno a.a. 2004- 2005 di anna maria carminelli gregori."

Presentazioni simili


Annunci Google