SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler 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/
Le stringhe
° Uso comune degli array: memorizzazione di stringhe di
  caratteri

° Stringa costante: serie di caratteri racchiusa tra doppi apici
    “HELLO WORLD”
° Stringa: array di caratteri che termina SEMPRE con il
  carattere nullo rappresentato dalla sequenza di escape ‘0’

° Per memorizzare una stringa si usa un array di caratteri
  (memorizzazione su un byte).
         H E    L   L   O        W O    R L     D 0
   char str [ ] = “some text”;


                                                                   3
Le stringhe

  Le stringhe sono diverse dalle costanti carattere
         "a": array di due elementi
                ('a' e '0’, char array[2];)
           'a': costante carattere
         °      (char ch = 'a';)
°  In memoria sarà assegnato
   °     "a": due byte (uno per 'a' e uno per '0') consecutivi
   °     'a' : un byte

°   "abc" : array di caratteri di dimensione 4 (tre per i caratteri 'a', 'b', 'c' e uno per
    '0')
°   'a'
°   'b'      sono tre costanti carattere
°   'c'




                                                                                              4
° L’array che rappresenta la stringa ha dimensione maggiore
  di 1 rispetto la dimensione della stringa
° Viene automaticamente aggiunto il carattere di terminazione
  0

        s    o    m    e         t    e   x    t    0


° Se specifichiamo la lunghezza della stringa, allora il numero
  di caratteri deve potere essere contenuto nell’array
       char str [3] = “guarda”;     /* Errato */

° Se la stringa è più corta della lunghezza dell’array, gli
  elementi mancanti sono inizializzati con 0.




                                                                  5
s     o   m      e      t     e   x      t   0



char str       [3]= “some text”
                   str[0]              1000
                            ‘s’
                   str[1]   ‘o’        1001
                   str[2]   ‘m’        1002
                   str[3]   ‘e’        1003
                   str[4]   ‘‘         1004
                   str[5]   ‘t’        1005
                   str[6]   ‘e’        1006
                   str[7]   ‘x’        1007
                   str[8]   ‘t’        1008
                   str[9]   ‘0’       1009



                                                       6
° Inizializzazione con singole costanti di carattere nella lista di
  inizializzazione

       char str[ ] = {'g', 'u', 'a', 'r', 'd', 'a'};

    ° Sarà aggiunto il carattere di terminazione
    ° L’array è quindi di 7 elementi

° La stringa di caratteri è un array a tutti gli effetti
   ° Accesso ai singoli elementi con nome e indice
           str[3]  'r'

° Una stringa è un array:
   ° Viene trattata dal compilatore come un puntatore (nome di array)
   ° Il suo valore è l'indirizzo del primo elemento della stringa




                                                                        7
Lettura e scrittura
°   Si usano le funzioni scanf e printf con lo specificatore di formato %s
    char str[4];
    scanf("%s", str);                       NB: manca &
    printf("%s", str);             (nome_array =indirizzo)

#include <stdio.h>
#define N 20

int main (void)       {
   char ar[N]= "Oggi piove.";
   char str[N];
   printf("Introduci una stringa
                n");
   scanf("%s", str);
   printf("prima stringa: %sn
                seconda stringa: %sn",
                ar, str);
   return 0;
}


                                                          stringa.c
                                                                             8
° scanf
   ° il suo argomento deve essere un puntatore ad un array di
     dimensioni sufficienti per contenere la riga di input
   ° Termine immissione: carattere di spaziatura
   ° Dopo avere letto la stringa viene automaticamente
     aggiunto un carattere '0'
° printf
   ° il suo argomento deve essere un puntatore a un array di
     caratteri terminato dal carattere nullo
   ° i caratteri sono stampati fino al terminatore




                                                                9
int main( void ) {
  char *p = "abc";
  printf("%s %s %s n",
            p, p+1,p+2);
  return 0 ; }                                             stringaP.c
  /* stampa abc bc c*/

° Alla variabile p viene assegnato l'indirizzo dell'array di caratteri "abc"
° La stampa di un puntatore a char provoca la stampa di ogni carattere
  successivo dell'array fino a '0'.
° printf(.. p): stampa di abc (p = puntatore di inizio stringa)
° printf(.. p+1): stampa di bc (p+1 = puntatore al secondo elemento della
  stringa)
° printf(.. p+2): stampa di c (p+2 = puntatore al terzo elemento della
  stringa)



                                                                               10
° Esempio:
     ° Funzione che conta il numero di parole in una stringa
     ° Ipotesi: le parole sono separate da caratteri di
       spaziatura

   ° viene utilizzata la macro isspace ( )
      ° verifica se il carattere è uno spazio, una tabulazione o
        un newline
      ° definita in ctype.h




                                                                   11
° Algoritmo

° Inizializza il contatore di parole cnt=0

   ° Fino a che non arrivi alla fine della stringa

       ° Leggi i caratteri della stringa fino a che non trovi un
         carattere utile (ossia diverso da spazio, una tabulazione
         o un a capo)
       ° Se il carattere non è uno spazio, incrementa il
         contatore di parole
       ° Salta tutti i caratteri della parola




                                                                     12
#include <stdio.h>
#include <ctype.h>

int word_cnt (char *);

int main( void ) {
  char ar[ ] = "guarda che il tempo non promette bene";
  int parole;

    parole = word_cnt(ar);
    printf("%d n", parole);

    return 0 ;
}




                                    contaPar.c
                                                          13
int word_cnt (char *s) {
   int cnt =0;
   while (*s != '0')
   {
       while (isspace (*s))        /*salta spazi*/
            s++;
        if (*s != '0')
          {                         /*trovato inizio parola*/
            ++cnt;
            while(!isspace(*s) &&
                      *s != '0')
                 ++s;        /*salta la parola fino allo
                                    spazio successivo o alla
                                    fine della stringa */
             }
     }
   return cnt;
}




                                          contaPar.c
                                                                14
Rappresentazione di dati eterogenei
Ipotesi: definizione di insieme di oggetti di tipo diverso (es. int, float, array)
Esempio:
     ° Rappresentazione di un individuo
          ° nome: array di caratteri
          ° cognome: array di caratteri
          ° data di nascita: tre interi
          ° codice fiscale: array di 17 caratteri
 queste informazioni non possono essere inserite in un array perché i tipi sono
eterogenei
 memorizzazione in variabili distinte

char nome[15], cognome[15], cod_fis[17];
short int giorno, mese, anno;




                                                                                     15
Rappresentazione di dati eterogenei
L’immissione dei dati dovrebbe avvenire indipendentemente per ciascun campo:
strcpy (nome, “Mario”);
strcpy (cognome, “Rossi”);
strcpy(cod_fis, “RSSMRO63L33H501S”);
giorno = 12;
mese = 7;
anno = 1963;
 organizzazione di dati piuttosto disomogenea: le informazioni relative ad una
persona sono sparse per la memoria
se dovessimo gestire un database …:

char nome[1000][15], cognome[1000][15], cod_fis[1000][17];
short int giorno[1000], mese[1000], anno[1000];




                                                                                  16
Strutture

Soluzione: dato che contenga informazioni di tipo diverso.
 In C esiste un tipo di dati, chiamato struttura, che permette di definire in
   modo aggregato tipi di dato eterogenei.

° Una struttura consiste di un nome e di componenti (campi o elementi).
   ° Il nome assegnato alla struttura diventa il nome del tipo di dato
       ° tipo di dato definito dall’utente che può essere usato per
         dichiarare variabili di quel tipo.

° Nota Bene: la struttura da’ la possibilità all’utente di definire un tipo di
  dato e di denominarlo




                                                                                 17
Strutture: sintassi
                         etichetta
struct <tag_name>
{
    <tipo1> <nome_campo1>;           campi o elementi
    <tipo2> <nome_campo2>;
    …………………………..;
    <tipoN> <nome_campoN>; };

Esempio:      struct contribuente {
                       char nome[15];
                       char cognome[15];
                       char cod_fis[17];
                       short int giorno;
                       short int mese;
                       short int anno;
                       };


                                                        18
Strutture
° Una struttura definita è nuovo tipo di dato che si può usare per definire
  variabili usando l’etichetta struct contribuente esattamente come int, float
  , etc.

° Definizione di una variabile cont1 di tipo struct contribuente
struct contribuente cont1;
struct contribuente {
   char nome[15], cognome[15], cod_fis[17];
   short int giorno, mese, anno;
             } cont1;




                                                                                 19
Strutture

cont1 è di tipo struct contribuente

° è formata dagli stessi campi della struttura
° in associazione al tipo vengono fornite dal C delle funzioni di accesso ai
  singoli campi
        ° per fornire valori ai campi
        ° per prelevare i valori dei campi
° il meccanismo di memorizzazione di una variabile di tipi struttura tiene
  conto dell’unicità della struttura




                                                                               20
° Si noti la differenza con l’array:
   ° quando definiamo un array, l’istanza è unica
   ° Una struttura può avere più di un istanza
       struct contribuente mrossi;
       struct contribuente pallini;
       struct contribuente torto;
  nome      cognome       cod_fis    giorno    mese       anno
struct contribuente mrossi;
 Mario     Rossi      RSSMRO52P34H501Y        18      8   1952
struct contribuente pallini;
 Carlo    Pallini      PLNCRL60F80H501W         8     8   1960

 struct contribuente torto;
 Gelso    Torto        TRTGLS76J08H501W         6     6   1976

                                                                 21
Meccanismo di accesso ai campi
  <nome_struttura>.<nome_campo>
  mrossi.nome
  pallini.giorno
  torto.cod_fis
  mrossi.anno
Assegnazione valori
  mrossi.nome <- “Mario Rossi”
  pallini.giorno <- 8
  torto.cod_fis <- “TRTFRC76J08H501W”
  mrossi.anno <- 1960

                                        22
Memorizzazione
° Dichiarando una struttura, ci sarà un’allocazione di memoria pari alla
  somma di quella richiesta per i campi.
° La memorizzazione della struttura avviene in modo consecutivo
  nell’ordine in cui i campi sono dichiarati.

 struct contribuente {
     char nome[15], cod_fis[17];
    short int giorno, mese, anno;    };
 struct contribuente cont1;


  1000
  1004
  1008                       nome[]
  100C
  1010
  1014                         cod_fis[]
  1018
  101C
  1020             giorno                    mese
  1024                              anno

                                                                           23
Memorizzazione
° La contiguità degli elementi della struttura non è assicurata per la
  presenza di spazi vuoti tra gli elementi a causa dell’allineamento degli
  elementi
   ° Es: tutti gli oggetti di dimensioni superiori a char sono memorizzati in
     locazioni con indirizzi pari.
° Queste restrizioni sull’allineamento possono creare spazi vuoti (buchi o
  gap) nelle strutture.

struct esempio_allineamento {
         char mem1;
         short mem2;
         Char mem3;
         } s1;
                           1001                            1003
1000              mem1                   mem2                     mem3
1004


                                                                                24
° In mancanza di restrizioni di allineamento, s1 viene memorizzato senza
  buchi.
° In presenza di restrizioni, vi sarà un buco tra mem1 e mem2.


                            1001                             1003
 1000            mem1                    mem2                       mem3
 1004
° Confrontare due strutture è un errore di sintassi.




                                                                           25
Composizione di una struttura

° I membri delle strutture possono contenere variabili di qualsiasi tipo
  scalare (int, float, etc.) o aggregato come array e altre strutture.
   ° Una struttura non può contenere una istanza di se stessa.
° Una struttura può contenere un elemento che sia un puntatore (anche a
  se stessa)

° A partire da una struttura ST possiamo dichiarare
   ° variabili di tipo ST (istanze)
         struct ST istance1;
   ° puntatori alla struttura
         struct ST *s;
   ° vettori di elementi di tipo struttura
         struct ST vettore[1000];




                                                                           26
struct contribuente contrs[1000], *pctr;

° contrs[1000]:
   ° array di 1000 elementi
   ° ogni elemento è una struttura con i campi nome, cognome, cod_fis,
     giorno, mese, anno.

° pctr: un puntatore ad un struttura
   ° pctr= &contrs[10] fa puntare pctr all’undicesimo elemento
      dell’array.




                                                                         27
contrs[0]     nome    cognome      cod_fis     giorno   mese   anno
                nome    cognome      cod_fis     giorno   mese   anno
  contrs[2]
                nome    cognome      cod_fis     giorno   mese   anno
                nome    cognome      cod_fis     giorno   mese   anno


ptr
                nome     cognome     cod_fis     giorno   mese   anno


                nome    cognome      cod_fis     giorno   mese   anno
                nome     cognome     cod_fis     giorno   mese   anno
                nome    cognome      cod_fis     giorno   mese   anno

      contrs[997].nome =”Maria”;
      contrs[997].cod_fis =”BNCMRA79F89H505Y”;
      contrs[997].giorno =15;
      contrs[997].mese=9;
      contrs[997].anno =1989;

                                                                        28
Accesso diretto (1)
° nome istanza della struttura e il nome del membro separati dall’operatore
  punto (.), detto anche operatore membro di struttura
            cnt1.nome, cnt1.giorno, cnt1.mese …
° Un costrutto della forma
            variabile_di_struttura.nome_membro
° è una variabile e può essere utilizzata nello stesso modo di una variabile
  semplice o un elemento di un array.
            if (cnt1.giorno > 31 || cnt1.mese >12 )
                 printf(“data erratan”);
° Può anche essere utilizzata per assegnare valori ai singoli membri.
                  struct contribuente cnt3;
                  cnt3.nome = “Luigi”;
                  cnt3.giorno = 23;




                                                                               29
Accesso diretto (2)


° È possibile assegnare una intera struttura ad un’altra
            struct contribuente cnt4;
            cnt4=cnt3;

° È equivalente all’assegnazione campo per campo.




                                                           30
Accesso indiretto tramite puntatore (1)
° La definizione di puntatore ad una struttura è uguale alle altre
  dichiarazioni di puntatori:
         struct contribuente *Pcnt;
° Per accedere ad un elemento si usa l’operatore freccia, o operatore
  puntatore a struttura
       ° operatore freccia ->
   ° simbolo meno (-) seguito senza spazi dal simbolo di maggiore (>)
° Accesso:
   ° nome del puntatore seguito dall’operatore freccia e dal nome del
      campo

           Pcnt->nome, Pcnt->giorno, Pcnt->cod_fis, …




                                                                        31
Accesso indiretto tramite puntatore (2)

° Può essere usato esattamente come l’altra forma di accesso
       if (Pcnt->giorno > 31 || Pcnt->mese >12 )
              printf(“data erratan”);

° L’operatore freccia è una forma abbreviata per accedere all’indirizzo
  contenuto nel puntatore e quindi applicare poi l’operatore punto:

        Pnct -> equivale a *Pcnt
        Pcnt->nome equivale a (*Pcnt).nome


° Si noti che le parentesi tonde sono necessarie perché l’operatore membro di
  struttura (il punto) ha priorità maggiore dell’operatore di risoluzione del
  riferimento (l’asterisco).




                                                                                32
Esempio 10.2 Deitel&Deitel

#include <stdio.h>
struct carta {
 char *numero, *seme; };
int main (void) {
 struct carta a, *aPtr;
 a.numero=”Asso”;
 a.seme=”Picche”;
 aPtr=&a;
 printf("Stampa con operatore membro di strutturan");
 printf(“%s %s %sn”, a.numero, “di”, a.seme);
 printf("Stampa con operatore puntatore a strutturan"); printf(“%s %s %sn”,
          aPtr->numero, “di”, aPtr->seme);
 printf("Stampa con punt. e operatore membro di strutturan");
 printf(“%s %s %sn”, (*aPtr).numero, “di”,(*aPtr).seme);
 return 0; }


                                                         10.2.c
                                                                                33
Modi alternativi per definire una struttura

  ° Una struttura può essere dichiarata anche senza nome:
     struct {
        char nome[15], cognome[15], cod_fis[17];
        short int giorno, mese, anno;
               } cont1;
  ° Nessuna istanza di questa struttura può essere dichiarata al di fuori
    della lista di variabili ammesse dopo la parentesi graffa:
    struct {
          char nome[15], cognome[15], cod_fis[17];
          short int giorno, mese, anno;
          } cont1, contrs[1000], *pctr;




                                                                            34
Uso del typedef

  Rappresenta un modo per creare dei
  sinonimi per i tipi definiti in precedenza

  typedef struct contribuente Contribuente;



  Contribuente è il sinonimo
  Rappresenta l’intera struttura, compresa
  la parola chiave struct




                                               35
Uso del typedef

struct contribuente {
   char nome[15], cognome[15], cod_fis[17];
   short int giorno, mese, anno; };
typedef struct contribuente Contribuente;

typedef struct [contribuente]
{
char nome[15], cognome[15], cod_fis[17];
short int giorno, mese, anno;
} Contribuente;




                                              36
Uso del typedef


° Per dichiarare una variabile del tipo struttura si usa solo il nome
  assegnato con il typedef:
       Contribuente c1;
                equivalente a
       struct contribuente c1;

° typedef crea solo un sinonimo per un tipo già dichiarato.

° typedef può essere usato per creare sinonimi di tipi fondamentali per
  garantire la portabilità di un programma.




                                                                          37
Uso del typedef

° Esempio: programma scritto per funzionare con interi di 4 byte
  potrebbe usare int su un sistema e long su un altro, a seconda
  dell’implementazione.
   typedef Integer int;
   typedef Integer long;

° Tutto il programma può essere scritto usando
                Integer
° Si deve cambiare solo il typedef a seconda se quel sistema abbia o no gli
  int di 4 byte




                                                                              38
Inizializzazione

° Analoga a quanto avviene per gli array
    ° nome della variabile del tipo struttura + simbolo uguale
      “=” + la lista dei valori tra parentesi graffe
    ° Ogni valore iniziale deve essere dello stesso tipo del
      corrispondente tipo della struttura.
Contribuente cnt1 = { “Mario Rossi”, “RSSMRO63L33H501S”,
                      12, 7, 1963};
struct contribuente cnt1 = { “MarioRossi”,
                      “RSSMRO63L33H501S”, 12, 7, 1963};




                                                                 39
Inizializzazione

° Elenco con meno valori di quanti siano i membri della
  struttura:
   ° i rimanenti sarebbero inizializzati automaticamente a 0
     (NULL nel caso di puntatori)
° Elenco con più valori di quanti siano i membri della
  struttura:
   ° errore di sintassi




                                                               40
E’ possibile inizializzare contestualmente alla dichiarazione

struct contribuente {
   char nome[15], cognome [15], cod_fis[17];
   short int giorno, mese, anno;
    } cnt1 = { “Mario”, “Rossi”,
                          “RSSMRO63L33H501S”, 12,
                          7, 1963};




                                                                41
° Una struttura può anche dichiarata al di fuori di un blocco funzione ed
  essere quindi globale per l’intero programma

typedef struct risultato {
                 int uno;
                 int due; } Risultato;
typedef struct partita {
         char squadra_casa[20], squadra_ospite[20], arbitro[20];
         Risultato ris;} Partita;

° Le variabili di struttura dichiarate nel programma al di fuori di una
  funzione sono automaticamente inizializzate a 0 (NULL nel caso di
  puntatori), se non sono state altrimenti inizializzate.




                                                                            42
° Le variabili di struttura possono anche essere inizializzate con istruzioni
  di assegnamento.

    Partita derby;
    derby.squadra_casa = “Lazio”;
    derby.squadra_ospite = “Roma”;
    derby.arbitro = “Non lo so”;
    derby.ris.uno = 1;
    derby.ris.due = 5;




                                                                                43

Mais conteúdo relacionado

Mais procurados

12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatoriMajong DevJfu
 
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
 
Esercitazione 4 (19 marzo 2012)
Esercitazione 4 (19 marzo 2012)Esercitazione 4 (19 marzo 2012)
Esercitazione 4 (19 marzo 2012)STELITANO
 
14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e FileMajong DevJfu
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedefPiero Fraternali
 

Mais procurados (10)

2006 Py02 base
2006 Py02 base2006 Py02 base
2006 Py02 base
 
12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori12 - Programmazione: Array dinamici e puntatori
12 - Programmazione: Array dinamici e puntatori
 
2008 python
2008 python2008 python
2008 python
 
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
 
Appunti Basi(05 06)
Appunti Basi(05 06)Appunti Basi(05 06)
Appunti Basi(05 06)
 
Esercitazione 4 (19 marzo 2012)
Esercitazione 4 (19 marzo 2012)Esercitazione 4 (19 marzo 2012)
Esercitazione 4 (19 marzo 2012)
 
Array
ArrayArray
Array
 
Espressioni regolari
Espressioni regolariEspressioni regolari
Espressioni regolari
 
14 - Programmazione: Stream e File
14 - Programmazione: Stream e File14 - Programmazione: Stream e File
14 - Programmazione: Stream e File
 
06 1 array_stringhe_typedef
06 1 array_stringhe_typedef06 1 array_stringhe_typedef
06 1 array_stringhe_typedef
 

Destaque

Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
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 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)STELITANO
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)STELITANO
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2STELITANO
 
