SlideShare a Scribd company logo
1 of 31
Download to read offline
Dipartimento Ingegneria Chimica Materiali Ambiente

             Abilità Informatiche
           Lezione del 2 Aprile 2012




            Prof. Antonino Stelitano
Docente        Antonino
               Stelitano

Tutor          Da definire

Lezioni        Lunedì             14:00 – 17:30 aula 16
                                  Lab. Paolo Ercoli

               Mercoledì          15:45 – 19:00 aula 17
                                  Lab. Paolo Ercoli
Ricevimento:   Per                antonino.stelitano@uniroma1.it
               appuntamento       stelitano.a@libero.it


Sito web:      http://w3.uniroma1.it/ab_informatiche/
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 una
      struttura usano sempre il nome della struttura,

struct frutta {
                  char *nome;
                  int calorie; };
struct vegetale {
                        char *nome;
                        int calorie; };

struct frutta a;                     a.nome
struct vegetale c, d;                c.nome c.calorie


                                                                    3
• Dati
  – Gruppo di contribuenti memorizzati con nome, codice
    fiscale, 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’array




                                                          4
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
#include <stdio.h>
#define DIM 1000
int 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
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
Utilizzo di strutture con funzioni
• Le strutture possono essere passate come parametri a funzioni e possono a loro
  volta 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: la
  struttura 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 variabile
  di struttura.



                                                                                    8
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 deve
    conoscere la dimensione di ogni membro della struttura
     struct dept {
                   char nome_sezione;
                   int numero_sezione;
                   };
•   Funzione che aggiorna le informazioni sugli impiegati.

                                                                             9
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
• Altrimenti modifica all’interno della funzione (o
  main) che contiene la struttura
• Accesso a un membro di una struttura all’interno
  di una struttura:
     e.sezione.numero_sezione

• che è equivalente a (e.sezione).numero_sezione




                                                   11
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 una
  struttura che contiene tre elementi.
• L’allocazione di memoria rimane inalterata, ma invece di accedere all’anno
  come cont1.anno si deve scrivere
         cont1.data_nascita.anno


                                                                           12
Esempio10.3, p.355, Deitel& Deitel


• Simulazione di un mescolatore e distributore di carte
• Rappresentiamo il mazzo con un vettore i cui elementi sono
  carte
• Una carta è definita con una struttura
• Per mescolare il mazzo ci serve un generatore di numeri casuali




                                                                    13
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
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
     valore


                                                              15
Esercizio

• Scrivere un programma che, data una stringa di
  N caratteri, la inverta (es: "Informatica" diventa
  "acitamrofnI")




                                                       16
#include <stdio.h>               Soluzione
#define N 31

void 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
Soluzione
void 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
Esercizio
• Scrivere la funzione "massimoMatrice", che calcola il massimo della
  matrice e la sua posizione.

• La funzione riceve come parametri:
   – un array bidimensionale di interi
   – due interi che rappresentano le due dimensioni dell'array
   – gli indirizzi di due variabili intere per memorizzare gli indici del
      massimo

• La funzione restituisce il valore del massimo della matrice.




                                                                            19
Soluzione
#include <stdio.h>
#include <stdlib.h>

#define R 3
#define C 2

void stampaMatrice(int [][C], int, int);
void leggiMatrice(int [][C], int, int);

int massimoMatrice (int [][C], int *, int *, int , int );




                                                            20
