Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria



Documenti analoghi
Esercitazione 9. Strutture ed Enumerazioni. Allocazione dinamica di memoria

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Funzioni in C. Violetta Lonati

Corso di Fondamenti di Informatica

I puntatori e l allocazione dinamica di memoria

Introduzione alla programmazione in C

Record in C: il costruttore struct.

RICERCA DI UN ELEMENTO

Concetti chiave. Struct. Variabili strutturate: il tipo struct Elementi di una struttura typedef e struct Array di strutture

Introduzione al linguaggio C Gli array

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Breve riepilogo della puntata precedente:

Introduzione al Linguaggio C

Fondamenti di Informatica T. Linguaggio C: i puntatori

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Fondamenti di Informatica 2

Appello di Informatica B

Inizializzazione, Assegnamento e Distruzione di Classi

INFORMATICA - I puntatori Roberta Gerboni

Laboratorio di programmazione

Lezione 9: Strutture e allocazione dinamica della memoria

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Esame del 3 febbraio 2010

Grammatica di base: Pointers

Lab 11 Gestione file di testo"

Esempio: Array di struct

puntatori Lab. Calc. AA 2007/08 1

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 9 Settembre 2015

Le variabili. Olga Scotti

La struttura dati ad albero binario

Allocazione dinamica della memoria - riepilogo

Le operazioni di allocazione e deallocazione sono a carico del sistema.

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Fondamenti di Informatica e Laboratorio T-AB T-16 Progetti su più file. Funzioni come parametro. Parametri del main

Linguaggio C - Stringhe

ESAME SCRITTO DI ELEMENTI DI INFORMATICA E PROGRAMMAZIONE. 27 Gennaio 2015

Visibilità dei Membri di una Classe

Le stringhe. Le stringhe

Indirizzo di una funzione. Puntatori a funzioni. Definizione di variabili. Definizione di variabili

Gestione delle stringhe in C

costruttori e distruttori

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella

Esercizio 1. Esercizio 2

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

Variabili e tipi di dato

Definizione di nuovi tipi in C

Compito di Fondamenti di Informatica

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

Esercizio 1. Esercizio 1

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Matematica in laboratorio

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Tipi di dato-prima parte

Gestione dei File in C

EXCEL FUNZIONI PRINCIPALI

Caratteri e stringhe Esercizi risolti

Esercizi di programmazione in C


13 - Gestione della Memoria nella Programmazione Orientata agli Oggetti

Raggruppamenti Conti Movimenti

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)


Il tipo di dato astratto Pila

dall argomento argomento della malloc()

Esercizio: gestione di un conto corrente

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

Problem solving elementare su dati vettoriali

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

Algoritmi e Strutture Dati

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Laboratorio di Algoritmi e Strutture Dati

Esempi di algoritmi. Lezione III

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Laboratorio di Fondamenti di Informatica anno accademico Esercizi proposti il

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

Strutturazione logica dei dati: i file

Linguaggio C - Funzioni

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Concetto di Funzione e Procedura METODI in Java

Programmazione. Laboratorio. Roberto Cordone DI - Università degli Studi di Milano

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Puntatori Passaggio di parametri per indirizzo

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

MANUALE EDICOLA 04.05

Oggetti Lezione 3. aspetti generali e definizione di classi I

Esercitazione 7. Procedure e Funzioni

Corso di Informatica

I file di dati. Unità didattica D1 1

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Laboratorio di Algoritmi e Strutture Dati

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Sistema operativo: Gestione della memoria

Transcript:

Esercitazione 10 Strutture ed Enumerazioni Allocazione dinamica di memoria

ESERCIZIO Scrivere una funzione che, dato un array di interi bidimensionale di dimensione n n, calcoli e stampi la somma degli elementi che stanno sotto, sopra e sulla diagonale principale. 0 1 2 3 0 1 2 3 0 4 0 3-3 64 0 57 2 30 2 23 11 78 18 84 somma degli elementi sotto la diagonale: -3+2+30+11+78+18 somma degli elementi sopra la diagonale: 4+0+3+0+57+23 somma degli elementi sulla diagonale: 0+64+2+84

