System is processing data
Please download to view
...

Lezione 15 (2 aprile 2012)

by stelitano

on

Report

Category:

Documents

Download: 0

Comment: 0

233

views

Comments

Description

Download Lezione 15 (2 aprile 2012)

Transcript

  • 1. Dipartimento Ingegneria Chimica Materiali Ambiente Abilità Informatiche Lezione del 2 Aprile 2012Prof. Antonino Stelitano
  • 2. DocenteAntonino StelitanoTutorDa definireLezioniLunedì 14:00 – 17:30 aula 16Lab. Paolo Ercoli Mercoledì15:45 – 19:00 aula 17Lab. Paolo ErcoliRicevimento: Perantonino.stelitano@uniroma1.it appuntamento stelitano.a@libero.itSito web:http://w3.uniroma1.it/ab_informatiche/
  • 3. Le stringhe° Uso comune degli array: memorizzazione di stringhe dicaratteri° Stringa costante: serie di caratteri racchiusa tra doppi apici  “HELLO WORLD”° Stringa: array di caratteri che termina SEMPRE con ilcarattere nullo rappresentato dalla sequenza di escape ‘0’° Per memorizzare una stringa si usa un array di caratteri(memorizzazione su un byte). H EL L OW OR L D 0 char str [ ] = “some text”; 3
  • 4. Le stringheLe 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 per0)° a° bsono tre costanti carattere° c4
  • 5. ° L’array che rappresenta la stringa ha dimensione maggioredi 1 rispetto la dimensione della stringa° Viene automaticamente aggiunto il carattere di terminazione0some te xt0° Se specifichiamo la lunghezza della stringa, allora il numerodi caratteri deve potere essere contenuto nell’array char str [3] = “guarda”; /* Errato */° Se la stringa è più corta della lunghezza dell’array, glielementi mancanti sono inizializzati con 0.5
  • 6. s o met e xt 0char 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 diinizializzazione 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 è lindirizzo del primo elemento della stringa7
  • 8. Lettura e scrittura° Si usano le funzioni scanf e printf con lo specificatore di formato %schar str[4];scanf("%s", str); NB: manca &printf("%s", str); (nome_array =indirizzo)#include <stdio.h>#define N 20int main (void) { char ar[N]= "Oggi piove."; char str[N]; printf("Introduci una stringan"); scanf("%s", str); printf("prima stringa: %snseconda 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 terminatore9
  • 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 lindirizzo dellarray di caratteri "abc"° La stampa di un puntatore a char provoca la stampa di ogni caratteresuccessivo dellarray 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 dellastringa)° printf(.. p+2): stampa di c (p+2 = puntatore al terzo elemento dellastringa) 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 oun 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.c13
  • 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 allospazio successivo o allafine della stringa */ } } return cnt;}contaPar.c14
  • 15. Rappresentazione di dati eterogeneiIpotesi: 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 sonoeterogenei memorizzazione in variabili distintechar nome[15], cognome[15], cod_fis[17];short int giorno, mese, anno; 15
  • 16. Rappresentazione di dati eterogeneiL’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 unapersona 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. StruttureSoluzione: 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 didato e di denominarlo 17
  • 18. Strutture: sintassi etichettastruct <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 definirevariabili usando l’etichetta struct contribuente esattamente come int, float, etc.° Definizione di una variabile cont1 di tipo struct contribuentestruct contribuente cont1;struct contribuente { char nome[15], cognome[15], cod_fis[17]; short int giorno, mese, anno; } cont1; 19
  • 20. Strutturecont1 è di tipo struct contribuente° è formata dagli stessi campi della struttura° in associazione al tipo vengono fornite dal C delle funzioni di accesso aisingoli campi° per fornire valori ai campi° per prelevare i valori dei campi° il meccanismo di memorizzazione di una variabile di tipi struttura tieneconto 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;nomecognome cod_fisgiornomese annostruct contribuente mrossi; Mario RossiRSSMRO52P34H501Y188 1952struct contribuente pallini; CarloPalliniPLNCRL60F80H501W 8 8 1960 struct contribuente torto; GelsoTortoTRTGLS76J08H501W 6 6 1976 21
  • 22. Meccanismo di accesso ai campi<nome_struttura>.<nome_campo>mrossi.nomepallini.giornotorto.cod_fismrossi.annoAssegnazione valorimrossi.nome <- “Mario Rossi”pallini.giorno <- 8torto.cod_fis <- “TRTFRC76J08H501W”mrossi.anno <- 196022
  • 23. Memorizzazione° Dichiarando una struttura, ci sarà un’allocazione di memoria pari allasomma di quella richiesta per i campi.° La memorizzazione della struttura avviene in modo consecutivonell’ordine in cui i campi sono dichiarati. struct contribuente { char nome[15], cod_fis[17];short int giorno, mese, anno;}; struct contribuente cont1;100010041008 nome[]100C10101014 cod_fis[]1018101C1020 giornomese1024anno 23
  • 24. Memorizzazione° La contiguità degli elementi della struttura non è assicurata per lapresenza di spazi vuoti tra gli elementi a causa dell’allineamento deglielementi ° 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 ogap) nelle strutture.struct esempio_allineamento { char mem1; short mem2; Char mem3; } s1; 100110031000mem1 mem2 mem3100424
  • 25. ° In mancanza di restrizioni di allineamento, s1 viene memorizzato senzabuchi.° In presenza di restrizioni, vi sarà un buco tra mem1 e mem2.1001 1003 1000mem1mem2 mem3 1004° Confrontare due strutture è un errore di sintassi. 25
  • 26. Composizione di una struttura° I membri delle strutture possono contenere variabili di qualsiasi tiposcalare (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 ase 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 elementodell’array. 27
  • 28. contrs[0] nomecognomecod_fis giorno mese annonomecognomecod_fis giorno mese annocontrs[2]nomecognomecod_fis giorno mese annonomecognomecod_fis giorno mese annoptrnome cognome cod_fis giorno mese annonomecognomecod_fis giorno mese annonome cognome cod_fis giorno mese annonomecognomecod_fis giorno mese annocontrs[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’operatorepunto (.), detto anche operatore membro di strutturacnt1.nome, cnt1.giorno, cnt1.mese …° Un costrutto della formavariabile_di_struttura.nome_membro° è una variabile e può essere utilizzata nello stesso modo di una variabilesemplice 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’altrastruct 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 altredichiarazioni di puntatori: struct contribuente *Pcnt;° Per accedere ad un elemento si usa l’operatore freccia, o operatorepuntatore a struttura ° operatore freccia -> ° simbolo meno (-) seguito senza spazi dal simbolo di maggiore (>)° Accesso: ° nome del puntatore seguito dall’operatore freccia e dal nome delcampo 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’indirizzocontenuto nel puntatore e quindi applicare poi l’operatore punto:Pnct -> equivale a *PcntPcnt->nome equivale a (*Pcnt).nome° Si noti che le parentesi tonde sono necessarie perché l’operatore membro distruttura (il punto) ha priorità maggiore dell’operatore di risoluzione delriferimento (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.c33
  • 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 fuoridella 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 typedefRappresenta un modo per creare deisinonimi per i tipi definiti in precedenzatypedef struct contribuente Contribuente;Contribuente è il sinonimoRappresenta l’intera struttura, compresala parola chiave struct 35
  • 36. Uso del typedefstruct 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 nomeassegnato 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 pergarantire la portabilità di un programma.37
  • 38. Uso del typedef° Esempio: programma scritto per funzionare con interi di 4 bytepotrebbe usare int su un sistema e long su un altro, a secondadell’implementazione. typedef Integer int; typedef Integer long;° Tutto il programma può essere scritto usandoInteger° Si deve cambiare solo il typedef a seconda se quel sistema abbia o no gliint di 4 byte38
  • 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 delcorrispondente 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 dellastruttura: ° i rimanenti sarebbero inizializzati automaticamente a 0 (NULL nel caso di puntatori)° Elenco con più valori di quanti siano i membri dellastruttura: ° errore di sintassi 40
  • 41. E’ possibile inizializzare contestualmente alla dichiarazionestruct 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 edessere quindi globale per l’intero programmatypedef 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 unafunzione sono automaticamente inizializzate a 0 (NULL nel caso dipuntatori), se non sono state altrimenti inizializzate.42
  • 43. ° Le variabili di struttura possono anche essere inizializzate con istruzionidi 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
  • Fly UP