SlideShare ist ein Scribd-Unternehmen logo
1 von 60
Downloaden Sie, um offline zu lesen
Tipi di dato strutturati
(Parte 2: stringhe, strutture)
Tipo di dato stringa




Programmazione I - Paolo Valente, 2008/2009   2
Stringa

• Una stringa è una sequenza di caratteri
• Letterale stringa (costante senza nome):
  sequenza di caratteri delimitati da doppi apici
• Esempio:
  quot;sono una stringaquot;

• All'oggetto cout abbiamo spesso passato dei
  letterali di tipo stringa mediante l'operatore di
  uscita <<


Programmazione I - Paolo Valente, 2008/2009             3
Stringhe in C/C++
• Nel linguaggio C/C++ non esiste propriamente un
  tipo stringa
• Il tipo stringa è quindi un oggetto astratto
  implementato concretamente mediante
    – Un array di caratteri terminati da un carattere
      terminatore
              Tipicamente il carattere speciale '0'
          o


                – Numericamente, il suo valore è 0
• Come per i vettori, nella libreria standard del C++ è
  disponibile anche un tipo astratto stringa (string) con
  interfaccia di più alto livello di un array di caratteri
    – In questo corso non vedremo tale tipo astratto
Programmazione I - Paolo Valente, 2008/2009             4
Stringa (sintassi)
SINTASSI della definizione di una variabile di tipo
stringa:
 char <identificatore> [ <espr-costante> ] ;

char stringa[6] ;
      • alloca spazio per 6 oggetti char
      • uno va utilizzato per il fine stringa ‘0’
      • quindi la stringa ha al più 5 caratteri

                                   M      A   R   C    O     0
                                                                            stringa[5]
                                   0      1   2   3    4      5
                                                                           stringa[4]
            stringa[0]                                        stringa[3]
                                                      stringa[2]
                     stringa[1]
Programmazione I - Paolo Valente, 2008/2009                                              5
NOTE 1/2
  La definizione char stringa[N] ;
        - Alloca spazio per una stringa di al più N-1 caratteri
        - E’ possibile utilizzare un array di N caratteri anche per
          stringhe di dimensione inferiore ad N-1
          Es., char nome[6] ;

                                                           ?
                                 A      N     N   A   0
                                 0      1     2   3    4   5

        - in questo caso le celle oltre il carattere ‘0’ sono
          concettualmente vuote;
        - ovviamente contengono pur sempre un valore che però
          non viene preso in considerazione
Programmazione I - Paolo Valente, 2008/2009                           6
NOTE 2/2
• Una stringa è un array di caratteri

• Ma un array di caratteri non è necessariamente
  una stringa

• Affinché un array di caratteri risulti una stringa,
  è necessario che l’ultimo elemento sia ‘0’




Programmazione I - Paolo Valente, 2008/2009         7
Inizializzazione
Vi sono tre modi per inizializzare una stringa in una
definizione:
 char nome[6] = { ‘M’, ‘A’, ‘R’, ‘C’, ‘O’, ‘0’ } ;
      /* come un normale array */
 char nome[6] = “MARCO” ;
      /* utilizzabile solo per le stringhe; il carattere di fine
         stringa viene inserito automaticamente dal compilatore*/

  char nome[ ] = “MARCO” ;
    /* in questo caso l'array viene dimensionato
       automaticamente a 6 ed il carattere di fine stringa viene
       inserito dal compilatore */


Programmazione I - Paolo Valente, 2008/2009                        8
Assegnamento
• Se non si tratta di una inizializzazione, l’unico
  modo per assegnare un valore ad una stringa è
  carattere per carattere (come un normale array),
  con esplicito inserimento del carattere di fine
  stringa:
                                     char nome[6];
                                     nome[0]= ‘M’;
                                     nome[1]= ‘A’;
                                     nome[2]= ‘R’;
                                     nome[3]= ‘C’;
                                     nome[4]= ‘O’;
                                     nome[5]= ‘0’;

Programmazione I - Paolo Valente, 2008/2009           9
Input/Output di stringhe
• Se un oggetto di tipo stringa (ossia array di caratteri)
      – viene passato al cout/cerr mediante l'operatore <<, la
        stampa dei caratteri termina quando si incontra il
        terminatore
      – viene utilizzato per memorizzarvi ciò che si legge da
        cin mediante l'operatore >>, vi finisce dentro la
        prossima parola, ossia sequenza di caratteri non
        separati da spazi
        Esempio: se sullo stdin vi è “ciao mondo”, nella
        stringa finisce solo “ciao” (e sullo stdin rimane
        “ mondo”)
• Esercizio: definire un oggetto di tipo stringa,
  inizializzarlo, stamparlo, scriverci dentro il contenuto
  dello stdin, ristamparlo
Programmazione I - Paolo Valente, 2008/2009                     10
Soluzione
  main()
  {
     cont int MAX_LUN = 20 ;
     char stringa[MAX_LUN] = quot;provaquot;;
     cout<<stringa<<endl ;
     cin>>stringa ;
     cout<<stringa<<endl ;
  }




Programmazione I - Paolo Valente, 2008/2009         11
Errori da evitare con le stringhe
• Definire un array di caratteri ed inizializzarlo
  successivamente come una stringa
      SEQUENZA DI ISTRUZIONI ERRATA:
                      char nome[6];
                                                     NO
                      nome = “MARCO” ;


• Copiare una stringa in un’altra con l’operazione di
  assegnamento
     SEQUENZA DI ISTRUZIONI ERRATA:
                      char nome[15], cognome[15] ;
                      ...
                                                     NO
                      nome = cognome;

   Gli elementi vanno copiati uno alla volta.

Programmazione I - Paolo Valente, 2008/2009               12
Caratteri e stringhe
• E’ importante osservare la differenza tra
        ‘A’           carattere A,
                      rappresentabile in un oggetto di tipo char c=‘A’

        “A”           stringa A,
                      rappresentabile in un array, es. char s[2]=“A”

   Tale differenza ha un impatto anche sulla
   memorizzazione dei relativi dati, rispettivamente:

                             A                  A   0


Programmazione I - Paolo Valente, 2008/2009                            13
La stringa è un “vettore particolare”
• I singoli caratteri di una stringa possono anche
  essere visti come oggetti indipendenti
• Se pensati come stringa sono però parte di un
  tutt'uno
             “MARCO”  ‘M’ ‘A’ ‘R’ ‘C’ ‘O’ '0'




Programmazione I - Paolo Valente, 2008/2009          14
La stringa è un “vettore particolare” (2)
• Nell’accezione comune, una stringa è una
  sequenza di caratteri la cui lunghezza può variare
• Di conseguenza, per supportare pienamente il
  tipo stringa bisognerebbe far riferimento ad un
  supporto per l’allocazione dinamica della memoria
• Tuttavia, poiché la gestione di dati dinamici sarà
  trattata in seguito, per ora si prenderà in
  considerazione solo il caso di
      – stringhe statiche (dimensione fissa)
      – stringhe con dimensione massima definita a tempo di
        scrittura del programma