Funzione somma */ la funzione somma utilizza i puntatori per restituire i tre valori richiesti. */ void somma (int a [ MAX_N][MAX_N], int n, int *somma_sotto, int *somma_sopra, int *somma_diag) { int i, j; */ inizializzazione delle variabili per le somme */ *somma_sotto = 0; *somma_sopra = 0; *somma_diag = 0;

*/ somma degli elementi sotto la diagonale principale */ for (i=1; i<n; i++) for (j =0; j<i ; j++) *somma_sotto +=a[i][j]; */ somma degli elementi sopra la diagonale principale */ for (i=0; i<n-1; i++) for (j =i+1; j<n ; j++) *somma_sopra +=a[i][j]; */ somma degli elementi sulla diagonale principale */ for (i=0; i < n; i++) *somma_diag +=a[i][i]; return ; }

Typedef La parola chiave typedef viene usata per assegnare un alias a un qualsiasi tipo, fondamentale o derivato. Esempio typedef char * Stringa; Stringa s1, s2; Il tipo char *, cioè il tipo puntatore a carattere, viene ribattezzato Stringa. Quindi si definiscono due variabili, s1 e s2 di tipo Stringa.

Typedef typedef int Interi; // Il tipo int viene ribattezzato Interi typedef Stringa Lista_spesa[30]; Lista_spesa tab; tab[0]= pane ; tab[1]= latte ; Lista_spesa è il tipo array di 30 puntatori a carattere. La variabile tab di tipo Lista_spesa è un array di puntatori a carattere, di cui inizializzo i prime due.

Tipi derivati A partire dai tipi fondamentali (int, float, double, char) è possibile costruire nuovi tipi, detti tipi derivati. Gli array e i puntatori sono esempi di tipi derivati, nel senso che per essere specificati hanno bisogno di riferirsi a un tipo base. Altri esempi di tipi derivati sono i tipi structure (strutture) i tipi enumerazione

Tipi structure Esempio Il seguente tipo struttura rappresenta il concetto di data. struct Data { int giorno; char *mese; int anno; } ; /* dichiarazione del tipo data */ Questa dichiarazione introduce un nuovo tipo, il tipo Data. È ora possibile dichiarare variabili di tipo struct Data nel seguente modo: struct Data ieri, oggi; /* ieri e oggi sono variabili di tipo struct Data */ La variabile oggi è una variabile strutturata composta di tre campi: due di tipo int - giorno e anno - e una di tipo stringa - mese.

Tipi structure La sintassi generale per la definizione di un tipo struttura è: struct nome_struttura { tipo_campo1 nome_campo1; tipo_campo2 nome_campo2;... tipo_campon nome_campon; } ; Gli elementi di una struttura sono detti campi; essi sono identificati da un nome e da un tipo che può essere sia fondamentale che derivato. La struttura così definita è un nuovo tipo a tutti gli effetti. Si possono definire variabili di tipo struct nome_struttura come segue: struct nome_struttura nome_variabile;

typedef e tipi structure Esempio typedef struct { int giorno; char *mese; int anno; } Data ; /* dichiarazione del tipo Data */ Questa dichiarazione introduce un nuovo nome per il tipo struttura. È ora possibile dichiarare variabili di tipo Data nel seguente modo: Data ieri, oggi; /* ieri e oggi sono variabili di tipo Data */

Esempio La seguente definizione introduce la struttura Automobile. Vengono dichiarate quindi due variabili di tipo Automobile, a1 e a2. typedef struct { char *marca; char *modello; int numero_vendute; } Automobile; Automobile a1, a2;

Tipi structure Per accedere ai campi di una variabile di tipo struttura si fa uso dell operatore punto (.) ESEMPIO Si consideri la struttura Data e le variabili ieri e oggi di tipo Data. Possiamo inizializzare le variabili ieri e oggi nel seguente modo: oggi.giorno = 30; oggi.mese = Novembre ; oggi.anno = 2007; ieri.anno = oggi.anno; printf( %d %s %d, oggi.giorno, oggi.mese, oggi.anno);