Symposium resources roadshow dampier gold richard hay
Symposium resources roadshow dampier gold richard haySymposium resources roadshow dampier gold richard hay
Symposium resources roadshow dampier gold richard haySymposium
 
David Vink (Veronica Publising) @ CMC Nieuwe Uitgeefconcepten
David Vink (Veronica Publising) @ CMC Nieuwe UitgeefconceptenDavid Vink (Veronica Publising) @ CMC Nieuwe Uitgeefconcepten
David Vink (Veronica Publising) @ CMC Nieuwe UitgeefconceptenMedia Perspectives
 
מהבית למוזיאון בעקבות תיעוד המורשת
מהבית למוזיאון בעקבות תיעוד המורשתמהבית למוזיאון בעקבות תיעוד המורשת
מהבית למוזיאון בעקבות תיעוד המורשתchayalamp
 
использование морских праздников и событий в патриотической работе
использование морских праздников и событий в патриотической работеиспользование морских праздников и событий в патриотической работе
использование морских праздников и событий в патриотической работеCadets Chuvashiya
 
Changes adapted ppt @ bec doms mba bagalkot
Changes adapted  ppt @ bec doms mba bagalkotChanges adapted  ppt @ bec doms mba bagalkot
Changes adapted ppt @ bec doms mba bagalkotBabasab Patil
 
