Informatica 2 modulo C Massimo Callisto De Donato

Documenti analoghi
Programmazione C Massimo Callisto De Donato

Linguaggio C - Strutture

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Programmazione I - Laboratorio

Esercizi. La funzione swapint() primo tentativo

Lezione 13: Strutture dati dinamiche

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

parte dichiarativa globale: dichiarazioni di costanti dichiarazioni di tipi dichiarazioni di variabili prototipi di funzioni/procedure

parte dichiarativa globale: dichiarazioni di costanti dichiarazioni di tipi dichiarazioni di variabili prototipi di funzioni/procedure

Corso di Fondamenti di Programmazione canale E-O. Strutture. Strutture. Definizione di strutture (2) Definizione di strutture (1)

Esercitazione 11. Liste semplici

C: panoramica. Violetta Lonati

Allocazione dinamica memoria

Lezione 8 Struct e qsort

Tipi user-defined. parte dichiarativa globale:

dott. Sabrina Senatore

Fondamenti di Informatica 2

Laboratorio di Informatica

Lezione 6 Struct e qsort

Lezione 11: Liste a Puntatori e Input/Output

Laboratorio di Algoritmi e Strutture Dati Ingegneria e Scienze Informatiche - Cesena A.A

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Le strutture. UNIVERSITÀ DEGLI STUDI DEL SANNIO Benevento DING DIPARTIMENTO DI INGEGNERIA

Le strutture dati elementari (I parte) Gianpiero Cabodi Dip. Automatica e Informatica Politecnico di Torino

Lezione 20: Tipi derivati: struct e union

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Struct, enum, Puntatori e Array dinamici

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Il linguaggio C. Puntatori e dintorni

Aritmetica dei puntatori

Strutture, Unioni, Enumerazioni in C. Emilio Di Giacomo

Strutture dati dinamiche

Le strutture /1. struct temp {char titolo[200]; char autore[100]; int pagine; } ; typedef struct temp libro;

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Corso di Laboratorio di Sistemi Operativi A.A

Lezione 8: Stringhe ed array multidimensionali

Introduzione al linguaggio C Puntatori

Laboratorio di Informatica I

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Lezione 6: Array e puntatori

Hash Table. Hash Table

I puntatori. DD Cap.7 pp KP Cap.6 pp

Fondamenti di Informatica 2

Programmazione I - Laboratorio

ARRAY DI PUNTATORI. ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori

Fondamenti di Informatica T-1, 2015/2016 Modulo 2. Prova d Esame 1A di Giovedì 14 Gennaio 2016 tempo a disposizione 2h

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Strutture Dati. Luca Abeni

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Strutture Dinamiche. Strutture Dinamiche

Fondamenti di Informatica 12. Linguaggio C -4

Il linguaggio C Strutture

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Funzioni, puntatori, strutture. Lab. Calc. AA 2006/07

Le Funzioni in C. Fondamenti di Informatica Anno Accademico 2010/2011. Corso di Laurea in Ingegneria Civile Politecnico di Bari Sede di Foggia

Dati strutturati in C

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Lezione 12: Allocazione Dinamica della Memoria

Laboratorio di Informatica

&v restituisce l indirizzo della zona di memoria allocata per v.

8 maggio Le lezioni di giovedi 9 maggio e giovedi 16 maggio saranno tenute dalla dott.ssa Di Ianni. Vediamo le vostre soluzioni per

Informatica A (per gestionali) A.A. 2004/2005. Esercizi di programmazione C Funzioni: passaggio di parametri per indirizzo, passaggio di array.

Informatica A (per gestionali) A.A. 2004/2005. Esercizi C. Funzioni: variabili e tipi locali e globali, passaggio parametri per valore, prototipo

Informatica 1. Prova di recupero 21 Settembre 2001

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Passaggio dei parametri. Passaggio dei parametri

definisce un vettore di 4 puntatori a carattere (allocata memoria per 4 puntatori)!

Laboratorio di Informatica I

Informatica per Statistica Riassunto della lezioni del 14/11/2012 e 16/11/2012

Fondamenti di Informatica: Ingegneria Meccanica Prova scritta del 12 luglio 2008

ALGORITMI E STRUTTURE DATI

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti

Tipi di dato personalizzati Array di struct. Tipi di dato utente. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

Linguaggio C: Array Valeria Cardellini

Puntatori e array. Violetta Lonati

Uso avanzato dei puntatori Allocazione dinamica della memoria

Strutture Dinamiche. Fondamenti di Informatica

Corso di Informatica A.A

Introduzione ai puntatori in C Definizione

Esercizio (o esempio?)