Operazioni su strutture Si possono assegnare variabili di tipo struttura a variabili dello stesso tipo struttura. Data d1, d2;... d1 = d2; Nota: questo permette di assegnare interi vettori. typedef struct { int a[12]; char b; } Prova x, y;... x = y; Non è possibile effettuare il confronto tra due variabili di tipo struttura. Data d1, d2; if (d1 == d2)... Errore!

Esempio /* definizione della struttura Automobile */ #define <stdio.h> typedef struct { char *marca; char *modello; int numero_vendute; } Automobile; int main ( ) { Automobile a1, a2; (continua)

a1.marca = FERRARI ; a1.modello = F40 ; a1.numero_vendute = 200; a2.marca = OPEL ; a2.modello = ASTRA ; a2.numero_vendute = 2000; printf ( marca auto = %s\n, a1.marca); printf ( modello auto = %s\n, a1.modello); printf ( vendute = %d\n, a1.numero_vendute); printf ( marca auto = %s\n, a2.marca); printf ( modello auto = %s\n, a2.modello); printf ( vendute = %d\n, a2.numero_vendute); }

ESERCIZIO Stabilire se il seguente codice e sintatticamente corretto e, in tal caso, cosa produce a video. typedef struct { int a; } S1; typedef struct { int a; } S2; S1 bob, ric; S2 gio; bob.a = 30; ric = bob; gio = bob; printf ( %d, %d, %d \n, bob.a, ric.a, gio.a);

SOLUZIONE typedef struct { int a; } S1; typedf struct { int a; } S2; S1 bob, ric; S2 gio; bob.a = 30; ric = bob; gio = bob; /* errore: non si può assegnare una variabile di tipo S1 a una di tipo S2 */ printf ( %d, %d, %d \n, bob.a, ric.a, gio.a);

ESERCIZIO Stabilire se il seguente codice e sintatticamente corretto e, in tal caso, cosa produce a video. typedef struct { int giorno; char *mese; int } Data; anno; Data *pd, compleanno; pd = &compleanno; *pd.giorno = 30; *pd.mese = Novembre ; *pd.anno = 2007; printf ( Il mio compleanno e il: %d, %s, %d \n, compleanno.giorno, compleanno.mese, compleanno.anno);

SOLUZIONE typedf struct { int giorno; char *mese; int anno; } Data; Data *pd, compleanno; pd = &compleanno; *pd.giorno = 30; /* errore: poiché l operatore. ha priorità *pd.mese = Novembre ; maggiore rispetto all operatore * bisogna *pd.anno = 2007; usare le parentesi: (*pd).giorno..., (*pd).mese..., (*pd).anno... */ printf ( Il mio compleanno e il: %d, %s, %d \n, compleanno.giorno, compleanno.mese, compleanno.anno);

ESERCIZIO Stabilire se il seguente codice e sintatticamente corretto e, in tal caso, cosa produce a video. typedef struct { int giorno; char *mese; int anno; } Data; Data compleanno = { 30, Novembre, 2007 }; Data *pd; pd = &compleanno; pd -> giorno = compleanno -> giorno; pd -> mese = compleanno -> mese; pd -> anno = compleanno -> anno; printf ( Il mio compleanno : %d, %s, %d \n, pd.giorno, pd.mese, pd.anno);

SOLUZIONE typedef struct { int giorno; char *mese; int anno; } Data; Data compleanno = { 30, Novembre, 2007 }; Data *pd; pd = &compleanno; pd -> giorno = compleanno -> giorno; pd -> mese = compleanno -> mese; pd -> anno = compleanno -> anno; / / errore: compleanno.giorno / / errore: compleanno.mese / / errore: compleanno.anno printf ( Il mio compleanno : %d, %s, %d \n, pd.giorno, pd.mese, pd.anno); / / errore: pd->giorno, pd->mese, pd->anno

Esercizio Scrivere una funzione che, dato un puntatore a una variabile di tipo Data, restituisce il numero del mese relativo alla data puntata dal puntatore in caso di errore, restituisce 0.

