InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1....

78
Informatica C – CHI/MAT Giovanni Agosta Informatica C – CHI/MAT – p.1/78

Transcript of InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1....

Page 1: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

InformaticaC – CHI/MATGiovanni Agosta

Informatica C – CHI/MAT – p.1/78

Page 2: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Funzioni1. Sottoprogrammi

2. Funzioni e Procedure

3. Parametri formali e attuali

4. Dichiarazione ed uso di funzioni

Informatica C – CHI/MAT – p.2/78

Page 3: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Sottoprogrammi

� Problemi:

� Come evitare di riscrivere ogni volta lestesse parti di codice?

� Come estendere l’operatore meccanico inmodo che possa comprendere nuovicomandi?

Informatica C – CHI/MAT – p.3/78

Page 4: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Sottoprogrammi

� Problemi:

� Come evitare di riscrivere ogni volta lestesse parti di codice?

� Come estendere l’operatore meccanico inmodo che possa comprendere nuovicomandi?

� Risposta: definendo e usando deisottoprogrammi!

Informatica C – CHI/MAT – p.4/78

Page 5: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Sottoprogrammi

� Cos’è un sottoprogramma?

� È una unità di elaborazione autonoma, comeun programma, che può essere usata in altriprogrammi

� Nota: un programma, in C, è un casoparticolare di sottoprogramma

� Il programma è il sottoprogramma di nome“main”

Informatica C – CHI/MAT – p.5/78

Page 6: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

FunzionieProcedureSi distinguono due tipi di sottoprogrammi:

� Funzione (pura): come in una funzionematematica, calcola un risultato in funzione diuno o più parametri

� Procedura: come in un programma, eseguedei comandi che hanno un effetto sullo statodell’operatore meccanico

In C, entrambi i tipi sono rappresentati dallo

stesso costrutto, la funzione (non pura, rispetto

alla definizione)

Informatica C – CHI/MAT – p.6/78

Page 7: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Dichiarazionedi FunzioneSintassi:<tipo> <nome-funzione> (<parametri-formali> ){<corpo della funzione>}

Esempio:int somma( int a, int b, int c ){return a+b+c;}

Informatica C – CHI/MAT – p.7/78

Page 8: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Parametriformali

� Nella dichiarazione di funzione, i parametriformali sono delle variabili i cui valori nonsono definiti all’interno della funzione, maprovengono dal programma chiamante

� Nella chiamata di funzione, i parametri formalivengono “sostituiti” da valori chiamatiparametri attuali

� I parametri formali sono dichiarati comevariabili, con tipo e nome, ma fra le parentesitonde all’inizio della dichiarazione invece chenel corpo della funzione

Informatica C – CHI/MAT – p.8/78

Page 9: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Chiamatadi funzioneSintassi:<nome-funzione> (<parametri-attuali> );

Esempio:int main() {printf("%d", somma(1,2,3));}

Informatica C – CHI/MAT – p.9/78

Page 10: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Parametriformali edattuali

� Nella chiamata della funzione somma, iparametri attuali 1, 2, 3 sostituiscono iparametri formali a, b, c

� I parametri attuali possono essere costanti ovariabili

Informatica C – CHI/MAT – p.10/78

Page 11: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempidi Funzioni

� Vediamo ora un esempio di funzione pura edun esempio di procedura

� In entrambi i casi, l’obiettivo delsottoprogramma è calcolare il risultatodell’elevamento di un numero (base) ad unapotenza (esponente):

�� � �� �� � � � �� � � � � � � � �� � ��� �� � � � �

Informatica C – CHI/MAT – p.11/78

Page 12: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(1): Funzionepuraint pow(int base, int esponente){int risultato=1;int i;for ( i=0; i<esponente; i++)risultato = risultato * base;return risultato;}

Informatica C – CHI/MAT – p.12/78

Page 13: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Commento(1)