Triangles lesson
Triangles lessonTriangles lesson
Triangles lessonlandml
 
OSHA CERTIFICATE OF COMPLETION
OSHA CERTIFICATE OF COMPLETIONOSHA CERTIFICATE OF COMPLETION
OSHA CERTIFICATE OF COMPLETIONRick Makowski
 
After effects slide solyanna
After effects slide solyannaAfter effects slide solyanna
After effects slide solyannasolyanna
 
Deepstore Brochure
Deepstore BrochureDeepstore Brochure
Deepstore BrochureOmar Akhtar
 
исследовательская работа
исследовательская работаисследовательская работа
исследовательская работаCadets Chuvashiya
 
Mgt. process & organizational behaviour complete
Mgt. process & organizational behaviour completeMgt. process & organizational behaviour complete
Mgt. process & organizational behaviour completeRohit Mishra
 

Destaque (20)

Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 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 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)Lezione 11 (26 marzo 2012)
Lezione 11 (26 marzo 2012)
 
Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)Lezione 13 (2 aprile 2012)
Lezione 13 (2 aprile 2012)
 
Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2Lezione 10 (21 marzo 2012)2
Lezione 10 (21 marzo 2012)2
 
Symposium resources roadshow dampier gold richard hay
Symposium resources roadshow dampier gold richard haySymposium resources roadshow dampier gold richard hay
Symposium resources roadshow dampier gold richard hay
 