SOLUZIONE int numero_mese (Data *pd) { if (! strcmp(pd -> mese, Gennaio )) /* l operatore -> permette return (1); di accedere direttamente ai campi di una variabile strutturata puntata da un puntatore */ if (! strcmp (pd -> mese, Febbraio )) return (2);... if (! strcmp (pd -> mese, Dicembre )) return (12); return (0); }

Strutture di Strutture In C è possibile definire strutture di strutture Regola: le strutture che compaiono nei campi di una struttura devono essere state definite prima della struttura che le contiene.

Esempio Definire una struttura utile per la gestione di un autosalone. typedef struct { int giorno; char *mese; int anno; } Data; typedef struct { char *marca; char *modello; int numero_vendute; Data data_prima_produzione; } Automobile; Automobile salone[100];

Esempio Definire una struttura utile per la gestione di un conto corrente. typedef struct { int giorno; char *mese; int anno; } Data; typedef struct { int numero_conto; char nome[80]; float bilancio; Data ultimo_movimento; } Conto_corrente;

Tipi enumerazione Spesso si ha l esigenza di definire un insieme finito di valori alternativi da associare ad un oggetto. Ad esempio i 4 semi delle carte da poker sono cuori, fiori, quadri, picche. In genere si memorizzano questi valori associando un numero costante univoco a ciascuno. Perciò si potrebbe scrivere const int cuori = 1; const int fiori = 2; const int quadri = 3; const int picche = 4; Questa tecnica ha dei punti deboli. Il principale è che non c e modo di restringere l insieme dei valori assegnabili ad una variabile ai soli cuori, fiori, quadri, picche.

Tipi enumerazione I tipi enumerazione forniscono un metodo alternativo non solo per definire ma anche per raggruppare insiemi di costanti. Ad esempio: enum Seme {cuori = 1, fiori, quadri, picche} ; Così ho dichiarato un nuovo tipo enum Seme, che è un tipo enumerazione. I valori che appartengono al tipo enum Seme sono solo quattro: cuori, fiori, quadri, picche, e corrispondono agli interi 1,2,3 e 4. Nota: per default, al primo enumeratore è assegnato il valore 0 e ai successivi i valori 1,2,ecc... Noi abbiamo assegnato a cuori il valore 1. A fiori è assegnato automaticamente il valore 2, a quadri il valore 3 e a picche il valore 4.

typedef e tipi enumerazione Esempio: typedef enum Seme {cuori = 1, fiori, quadri, picche} Seme ; Seme p, s; Così ho rinominato il tipo enum Seme con il nuovo nome Seme. p ed s sono due variabili di tipo Seme.

Tipi enumerazione Oggetti di tipo enumerazione possono essere definiti, prendere parte a espressioni ed essere passati come argomenti a funzioni. Un oggetto di tipo enumerazione può essere inizializzato con - oppure è possibile assegnargli - solo un oggetto dello stesso tipo enumerazione. Esempio typedef enum Seme {cuori = 1, fiori, quadri, picche} Seme; Seme s = quadri; /* corretto, corrisponde a s = 3 */ Seme p = 4; /* corretto (ma brutto ), equivale a p = picche */ s = p; /* corretto */

Tipi enumerazione Non è possibile stampare i nomi effettivi degli enumeratori. Esempio typedef enum Seme {cuori = 1, fiori, quadri, picche} Seme; Seme s = quadri; printf( s = %d, s); /* stampa s = 3 */

Esercizio Dire cosa stampa il seguente frammento di codice. typedef enum Seme {cuori = 1, fiori, quadri, picche} Seme; typed struct { Seme seme; int numero; } Carta; Carta carta1, carta2; carta1.seme = cuori; carta1.numero = 1; carta2.seme = quadri; carta2.numero = 10; carta1 = carta2; printf( seme carta 1 = %d\n, carta1.seme); printf( numero carta 1 = %d\n, carta1.numero);

Soluzione typedef enum Seme {cuori = 1, fiori, quadri, picche} Seme; typedef struct { Seme seme; int numero; } Carta; stampa Carta carta1, carta2; carta1.seme = cuori; seme carta 1 = 3 carta1.numero = 1; numero carta 1 = 10 carta2.seme = quadri; carta2.numero = 10; carta1 = carta2; printf( seme carta 1 = %d\n, carta1.seme); printf( numero carta 1 = %d\n, carta1.numero);

