System is processing data
Please download to view
...

Lezione 16 (2 aprile 2012)

by stelitano

on

Report

Category:

Documents

Download: 0

Comment: 0

218

views

Comments

Description

Download Lezione 16 (2 aprile 2012)

Transcript

  • 1. Dipartimento Ingegneria Chimica Materiali Ambiente Abilità Informatiche Lezione del 2 Aprile 2012Prof. Antonino Stelitano
  • 2. DocenteAntonino StelitanoTutorDa definireLezioniLunedì 14:00 – 17:30 aula 16Lab. Paolo Ercoli Mercoledì15:45 – 19:00 aula 17Lab. Paolo ErcoliRicevimento: Perantonino.stelitano@uniroma1.it appuntamento stelitano.a@libero.itSito web:http://w3.uniroma1.it/ab_informatiche/
  • 3. Nome dei campi• I nomi dei campi all’interno di una struttura devono essere unici,ma campi di strutture differenti possono avere lo stesso nome.– questo non crea ambiguità perché i metodi di accesso ad unastruttura usano sempre il nome della struttura,struct frutta {char *nome;int calorie; };struct vegetale {char *nome;int calorie; };struct frutta a; a.nomestruct vegetale c, d;c.nome c.calorie3
  • 4. • Dati– Gruppo di contribuenti memorizzati con nome, codicefiscale, data di nascita (giorno, mese, anno)– 1000 contribuenti memorizzati in un array• Problema – Contare il numero di persone che hanno un’età compresa tra due valori dati – Supponiamo di avere definito una funzione leggi per memorizzare l’array4
  • 5. Definizione di contribuente struct contribuente { char nome[15], cod_fis[17]; short int giorno, mese, anno; }; typedef struct contribuente Contribuente;Definizione matrice dei contribuenti Contribuente gruppo [DIM]; 5
  • 6. #include <stdio.h>#define DIM 1000int conta_persone (Contribuente [ ], int, int, int);int leggi (Contribuente [ ]);int main (void) {struct contribuente {char nome[15], cod_fis[17];short int giorno, mese, anno; };typedef struct contribuente Contribuente;Contribuente gruppo [DIM];int min=20, max=45, a_cor=2002, num_persone=0;leggi(gruppo);num_persone =conta_persone (gruppo, min, max ,a_cor);printf(“Persone di eta’ compresa tra %d e %d anni: %dn”, min, max,num_persone);return 0;}6
  • 7. int conta_persone (Contribuente gruppo [], int low_age, int high_age,int current_year){int i, age, count = 0; for ( i = 0; i < size; ++i) {age = current_year - gruppo[i].anno; if (age >= low_age && age <= high_age) count++;} return count; }7
  • 8. Utilizzo di strutture con funzioni• Le strutture possono essere passate come parametri a funzioni e possono a lorovolta essere restituite dalle funzioni stesse.• intera struttura• singoli membri• puntatori a una struttura• Quando viene passata una struttura o i suoi membri, il passaggio è per valore: lastruttura o i suoi membri non sono modificati – copia locale nel corpo della funzione chiamata. – se uno dei membri della struttura è un array, anch’esso viene copiato.• il passaggio di una struttura per valore può risultare inefficiente.• Alternativa: passaggio della struttura per riferimento con lo indirizzo della variabiledi struttura.8
  • 9. Esempio:typedef struct {char nome [25];int mat_impiegato;struct dept sezione;double salario; … … …………………………………} impiegato;• Si deve definire struct dept prima dell’uso perché il compilatore deveconoscere la dimensione di ogni membro della struttura struct dept { char nome_sezione; int numero_sezione; };• Funzione che aggiorna le informazioni sugli impiegati. 9
  • 10. void aggiorna (impiegato *p){ ……………………………. printf (“Inserisci il numero della sezione: n”); scanf (“%d”, &n); p -> sezione.numero_sezione = n;………………..}• p -> sezione.numero_sezione è equivalente a (p -> sezione.numero_sezione)• si accede, tramite un puntatore, a un campo• aggiorna ( ) può essere usata chiamata così: impiegato e; aggiorna(&e);• viene passato l’indirizzo di e• Non è quindi necessario effettuare alcuna copia locale della struttura in aggiorna ( )10
  • 11. • Altrimenti modifica all’interno della funzione (omain) che contiene la struttura• Accesso a un membro di una struttura all’internodi una struttura: e.sezione.numero_sezione• che è equivalente a (e.sezione).numero_sezione 11
  • 12. Strutture nidificate• Una struttura nidificata è una struttura un cui almeno uno degli elementi èa sua volta una struttura.• La precedente struttura contribuente potrebbe essere definita così:typedef struct {char nome[15], cod_fis[17];struct { short int giorno, mese, anno; } data_nascita;} Contribuente;• I tre campi che rappresentavano la data di nascita sono sostituiti da unastruttura che contiene tre elementi.• L’allocazione di memoria rimane inalterata, ma invece di accedere all’annocome cont1.anno si deve scrivere cont1.data_nascita.anno 12
  • 13. Esempio10.3, p.355, Deitel& Deitel• Simulazione di un mescolatore e distributore di carte• Rappresentiamo il mazzo con un vettore i cui elementi sonocarte• Una carta è definita con una struttura• Per mescolare il mazzo ci serve un generatore di numeri casuali13
  • 14. rand, srand, time• Funzione rand ( ) – Generatore di numeri pseudocasuali – Sempre la stessa sequenza – Per cambiare sequenza ha bisogno di una specie di inizializzazione tramite srand• Funzione srand (unsigned int) – Prende come argomento un unsigned int – A seconda del valore dato genera una sequenza diversa – Per non immettere il valore usiamo la funzione time• Funzione time(NULL) – Restituisce l’ora espresso in secondi – Contenuta in time.h 14
  • 15. Generazione di numeri casuali• Inizializzazione srand (time(NULL))• j = rand () % 52; – rand produce un intero – Il modulo di questo intero su 52 (che è il numero delle carte) da’ un valore compreso tra 0 e 51 • Il resto è sempree minore di 52 – Viene utilizzato per determinare a quale carta dare il valore15
  • 16. Esercizio• Scrivere un programma che, data una stringa diN caratteri, la inverta (es: "Informatica" diventa"acitamrofnI") 16
  • 17. #include <stdio.h> Soluzione#define N 31void scambia(char *a, char *b) {char aux;aux = *a;*a = *b;*b = aux; }/* Funzione che calcola la lunghezza della stringa */int lung(char s[]) { int i; /* incremento il contatore fintanto che non incontro il carattere di terminazione */ for (i=0; s[i] != 0; i++); return i;}17
  • 18. Soluzionevoid inverti2(char v[]){int i,l;l = lung(v);for (i=0; i<l/2; i++) scambia(&v[i],&v[l-i-1]);}main() {char s[N]; scanf("%s",s); inverti2(s); printf("nStringa invertita: %s",s);}18
  • 19. Esercizio• Scrivere la funzione "massimoMatrice", che calcola il massimo dellamatrice e la sua posizione.• La funzione riceve come parametri: – un array bidimensionale di interi – due interi che rappresentano le due dimensioni dellarray – gli indirizzi di due variabili intere per memorizzare gli indici delmassimo• La funzione restituisce il valore del massimo della matrice.19
  • 20. Soluzione#include <stdio.h>#include <stdlib.h>#define R 3#define C 2void stampaMatrice(int [][C], int, int);void leggiMatrice(int [][C], int, int);int massimoMatrice (int [][C], int *, int *, int , int );20
  • 21. int main() Soluzione{/* variabile a cui assegnare il valore restituito dalla funzione massimoMatrice */int massimo;/* variabili che devono essere modificate dalla funzione massimoMatriceper restituire gli indici del valore massimo */intriga = -1, colonna = -1;int mat[R][C]; leggiMatrice(mat, R, C); stampaMatrice(mat, R, C); massimo = massimoMatrice (mat, &riga, &colonna, R, C); printf("nMassimo della matrice: %dn", massimo); printf ("Posizione: riga %d, colonna %dn", riga, colonna);system("pause"); return 0;} 21
  • 22. Soluzionevoid leggiMatrice(int m[][C], int dim1, int dim2){ int i, j;printf("Inserire gli elementi di una matrice di interi %dx%dn", dim1, dim2);for (i = 0; i < dim1; i++) for (j = 0; j < dim2; j++) { printf("Elemento %d %d: ", i, j); scanf("%d", &m[i][j]); }} 22
  • 23. Soluzionevoid stampaMatrice(int m[][C], int dim1, int dim2){ int i, j;printf("nStampa della matrice:n");for (i = 0; i < dim1; i++) { for (j = 0; j < dim2; j++)printf("%5d", m[i][j]); printf("n");}} 23
  • 24. Soluzioneint massimoMatrice (int matrice[][C], int *r, int *c, int dim1, int dim2) {int i, j, max;max = matrice[0][0];*r = 0;*c = 0;for (i = 0; i < dim1; i++)for (j = 0; j < dim2; j++)if ( matrice[i][j] >= max) { max = matrice[i][j]; *r = i; *c = j;}return max;} 24
  • 25. Esercizio• Completare il programma scrivendo due funzioni "simmetrica" e"diagonale", che verificano rispettivamente se una data matrice quadrata esimmetrica e diagonale.• Entrambe le funzioni ricevono come parametri: – un array bidimensionale di interi – la dimensione dellarray• La funzione "simmetrica" restituisce il valore 1 se larray bidimensionalecorrisponde a una matrice simmetrica, 0 altrimenti. – Una matrice quadrata si dice simmetrica se gli elementi della matrice sonosimmetrici rispetto alla diagonale principale.• La funzione "diagonale" restituisce il valore 1 se larray bidimensionalecorrisponde a matrice diagonale, 0 altrimenti. – Una matrice quadrata si dice diagonale se tutti gli elementi allesterno delladiagonale principale sono nulli.• Una matrice diagonale e anche simmetrica.25
  • 26. Soluzione#include <stdio.h>#include <stdlib.h>#define N 3void stampaMatrice(int [][N], int);void leggiMatrice(int [][N], int);int simmetrica (int [][N], int );int diagonale (int [][N], int );26
  • 27. Soluzioneint main(){int mat[N][N]; /* variabile a cui assegnare il valore restituito dalla funzione simmetrica */ int simm_ok = -1; /* variabile a cui assegnare il valore restituito dalla funzione diagonale */ int diag_ok = -1; leggiMatrice(mat, N); stampaMatrice(mat, N); simm_ok = simmetrica (mat, N);27
  • 28. Soluzioneif ( simm_ok == 1 ) printf("nLa matrice e simmetrican");if (simm_ok == 0 ) printf("nLa matrice non e simmetrican");diag_ok = diagonale (mat, N);if ( diag_ok == 1 ) printf("nLa matrice e diagonalen");if (diag_ok == 0 ) printf("nLa matrice non e diagonalen");system("pause");return 0;}28
  • 29. Soluzionevoid leggiMatrice(int m[][N], int dim){ int i, j; printf("Inserire gli elementi di una matrice quadrata di interi %dx%dn", dim, dim); for (i = 0; i < dim; i++)for (j = 0; j < dim; j++) { printf("Elemento %d %d: ", i, j); scanf("%d", &m[i][j]);}}void stampaMatrice(int m[][N], int dim){ int i, j; printf("nStampa della matrice:n"); for (i = 0; i < dim; i++) { for (j = 0; j < dim; j++)printf("%5d", m[i][j]); printf("n"); }}29
  • 30. Soluzioneint simmetrica (int matrice[][N], int dim) {int i, j;for (i = 0; i < dim; i++) for (j = i+1; j < dim; j++) if ( matrice[i][j] != matrice[j][i]) return 0;return 1;}30
  • 31. Soluzioneint diagonale (int matrice[][N], int dim) {int i, j;for (i = 0; i < dim; i++) for (j = 0; j < dim; j++) if ( i != j && matrice[i][j] != 0) return 0;return 1;}31
  • Fly UP