David Vink (Veronica Publising) @ CMC Nieuwe Uitgeefconcepten
David Vink (Veronica Publising) @ CMC Nieuwe UitgeefconceptenDavid Vink (Veronica Publising) @ CMC Nieuwe Uitgeefconcepten
David Vink (Veronica Publising) @ CMC Nieuwe Uitgeefconcepten
 
Save the Date: Collaborative Calendar for Balboa Park
Save the Date: Collaborative Calendar for Balboa ParkSave the Date: Collaborative Calendar for Balboa Park
Save the Date: Collaborative Calendar for Balboa Park
 
Lavorazioni
LavorazioniLavorazioni
Lavorazioni
 
מהבית למוזיאון בעקבות תיעוד המורשת
מהבית למוזיאון בעקבות תיעוד המורשתמהבית למוזיאון בעקבות תיעוד המורשת
מהבית למוזיאון בעקבות תיעוד המורשת
 
использование морских праздников и событий в патриотической работе
использование морских праздников и событий в патриотической работеиспользование морских праздников и событий в патриотической работе
использование морских праздников и событий в патриотической работе
 
A menjar la mona!!!
A menjar la mona!!!A menjar la mona!!!
A menjar la mona!!!
 
Changes adapted ppt @ bec doms mba bagalkot
Changes adapted  ppt @ bec doms mba bagalkotChanges adapted  ppt @ bec doms mba bagalkot
Changes adapted ppt @ bec doms mba bagalkot
 