Programmazione I - Paolo Valente, 2008/2009              15
Esercizio 1 (Specifica)


• Data una stringa di caratteri, se ne calcoli la
  lunghezza.




Programmazione I - Paolo Valente, 2008/2009         16
Esercizio 1 (Idea)

• Bisogna scandire tutto l'array che rappresenta la
  stringa fino al carattere di terminazione ‘0’,
  contando i passi che si effettuano




Programmazione I - Paolo Valente, 2008/2009           17
Esercizio 1 (Algoritmo)
• Inizializzare una variabile contatore a 0
• Utilizzare un ciclo fino al carattere ‘0’ ed
  incrementare la variabile contatore ad ogni passo
• Stampare il valore finale della variabile contatore



 Esercizio 9 (Rappresentazione informazioni)
• Serve una variabile stringa
• Serve una variabile ausiliarie (int) come indice del ciclo e
  forse un'ulteriore variabile come contatore del numero di
  caratteri
Programmazione I - Paolo Valente, 2008/2009                      18
Esercizio 1 (Programma)
  main()
  {
   int conta=0;
   char dante[] = “Nel mezzo del cammin di nostra vita”;
     for (int i=0; dante[i]!=‘0’; i++)
        conta++; // poteva bastare la sola variabile i

     cout<<“Lunghezza stringa = “<<conta<<endl ;
    }




Programmazione I - Paolo Valente, 2008/2009                19
Stringa diversa

  main()
  {
   int conta=0;
   char dante[] = “Ho preso 0 spaccato”;
     for (int i=0; dante[i] != '0'; i++)
        conta++;
                                              E’ corretto?

     cout<<“Lunghezza stringa = “<<conta<<endl;
    }


Programmazione I - Paolo Valente, 2008/2009                  20
Risposta
• Sì, perché il carattere '0' è diverso dal carattere
  '0'




Programmazione I - Paolo Valente, 2008/2009          21
Esercizio 2 (Specifica)


• Copiare una stringa data in un’altra,
      – la stringa di destinazione deve essere memorizzata
        in un array di dimensioni sufficienti a contenerla
      – il precedente contenuto della stringa di
        destinazione viene perso (sovrascrittura)




Programmazione I - Paolo Valente, 2008/2009              22
Esercizio 2 (Algoritmo)
• Scandire tutta la prima stringa fino al carattere di
  terminazione ‘0’
• Copiare carattere per carattere nella seconda
  stringa
• Aggiungere il carattere di fine stringa



                (Rappresentazione informazioni)
• Servono due variabili stringa ed almeno un indice per
  scorrere gli array

Programmazione I - Paolo Valente, 2008/2009               23
Esercizio 2 (Programma)

  main()
  {
   int i; // volutamente non definito nell'intestazione del for
   char origine [] = “Nel mezzo del cammin di nostra vita”;
   char copia [40] ;

      for (i=0; origine[i] != '0' ; i++)
         copia[i]=origine[i]; /* si esce prima della copia del carattere di
                                              fine stringa che, quindi, va aggiunto
                                              esplicitamente */
      copia[i]=‘0’ ;
  }

Programmazione I - Paolo Valente, 2008/2009                                           24
Stampa di una stringa
• Una stringa si può ovviamente stampare anche
  carattere per carattere

  Esempio
     int i=0; char str[]=“Nel mezzo del cammin di nostra vita”;
       …
      while (str[i] != '0')
         { cout<<str[i]; i++ }




Programmazione I - Paolo Valente, 2008/2009                       25
Funzioni di libreria
• Così come per le funzioni matematiche e quelle sui
  caratteri, il linguaggio C/C++ ha una ricca libreria di
  funzioni per la gestione delle stringhe, presentata in
  <cstring> (string.h in C)
• strcpy(stringa1, stringa2)
  copia il contenuto di stringa2 in stringa1 (sovrascrive)
• strncpy(stringa1, stringa2, n)
  copia i primi n caratteri di stringa2 in stringa1
• strcat(stringa1, stringa2)
  concatena il contenuto di stringa2 a stringa1
• strcmp(stringa1, stringa2)
  confronta stringa2 con stringa1: 0 (uguali), >0
  (stringa1 è maggiore di stringa 2), <0 (viceversa)
Programmazione I - Paolo Valente, 2008/2009                 26
Esercizi
• Controllare se una stringa è più lunga di un’altra
• Copiare soltanto i primi 10 caratteri di una stringa in
  un’altra stringa, inizialmente vuota. [Att.!: esistono?]
• Copiare soltanto le vocali di una stringa in un’altra stringa,
  inizialmente vuota.
• Copiare soltanto le lettere minuscole di una stringa in
  un’altra stringa, inizialmente vuota. [Att.!: ricordare la
  tabella ASCII]
• Concatenazione (append) di due stringhe: Aggiungere una
  stringa in fondo ad un’altra stringa, lasciando uno spazio
  tra le due stringhe [Att.!: la seconda stringa può essere
  vuota o no]
• Verificare se due stringhe sono uguali o diverse
• Data una frase, contare il numero dei caratteri maiuscoli,
  minuscoli, numerici e dei caratteri non alfanumerici

Programmazione I - Paolo Valente, 2008/2009                   27
Array di stringhe
Per analogia a quanto detto in precedenza, un array di
stringhe si realizza mediante una matrice di tipo char.
Esempio: Elenco dei nomi dei giorni della settimana
          char giorni[7][11] = { “lunedi'”, “martedi'”, “mercoledi'”,
                     “giovedi'”, “venerdi'”, “sabato”, “domenica” }


                                                        '
                   l      u      n      e     d     i          0
                                                                 '
                   m      a      r      t     e    d     i           0
                                                                           '
                   m      e      r      c     o    l      e      d     i       0
                                                                '
                   g      i      o      v     e    d       i         0
                                                                '
                   v      e      n      e     r    d       i          0
                   s      a      b       a     t    o    0
                   d      o      m       e     n    i   c      a     0
Programmazione I - Paolo Valente, 2008/2009                                         28
Tipo di dato “struttura”




Programmazione I - Paolo Valente, 2008/2009   29
Tipi di dato

                                                           Derivati
      Scalari,
    Fondamentali,
     Primitivi o
     Aritmetici
                                              Riferimenti Strutturati   Puntatori
                                                           array []
                                                           struct
      predefiniti             enumerati
        bool                     enum
        char
        int
         float
         double

Programmazione I - Paolo Valente, 2008/2009                                    30
Esempio
• Caratterizzare alcuni attributi di una “persona”

• Persona
      –   Nome (stringa di al più 15 caratteri)
      –   Cognome (stringa di al più 20 caratteri)
      –   Luogo di nascita (stringa di al più 20 caratteri)
      –   Età (int)
      –   Altezza espressa in metri (float)
      –   Codice fiscale (stringa di 16 caratteri)