int main()                               Soluzione
{
    /* variabile a cui assegnare il valore restituito dalla funzione massimoMatrice */
    int massimo;
    /* variabili che devono essere modificate dalla funzione massimoMatrice
    per restituire gli indici del valore massimo */
    int    riga = -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
Soluzione

void 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
Soluzione

void 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
Soluzione
int 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
Esercizio
• Completare il programma scrivendo due funzioni "simmetrica" e
  "diagonale", che verificano rispettivamente se una data matrice quadrata e'
  simmetrica e diagonale.
• Entrambe le funzioni ricevono come parametri:
   – un array bidimensionale di interi
   – la dimensione dell'array
• La funzione "simmetrica" restituisce il valore 1 se l'array bidimensionale
  corrisponde a una matrice simmetrica, 0 altrimenti.
   – Una matrice quadrata si dice simmetrica se gli elementi della matrice sono
      simmetrici rispetto alla diagonale principale.
• La funzione "diagonale" restituisce il valore 1 se l'array bidimensionale
  corrisponde a matrice diagonale, 0 altrimenti.
   – Una matrice quadrata si dice diagonale se tutti gli elementi all'esterno della
      diagonale principale sono nulli.
• Una matrice diagonale e' anche simmetrica.

                                                                                  25
Soluzione
#include <stdio.h>
#include <stdlib.h>

#define N 3



void stampaMatrice(int [][N], int);
void leggiMatrice(int [][N], int);

int simmetrica (int [][N], int );
int diagonale (int [][N], int );




                                            26
Soluzione
int 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
Soluzione
    if ( 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
Soluzione
void 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
Soluzione

int 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
Soluzione
int 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

More Related Content

What's hot

12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatoriMajong DevJfu
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++Ilio Catallo
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object OrientedManuel Scapolan
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2Majong DevJfu
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScriptGiovanni Buffa
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: FunzioniMajong DevJfu
 
05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioniPiero Fraternali
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturatiMajong DevJfu
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Marcello Missiroli
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2STELITANO
 

What's hot (20)

12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
11 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 211 - Programmazione: Tipi di dato strutturati pt. 2
11 - Programmazione: Tipi di dato strutturati pt. 2
 
8 Algoritmi
8   Algoritmi8   Algoritmi
8 Algoritmi
 
05 1 intro-struttura
05 1 intro-struttura05 1 intro-struttura
05 1 intro-struttura
 
2006 Py02 base
2006 Py02 base2006 Py02 base
2006 Py02 base
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
2008 python
2008 python2008 python
2008 python
 
05 - Programmazione: Funzioni
05 - Programmazione: Funzioni05 - Programmazione: Funzioni
05 - Programmazione: Funzioni
 
07 2 ricorsione
07 2 ricorsione07 2 ricorsione
07 2 ricorsione
 
05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni05 3 istruzioni-selezione-iterazione-condizioni
05 3 istruzioni-selezione-iterazione-condizioni
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
R sim rank
R sim rank  R sim rank
R sim rank
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati10 - Programmazione: Tipi di dato strutturati
10 - Programmazione: Tipi di dato strutturati
 
Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!Vogliamo programmatori stupidi e pigri!
Vogliamo programmatori stupidi e pigri!
 
06 3 struct
06 3 struct06 3 struct
06 3 struct
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2
 
Java lezione 2
Java lezione 2Java lezione 2
Java lezione 2
 

Viewers also liked

5434 avtodsdsdsds
5434 avtodsdsdsds5434 avtodsdsdsds
5434 avtodsdsdsdsNightLightW
 
Volunteer in Italy 2012
Volunteer in Italy 2012Volunteer in Italy 2012
Volunteer in Italy 2012AYAvolunteer
 
Tutte le liste dei candidati alle elezioni 2012 a Martina Franca
Tutte le liste dei candidati alle elezioni 2012 a Martina FrancaTutte le liste dei candidati alle elezioni 2012 a Martina Franca
Tutte le liste dei candidati alle elezioni 2012 a Martina FrancaMassimiliano Martucci
 
Slideshare
SlideshareSlideshare
Slidesharebolona
 
IEEE GOLD STEP
IEEE GOLD  STEPIEEE GOLD  STEP
IEEE GOLD STEPNeil Ghosh
 
Unit Results. APPENDIX 2
Unit Results. APPENDIX 2Unit Results. APPENDIX 2
Unit Results. APPENDIX 2Georgia Butler
 
Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)Яндекс.Деньги
 
ирбиC
ирбиCирбиC
ирбиCkrupij
 
Business etiquettes ppt @ bec doms bagalkot mba
Business etiquettes  ppt @ bec doms bagalkot mbaBusiness etiquettes  ppt @ bec doms bagalkot mba
Business etiquettes ppt @ bec doms bagalkot mbaBabasab Patil
 

Viewers also liked (18)

mitchell pou 2[1]
mitchell pou 2[1]mitchell pou 2[1]
mitchell pou 2[1]
 
Fotoscurso
FotoscursoFotoscurso
Fotoscurso
 
Grafisk presentation
Grafisk presentationGrafisk presentation
Grafisk presentation
 
5434 avtodsdsdsds
5434 avtodsdsdsds5434 avtodsdsdsds
5434 avtodsdsdsds
 
excel ntics deber
excel ntics deberexcel ntics deber
excel ntics deber
 
Volunteer in Italy 2012
Volunteer in Italy 2012Volunteer in Italy 2012
Volunteer in Italy 2012
 
Menjar
MenjarMenjar
Menjar
 
Tutte le liste dei candidati alle elezioni 2012 a Martina Franca
Tutte le liste dei candidati alle elezioni 2012 a Martina FrancaTutte le liste dei candidati alle elezioni 2012 a Martina Franca
Tutte le liste dei candidati alle elezioni 2012 a Martina Franca
 
Slideshare
SlideshareSlideshare
Slideshare
 
IEEE GOLD STEP
IEEE GOLD  STEPIEEE GOLD  STEP
IEEE GOLD STEP
 
Galaxias
GalaxiasGalaxias
Galaxias
 
JStevens UOB Ref
JStevens UOB RefJStevens UOB Ref
JStevens UOB Ref
 
Unit Results. APPENDIX 2
Unit Results. APPENDIX 2Unit Results. APPENDIX 2
Unit Results. APPENDIX 2
 
Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)Системы электронных платежей в России (исследование TNS)
Системы электронных платежей в России (исследование TNS)
 