Esercizio Consideriamo il seguente tipo di dato: typedef struct Student{ char cognome[15]; char nome[15] int voto; } Studente; Vogliamo costruire delle procedure che ci permettano di lavorare con tabelle di studenti: riempirle (con dati immessi dall utente), ordinarle in ordine alfabetico, stamparle, ecc.

void leggi(studente classe[], int nstudenti){ int i; for ( i = 0 ; i < nstudenti ; i++ ){ } } printf("\ncognome = "); scanf("%s", classe[i].cognome); printf("nome = "); scanf("%s", classe[i].nome); printf("voto = "); scanf("%d", &classe[i].voto) ; Viene passato il riferimento all array (nessuna copia!) void scrivi(studente classe[], int nstudenti){ int i; for ( i = 0 ; i < nstudenti ; i++ ){ printf("\n cognome = %s classe[i].cognome); printf("\n nome = %s", classe[i].nome); printf("\n voto = %d\n", classe[i].voto); } }

Ordinamento per inserzione passi successivi 0 1 i-1 i 2 4 6 9 5 3 8 1 7 0 Parte già ordinata Elemento da considerare adesso

Ordinamento per inserzione passi successivi 0 1 i-1 i 2 4 6 9 3 8 1 7 0 temp 5 Elemento da considerare adesso

Ordinamento per inserzione passi successivi 0 1 i-1 i 2 4 6 9 3 8 1 7 0 temp 5

Ordinamento per inserzione passi successivi 0 1 i-1 i 2 4 6 9 3 8 1 7 0 temp 5

Ordinamento per inserzione passi successivi 0 1 i-1 i 2 4 5 6 9 3 8 1 7 0 Parte già ordinata temp Prossimo elemento da considerare

Torniamo all esercizio... La tecnica di ordinamento per inserzione si applica ad array di qualsiasi tipo. In questo caso particolare, due elementi stud1 e stud2 dell array sono ordinati se stud1.cognome < stud2.cognome oppure stud1.cognome == stud2.cognome e stud1.nome < stud2.nome rispetto all ordine lessicografico (quello dell elenco telefonico!)

Ordinamento int maggiore(studente p, Studente q){ return (strcmp(p.cognome, q.cognome)>0 (strcmp(p.cognome, q.cognome)==0 && strcmp(p.nome, q.nome)>0)); } void inserisci( Studente a[], int i ){ int h; Studente temp = a[i] ; for ( h = i ; h > 0 && maggiore(a[h-1],temp); h-- ){ a[h] = a[h-1]; } a[h] = temp ; } void ordina(studente a[], int nstudenti){ int i; for (i=1; i<nstudenti; i++) inserisci(a,i); }

Fine esercizio... A questo punto non rimane che scrivere il programma principale... #include<stdio.h> #include <string.h> #define NUM_STUDENTI 300... int main(void){ Studente classe[num_studenti]; int nstud = 120; } leggi(classe, nstud); scrivi(classe, nstud); ordina(classe, nstud); scrivi(classe,nstud);

Esercizio Dichiarare un tipo enumerazione Colore che rappresenta i due colori delle pedine degli scacchi (bianco e nero), ed un tipo enumerazione Personaggio che rappresenta i diversi tipi di pedina (re, regina, alfiere, cavallo, torre e pedone). typedef enum Colore { bianco, nero } Colore; typedef enum Personaggio { re, regina, alfiere, cavallo torre, pedone } Personaggio;

Esercizio Dichiarare un tipo record Pedina, che rappresenta una pedina degli scacchi, con due campi: colore e personaggio, di tipo Colore e Personaggio, respettivamente. typedef struct { Colore colore; Personaggio personaggio; } Pedina;

Esercizio Dichiarare un tipo record Casella, che rappresenta una casella della scacchiera, ed è un record di due campi: colore (il colore della casella, di tipo Colore) e pezzo, un riferimento ad una variabile di tipo Pedina (il riferimento sarà NULL se la casella non contiene nessuna pedina, altrimenti conterrà l indirizzo di una variabile di tipo Pedina). typedef struct { Colore colore; Pedina *pezzo; } Casella;

Esercizio Dichiarare il tipo Scacchiera, i cui elementi sono tabelle bidimensionali di dimensione 8 per 8 aventi come tipo base il tipo Casella. Un valore di tipo Scacchiera rappresenta una possibile configurazione della scacchiera. typedef Casella Scacchiera [8][8]; Scacchiera s;

Esercizio Utilizzando i tipi definiti precedentemente, inizializzare una variabile s di tipo Scacchiera in modo che rappresenti una scacchiera in cui tutte le caselle sono nere e sia presente solo il re bianco in posizione (0,0). Scacchiera s; int i, j; Pedina *king; for (i=0; i<8; i++) for (j=0; j<8; j++) { s[ i ][ j ].colore = nero; s[ i ][ j ].pezzo = NULL; } king = (Pedina*) malloc(sizeof(pedina)); king ->colore = bianco; king ->personaggio = re; s[0][0].pezzo = king;

Esercizio Utilizzando il modello ambiente-memoria, descrivere graficamente la situazione al termine dei comandi necessari a realizzare quanto richiesto dall esercizio precedente. ambiente memoria Scacchiera s Pedina *king stack nero nero NULL nero NULL heap bianco re nero NULL...

Esercizio Utilizzando i tipi definiti negli esercizi precedenti, scrivere la definizione di una funzione che, prendendo come parametro attuale un valore s di tipo Scacchiera verifica se la torre nera è presente nella scacchiera s. La funzione restituisce 1 se la torre nera è presente, altrimenti restituisce 0.

Soluzione int cercatorrenera (Scacchiera s) { int i, j; for (i=0; i<8; i++) for (j=0; j<8; j++) if ((s[i][j].pezzo!= NULL) && ((s[i][j].pezzo)->colore == nero) && ((s[i][j].pezzo)->personaggio == torre) ) return 1; } return 0;

Allocazione dinamica typedef struct { char titolo[30]; char autore[15]; } Libro; Libro titolo Libro *lib; lib = (Libro *) malloc (sizeof(libro)); printf( Inserisci titolo senza spazi: ); scanf( %s, lib -> titolo); printf( Inserisci autore: ); scanf( %s, lib -> autore); autore

Allocazione dinamica typedef struct { char titolo[30]; char autore[15]; } Libro; Libro titolo /* altro modo di inizializzare */ Libro *lib; lib = (Libro *) malloc (sizeof(libro)); autore strcpy( lib -> titolo, La divina commedia ); strcpy( lib -> autore, Dante ); NOTA: Se inserisco Harry Potter e l ordine della fenice, si esce dai limiti!!! E se inserisco Iliade spreco spazio

Allocazione dinamica typedef struct { char *titolo; char *autore; } Libro; Libro *lib; Libro lib = (Libro *) malloc (sizeof(libro)); /* così ho allocato spazio solo per due puntatori */ titolo /* prima di inserire le stringhe per titolo e autore autore occorre allocare lo spazio necessario a contenerle */

Allocazione dinamica typedef struct { char *titolo; char *autore; } Libro; Libro titolo Libro *lib; lib = (Libro *) malloc (sizeof(libro)); lib->titolo =(char *) malloc (sizeof(char)*40); autore lib->autore =(char *) malloc (sizeof(char)*15); strcpy( lib->titolo, Harry Potter e l ordine della fenice ); strcpy( lib->autore, J.K. Rowling );

Allocazione dinamica /* così posso usare la memoria in modo efficiente: */ Libro *lib2; lib2 = (Libro *) malloc (sizeof(libro)); lib2->titolo =(char *) malloc (sizeof(char)*7); lib2->autore =(char *) malloc (sizeof(char)*6); strcpy( lib2->titolo, Iliade ); Libro strcpy( lib2->autore, Omero ); titolo I l i a d e \0 O m e r o \0 autore