Programmazione I - Paolo Valente, 2008/2009                   31
Esempio di dichiarazione in C/C++
Dichiarazione del nuovo tipo di dati persona

    struct persona
     {
          char nome[16];
          char cognome[21];
          char luogo_nascita[21];
          int eta;
          float altezza;
          char codice_fiscale[17];
         };

Programmazione I - Paolo Valente, 2008/2009    32
Esempio di utilizzo
• Una volta dichiarato il nuovo tipo di dati persona,
  è possibile definire variabili di questo tipo
• Esempio:
     persona Mario, Anna;

• Che cos’è la variabile Mario?

 Una variabile strutturata composta da 3 stringhe, 1 int, 1
 float ed un’altra stringa
 Gli elementi della variabile strutturata sono detti membri
 o campi. Ciascun campo è caratterizzato da un tipo e da
 un nome


Programmazione I - Paolo Valente, 2008/2009                    33
Oggetto di tipo struttura
• Oggetto di tipo struttura
      – n-upla ordinata di elementi, detti membri o campi,
        ciascuno dei quali ha un suo nome ed un suo tipo




Programmazione I - Paolo Valente, 2008/2009                  34
Tipo di dato basati sul tipo struttura
• Tipo di dato dichiarato mediante il costrutto struct
  Es.: il precedente tipo Persona
   – Nuovo tipo di dato
   – La dichiarazione del nuovo tipo di dato
     definisce il tipo ed il nome di ciascun campo di
     ogni oggetto di quel tipo di dato
   – Es.: il tipo persona dichiara il nome ed il tipo di
     tutti (e soli) i campi presenti in ogni oggetto di
     tipo persona
• Per brevità chiameremo semplicemente tipi
  struttura questi nuovi tipi di dato
• In altri linguaggi i tipi struttura sono spesso
  chiamati record
Programmazione I - Paolo Valente, 2008/2009            35
Dichiarazione tipi struttura e
                 definizione variabili
Dichiarazione di un tipo struttura:
struct <nome_tipo> { <lista_dichiarazioni_campi> } ;

 Nome del nuovo tipo                                NOTA: Raro caso in cui
                                                    si usa il ; dopo una }
                                                    Motivo: ci potrebbe essere una
                                                    definizione di variabile/i

Definizione di variabili di un tipo strutturato di nome
nome_tipo:
[ const ] <nome_tipo>                         identificatore1, identificatore2, ... ;
Programmazione I - Paolo Valente, 2008/2009                                        36
Esempio
              Nome del nuovo tipo

           struct frutto
            {
              char nome[20];
                                                                 Campi
              float peso, diametro;
            };
                           Dichiarazione di due campi



           frutto f1, f2;                      Definizione Variabili di tipo frutto

Programmazione I - Paolo Valente, 2008/2009                                       37
Definizione di variabili contestuale
          alla dichiarazione del tipo
                                              Nome tipo: se manca è anonimo

 [ const ]   struct [ <nome_tipo> ]
    { <lista_dichiarazioni_campi> } identif_1, identif_2, ... ;


Esempio
    struct frutto         Nome nuovo tipo (opzionale)
     {
       char nome[20];                Campi
       float peso, diametro;
      } f1, f2;         Variabili
Programmazione I - Paolo Valente, 2008/2009                                   38
Selezione dei campi di un oggetto
                 strutturato
• Si usa la “notazione a punto”

• Dato l’esempio precedente
   struct frutto {
      char nome[20]; float peso, diametro; } f;

• Si può accedere ai campi di f mediante
          f.nome              f.peso         f.diametro
     che risultano essere normali variabili, rispettivamente di
     tipo stringa e di tipo float
          Es., f.peso = 0.34; cout<<f.nome<<endl ;
Programmazione I - Paolo Valente, 2008/2009                       39
Esempio
struct coordinate { int x, y; };

main()
  {
    coordinate p1, p2, punto3;
    p1.x=13; p1.y=21; p2.x=32; p2.y=70;
    punto3.x = p1.x + p2.x;
    punto3.y = p1.y + p2.y;
    cout<<quot;Coordinate risultanti:quot;
        <<quot; Ascissa=quot;<<punto3.x<<
        <<quot; e Ordinata=quot;<<punto3.y<<endl ;
  }

Programmazione I - Paolo Valente, 2008/2009         40
Esercizio
• Dalle slide di esercitazione:
  – struttura.cc




Programmazione I - Paolo Valente, 2008/2009          41
Inizializzazione
• Un oggetto struttura può essere inizializzato

   ١) elencando i valori iniziali dei campi fra parentesi
      graffe
      Esempio:
      struct coord
          { int x, y; } p1 = {3, 2} ;

   ٢) Copiando il contenuto di un altro oggetto dello
       stesso tipo
       Esempio:
       coord p2 = p1 ;
     • Equivale ad una inizializzazione campo per campo


       Ossia, p2.x = p1.x ; p2.y = p1.y ;
Programmazione I - Paolo Valente, 2008/2009                 42
Operazioni fra strutture:
                        assegnamento
• L'assegnamento tra oggetti di tipo struttura equivale ad
  una copia campo per campo
   Esempio:
   coord p1 = {3, 2} ;
   coord p2 ;
   p2 = p1 ;
    – I due oggetti devono essere dello stesso tipo
      struttura

• NON E’ CONSENTITO, invece, fare assegnamenti di
  oggetti struttura con nomi di tipi diversi, anche se i due
  tipi avessero gli stessi campi e tipi

Programmazione I - Paolo Valente, 2008/2009                43
Esempi assegnamenti
struct coordinata { int x; int y} p1, p2;
struct coor { int x; int y} t1, t2;
int k;
                              ….
p2 = p1;
p1 = t2;
                            Quali sono validi e quali no?
t2 = t1;
k = p1;




Programmazione I - Paolo Valente, 2008/2009                 44
Esempi assegnamenti
struct coordinata { int x; int y} p1, p2;
struct coor { int x; int y} t1, t2;
int k;
                              ….
p2 = p1;             SI
p1 = t2;             NO
                     SI
t2 = t1;
                     NO
k = p1;




Programmazione I - Paolo Valente, 2008/2009   45
Strutture contenenti array

struct abc { int x; int v[5];} ;
abc p1 = {1, {1, 2, 5, 4, 2}} ;
abc p2 ;
p2 = p1 ; A cosa equivale ??




Programmazione I - Paolo Valente, 2008/2009    46
Strutture contenenti array

struct abc { int x; int v[5];} ;
abc p1 = {1, {1, 2, 5, 4, 2}} ;
abc p2 ;
p2 = p1 ; Equivale a
                          p2.x = p1.x ;
                          for (int i = 0 ; i < 5 ; i++)
                               p2.v[i] = p1.v[i] ;