� In questo esempio, usiamo un ciclo acontatore per calcolare la potenza come seriedi prodotti

� Questa funzione restituisce un risultato, e nonha altri effetti: è una funzione pura

� Questa funzione restituisce un risultatosignificativo solo se l’esponente è positivo!

Informatica C – CHI/MAT – p.13/78

Page 14: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(2): Proceduraint power(int base, int esponente){if (esponente<0){printf("Errore: esponente

negativo");return -1;}else return pow(base, esponente);}

Informatica C – CHI/MAT – p.14/78

Page 15: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Commento(2)

� In questo esempio, usiamo una funzionedefinita in precedenza per calcolare� �� � ��� �� � � � �

� Questa funzione restituisce un risultato, mapuò avere un effetto collaterale

� Restituisce un risultato significativo sel’esponente è positivo

� Stampa un messaggio d’errore (effettocollaterale) altrimenti

� Si tratta di una procedura

Informatica C – CHI/MAT – p.15/78

Page 16: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Funzionidi libreria

� Alcune funzioni di uso molto comune sonorese disponibili in librerie

� Una libreria è una raccolta di funzioni di usocomune

� Un esempio di funzione di libreria è printf

Informatica C – CHI/MAT – p.16/78

Page 17: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Funzionidi libreria: printfprintf( <format-string>, <parametri>)

� <format-string> è una stringa cherappresenta la parte “costante” del testo dastampare, e le posizioni in cui inserire i valoridei parametri

� Gli altri parametri possono essere numeri oaltre stringhe

Informatica C – CHI/MAT – p.17/78

Page 18: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Funzionidi libreria: scanfscanf( <format-string>, <parametri>)

� Salva i valori letti dalla tastiera in variabilipassate come parametri

� La stringa di formato rappresenta il formatodella stringa da leggere

� I parametri in questo caso sono solo variabili(non costanti)

� I parametri sono preceduti da un carattere ’&’

� Vedremo il significato di questo ’&’ in seguito

Informatica C – CHI/MAT – p.18/78

Page 19: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:scanf & printf

int main(){int a, b;int res;printf("Base: ");scanf("%d

n", &a);printf("Esponente: ");scanf("%d", &b);res=power(a, b);if (res>=0)printf("Pow = %d

n", res);}

Informatica C – CHI/MAT – p.19/78

Page 20: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Includerele librerieRicordate di includere le librerie!#include <stdio.h>#include <math.h>#include "mylib.h"

� Alcuni compilatori includonoautomaticamente le librerie standard (adesempio stdio.h)

� La libreria stdio.h comprende le funzioniprintf e scanf

� La libreria math.h comprende funzioni di tipomatematico

Informatica C – CHI/MAT – p.20/78

Page 21: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Includerele librerieLa libreria math.h comprende funzioni di tipomatematico come:

� double pow(double x, double y):elevamento a potenza � �

� double log(double x): logaritmonaturale

� � � � �

� double sqrt(double x): radice quadrata�� double sin(double x): seno � � � � �

� double cos(double x): coseno �� � � �

Informatica C – CHI/MAT – p.21/78

Page 22: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Programmareconle funzioniIn questa seconda parte della lezione, svolgiamoalcuni esercizi sugli argomenti finora trattati:

� Strutture di controllo

� Array

� Funzioni

� Funzioni di libreria

Informatica C – CHI/MAT – p.22/78

Page 23: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Mediadi unvettore

� In primo luogo, torniamo su un esempio giàvisto

� Calcoliamo la media di un vettore dielementi, con costante

Informatica C – CHI/MAT – p.23/78

Page 24: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(1)

���� array-funzioni.c� Esempio di operazione su un array: calcolo della media�

� Esegue lo stesso insieme di operazioni di array2.c,� ma le suddivide in diverse funzioni� �

#define N 10

Informatica C – CHI/MAT – p.24/78

Page 25: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(2)int leggi(int vettore[ ], int n) {

int i;� � Legge dalla tastiera dieci numeri, e li salva in �

� ’vettore’; scanf una funzione di libreria � �

for (i=0; i �n-1; i++) {scanf("%d

n", &vettore[i]);}scanf("%d", &vettore[n-1]);return 0;

}

Informatica C – CHI/MAT – p.25/78

Page 26: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(3)int somma(int vettore[ ], int n) {

int i, somma=0;� � Calcola la somma dei 10 valori in ’vettore’ � �

for (i=0; i �n; i++)somma = somma + vettore[i];

return somma;}

float media(int vettore[ ], int n) {� � Calcola la media dei valori, dividendo per 10 � �

return ((float ) somma(vettore,n))

((float ) n);}

Informatica C – CHI/MAT – p.26/78

Page 27: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(4)int main(){ � � Dichiara un vettore di 10 interi, non inizializzato � �

int vettore[N];

� � Leggi i dieci valori dalla tastiera� �

leggi(vettore, N);

� � Stampa la media dei valori dell’array � �

printf("Media: %f

n", media(vettore, N));return 0;

}

Informatica C – CHI/MAT – p.27/78

Page 28: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Somma/differenzadi vettoriVogliamo costruire un programma che:

� Legge due vettori di elementi dalla tastiera

� Legge un operatore (’+’ o ’-’) dalla tastiera

� Calcoliamo e stampa la somma o ladifferenza fra i due vettori

Informatica C – CHI/MAT – p.28/78

Page 29: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(1)

���� array3.c� Somma e differenza di array�

� Richiede in input due array, e permette di eseguire� le operazioni di somma e differenza� �

#define N 10

Informatica C – CHI/MAT – p.29/78

Page 30: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(2)int leggi(int vettore[ ], int n) {

int i;� � Legge dalla tastiera N numeri, e li salva in �

� ’vettore’; scanf una funzione di libreria � �

printf("Inserisci un vettore di %delementi:

n", n);for (i=0; i �n-1; i++) {

scanf("%d

n", &vettore[i]);}scanf("%d", &vettore[n-1]);return 0;

}

Informatica C – CHI/MAT – p.30/78

Page 31: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(3)int somma(int v1[ ], int v2[ ], int n) {

int i, somma=0;� � Calcola la somma di v1 e v2 e la salva in v2 � �

for (i=0; i �n; i++)v1[i] = v1[i] + v2[i];

return somma;}

Informatica C – CHI/MAT – p.31/78

Page 32: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(4)int differenza(int v1[ ], int v2[ ], int n) {

int i, somma=0;� � Calcola la differenza di v1 e v2 e la salva in v1 � �

for (i=0; i �n; i++)v1[i] = v1[i] - v2[i];

return somma;}

Informatica C – CHI/MAT – p.32/78

Page 33: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(5)int main(){ � � Dichiara due vettori di 10 interi � �

int vett1[N];int vett2[N];char op[10];int i;

� � Leggi i dieci valori dalla tastiera� �

leggi(vett1, N);leggi(vett2, N);

Informatica C – CHI/MAT – p.33/78

Page 34: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(6)

� � Chiede una operazione da eseguire � �printf("Inserisci un operatore:

�n");

scanf("%s", op);

��� Chiamata di funzione, legge un �

� carattere dalla tastiera � �

Informatica C – CHI/MAT – p.34/78

Page 35: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(7)switc h (op[0]) {

��� Switch: variabile di test � �case ’ ’ : printf("v1 v2 � [ ");

somma(vett1, vett2, N);for (i=0; i �N-1; i++)

printf("%d, ", vett1[i]);printf("%d ]

�n", vett1[N-1]);

break ;

��� Case: espressione di confronto �

� e comando relativo � �

Informatica C – CHI/MAT – p.35/78

Page 36: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(8)case ’-’ : printf("v1-v2 � [ ");

differenza(vett1, vett2, N);for (i=0; i �N-1; i++)

printf("%d, ", vett1[i]);printf("%d ]

n", vett1[N-1]);break ;

��� Case: espressione di confronto �

� e comando relativo � �

Informatica C – CHI/MAT – p.36/78

Page 37: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio(9)default : printf("Operatore non

accettato!

n");��� Default: esprime un caso che si�� applica quando nessuno dei �� precedenti applicabile � �

} � � Chiede una operazione da eseguire � �

return 0;}

Informatica C – CHI/MAT – p.37/78

Page 38: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Strutturedati complesse1. Tipi di dato elementari

2. Vettori

3. Matrici

4. Strutture o record

5. Costruzione di nuovi tipi

Informatica C – CHI/MAT – p.38/78

Page 39: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Vettori

� I vettori (o array) rappresentano insiemiordinati di elementi dello stesso tipo

� Possono rappresentare sequenze di numeri,vettori, e altri insiemi dello stesso tipo

� Possiamo rappresentare in qualche mododelle matrici?

Informatica C – CHI/MAT – p.39/78

Page 40: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Vettori

� I vettori (o array) rappresentano insiemiordinati di elementi dello stesso tipo

� Possono rappresentare sequenze di numeri,vettori, e altri insiemi dello stesso tipo

� Possiamo rappresentare in qualche mododelle matrici? Sì!

Informatica C – CHI/MAT – p.40/78

Page 41: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Matrici (1)

� Una matrice può essere considerata come uninsieme ordinato di vettori (ad esempio le suerighe):

�"!$# ! �!$# % & & & �"!$# '

� %# ! � %# % & & & � %# '... ... . . . ...

� � # ! � � # % & & & � � # '((( �

) �"!$# ! �!$# % & & & �"!$# ' *

) � %# ! � %# % & & & � %# ' *

) ... ... . . . ...

*

) � � # ! � � # % & & & � � # ' *

Informatica C – CHI/MAT – p.41/78

Page 42: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Matrici (2)

� Supponiamo allora di avere una matrice :

�+!$# ! �!$# % & & & �+!$# '

� %# ! � %# % & & & � %# '

... ... . . . ...

� � # ! � � # % & & & � � # '(((

Informatica C – CHI/MAT – p.42/78

Page 43: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Matrici (3)

� Rappresentiamo sotto forma di insieme divettori:

�,

-.-.--/-.-.0

! � ) �!$# ! �! # % & & & �+!$# ' *

! � ) � %# ! � %# % & & & � %# ' *

...

) ... ... . . . ...

*

� � ) � � # ! � � # % & & & � � # ' *

� Allora, possiamo dire che:� ) ! % & & & � * 1

Informatica C – CHI/MAT – p.43/78

Page 44: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Matrici (4)Vediamo come tutto questo si traduce in C:

� Ciascun 2 è un array (di float, ad esempio)

� è a sua volta un array, ma non un array dinumeri

� è un array di array, ovvero un arraymultidimensionale

Informatica C – CHI/MAT – p.44/78

Page 45: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Array Multidimensionali(1)Sintassi:<tipo> <nome-variabile> ’[’<dimensione1> ’]’ ...’[’<dimensioneN> ’]’

Esempi:int matrice[7][7];float floatcube[10][6][11];

Informatica C – CHI/MAT – p.45/78

Page 46: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Array Multidimensionali(2)

� Accedere ad un array multimensionali

int matrice[7][7];...a = matrice[2][1]; ...matrice[3][6] = ...

Informatica C – CHI/MAT – p.46/78

Page 47: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Lavorareconle matriciCosa possiamo fare con le matrici

� Input e output, naturalmente!

� L’input è simile a quello dei vettori

� L’output deve essere organizzato in mododa essere comprensibile

� Operazioni su matrici

� Somma, differenza

� Trasposizione

Informatica C – CHI/MAT – p.47/78

Page 48: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Sommadi Matrici (1)

���� matrix.c� Esempio di operazione su matrici: calcolo della somma�

� Questo esercizio mostra non solo il meccanismo per� eseguire operazioni aritmetiche su matrici, ma anche la� lettura e la stampa di matrici.� �

#include

stdio.h

3

#define N 10#define OK 0

Informatica C – CHI/MAT – p.48/78

Page 49: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Sommadi Matrici (2)int mprint(int matrix[N][N]) {

int i,j;for(i=0; i �N; i++) {

��� Ciclo esterno (righe) � �

for (j=0; j

N; j++)

��� Ciclo interno (colonne) � �

��� Stampa il numero considerato allineato a 3 �

� caratteri: ad esempio ’ 3’, ’ 12’, ’123’ � �

printf("%3d ", matrix[i][j]);��� A capo a fine riga (lascia una riga vuota) � �

printf("

n

n");4

return OK;

��� valore di ritorno convenzionale � �

4

Informatica C – CHI/MAT – p.49/78

Page 50: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Sommadi Matrici (3)int mread(int matrix[N][N]) {

int i,j,c;printf("Inserire una matrice:

�n");

for(i=0; i �N; i++)for(j=0; j �N; j++){

scanf("%d", &c);matrix[i][j]=c;

}return OK;

}

Informatica C – CHI/MAT – p.50/78

Page 51: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Sommadi Matrici (4)int somma(int d[N][N], int a[N][N], int b[N][N]) {

int i,j;� � Somma di matrici: �

� d ij � a ij b ij � �

for(i=0; i �N; i++)

��� righe � �for(j=0; j �N; j++)

��� colonne � �

d[i][j]= a[i][j]+b[i][j];� � valore di ritorno convenzionale � �

return OK;}

Informatica C – CHI/MAT – p.51/78

Page 52: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Sommadi Matrici (5)int main() {

int in1[N][N];int in2[N][N];int out[N][N];

mread(in1);

��� lettura della 1a matrice � �

mprint(in1);

��� stampa della 1a matrice � �

mread(in2);

��� lettura della 2a matrice � �

mprint(in2);

��� stampa della 2a matrice � �

Informatica C – CHI/MAT – p.52/78

Page 53: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Sommadi Matrici (6)somma(out, in1, in2);

��� calcolo della somma � �

printf("Somma:

n");mprint(out);

� � stampa del risultato � �return OK;

��� valore convenzionale � �}

Informatica C – CHI/MAT – p.53/78

Page 54: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Calcolodellamatricetrasposta

�5!$# ! �!$# % & & & �5!$# '

� %# ! � %# % & & & � %# '... ... . . . ...

� � # ! � � # % & & & � � # '(((

1 �

�! # ! � %# ! & & & � � # !

�! # % � %# % & & & � � # %

... ... . . . ...

�5!$# ' � %# ' & & & � '# �(((

Informatica C – CHI/MAT – p.54/78

Page 55: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Trasposizione(1)

���� matrix2.c� Esempio di operazione su un matrici: trasposizione�

� �

#include

stdio.h

3#define N 10#define OK 0

Informatica C – CHI/MAT – p.55/78

Page 56: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Trasposizione(2)int T(int ta[N][N], int a[N][N]) {

int i,j;� � Traspozione di matrici: �

� d ij � a ji � �

for(i=0; i �N; i++)

��� righe � �for(j=0; j �N; j++)

��� colonne � �

ta[i][j]= a[j][i];� � valore di ritorno convenzionale � �

return OK;}

Informatica C – CHI/MAT – p.56/78

Page 57: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Trasposizione(3)int main() {

int in[N][N];int out[N][N];

mread(in);

��� lettura della matrice � �

mprint(in);

��� stampa della matrice � �

T(out, in);

� � calcolo della trasposta � �

printf("Trasposta:

n");mprint(out);

� � stampa del risultato � �

return OK;��� valore convenzionale � �

}

Informatica C – CHI/MAT – p.57/78

Page 58: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Strutturedati complesse1. Tipi di dato elementari

2. Vettori

3. Matrici

4. Strutture o record

5. Costruzione di nuovi tipi

Informatica C – CHI/MAT – p.58/78

Page 59: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Strutture

� Gli array (mono- o multi-dimensionali)permettono di rappresentare sequenze dielementi dello stesso tipo

� Come possiamo rappresentare insiemi dielementi di tipo diverso?

� Ma soprattutto, ci servono questi insiemi?

Informatica C – CHI/MAT – p.59/78

Page 60: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Strutture

� Gli array (mono- o multi-dimensionali)permettono di rappresentare sequenze dielementi dello stesso tipo

� Come possiamo rappresentare insiemi dielementi di tipo diverso? con le Strutture

� Ma soprattutto, ci servono questi insiemi?Sì

Informatica C – CHI/MAT – p.60/78

Page 61: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Insieminonomogenei

� A che cosa può servire un insieme nonomogeneo (ovvero con elementi di tipodiverso fra loro)?

A rappresentare oggetti complessi, adesempio:

� Una data: October 25, 2004

� L’anagrafica di una persona: <"Giovanni","Agosta", 28, "Dicembre", 1975>

� Coordinate:67 89 : ;

� . . .

Informatica C – CHI/MAT – p.61/78

Page 62: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Dichiarazionedi StruttureSintassi:struct ’{’<tipo1> <identificatore> ’;’...<tipoN> <identificatore> ’;’} <nome-variabile>

Esempi:struct {char[20] nome;int anno_di_nascita;} persona;

Informatica C – CHI/MAT – p.62/78

Page 63: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Accessoai campi

� A differenza degli array, i valori contenuti inuna struttura non sono individuati attraversoun numero

� Ogni valore (o campo) della struttura èindividato dall’identificatore associato:

persona.anno_di_nascita = 1975;...printf("%c", persona.nome[0]);

Informatica C – CHI/MAT – p.63/78

Page 64: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:DataVediamo un semplice esempio:

� Una data è rappresentata da tre interi

Usiamo comunque una struttura, perchè:

� I tre valori non sono realmente dello stessotipo

� Infatti si tratta di intervalli diversi sugli interi:� � < � � = )?> @ > *

� � � = )?> > 9 *

� � � = )BA *

Informatica C – CHI/MAT – p.64/78

Page 65: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Data(1)int main(){

struct {unsigned shor t int giorno;unsigned shor t int mese;int anno;

} data;

int c;

Informatica C – CHI/MAT – p.65/78

Page 66: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Data(2)printf("Giorno: ");scanf("%d",&c);data.giorno = c;printf("Mese: ");scanf("%d",&c);data.mese = c;printf("Anno: ");scanf("%d",&c);data.anno = c;printf("Data � %d/%d/%d �

n", data.giorno,data.mese, data.anno);}

Informatica C – CHI/MAT – p.66/78

Page 67: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Strutturedati complesse1. Tipi di dato elementari

2. Vettori

3. Matrici

4. Strutture o record

5. Costruzione di nuovi tipi

Informatica C – CHI/MAT – p.67/78

Page 68: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Definizionedi tipi

� Vediamo come possiamo definire un nuovotipo

Sintassi:typedef <definizione-di-tipo> <nome>

Esempi:typedef unsigned long int naturale;...naturale n = 10;

Informatica C – CHI/MAT – p.68/78

Page 69: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Tipi enumerativiSintassi:enum ’{’ <etichetta>, ...<etichetta>’}’

Esempi:typedef enum { FALSO, VERO }booleano;

Informatica C – CHI/MAT – p.69/78

Page 70: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempiocompleto:Datav.2

� In questa lezione, abbiamo visto:

� Come dichiarare nuovi tipi

� Come dichiarare tipi enumerativi

� Come usare il costruttore struct

� Riprendiamo l’esempio della data, alla luce diqueste nuove conoscenze

Informatica C – CHI/MAT – p.70/78

Page 71: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (1)

���� struct.c� Esempio di uso di strutture, definizioni di tipo� e tipi enumerativi�

� Questo programma mostra come dichiarare ed usare� variabili appartenenti a tipi definiti dall’utente.� �

#include

stdio.h

3

��� Dichiarazione di un valore non valido per i giorni � �

#define NON_VALIDO 0

Informatica C – CHI/MAT – p.71/78

Page 72: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (2)

��� typedef e’ la parola chiave per definire nuovi �� tipi, qui la usiamo per introdurre un nome piu’ �� breve per ’unsigned short int’. � �typedef unsigned shor t int t_giorno;

��� Definizione del nuovo tipo ’mesi’, in cui i mesi �� hanno valori di questo tipo: GEN � �1, FEB � �2, etc. �

� Notate che NONE, pari a 0, e’ inserito per fare si’�� che i mesi inizino da 1 piuttosto che da 0. � �

typedef enum { NONE, GEN, FEB, MAR, APR,MAG, GIU, LUG, AGO, SET, OTT, NOV, DIC }mesi;

Informatica C – CHI/MAT – p.72/78

Page 73: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (3)

��� Definizione del nuovo tipo ’data’, in cui si puo’ �� salvare una data sotto forma di

giorno,mese,anno

3 �

� definiti in modo opportuno. � �

typedef struct _data {t_giorno giorno;mesi mese;int anno;

} data;

Informatica C – CHI/MAT – p.73/78

Page 74: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (4)

��� Funzione che legge e restituisce una data. � �data leggi_data() {

int c;� � Dichiarazione di variabile di tipo ’data’ �� Inizializziamo tutti i campi con valori non �

� definiti (NON VALIDO; NONE), eccetto l’anno � �

data la_data = { NON_VALIDO, NONE, 0 };

Informatica C – CHI/MAT – p.74/78

Page 75: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (5)

� � Continua a chiedere un valore finche’ non ne �

� viene inserito uno accettabile � �

while (la_data.giorno==NON_VALIDO) {printf("Giorno: ");scanf("%d",&c);��� verifiche di correttezza dei valori inseriti � �

if (c � 1 C C

c 3 31)la_data.giorno = NON_VALIDO;

elsela_data.giorno = c;

}

Informatica C – CHI/MAT – p.75/78

Page 76: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (6)while (la_data.mese==NONE) {

printf("Mese: ");scanf("%d",&c);if (c � GEN

C C

c 3 DIC)la_data.mese = NONE;

elsela_data.mese = c;

}printf("Anno: ");scanf("%d",&c);la_data.anno = c;return la_data;

}Informatica C – CHI/MAT – p.76/78

Page 77: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (7)int stampa_data(data la_data) {� � verifiche di correttezza dei valori dei parametri � �

if (la_data.giorno == NON_VALIDOC C

la_data.mese == NONE) {printf("Errore, data non valida!

n");return -1;

��� Valore convenzionale: ’errore’ � �

}else {

printf("Data � %d/%d/%d �

n",la_data.giorno, la_data.mese, la_data.anno);

return 0;��� Valore convenzionale: ’corretto’ � �

}

Informatica C – CHI/MAT – p.77/78

Page 78: InformaticaC– CHI/MAThome.deib.polimi.it/agosta/old/infoC-2004/infoC-2004.5-6.pdfFunzioni 1. Sottoprogrammi 2. Funzioni e Procedure 3. Parametri formali e attuali 4. Dichiarazione

Esempio:Datav.2 (8)

��� Funzione principale: legge e stampa una data � �

int main(){data oggi;oggi = leggi_data();return stampa_data(oggi);

}

Informatica C – CHI/MAT – p.78/78