Bab1 f1
Bab1 f1Bab1 f1
Bab1 f1
 
Triangles lesson
Triangles lessonTriangles lesson
Triangles lesson
 
OSHA CERTIFICATE OF COMPLETION
OSHA CERTIFICATE OF COMPLETIONOSHA CERTIFICATE OF COMPLETION
OSHA CERTIFICATE OF COMPLETION
 
After effects slide solyanna
After effects slide solyannaAfter effects slide solyanna
After effects slide solyanna
 
Deepstore Brochure
Deepstore BrochureDeepstore Brochure
Deepstore Brochure
 
исследовательская работа
исследовательская работаисследовательская работа
исследовательская работа
 
Mgt. process & organizational behaviour complete
Mgt. process & organizational behaviour completeMgt. process & organizational behaviour complete
Mgt. process & organizational behaviour complete
 

Semelhante a Lezione 15 (2 aprile 2012)

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) puntatori vettori
Lezione 12 (28 marzo 2012) puntatori   vettoriLezione 12 (28 marzo 2012) puntatori   vettori
Lezione 12 (28 marzo 2012) puntatori vettoriSTELITANO
 
6 Vettori E Matrici
6   Vettori E Matrici6   Vettori E Matrici
6 Vettori E Matriciguest60e9511
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e RiferimentiIlio Catallo
 
Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)STELITANO
 
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLextrategy
 
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
 
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdfPasqualeRuocco5
 
Python - Primi passi
Python - Primi passi Python - Primi passi
Python - Primi passi orestJump
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)STELITANO
 
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014Andrea Telatin
 
Linguaggio R, principi e concetti
Linguaggio R, principi e concettiLinguaggio R, principi e concetti
Linguaggio R, principi e concettiVincenzo De Maio
 

Semelhante a Lezione 15 (2 aprile 2012) (20)

Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)Lezione 16 (2 aprile 2012)
Lezione 16 (2 aprile 2012)
 
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
 
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
 
6 Vettori E Matrici
6   Vettori E Matrici6   Vettori E Matrici
6 Vettori E Matrici
 
Puntatori e Riferimenti
Puntatori e RiferimentiPuntatori e Riferimenti
Puntatori e Riferimenti
 
Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)Lezione 8 (12 marzo 2012)
Lezione 8 (12 marzo 2012)
 
PHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQLPHP:funzioni e interazione con MySQL
PHP:funzioni e interazione con MySQL
 
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...
 
Array in C++
Array in C++Array in C++
Array in C++
 
3 Linguaggioc
3   Linguaggioc3   Linguaggioc
3 Linguaggioc
 
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
7. MATLAB - Parte 2 (IO, cicli, funzioni).pdf
 
12 Struct
12   Struct12   Struct
12 Struct
 
Python - Primi passi
Python - Primi passi Python - Primi passi
Python - Primi passi
 
Corso c++
Corso c++Corso c++
Corso c++
 
Java lezione 2
Java lezione 2Java lezione 2
Java lezione 2
 
Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)Esercitazione 3 (14 marzo 2012)
Esercitazione 3 (14 marzo 2012)
 
Lezione 3
Lezione 3Lezione 3
Lezione 3
 
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
 
R Vectors
R VectorsR Vectors
R Vectors
 
Linguaggio R, principi e concetti
Linguaggio R, principi e concettiLinguaggio R, principi e concetti
Linguaggio R, principi e concetti
 

Mais de 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 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 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 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
 
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
 
Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)STELITANO
 

Mais de STELITANO (18)

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 21 (2 maggio 2012)
Lezione 21 (2 maggio 2012)Lezione 21 (2 maggio 2012)
Lezione 21 (2 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 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
 
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 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)Lezione 10 (21 marzo 2012)
Lezione 10 (21 marzo 2012)
 