Fondamenti di Programmazione

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 19 14/04/2014

Corso di Informatica A.A

Strutture Dati. Nicu Sebe. Informatica Nicu Sebe 1 / 27

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Dati due punti sul piano calcolare la loro distanza

Prof. G. Ascia. I puntatori. Fondamenti di Informatica

Variabili e Funzioni. Informatica 1 / 19

ALGORITMI E STRUTTURE DATI

Fondamenti di Informatica T. Linguaggio C: i puntatori

Tipi strutturati - struct

Gestione dei files. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Via Leopardi 132

Transcript:

Università degli studi di Camerino Scuola di scienze e tecnologia - Sezione Informatica Informatica 2 modulo C Massimo Callisto De Donato massimo.callisto@unicam.it www.cs.unicam.it/massimo.callisto LEZIONE 8 LE STRUTTURE

Le strutture Abbiamo visto tipi di dati base (int, char,...) ed il tipo derivato array per manipolare gruppi omogenei di dati. Capita spesso di dover aggregare elementi di tipo diverso (non omogenei). Esempio: scrivere un programma che memorizzi le date di assunzione (es. 23 febbraio 2006) di n dipendenti (identificati da nome e cognome) con relativo stipendio. Si deve poter ricercare, a partire da un nome o stipendio, la relativa data di assunzione.

Strutture Soluzione: 3 vettori per le date: int* gg, char *mese, int* anno 2 vettore per i dipendenti: char *nome, char* cognome 1 vettore per lo stipendio: int *stipendio La connessione tra i vettori è data dalla relativa posizione Funzione di ricerca che ritorni l indice relativo al dipendente trovato (per nome o stipendio): int ricerca(char* nome, char* cognome); int ricerca_x_stipendio(int stipendio); Implementiamo la soluzione (esercizio). Abbastanza laborioso il tutto