Programmazione I - Paolo Valente, 2008/2009               47
Utilizzo campi o intero oggetto
    struct frutto { char nome[20]; float peso, diametro; };
    main()
     {
       frutto f1, f2, f3;
       float somma;
       f1.nome= {‘m’, ‘e’, ‘l’, ‘a’, ‘0’ }; // ERRATO
       f1.peso=0.26;
       f2.nome={‘a’, ‘r’, ‘a’, ‘n’, ‘c’, ‘i’, ‘a’, ‘0’}; // ERRATO
       f2.peso=0.44;
                                                      Utilizzo dei campi
       somma = f1.peso + f2.peso;
          f3 = f2;                            Utilizzo dell’intera variabile struct
                                                         CORRETTO
      }

Programmazione I - Paolo Valente, 2008/2009                                           48
Esercizio
• Dalle slide di esercitazione:
  – traccia_classifica_solo_elenco.cc
  – traccia_classifica.cc




Programmazione I - Paolo Valente, 2008/2009          49
Esercizio 3 (Specifica)


• Si determini una struttura dati in grado di
  rappresentare la figura piana trapezio. Inseriti i
  dati rappresentativi, si calcoli il perimetro e
  l’area.




Programmazione I - Paolo Valente, 2008/2009        50
Esercizio 3 (Idea-Algoritmo)
   • Un trapezio è caratterizzato da:
             Base maggiore (B)
         –
             Base minore (b)
         –
         –   Lato sinistro (lato_s)
         –   Lato destro (lato_d)
         –   Altezza (h)
   • Per calcolare il perimetro, si applica la formula:
                 (B+b+lato_s+lato_d)
   • Per calcolare l’area, si applica la formula:
                       ((B+b)*h)/2.

Programmazione I - Paolo Valente, 2008/2009               51
Esercizio 3 (Rappresentazione informazioni)
• Come si rappresentano le informazioni relative ad
  un trapezio?
      – Sono dati omogenei a basso livello (numeri reali),
        quindi si potrebbe utilizzare un array (ma bisogna
        ricordare l'indice di ciascuno degli elementi del
        trapezion)
      – Pur essendo dati omogenei a basso livello (numeri
        reali), si riferiscono ad elementi concettualmente distinti
        nel dominio del problema, per cui si potrebbe utilizzare
        un tipo struttura per poter assegnare un nome distinto a
        ciascun elemento del trapezio

                                    Quale scelta è migliore?
Programmazione I - Paolo Valente, 2008/2009                      52
Esercizio 3 (Rappresentazione informazioni)
• array
            vett[0] ~ Base maggiore
            vett[1] ~ Base minore
            vett[2] ~ Lato sinistro
            vett[3] ~ Lato destro
            vett[4] ~ Altezza
• struct
            struct trapezio
               {
                 double base_maggiore;
                 double base_minore;
                 double lato_s;
                 double lato_d;
                 double h;
               };
Programmazione I - Paolo Valente, 2008/2009   53
Esercizio 3 (Programma - array)
  main()
  {
   double trapezio[5] = {15, 10, 4, 6, 3};
   double perimetro, area;
      perimetro=trapezio[0]+trapezio[1]+trapezio[2]+trapezio[3];
      area=(trapezio[0]+trapezio[1])*trapezio[4])/2.;
      cout<<“Perimetro=”<<perimetro<<” Area=”<<area<<endl ;
  }




Programmazione I - Paolo Valente, 2008/2009                    54
Esercizio 3 (Programma - struct)
main()
  {
    struct trapezio
      {
        double base_maggiore;
        double base_minore;
        double lato_s;
        double lato_d;
        double altezza;
      } trapezio = {15, 10, 4, 6, 3};
     double perimetro, area;
// continua nella prossima slide


Programmazione I - Paolo Valente, 2008/2009   55
Esercizio 3 (Programma - struct)
…
 perimetro = trapezio.base_maggiore +
                       trapezio.base_minore +
                       trapezio.lato_s + trapezio.lato_d;

    area =

     ( trapezio.base_maggiore + trapezio.base_minore )

     * trapezio.altezza / 2;

    cout<<“Perimetro=”<<perimetro<<” Area=”<<area<<endl ;
}

Programmazione I - Paolo Valente, 2008/2009                 56
Leggibilità ed organizzazione informazioni
• Il precedente esercizio è uno dei casi in cui la
  struttura fornisce, rispetto all'array:
• Migliore leggibilità
      – I campi sono acceduti mediante nomi significativi
• Migliore organizzazione dei dati
      – Informazioni logicamente correlate stanno nello
        stesso tipo di dato

• Questa nota è molto importante per
  l'organizzazione dei dati, in base a quanto detto
  nella lezione sull'ingegneria del codice

Programmazione I - Paolo Valente, 2008/2009                 57
Passaggio e ritorno oggetti struttura 1/2
• Gli oggetti struttura possono essere
  passati/ritornati per valore
      – Nel parametro formale finisce la copia campo per
        campo del parametro attuale
• Questo può essere molto oneroso
      – Per esempio se l'oggetto contiene un array molto
        molto grande
      – Soluzione efficiente ???




Programmazione I - Paolo Valente, 2008/2009                58
Passaggio e ritorno oggetti struttura 2/2
• Passaggio/ritorno per riferimento
• Però, come sappiamo nel passaggio per
  riferimento si rischia la modifica indesiderata!
      – Utilizzare quindi, come già visto, il qualificatore
        const




Programmazione I - Paolo Valente, 2008/2009                   59
Struttura dati
• Una struttura dati è un
      – insieme di tipi e di oggetti;
      – definito per realizzare un qualche algoritmo.
• Ad esempio, l'insieme di variabili che abbiamo
  definito come “Rappresentazione delle
  informazioni” negli esercizi fatti assieme sono
  appunto delle strutture dati
• Mediante i tipi primitivi, gli array ed il costrutto
  struct possiamo definire strutture dati di
  arbitraria complessità
• Ci mancano solo i puntatori per poter definire
  strutture dati dinamiche
Programmazione I - Paolo Valente, 2008/2009              60

Weitere ähnliche Inhalte

Was ist angesagt?

15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi
Majong DevJfu
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
STELITANO
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
STELITANO
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
STELITANO
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
STELITANO
 
6 Vettori E Matrici
6   Vettori E Matrici6   Vettori E Matrici
6 Vettori E Matrici
guest60e9511
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)
STELITANO
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
STELITANO
 

Was ist angesagt? (20)

JavaScript Object Oriented
JavaScript Object OrientedJavaScript Object Oriented
JavaScript Object Oriented
 
Gestione della memoria in C++
Gestione della memoria in C++Gestione della memoria in C++
Gestione della memoria in C++
 
15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi15 - Programmazione: Algoritmi
15 - Programmazione: Algoritmi
 
05 1 intro-struttura
05 1 intro-struttura05 1 intro-struttura
05 1 intro-struttura
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Corso Iphone in 48h
Corso Iphone in 48hCorso Iphone in 48h
Corso Iphone in 48h
 
Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
Introduzione a JavaScript
Introduzione a JavaScriptIntroduzione a JavaScript
Introduzione a JavaScript
 
Corso c++
Corso c++Corso c++
Corso c++
 