Lezione 15 (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. Le stringhe ° Uso comune degli array: memorizzazione di stringhe di caratteri ° Stringa costante: serie di caratteri racchiusa tra doppi apici  “HELLO WORLD” ° Stringa: array di caratteri che termina SEMPRE con il carattere nullo rappresentato dalla sequenza di escape ‘0’ ° Per memorizzare una stringa si usa un array di caratteri (memorizzazione su un byte). H E L L O W O R L D 0 char str [ ] = “some text”; 3
  • 4. Le stringhe Le stringhe sono diverse dalle costanti carattere "a": array di due elementi ('a' e '0’, char array[2];) 'a': costante carattere ° (char ch = 'a';) ° In memoria sarà assegnato ° "a": due byte (uno per 'a' e uno per '0') consecutivi ° 'a' : un byte ° "abc" : array di caratteri di dimensione 4 (tre per i caratteri 'a', 'b', 'c' e uno per '0') ° 'a' ° 'b' sono tre costanti carattere ° 'c' 4
  • 5. ° L’array che rappresenta la stringa ha dimensione maggiore di 1 rispetto la dimensione della stringa ° Viene automaticamente aggiunto il carattere di terminazione 0 s o m e t e x t 0 ° Se specifichiamo la lunghezza della stringa, allora il numero di caratteri deve potere essere contenuto nell’array char str [3] = “guarda”; /* Errato */ ° Se la stringa è più corta della lunghezza dell’array, gli elementi mancanti sono inizializzati con 0. 5
  • 6. s o m e t e x t 0 char str [3]= “some text” str[0] 1000 ‘s’ str[1] ‘o’ 1001 str[2] ‘m’ 1002 str[3] ‘e’ 1003 str[4] ‘‘ 1004 str[5] ‘t’ 1005 str[6] ‘e’ 1006 str[7] ‘x’ 1007 str[8] ‘t’ 1008 str[9] ‘0’ 1009 6
  • 7. ° Inizializzazione con singole costanti di carattere nella lista di inizializzazione char str[ ] = {'g', 'u', 'a', 'r', 'd', 'a'}; ° Sarà aggiunto il carattere di terminazione ° L’array è quindi di 7 elementi ° La stringa di caratteri è un array a tutti gli effetti ° Accesso ai singoli elementi con nome e indice str[3]  'r' ° Una stringa è un array: ° Viene trattata dal compilatore come un puntatore (nome di array) ° Il suo valore è l'indirizzo del primo elemento della stringa 7
  • 8. Lettura e scrittura ° Si usano le funzioni scanf e printf con lo specificatore di formato %s char str[4]; scanf("%s", str); NB: manca & printf("%s", str); (nome_array =indirizzo) #include <stdio.h> #define N 20 int main (void) { char ar[N]= "Oggi piove."; char str[N]; printf("Introduci una stringa n"); scanf("%s", str); printf("prima stringa: %sn seconda stringa: %sn", ar, str); return 0; } stringa.c 8
  • 9. ° scanf ° il suo argomento deve essere un puntatore ad un array di dimensioni sufficienti per contenere la riga di input ° Termine immissione: carattere di spaziatura ° Dopo avere letto la stringa viene automaticamente aggiunto un carattere '0' ° printf ° il suo argomento deve essere un puntatore a un array di caratteri terminato dal carattere nullo ° i caratteri sono stampati fino al terminatore 9
  • 10. int main( void ) { char *p = "abc"; printf("%s %s %s n", p, p+1,p+2); return 0 ; } stringaP.c /* stampa abc bc c*/ ° Alla variabile p viene assegnato l'indirizzo dell'array di caratteri "abc" ° La stampa di un puntatore a char provoca la stampa di ogni carattere successivo dell'array fino a '0'. ° printf(.. p): stampa di abc (p = puntatore di inizio stringa) ° printf(.. p+1): stampa di bc (p+1 = puntatore al secondo elemento della stringa) ° printf(.. p+2): stampa di c (p+2 = puntatore al terzo elemento della stringa) 10
  • 11. ° Esempio: ° Funzione che conta il numero di parole in una stringa ° Ipotesi: le parole sono separate da caratteri di spaziatura ° viene utilizzata la macro isspace ( ) ° verifica se il carattere è uno spazio, una tabulazione o un newline ° definita in ctype.h 11
  • 12. ° Algoritmo ° Inizializza il contatore di parole cnt=0 ° Fino a che non arrivi alla fine della stringa ° Leggi i caratteri della stringa fino a che non trovi un carattere utile (ossia diverso da spazio, una tabulazione o un a capo) ° Se il carattere non è uno spazio, incrementa il contatore di parole ° Salta tutti i caratteri della parola 12
  • 13. #include <stdio.h> #include <ctype.h> int word_cnt (char *); int main( void ) { char ar[ ] = "guarda che il tempo non promette bene"; int parole; parole = word_cnt(ar); printf("%d n", parole); return 0 ; } contaPar.c 13
  • 14. int word_cnt (char *s) { int cnt =0; while (*s != '0') { while (isspace (*s)) /*salta spazi*/ s++; if (*s != '0') { /*trovato inizio parola*/ ++cnt; while(!isspace(*s) && *s != '0') ++s; /*salta la parola fino allo spazio successivo o alla fine della stringa */ } } return cnt; } contaPar.c 14
  • 15. Rappresentazione di dati eterogenei Ipotesi: definizione di insieme di oggetti di tipo diverso (es. int, float, array) Esempio: ° Rappresentazione di un individuo ° nome: array di caratteri ° cognome: array di caratteri ° data di nascita: tre interi ° codice fiscale: array di 17 caratteri  queste informazioni non possono essere inserite in un array perché i tipi sono eterogenei  memorizzazione in variabili distinte char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; 15
  • 16. Rappresentazione di dati eterogenei L’immissione dei dati dovrebbe avvenire indipendentemente per ciascun campo: strcpy (nome, “Mario”); strcpy (cognome, “Rossi”); strcpy(cod_fis, “RSSMRO63L33H501S”); giorno = 12; mese = 7; anno = 1963;  organizzazione di dati piuttosto disomogenea: le informazioni relative ad una persona sono sparse per la memoria se dovessimo gestire un database …: char nome[1000][15], cognome[1000][15], cod_fis[1000][17]; short int giorno[1000], mese[1000], anno[1000]; 16
  • 17. Strutture Soluzione: dato che contenga informazioni di tipo diverso.  In C esiste un tipo di dati, chiamato struttura, che permette di definire in modo aggregato tipi di dato eterogenei. ° Una struttura consiste di un nome e di componenti (campi o elementi). ° Il nome assegnato alla struttura diventa il nome del tipo di dato ° tipo di dato definito dall’utente che può essere usato per dichiarare variabili di quel tipo. ° Nota Bene: la struttura da’ la possibilità all’utente di definire un tipo di dato e di denominarlo 17
  • 18. Strutture: sintassi etichetta struct <tag_name> { <tipo1> <nome_campo1>; campi o elementi <tipo2> <nome_campo2>; …………………………..; <tipoN> <nome_campoN>; }; Esempio: struct contribuente { char nome[15]; char cognome[15]; char cod_fis[17]; short int giorno; short int mese; short int anno; }; 18
  • 19. Strutture ° Una struttura definita è nuovo tipo di dato che si può usare per definire variabili usando l’etichetta struct contribuente esattamente come int, float , etc. ° Definizione di una variabile cont1 di tipo struct contribuente struct contribuente cont1; struct contribuente { char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; } cont1; 19
  • 20. Strutture cont1 è di tipo struct contribuente ° è formata dagli stessi campi della struttura ° in associazione al tipo vengono fornite dal C delle funzioni di accesso ai singoli campi ° per fornire valori ai campi ° per prelevare i valori dei campi ° il meccanismo di memorizzazione di una variabile di tipi struttura tiene conto dell’unicità della struttura 20
  • 21. ° Si noti la differenza con l’array: ° quando definiamo un array, l’istanza è unica ° Una struttura può avere più di un istanza struct contribuente mrossi; struct contribuente pallini; struct contribuente torto; nome cognome cod_fis giorno mese anno struct contribuente mrossi; Mario Rossi RSSMRO52P34H501Y 18 8 1952 struct contribuente pallini; Carlo Pallini PLNCRL60F80H501W 8 8 1960 struct contribuente torto; Gelso Torto TRTGLS76J08H501W 6 6 1976 21
  • 22. Meccanismo di accesso ai campi <nome_struttura>.<nome_campo> mrossi.nome pallini.giorno torto.cod_fis mrossi.anno Assegnazione valori mrossi.nome <- “Mario Rossi” pallini.giorno <- 8 torto.cod_fis <- “TRTFRC76J08H501W” mrossi.anno <- 1960 22
  • 23. Memorizzazione ° Dichiarando una struttura, ci sarà un’allocazione di memoria pari alla somma di quella richiesta per i campi. ° La memorizzazione della struttura avviene in modo consecutivo nell’ordine in cui i campi sono dichiarati. struct contribuente { char nome[15], cod_fis[17]; short int giorno, mese, anno; }; struct contribuente cont1; 1000 1004 1008 nome[] 100C 1010 1014 cod_fis[] 1018 101C 1020 giorno mese 1024 anno 23
  • 24. Memorizzazione ° La contiguità degli elementi della struttura non è assicurata per la presenza di spazi vuoti tra gli elementi a causa dell’allineamento degli elementi ° Es: tutti gli oggetti di dimensioni superiori a char sono memorizzati in locazioni con indirizzi pari. ° Queste restrizioni sull’allineamento possono creare spazi vuoti (buchi o gap) nelle strutture. struct esempio_allineamento { char mem1; short mem2; Char mem3; } s1; 1001 1003 1000 mem1 mem2 mem3 1004 24
  • 25. ° In mancanza di restrizioni di allineamento, s1 viene memorizzato senza buchi. ° In presenza di restrizioni, vi sarà un buco tra mem1 e mem2. 1001 1003 1000 mem1 mem2 mem3 1004 ° Confrontare due strutture è un errore di sintassi. 25
  • 26. Composizione di una struttura ° I membri delle strutture possono contenere variabili di qualsiasi tipo scalare (int, float, etc.) o aggregato come array e altre strutture. ° Una struttura non può contenere una istanza di se stessa. ° Una struttura può contenere un elemento che sia un puntatore (anche a se stessa) ° A partire da una struttura ST possiamo dichiarare ° variabili di tipo ST (istanze) struct ST istance1; ° puntatori alla struttura struct ST *s; ° vettori di elementi di tipo struttura struct ST vettore[1000]; 26
  • 27. struct contribuente contrs[1000], *pctr; ° contrs[1000]: ° array di 1000 elementi ° ogni elemento è una struttura con i campi nome, cognome, cod_fis, giorno, mese, anno. ° pctr: un puntatore ad un struttura ° pctr= &contrs[10] fa puntare pctr all’undicesimo elemento dell’array. 27
  • 28. contrs[0] nome cognome cod_fis giorno mese anno nome cognome cod_fis giorno mese anno contrs[2] nome cognome cod_fis giorno mese anno nome cognome cod_fis giorno mese anno ptr nome cognome cod_fis giorno mese anno nome cognome cod_fis giorno mese anno nome cognome cod_fis giorno mese anno nome cognome cod_fis giorno mese anno contrs[997].nome =”Maria”; contrs[997].cod_fis =”BNCMRA79F89H505Y”; contrs[997].giorno =15; contrs[997].mese=9; contrs[997].anno =1989; 28
  • 29. Accesso diretto (1) ° nome istanza della struttura e il nome del membro separati dall’operatore punto (.), detto anche operatore membro di struttura cnt1.nome, cnt1.giorno, cnt1.mese … ° Un costrutto della forma variabile_di_struttura.nome_membro ° è una variabile e può essere utilizzata nello stesso modo di una variabile semplice o un elemento di un array. if (cnt1.giorno > 31 || cnt1.mese >12 ) printf(“data erratan”); ° Può anche essere utilizzata per assegnare valori ai singoli membri. struct contribuente cnt3; cnt3.nome = “Luigi”; cnt3.giorno = 23; 29
  • 30. Accesso diretto (2) ° È possibile assegnare una intera struttura ad un’altra struct contribuente cnt4; cnt4=cnt3; ° È equivalente all’assegnazione campo per campo. 30
  • 31. Accesso indiretto tramite puntatore (1) ° La definizione di puntatore ad una struttura è uguale alle altre dichiarazioni di puntatori: struct contribuente *Pcnt; ° Per accedere ad un elemento si usa l’operatore freccia, o operatore puntatore a struttura ° operatore freccia -> ° simbolo meno (-) seguito senza spazi dal simbolo di maggiore (>) ° Accesso: ° nome del puntatore seguito dall’operatore freccia e dal nome del campo Pcnt->nome, Pcnt->giorno, Pcnt->cod_fis, … 31
  • 32. Accesso indiretto tramite puntatore (2) ° Può essere usato esattamente come l’altra forma di accesso if (Pcnt->giorno > 31 || Pcnt->mese >12 ) printf(“data erratan”); ° L’operatore freccia è una forma abbreviata per accedere all’indirizzo contenuto nel puntatore e quindi applicare poi l’operatore punto: Pnct -> equivale a *Pcnt Pcnt->nome equivale a (*Pcnt).nome ° Si noti che le parentesi tonde sono necessarie perché l’operatore membro di struttura (il punto) ha priorità maggiore dell’operatore di risoluzione del riferimento (l’asterisco). 32
  • 33. Esempio 10.2 Deitel&Deitel #include <stdio.h> struct carta { char *numero, *seme; }; int main (void) { struct carta a, *aPtr; a.numero=”Asso”; a.seme=”Picche”; aPtr=&a; printf("Stampa con operatore membro di strutturan"); printf(“%s %s %sn”, a.numero, “di”, a.seme); printf("Stampa con operatore puntatore a strutturan"); printf(“%s %s %sn”, aPtr->numero, “di”, aPtr->seme); printf("Stampa con punt. e operatore membro di strutturan"); printf(“%s %s %sn”, (*aPtr).numero, “di”,(*aPtr).seme); return 0; } 10.2.c 33
  • 34. Modi alternativi per definire una struttura ° Una struttura può essere dichiarata anche senza nome: struct { char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; } cont1; ° Nessuna istanza di questa struttura può essere dichiarata al di fuori della lista di variabili ammesse dopo la parentesi graffa: struct { char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; } cont1, contrs[1000], *pctr; 34
  • 35. Uso del typedef Rappresenta un modo per creare dei sinonimi per i tipi definiti in precedenza typedef struct contribuente Contribuente; Contribuente è il sinonimo Rappresenta l’intera struttura, compresa la parola chiave struct 35
  • 36. Uso del typedef struct contribuente { char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; }; typedef struct contribuente Contribuente; typedef struct [contribuente] { char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; } Contribuente; 36
  • 37. Uso del typedef ° Per dichiarare una variabile del tipo struttura si usa solo il nome assegnato con il typedef: Contribuente c1; equivalente a struct contribuente c1; ° typedef crea solo un sinonimo per un tipo già dichiarato. ° typedef può essere usato per creare sinonimi di tipi fondamentali per garantire la portabilità di un programma. 37
  • 38. Uso del typedef ° Esempio: programma scritto per funzionare con interi di 4 byte potrebbe usare int su un sistema e long su un altro, a seconda dell’implementazione. typedef Integer int; typedef Integer long; ° Tutto il programma può essere scritto usando Integer ° Si deve cambiare solo il typedef a seconda se quel sistema abbia o no gli int di 4 byte 38
  • 39. Inizializzazione ° Analoga a quanto avviene per gli array ° nome della variabile del tipo struttura + simbolo uguale “=” + la lista dei valori tra parentesi graffe ° Ogni valore iniziale deve essere dello stesso tipo del corrispondente tipo della struttura. Contribuente cnt1 = { “Mario Rossi”, “RSSMRO63L33H501S”, 12, 7, 1963}; struct contribuente cnt1 = { “MarioRossi”, “RSSMRO63L33H501S”, 12, 7, 1963}; 39
  • 40. Inizializzazione ° Elenco con meno valori di quanti siano i membri della struttura: ° i rimanenti sarebbero inizializzati automaticamente a 0 (NULL nel caso di puntatori) ° Elenco con più valori di quanti siano i membri della struttura: ° errore di sintassi 40
  • 41. E’ possibile inizializzare contestualmente alla dichiarazione struct contribuente { char nome[15], cognome [15], cod_fis[17]; short int giorno, mese, anno; } cnt1 = { “Mario”, “Rossi”, “RSSMRO63L33H501S”, 12, 7, 1963}; 41
  • 42. ° Una struttura può anche dichiarata al di fuori di un blocco funzione ed essere quindi globale per l’intero programma typedef struct risultato { int uno; int due; } Risultato; typedef struct partita { char squadra_casa[20], squadra_ospite[20], arbitro[20]; Risultato ris;} Partita; ° Le variabili di struttura dichiarate nel programma al di fuori di una funzione sono automaticamente inizializzate a 0 (NULL nel caso di puntatori), se non sono state altrimenti inizializzate. 42
  • 43. ° Le variabili di struttura possono anche essere inizializzate con istruzioni di assegnamento. Partita derby; derby.squadra_casa = “Lazio”; derby.squadra_ospite = “Roma”; derby.arbitro = “Non lo so”; derby.ris.uno = 1; derby.ris.due = 5; 43