Strutture Sfruttiamo un nuovo tipo di dato derivato che il C mette a disposizione: le strutture (struct) Una struct ci permette di organizzare in modo efficiente gruppi di dati di diverso tipo. Esempio: questa è la struttura che può modellare il concetto di data di assunzione struct data { int giorno; char* mese; int anno; ;

Strutture: schema Una serie di campi (campo1,,campon) eterogenei: Ogni campo può essere di tipo base (int, float,... ) o derivato (array, strutture, ). nome_struct identifica la struct nel programma. struct nome_struct { ; tipo_a campo1; tipo_b campo2; tipo_? campo1;

Strutture: esempi di definizione #define LEN 150 struct data { int giorno; char* mese; int anno; ; struct persona{ char nome[len]; char cognome[len]; char codice_fiscale[len]; int eta; ; struct punto_vendita{ char nome[len]; char *citta; int dipendenti; ; struct punto{ int coordinata_x; int coordinata_y; ;

Strutture: definizione variabili Le istruzioni di prima hanno solo detto al compilatore lo schema generale. Il passo successivo è definire una variabile: di tipo struttura; il tipo deve seguire uno schema definito prima. Sintassi generale: struct nome_struct nome_variabile; Con le strutture di pima: struct data oggi; // n.b.: i dati in oggi sono ancora?? struct punto_vendita alimentari; struct punto punto_a, punto_b;

Strutture: definizione alternativa Spesso si usa una sintassi alternativa e più compatta per definire i tipi strutture. Usiamo la parola chiave typedef che funziona da alias per un tipo di dato: typedef nome_tipo mio_nuovo_nome; Esempio: i due modi sotto sono equivalenti: Lo possiamo applicare a casi generali oltre che alle struct! struct data { int giorno; char* mese; int anno; ; struct data oggi; typedef struct { int giorno; char* mese; int anno; data; data oggi;

Strutture: accesso alla variabile Definito lo schema di una struct ed una variabile che segue quello schema, accediamo ai campi della variabile con l operatore punto. : variabile.membro; Esempio: typedef struct { int giorno; char* mese; int anno; data; data oggi; oggi.giorno = 20; oggi.mese = maggio ; oggi.anno = 2011;

Esempio typedef struct{ float _x; float _y; punto; float powerof(float); float dst(punto, punto); int main() { char c; punto pt_a, pt_b; do{ printf( Punto A: "); scanf("%f%f", &pt_a._x, &pt_a._y); printf( Punto B: "); Ci vuole sempre la & scanf("%f%f", &pt_b._x, &pt_b._y); printf("distanza: %3.4f\n", dst(pt_a, pt_b)); while((c=getchar())!= 'N'); float powerof(float value){ return (value*value); float dst(punto a, punto b) { float distanza, dx, dy; dx = powerof(a._x - b._x); dy = powerof(a._y - b._y); distanza = sqrt(dx + dy); return distanza; return 0;

Strutture: funzioni e strutture Il passaggio delle strutture come parametro formale avviene sempre per valore. Le strutture possono essere ritornate come un qualsiasi tipo di dato. Esercizio: aggiungere al programma precedente una funzione per calcolare il punto medio tra gli estremi. Prototipo: punto punto_medio(punto a, punto b); Formula matematica PM = ((x 1 +x 2 )/2, (y 1 +y 2 )/2)

Strutture: assegnazione Possiamo assegnare strutture ad altre strutture, ovviamente se il tipo è uguale: typedef struct { int giorno; char *mese; int anno; data; data oggi domani; oggi.giorno = 23; oggi.mese = "febbraio"; oggi.anno = 2006; domani = oggi; // ora domani ha gli stessi valori di oggi domani.giorno++;

Strutture: assegnazione /* abbiamo usato su new_data un modo equivalente per dichiarare una struttura. Di conseguenza, la dichiarazione della variabile di quel tipo è leggermente diversa. */ typedef struct{ int giorno; char mese[10]; int anno; data; struct new_data{ int giorno; char mese[10]; int anno; ; data oggi; struct new_data domani; domani = oggi; //errore - tipi non compatibili

Strutture: equivalenze Non ha senso relazionare direttamente due strutture, i membri si. typedef struct{ float x; float y; punto; punto a; a.x = 10.2; a.y = 20.1; punto b; b.x = 13; b.y = 27.4; if(a < b) { // errore if(a.x < b.x & a.y < b.y) { // ok

Strutture: inizializzazione L inizializzazione avviene come per gl array. typedef struct{ float x; float y; punto; punto a = {10.2, 20.1; punto b = {13, 27.4; a.x = b.x - 5.2; a.y = ++b.y - 4; // a.y==23.4, b.y==28.4

Strutture: array di strutture Stessa sintassi degli array. #define LEN 100 typedef struct { char nome[len]; char citta[len]; int dipendenti; shop; shop negozio[5]; int i; for(i = 0; i < 5; i++) scanf("%s%s%d", negozio[i].nome, negozio[i].citta, &negozio[i].dipendenti); for(i = 0; i < 5; i++) printf("%s,%s,%d\n", negozio[i].nome, negozio[i].citta, negozio[i].dipendenti);

Esempio: passaggio di array di strutture #include <stdio.h> #define LEN 100 #define N 3 typedef struct { char nome[len]; char cognome[len]; worker; worker add(void); void stampa_lista(worker *); int main() { worker persona[n]; int i; for(i = 0; i < N; i++) persona[i] = add(); stampa_lista(persona); return 0; worker add(void){ worker tmp; scanf("%s%s", tmp.nome, tmp.cognome); return tmp; void stampa_lista(worker *lista){ int i; for(i = 0; i < N; i++) printf("%s,%s\n", lista[i].nome, lista[i].cognome);

Strutture: membri eterogenei Una struttura può aggregare altre strutture. Questo permette di rappresentare schemi di dati avanzati. Esempio: rappresentiamo un insieme di persone con un array persona anagrafe[4000]; typedef struct{ int giorno; char mese[10]; int anno; data; typedef struct{ char via[35]; int numero; char citta[30]; char provincia[2]; indirizzo; typedef struct{ char nome[30]; char cognome[30]; data nascita; char comune[30]; char telefono[20]; indirizzo ind; persona;

Strutture: puntatori a strutture E possibile dichiarare puntatori a strutture ed ottenere gli effetti già visti (es.: pass. per rif. di strutture, allocazione dinamica di strutture). Usiamo sempre: & per l indirizzamento; L operatore * per accedere al contenuto della struttura puntata. typedef struct{ int giorno; char* mese; int anno; data; data oggi, *pts; pts = &oggi; (*pts).giorno = 12; (*pts).mese = "Giugno"; (*pts).anno = 2011; N.b.: (*pts).anno è diverso da *pts.anno L operatore. ha precedenza su *

Precedenza tra operatori (aggiornata) Precedenze fra Operatori Operatori Associativita' () [] ->. da sinistra a destra! ~ ++ -- + - & * (tipo) sizeof da destra a sinistra * / % da sinistra a destra + - da sinistra a destra << >> da sinistra a destra < <= > >= da sinistra a destra ==!= da sinistra a destra & da sinistra a destra ^ da sinistra a destra da sinistra a destra && da sinistra a destra da sinistra a destra?: da destra a sinistra = += -= *= /= %= &= ^= = <<= >>= da destra a sinistra, da sinistra a destra

Strutture: puntatori a scrittura compatta -> Con i puntatori a strutture possiamo usare l operatore -> al posto degli operatori * e. typedef struct{ int giorno; char* mese; int anno; data; data oggi, *pt; pt = &oggi; pt->giorno = 23; pt->mese = Marzo ; pt->anno = 2011; // (*pt).giorno=23; // (*pt).mese= Marzo ; // (*pt).anno=2006;

Esempio #include <stdio.h> #include <stdlib.h> #include <unistd.h> typedef struct { int ora, min, sec; clock; void _initc(clock *pt); void _updatec(clock *pt); void _stampc(const clock *pt); int main(int argc, char *argv[]) { clock ora; clock *pts = &ora; _initc(pts); printf("timer started. Ctrl+C to stop\n"); while(1){ _updatec(pts); sleep(1000); return 0; N.b.: Non sempre otteniamo gli stessi risultati su piattaforme diverse. void _initc(clock *pt){ pt->ora = pt->min = pt->sec = 0; void _updatec(clock *pt){ pt->sec = ++pt->sec % 60; if(!pt->sec){ pt->min = ++pt->min % 60; if(!pt->min){ pt->ora++; _stampc(pt); void _stampc(const clock *pt){ printf("[%dh %dm %ds]\r", pt- >ora, pt->min, pt->sec);

Esercizio Implementare l esercizio proposto all inizio con i vettori utilizzando le strutture. La struttura che identifica il dipendente contiene un campo key per l identificazione univoca. Lo stipendio lo possiamo aggregare al dipendente.

Strutture: allocazione dinamica L allocazione dinamica di strutture fa affidamento su sizeof(). Senza non possiamo sapere quanta memoria occupa una struttura. typedef struct{ int giorno; char* mese; int anno; data; data *new_day; new_day = (data *) malloc(sizeof(data)); if(new_day == NULL) {/* out of memory */ new_day->giorno = 23; new_day->mese = "Marzo"; new_day->anno = 2011;

Strutture: esempio di liste Le strutture rivestono un ruolo fondamentale nell implementazione delle liste, ovvero elementi uguali connessi in sequenza. DATI DATI DATI Null Testa Coda I dati possono essere di tipo arbitrario I puntatori puntano allo stesso tipo dell elemento della lista Rispetto ad un array, una lista ha un lunghezza variabile dato che gli elementi vengono generati, allacciati e rimossi a run-time.

Esempio complesso: anagrafe (1) #include <stdio.h> #include <stdlib.h> typedef struct { char nome[100]; char cognome[100]; persona; N.b.: Ancora non abbiamo terminato il typedef per anagrafe. Quindi dobbiamo mettere la parola chiave struct typedef struct { persona *corrente; struct anagrafe *prossimo; anagrafe; persona* aggiungi_persona(void); anagrafe* aggiungi_anagrafe(void); void stampa_anagrafe(anagrafe*); void accoda(anagrafe*, anagrafe*);

Esempio complesso: anagrafe (2) persona* aggiungi_persona(void){ persona *tmp = (persona *) malloc(sizeof(persona)); if(tmp == NULL){ printf("out of memory!"); exit(-1); printf("insericni cognome e nome separati da spazio:"); scanf("%s%s", tmp->cognome, tmp->nome); return tmp; anagrafe* aggiungi_anagrafe(void){ anagrafe *tmp = (anagrafe *) malloc(sizeof(anagrafe)); if(tmp == NULL){ printf("out of memory!"); exit(-1); tmp->corrente = aggiungi_persona(); tmp->prossimo = NULL; return tmp;

Esempio complesso: anagrafe (3) void accoda(anagrafe* lista, anagrafe* elemento){ if(lista->prossimo == NULL) lista->prossimo = (struct anagrafe *) elemento; else accoda(lista->prossimo, elemento); // chiamata ricorsiva void stampa_anagrafe(anagrafe* ang){ printf("[%s, %s]\n", ang->corrente->cognome, ang->corrente->nome); if(ang->prossimo!= NULL) stampa_anagrafe((anagrafe *) ang->prossimo); // chiamata ricorsiva

Esempio complesso: anagrafe (4) /* mettiamo tutto insieme */ /* potevamo pensare a schemi di input migliori */ int main(int argc, char *argv[]) { int i = 10; anagrafe *elemento; anagrafe *mia_lista = aggiungi_anagrafe(); stampa_anagrafe(mia_lista); while(i--){ accoda(mia_lista, aggiungi_anagrafe()); stampa_anagrafe(mia_lista); return 0;