Linguaggio R, principi e concetti
Linguaggio R, principi e concettiLinguaggio R, principi e concetti
Linguaggio R, principi e concetti
 
06 2 vector_matrici
06 2 vector_matrici06 2 vector_matrici
06 2 vector_matrici
 
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
 
Pillole di C++
Pillole di C++Pillole di C++
Pillole di C++
 
06 3 struct
06 3 struct06 3 struct
06 3 struct
 
Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)
 
6 Vettori E Matrici
6   Vettori E Matrici6   Vettori E Matrici
6 Vettori E Matrici
 
Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)Lezione 5 (7 marzo 2012)
Lezione 5 (7 marzo 2012)
 
Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
07 1 funzioni
07 1 funzioni07 1 funzioni
07 1 funzioni
 
2006 Py02 base
2006 Py02 base2006 Py02 base
2006 Py02 base
 

Ähnlich wie 11 - Programmazione: Tipi di dato strutturati pt. 2

Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
STELITANO
 
14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e File
Majong DevJfu
 
13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++
Majong DevJfu
 
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Cristian Randieri PhD
 
Laboratorio Programmazione: Matrici, Stringhe e struct
Laboratorio Programmazione: Matrici, Stringhe e structLaboratorio Programmazione: Matrici, Stringhe e struct
Laboratorio Programmazione: Matrici, Stringhe e struct
Majong DevJfu
 
Laboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di datoLaboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di dato
Majong DevJfu
 
Lezione5 - MIPS & SPIM Unicam
Lezione5 - MIPS & SPIM UnicamLezione5 - MIPS & SPIM Unicam
Lezione5 - MIPS & SPIM Unicam
Nicola Paoletti
 

Ähnlich wie 11 - Programmazione: Tipi di dato strutturati pt. 2 (14)

Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)Lezione 15 (2 aprile 2012)
Lezione 15 (2 aprile 2012)
 
Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97Php Funzioni Built In Barbiera 97
Php Funzioni Built In Barbiera 97
 
14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e File
 
13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++13 - Programmazione: Compendio C - C++
13 - Programmazione: Compendio C - C++
 
Stringhe java
Stringhe javaStringhe java
Stringhe java
 
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
 
Espressioni regolari
Espressioni regolariEspressioni regolari
Espressioni regolari
 
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
Lezioni di programmazione in c le stringhe By Cristian Randieri - www.intelli...
 
Py a5 python-text
Py a5 python-textPy a5 python-text
Py a5 python-text
 
Array
ArrayArray
Array
 
Laboratorio Programmazione: Matrici, Stringhe e struct
Laboratorio Programmazione: Matrici, Stringhe e structLaboratorio Programmazione: Matrici, Stringhe e struct
Laboratorio Programmazione: Matrici, Stringhe e struct
 
Laboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di datoLaboratorio Programmazione: Visibilita' e tipi di dato
Laboratorio Programmazione: Visibilita' e tipi di dato
 
La crittografia frattale in Perl
La crittografia frattale in PerlLa crittografia frattale in Perl
La crittografia frattale in Perl
 
Lezione5 - MIPS & SPIM Unicam
Lezione5 - MIPS & SPIM UnicamLezione5 - MIPS & SPIM Unicam
Lezione5 - MIPS & SPIM Unicam
 

Mehr von Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
Majong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
Majong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
Majong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
Majong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
Majong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
Majong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
Majong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
Majong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
Majong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
Majong DevJfu
 

Mehr von Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