2016PanelPoster_SECONDVERSION
2016PanelPoster_SECONDVERSION2016PanelPoster_SECONDVERSION
2016PanelPoster_SECONDVERSION
 
ирбиC
ирбиCирбиC
ирбиC
 
Certification_1928181
Certification_1928181Certification_1928181
Certification_1928181
 
Business etiquettes ppt @ bec doms bagalkot mba
Business etiquettes  ppt @ bec doms bagalkot mbaBusiness etiquettes  ppt @ bec doms bagalkot mba
Business etiquettes ppt @ bec doms bagalkot mba
 

Similar to Lezione 16 (2 aprile 2012)

Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)STELITANO
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)STELITANO
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018Marco Parenzan
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...UltraUploader
 
Linguaggio R, principi e concetti
Linguaggio R, principi e concettiLinguaggio R, principi e concetti
Linguaggio R, principi e concettiVincenzo De Maio
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)STELITANO
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)STELITANO
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Majong DevJfu
 

Similar to Lezione 16 (2 aprile 2012) (20)

Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)Esercitazione 1 (27 febbraio 2012)
Esercitazione 1 (27 febbraio 2012)
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
What is new in C# 2018
What is new in C# 2018What is new in C# 2018
What is new in C# 2018
 
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...[Ebook   ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
[Ebook ita - security] introduzione alle tecniche di exploit - mori - ifoa ...
 
Linguaggio R, principi e concetti
Linguaggio R, principi e concettiLinguaggio R, principi e concetti
Linguaggio R, principi e concetti
 
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
 
12 Struct
12   Struct12   Struct
12 Struct
 
Corso c++
Corso c++Corso c++
Corso c++
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)
 
R Vectors
R VectorsR Vectors
R Vectors
 
Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
 
Programmazione Top Down in C++
Programmazione Top Down in C++Programmazione Top Down in C++
Programmazione Top Down in C++
 
Lezione JSP database Crud
Lezione JSP database CrudLezione JSP database Crud
Lezione JSP database Crud
 
7 Sottoprogrammi
7   Sottoprogrammi7   Sottoprogrammi
7 Sottoprogrammi
 
SQL Unità 1 linguaggio DDL; DML, funzioni di aggregazione
SQL Unità 1 linguaggio DDL; DML, funzioni di aggregazioneSQL Unità 1 linguaggio DDL; DML, funzioni di aggregazione
SQL Unità 1 linguaggio DDL; DML, funzioni di aggregazione
 
Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06Sistemi Operativi: Il kernel linux - Lezione 06
Sistemi Operativi: Il kernel linux - Lezione 06
 

More from STELITANO

Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012STELITANO
 
Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012STELITANO
 
Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012STELITANO
 
Dispenza aloisi
Dispenza aloisiDispenza aloisi
Dispenza aloisiSTELITANO
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)STELITANO
 
Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)STELITANO
 
Lezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteLezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteSTELITANO
 
Lezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteLezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteSTELITANO
 
Lezione 19 (18 aprile 2012) ricerca
Lezione 19 (18 aprile 2012)   ricercaLezione 19 (18 aprile 2012)   ricerca
Lezione 19 (18 aprile 2012) ricercaSTELITANO
 
Lezione 18 (18 aprile 2012) ordinamenti
Lezione 18 (18 aprile 2012)   ordinamentiLezione 18 (18 aprile 2012)   ordinamenti
Lezione 18 (18 aprile 2012) ordinamentiSTELITANO
 
Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettoriSTELITANO
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatoriSTELITANO
 
Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012STELITANO
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012STELITANO
 
Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)STELITANO
 
Lezione 10 (21 marzo 2012)3
Lezione 10 (21 marzo 2012)3Lezione 10 (21 marzo 2012)3
Lezione 10 (21 marzo 2012)3STELITANO
 

More from STELITANO (20)

Risultati
RisultatiRisultati
Risultati
 
Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012Soluzione esame b del 13 giugno 2012
Soluzione esame b del 13 giugno 2012
 
Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012Soluzione esame a del 13 giugno 2012
Soluzione esame a del 13 giugno 2012
 
Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012Soluzioni abilità informatiche 16 maggio 2012
Soluzioni abilità informatiche 16 maggio 2012
 
Dispenza aloisi
Dispenza aloisiDispenza aloisi
Dispenza aloisi
 
Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)Lezione 23 (9 maggio 2012)
Lezione 23 (9 maggio 2012)
 
Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)Lezione 22 (7 maggio 2012)
Lezione 22 (7 maggio 2012)
 
Lezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parteLezione 20 (2 maggio 2012) seconda parte
Lezione 20 (2 maggio 2012) seconda parte
 
Lezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parteLezione 20 (2 maggio 2012) prima parte
Lezione 20 (2 maggio 2012) prima parte
 
Lezione 19 (18 aprile 2012) ricerca
Lezione 19 (18 aprile 2012)   ricercaLezione 19 (18 aprile 2012)   ricerca
Lezione 19 (18 aprile 2012) ricerca
 
Lezione 18 (18 aprile 2012) ordinamenti
Lezione 18 (18 aprile 2012)   ordinamentiLezione 18 (18 aprile 2012)   ordinamenti
Lezione 18 (18 aprile 2012) ordinamenti
 
Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)Lezione 14 (2 aprile 2012)
Lezione 14 (2 aprile 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 12 (28 marzo 2012) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettori
 
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni   memoria - puntatoriLezione 12 (28 marzo 2012) funzioni   memoria - puntatori
Lezione 12 (28 marzo 2012) funzioni memoria - puntatori
 
Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012Soluzione esonero del 4 aprile 2012
Soluzione esonero del 4 aprile 2012
 
Eserc v del 26 marzo 2012
 Eserc v del 26 marzo 2012 Eserc v del 26 marzo 2012
Eserc v del 26 marzo 2012
 
Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)
 
Lezione 10 (21 marzo 2012)3
Lezione 10 (21 marzo 2012)3Lezione 10 (21 marzo 2012)3
Lezione 10 (21 marzo 2012)3
 

Lezione 16 (2 aprile 2012)

  • 1. Dipartimento Ingegneria Chimica Materiali Ambiente Abilità Informatiche Lezione del 2 Aprile 2012 Prof. Antonino Stelitano
  • 2. Docente Antonino Stelitano Tutor Da definire Lezioni Lunedì 14:00 – 17:30 aula 16 Lab. Paolo Ercoli Mercoledì 15:45 – 19:00 aula 17 Lab. Paolo Ercoli Ricevimento: Per antonino.stelitano@uniroma1.it appuntamento stelitano.a@libero.it Sito 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 una struttura usano sempre il nome della struttura, struct frutta { char *nome; int calorie; }; struct vegetale { char *nome; int calorie; }; struct frutta a; a.nome struct vegetale c, d; c.nome c.calorie 3
  • 4. • Dati – Gruppo di contribuenti memorizzati con nome, codice fiscale, 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’array 4
  • 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 1000 int 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 loro volta 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: la struttura 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 variabile di 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 deve conoscere 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 (o main) che contiene la struttura • Accesso a un membro di una struttura all’interno di 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 una struttura che contiene tre elementi. • L’allocazione di memoria rimane inalterata, ma invece di accedere all’anno come 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 sono carte • Una carta è definita con una struttura • Per mescolare il mazzo ci serve un generatore di numeri casuali 13
  • 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 valore 15
  • 16. Esercizio • Scrivere un programma che, data una stringa di N caratteri, la inverta (es: "Informatica" diventa "acitamrofnI") 16
  • 17. #include <stdio.h> Soluzione #define N 31 void 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. Soluzione void 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 della matrice e la sua posizione. • La funzione riceve come parametri: – un array bidimensionale di interi – due interi che rappresentano le due dimensioni dell'array – gli indirizzi di due variabili intere per memorizzare gli indici del massimo • La funzione restituisce il valore del massimo della matrice. 19
  • 20. Soluzione #include <stdio.h> #include <stdlib.h> #define R 3 #define C 2 void 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 massimoMatrice per restituire gli indici del valore massimo */ int riga = -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. Soluzione void 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. Soluzione void 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. Soluzione int 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 e' simmetrica e diagonale. • Entrambe le funzioni ricevono come parametri: – un array bidimensionale di interi – la dimensione dell'array • La funzione "simmetrica" restituisce il valore 1 se l'array bidimensionale corrisponde a una matrice simmetrica, 0 altrimenti. – Una matrice quadrata si dice simmetrica se gli elementi della matrice sono simmetrici rispetto alla diagonale principale. • La funzione "diagonale" restituisce il valore 1 se l'array bidimensionale corrisponde a matrice diagonale, 0 altrimenti. – Una matrice quadrata si dice diagonale se tutti gli elementi all'esterno della diagonale principale sono nulli. • Una matrice diagonale e' anche simmetrica. 25
  • 26. Soluzione #include <stdio.h> #include <stdlib.h> #define N 3 void stampaMatrice(int [][N], int); void leggiMatrice(int [][N], int); int simmetrica (int [][N], int ); int diagonale (int [][N], int ); 26
  • 27. Soluzione int 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. Soluzione if ( 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. Soluzione void 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. Soluzione int 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. Soluzione int 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