11 - Programmazione: Tipi di dato strutturati pt. 2

  • 1. Tipi di dato strutturati (Parte 2: stringhe, strutture)
  • 2. Tipo di dato stringa Programmazione I - Paolo Valente, 2008/2009 2
  • 3. Stringa • Una stringa è una sequenza di caratteri • Letterale stringa (costante senza nome): sequenza di caratteri delimitati da doppi apici • Esempio: quot;sono una stringaquot; • All'oggetto cout abbiamo spesso passato dei letterali di tipo stringa mediante l'operatore di uscita << Programmazione I - Paolo Valente, 2008/2009 3
  • 4. Stringhe in C/C++ • Nel linguaggio C/C++ non esiste propriamente un tipo stringa • Il tipo stringa è quindi un oggetto astratto implementato concretamente mediante – Un array di caratteri terminati da un carattere terminatore Tipicamente il carattere speciale '0' o – Numericamente, il suo valore è 0 • Come per i vettori, nella libreria standard del C++ è disponibile anche un tipo astratto stringa (string) con interfaccia di più alto livello di un array di caratteri – In questo corso non vedremo tale tipo astratto Programmazione I - Paolo Valente, 2008/2009 4
  • 5. Stringa (sintassi) SINTASSI della definizione di una variabile di tipo stringa: char <identificatore> [ <espr-costante> ] ; char stringa[6] ; • alloca spazio per 6 oggetti char • uno va utilizzato per il fine stringa ‘0’ • quindi la stringa ha al più 5 caratteri M A R C O 0 stringa[5] 0 1 2 3 4 5 stringa[4] stringa[0] stringa[3] stringa[2] stringa[1] Programmazione I - Paolo Valente, 2008/2009 5
  • 6. NOTE 1/2 La definizione char stringa[N] ; - Alloca spazio per una stringa di al più N-1 caratteri - E’ possibile utilizzare un array di N caratteri anche per stringhe di dimensione inferiore ad N-1 Es., char nome[6] ; ? A N N A 0 0 1 2 3 4 5 - in questo caso le celle oltre il carattere ‘0’ sono concettualmente vuote; - ovviamente contengono pur sempre un valore che però non viene preso in considerazione Programmazione I - Paolo Valente, 2008/2009 6
  • 7. NOTE 2/2 • Una stringa è un array di caratteri • Ma un array di caratteri non è necessariamente una stringa • Affinché un array di caratteri risulti una stringa, è necessario che l’ultimo elemento sia ‘0’ Programmazione I - Paolo Valente, 2008/2009 7
  • 8. Inizializzazione Vi sono tre modi per inizializzare una stringa in una definizione: char nome[6] = { ‘M’, ‘A’, ‘R’, ‘C’, ‘O’, ‘0’ } ; /* come un normale array */ char nome[6] = “MARCO” ; /* utilizzabile solo per le stringhe; il carattere di fine stringa viene inserito automaticamente dal compilatore*/ char nome[ ] = “MARCO” ; /* in questo caso l'array viene dimensionato automaticamente a 6 ed il carattere di fine stringa viene inserito dal compilatore */ Programmazione I - Paolo Valente, 2008/2009 8
  • 9. Assegnamento • Se non si tratta di una inizializzazione, l’unico modo per assegnare un valore ad una stringa è carattere per carattere (come un normale array), con esplicito inserimento del carattere di fine stringa: char nome[6]; nome[0]= ‘M’; nome[1]= ‘A’; nome[2]= ‘R’; nome[3]= ‘C’; nome[4]= ‘O’; nome[5]= ‘0’; Programmazione I - Paolo Valente, 2008/2009 9
  • 10. Input/Output di stringhe • Se un oggetto di tipo stringa (ossia array di caratteri) – viene passato al cout/cerr mediante l'operatore <<, la stampa dei caratteri termina quando si incontra il terminatore – viene utilizzato per memorizzarvi ciò che si legge da cin mediante l'operatore >>, vi finisce dentro la prossima parola, ossia sequenza di caratteri non separati da spazi Esempio: se sullo stdin vi è “ciao mondo”, nella stringa finisce solo “ciao” (e sullo stdin rimane “ mondo”) • Esercizio: definire un oggetto di tipo stringa, inizializzarlo, stamparlo, scriverci dentro il contenuto dello stdin, ristamparlo Programmazione I - Paolo Valente, 2008/2009 10
  • 11. Soluzione main() { cont int MAX_LUN = 20 ; char stringa[MAX_LUN] = quot;provaquot;; cout<<stringa<<endl ; cin>>stringa ; cout<<stringa<<endl ; } Programmazione I - Paolo Valente, 2008/2009 11
  • 12. Errori da evitare con le stringhe • Definire un array di caratteri ed inizializzarlo successivamente come una stringa SEQUENZA DI ISTRUZIONI ERRATA: char nome[6]; NO nome = “MARCO” ; • Copiare una stringa in un’altra con l’operazione di assegnamento SEQUENZA DI ISTRUZIONI ERRATA: char nome[15], cognome[15] ; ... NO nome = cognome; Gli elementi vanno copiati uno alla volta. Programmazione I - Paolo Valente, 2008/2009 12
  • 13. Caratteri e stringhe • E’ importante osservare la differenza tra ‘A’ carattere A, rappresentabile in un oggetto di tipo char c=‘A’ “A” stringa A, rappresentabile in un array, es. char s[2]=“A” Tale differenza ha un impatto anche sulla memorizzazione dei relativi dati, rispettivamente: A A 0 Programmazione I - Paolo Valente, 2008/2009 13
  • 14. La stringa è un “vettore particolare” • I singoli caratteri di una stringa possono anche essere visti come oggetti indipendenti • Se pensati come stringa sono però parte di un tutt'uno “MARCO”  ‘M’ ‘A’ ‘R’ ‘C’ ‘O’ '0' Programmazione I - Paolo Valente, 2008/2009 14
  • 15. La stringa è un “vettore particolare” (2) • Nell’accezione comune, una stringa è una sequenza di caratteri la cui lunghezza può variare • Di conseguenza, per supportare pienamente il tipo stringa bisognerebbe far riferimento ad un supporto per l’allocazione dinamica della memoria • Tuttavia, poiché la gestione di dati dinamici sarà trattata in seguito, per ora si prenderà in considerazione solo il caso di – stringhe statiche (dimensione fissa) – stringhe con dimensione massima definita a tempo di scrittura del programma Programmazione I - Paolo Valente, 2008/2009 15
  • 16. Esercizio 1 (Specifica) • Data una stringa di caratteri, se ne calcoli la lunghezza. Programmazione I - Paolo Valente, 2008/2009 16
  • 17. Esercizio 1 (Idea) • Bisogna scandire tutto l'array che rappresenta la stringa fino al carattere di terminazione ‘0’, contando i passi che si effettuano Programmazione I - Paolo Valente, 2008/2009 17
  • 18. Esercizio 1 (Algoritmo) • Inizializzare una variabile contatore a 0 • Utilizzare un ciclo fino al carattere ‘0’ ed incrementare la variabile contatore ad ogni passo • Stampare il valore finale della variabile contatore Esercizio 9 (Rappresentazione informazioni) • Serve una variabile stringa • Serve una variabile ausiliarie (int) come indice del ciclo e forse un'ulteriore variabile come contatore del numero di caratteri Programmazione I - Paolo Valente, 2008/2009 18
  • 19. Esercizio 1 (Programma) main() { int conta=0; char dante[] = “Nel mezzo del cammin di nostra vita”; for (int i=0; dante[i]!=‘0’; i++) conta++; // poteva bastare la sola variabile i cout<<“Lunghezza stringa = “<<conta<<endl ; } Programmazione I - Paolo Valente, 2008/2009 19
  • 20. Stringa diversa main() { int conta=0; char dante[] = “Ho preso 0 spaccato”; for (int i=0; dante[i] != '0'; i++) conta++; E’ corretto? cout<<“Lunghezza stringa = “<<conta<<endl; } Programmazione I - Paolo Valente, 2008/2009 20
  • 21. Risposta • Sì, perché il carattere '0' è diverso dal carattere '0' Programmazione I - Paolo Valente, 2008/2009 21
  • 22. Esercizio 2 (Specifica) • Copiare una stringa data in un’altra, – la stringa di destinazione deve essere memorizzata in un array di dimensioni sufficienti a contenerla – il precedente contenuto della stringa di destinazione viene perso (sovrascrittura) Programmazione I - Paolo Valente, 2008/2009 22
  • 23. Esercizio 2 (Algoritmo) • Scandire tutta la prima stringa fino al carattere di terminazione ‘0’ • Copiare carattere per carattere nella seconda stringa • Aggiungere il carattere di fine stringa (Rappresentazione informazioni) • Servono due variabili stringa ed almeno un indice per scorrere gli array Programmazione I - Paolo Valente, 2008/2009 23
  • 24. Esercizio 2 (Programma) main() { int i; // volutamente non definito nell'intestazione del for char origine [] = “Nel mezzo del cammin di nostra vita”; char copia [40] ; for (i=0; origine[i] != '0' ; i++) copia[i]=origine[i]; /* si esce prima della copia del carattere di fine stringa che, quindi, va aggiunto esplicitamente */ copia[i]=‘0’ ; } Programmazione I - Paolo Valente, 2008/2009 24
  • 25. Stampa di una stringa • Una stringa si può ovviamente stampare anche carattere per carattere Esempio int i=0; char str[]=“Nel mezzo del cammin di nostra vita”; … while (str[i] != '0') { cout<<str[i]; i++ } Programmazione I - Paolo Valente, 2008/2009 25
  • 26. Funzioni di libreria • Così come per le funzioni matematiche e quelle sui caratteri, il linguaggio C/C++ ha una ricca libreria di funzioni per la gestione delle stringhe, presentata in <cstring> (string.h in C) • strcpy(stringa1, stringa2) copia il contenuto di stringa2 in stringa1 (sovrascrive) • strncpy(stringa1, stringa2, n) copia i primi n caratteri di stringa2 in stringa1 • strcat(stringa1, stringa2) concatena il contenuto di stringa2 a stringa1 • strcmp(stringa1, stringa2) confronta stringa2 con stringa1: 0 (uguali), >0 (stringa1 è maggiore di stringa 2), <0 (viceversa) Programmazione I - Paolo Valente, 2008/2009 26
  • 27. Esercizi • Controllare se una stringa è più lunga di un’altra • Copiare soltanto i primi 10 caratteri di una stringa in un’altra stringa, inizialmente vuota. [Att.!: esistono?] • Copiare soltanto le vocali di una stringa in un’altra stringa, inizialmente vuota. • Copiare soltanto le lettere minuscole di una stringa in un’altra stringa, inizialmente vuota. [Att.!: ricordare la tabella ASCII] • Concatenazione (append) di due stringhe: Aggiungere una stringa in fondo ad un’altra stringa, lasciando uno spazio tra le due stringhe [Att.!: la seconda stringa può essere vuota o no] • Verificare se due stringhe sono uguali o diverse • Data una frase, contare il numero dei caratteri maiuscoli, minuscoli, numerici e dei caratteri non alfanumerici Programmazione I - Paolo Valente, 2008/2009 27
  • 28. Array di stringhe Per analogia a quanto detto in precedenza, un array di stringhe si realizza mediante una matrice di tipo char. Esempio: Elenco dei nomi dei giorni della settimana char giorni[7][11] = { “lunedi'”, “martedi'”, “mercoledi'”, “giovedi'”, “venerdi'”, “sabato”, “domenica” } ' l u n e d i 0 ' m a r t e d i 0 ' m e r c o l e d i 0 ' g i o v e d i 0 ' v e n e r d i 0 s a b a t o 0 d o m e n i c a 0 Programmazione I - Paolo Valente, 2008/2009 28
  • 29. Tipo di dato “struttura” Programmazione I - Paolo Valente, 2008/2009 29
  • 30. Tipi di dato Derivati Scalari, Fondamentali, Primitivi o Aritmetici Riferimenti Strutturati Puntatori array [] struct predefiniti enumerati bool enum char int float double Programmazione I - Paolo Valente, 2008/2009 30
  • 31. Esempio • Caratterizzare alcuni attributi di una “persona” • Persona – Nome (stringa di al più 15 caratteri) – Cognome (stringa di al più 20 caratteri) – Luogo di nascita (stringa di al più 20 caratteri) – Età (int) – Altezza espressa in metri (float) – Codice fiscale (stringa di 16 caratteri) Programmazione I - Paolo Valente, 2008/2009 31
  • 32. Esempio di dichiarazione in C/C++ Dichiarazione del nuovo tipo di dati persona struct persona { char nome[16]; char cognome[21]; char luogo_nascita[21]; int eta; float altezza; char codice_fiscale[17]; }; Programmazione I - Paolo Valente, 2008/2009 32
  • 33. Esempio di utilizzo • Una volta dichiarato il nuovo tipo di dati persona, è possibile definire variabili di questo tipo • Esempio: persona Mario, Anna; • Che cos’è la variabile Mario?  Una variabile strutturata composta da 3 stringhe, 1 int, 1 float ed un’altra stringa  Gli elementi della variabile strutturata sono detti membri o campi. Ciascun campo è caratterizzato da un tipo e da un nome Programmazione I - Paolo Valente, 2008/2009 33
  • 34. Oggetto di tipo struttura • Oggetto di tipo struttura – n-upla ordinata di elementi, detti membri o campi, ciascuno dei quali ha un suo nome ed un suo tipo Programmazione I - Paolo Valente, 2008/2009 34
  • 35. Tipo di dato basati sul tipo struttura • Tipo di dato dichiarato mediante il costrutto struct Es.: il precedente tipo Persona – Nuovo tipo di dato – La dichiarazione del nuovo tipo di dato definisce il tipo ed il nome di ciascun campo di ogni oggetto di quel tipo di dato – Es.: il tipo persona dichiara il nome ed il tipo di tutti (e soli) i campi presenti in ogni oggetto di tipo persona • Per brevità chiameremo semplicemente tipi struttura questi nuovi tipi di dato • In altri linguaggi i tipi struttura sono spesso chiamati record Programmazione I - Paolo Valente, 2008/2009 35
  • 36. Dichiarazione tipi struttura e definizione variabili Dichiarazione di un tipo struttura: struct <nome_tipo> { <lista_dichiarazioni_campi> } ; Nome del nuovo tipo NOTA: Raro caso in cui si usa il ; dopo una } Motivo: ci potrebbe essere una definizione di variabile/i Definizione di variabili di un tipo strutturato di nome nome_tipo: [ const ] <nome_tipo> identificatore1, identificatore2, ... ; Programmazione I - Paolo Valente, 2008/2009 36
  • 37. Esempio Nome del nuovo tipo struct frutto { char nome[20]; Campi float peso, diametro; }; Dichiarazione di due campi frutto f1, f2; Definizione Variabili di tipo frutto Programmazione I - Paolo Valente, 2008/2009 37
  • 38. Definizione di variabili contestuale alla dichiarazione del tipo Nome tipo: se manca è anonimo [ const ] struct [ <nome_tipo> ] { <lista_dichiarazioni_campi> } identif_1, identif_2, ... ; Esempio struct frutto Nome nuovo tipo (opzionale) { char nome[20]; Campi float peso, diametro; } f1, f2; Variabili Programmazione I - Paolo Valente, 2008/2009 38
  • 39. Selezione dei campi di un oggetto strutturato • Si usa la “notazione a punto” • Dato l’esempio precedente struct frutto { char nome[20]; float peso, diametro; } f; • Si può accedere ai campi di f mediante f.nome f.peso f.diametro che risultano essere normali variabili, rispettivamente di tipo stringa e di tipo float Es., f.peso = 0.34; cout<<f.nome<<endl ; Programmazione I - Paolo Valente, 2008/2009 39
  • 40. Esempio struct coordinate { int x, y; }; main() { coordinate p1, p2, punto3; p1.x=13; p1.y=21; p2.x=32; p2.y=70; punto3.x = p1.x + p2.x; punto3.y = p1.y + p2.y; cout<<quot;Coordinate risultanti:quot; <<quot; Ascissa=quot;<<punto3.x<< <<quot; e Ordinata=quot;<<punto3.y<<endl ; } Programmazione I - Paolo Valente, 2008/2009 40
  • 41. Esercizio • Dalle slide di esercitazione: – struttura.cc Programmazione I - Paolo Valente, 2008/2009 41
  • 42. Inizializzazione • Un oggetto struttura può essere inizializzato ١) elencando i valori iniziali dei campi fra parentesi graffe Esempio: struct coord { int x, y; } p1 = {3, 2} ; ٢) Copiando il contenuto di un altro oggetto dello stesso tipo Esempio: coord p2 = p1 ; • Equivale ad una inizializzazione campo per campo Ossia, p2.x = p1.x ; p2.y = p1.y ; Programmazione I - Paolo Valente, 2008/2009 42
  • 43. Operazioni fra strutture: assegnamento • L'assegnamento tra oggetti di tipo struttura equivale ad una copia campo per campo Esempio: coord p1 = {3, 2} ; coord p2 ; p2 = p1 ; – I due oggetti devono essere dello stesso tipo struttura • NON E’ CONSENTITO, invece, fare assegnamenti di oggetti struttura con nomi di tipi diversi, anche se i due tipi avessero gli stessi campi e tipi Programmazione I - Paolo Valente, 2008/2009 43
  • 44. Esempi assegnamenti struct coordinata { int x; int y} p1, p2; struct coor { int x; int y} t1, t2; int k; …. p2 = p1; p1 = t2; Quali sono validi e quali no? t2 = t1; k = p1; Programmazione I - Paolo Valente, 2008/2009 44
  • 45. Esempi assegnamenti struct coordinata { int x; int y} p1, p2; struct coor { int x; int y} t1, t2; int k; …. p2 = p1; SI p1 = t2; NO SI t2 = t1; NO k = p1; Programmazione I - Paolo Valente, 2008/2009 45
  • 46. Strutture contenenti array struct abc { int x; int v[5];} ; abc p1 = {1, {1, 2, 5, 4, 2}} ; abc p2 ; p2 = p1 ; A cosa equivale ?? Programmazione I - Paolo Valente, 2008/2009 46
  • 47. Strutture contenenti array struct abc { int x; int v[5];} ; abc p1 = {1, {1, 2, 5, 4, 2}} ; abc p2 ; p2 = p1 ; Equivale a p2.x = p1.x ; for (int i = 0 ; i < 5 ; i++) p2.v[i] = p1.v[i] ; Programmazione I - Paolo Valente, 2008/2009 47
  • 48. Utilizzo campi o intero oggetto struct frutto { char nome[20]; float peso, diametro; }; main() { frutto f1, f2, f3; float somma; f1.nome= {‘m’, ‘e’, ‘l’, ‘a’, ‘0’ }; // ERRATO f1.peso=0.26; f2.nome={‘a’, ‘r’, ‘a’, ‘n’, ‘c’, ‘i’, ‘a’, ‘0’}; // ERRATO f2.peso=0.44; Utilizzo dei campi somma = f1.peso + f2.peso; f3 = f2; Utilizzo dell’intera variabile struct CORRETTO } Programmazione I - Paolo Valente, 2008/2009 48
  • 49. Esercizio • Dalle slide di esercitazione: – traccia_classifica_solo_elenco.cc – traccia_classifica.cc Programmazione I - Paolo Valente, 2008/2009 49
  • 50. Esercizio 3 (Specifica) • Si determini una struttura dati in grado di rappresentare la figura piana trapezio. Inseriti i dati rappresentativi, si calcoli il perimetro e l’area. Programmazione I - Paolo Valente, 2008/2009 50
  • 51. Esercizio 3 (Idea-Algoritmo) • Un trapezio è caratterizzato da: Base maggiore (B) – Base minore (b) – – Lato sinistro (lato_s) – Lato destro (lato_d) – Altezza (h) • Per calcolare il perimetro, si applica la formula: (B+b+lato_s+lato_d) • Per calcolare l’area, si applica la formula: ((B+b)*h)/2. Programmazione I - Paolo Valente, 2008/2009 51
  • 52. Esercizio 3 (Rappresentazione informazioni) • Come si rappresentano le informazioni relative ad un trapezio? – Sono dati omogenei a basso livello (numeri reali), quindi si potrebbe utilizzare un array (ma bisogna ricordare l'indice di ciascuno degli elementi del trapezion) – Pur essendo dati omogenei a basso livello (numeri reali), si riferiscono ad elementi concettualmente distinti nel dominio del problema, per cui si potrebbe utilizzare un tipo struttura per poter assegnare un nome distinto a ciascun elemento del trapezio Quale scelta è migliore? Programmazione I - Paolo Valente, 2008/2009 52
  • 53. Esercizio 3 (Rappresentazione informazioni) • array vett[0] ~ Base maggiore vett[1] ~ Base minore vett[2] ~ Lato sinistro vett[3] ~ Lato destro vett[4] ~ Altezza • struct struct trapezio { double base_maggiore; double base_minore; double lato_s; double lato_d; double h; }; Programmazione I - Paolo Valente, 2008/2009 53
  • 54. Esercizio 3 (Programma - array) main() { double trapezio[5] = {15, 10, 4, 6, 3}; double perimetro, area; perimetro=trapezio[0]+trapezio[1]+trapezio[2]+trapezio[3]; area=(trapezio[0]+trapezio[1])*trapezio[4])/2.; cout<<“Perimetro=”<<perimetro<<” Area=”<<area<<endl ; } Programmazione I - Paolo Valente, 2008/2009 54
  • 55. Esercizio 3 (Programma - struct) main() { struct trapezio { double base_maggiore; double base_minore; double lato_s; double lato_d; double altezza; } trapezio = {15, 10, 4, 6, 3}; double perimetro, area; // continua nella prossima slide Programmazione I - Paolo Valente, 2008/2009 55
  • 56. Esercizio 3 (Programma - struct) … perimetro = trapezio.base_maggiore + trapezio.base_minore + trapezio.lato_s + trapezio.lato_d; area = ( trapezio.base_maggiore + trapezio.base_minore ) * trapezio.altezza / 2; cout<<“Perimetro=”<<perimetro<<” Area=”<<area<<endl ; } Programmazione I - Paolo Valente, 2008/2009 56
  • 57. Leggibilità ed organizzazione informazioni • Il precedente esercizio è uno dei casi in cui la struttura fornisce, rispetto all'array: • Migliore leggibilità – I campi sono acceduti mediante nomi significativi • Migliore organizzazione dei dati – Informazioni logicamente correlate stanno nello stesso tipo di dato • Questa nota è molto importante per l'organizzazione dei dati, in base a quanto detto nella lezione sull'ingegneria del codice Programmazione I - Paolo Valente, 2008/2009 57
  • 58. Passaggio e ritorno oggetti struttura 1/2 • Gli oggetti struttura possono essere passati/ritornati per valore – Nel parametro formale finisce la copia campo per campo del parametro attuale • Questo può essere molto oneroso – Per esempio se l'oggetto contiene un array molto molto grande – Soluzione efficiente ??? Programmazione I - Paolo Valente, 2008/2009 58
  • 59. Passaggio e ritorno oggetti struttura 2/2 • Passaggio/ritorno per riferimento • Però, come sappiamo nel passaggio per riferimento si rischia la modifica indesiderata! – Utilizzare quindi, come già visto, il qualificatore const Programmazione I - Paolo Valente, 2008/2009 59
  • 60. Struttura dati • Una struttura dati è un – insieme di tipi e di oggetti; – definito per realizzare un qualche algoritmo. • Ad esempio, l'insieme di variabili che abbiamo definito come “Rappresentazione delle informazioni” negli esercizi fatti assieme sono appunto delle strutture dati • Mediante i tipi primitivi, gli array ed il costrutto struct possiamo definire strutture dati di arbitraria complessità • Ci mancano solo i puntatori per poter definire strutture dati dinamiche Programmazione I - Paolo Valente, 2008/2009 60