1 Automi Cellulari (Rev )

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "1 Automi Cellulari (Rev. 2.0.3)"

Transcript

1 1 Automi Cellulari (Rev ) Gli automi cellulari sono una classe di modelli introdotti originariamente da von Neumann e Ulam nel 1948 come una semplice idealizzazione dell evoluzione delle cellule a livello cellulare. Un automa cellulare può essere pensato come un insieme di cellette il cui stato può assumere un numero finito di stati discreti. Nell ipotesi più semplice la celletta può trovarsi in soli due stati: 1 celletta viva o 0 celletta morta. Lo stato delle singole cellette cambia nel tempo a seconda dello stato delle cellette vicine. Ad esempio se ci sono troppe cellette vicine vive, la celletta muore. Questi modelli sono un tipico esempio del processo di riduzione utilizzato in fisica nell analisi di sistemi complessi. Il punto di partenza è che fenomeni complicati possano essere originati da poche leggi semplici. Sotto questa ipotesi, si cercano quindi modelli semplici che basati su queste leggi riproducano il comportamento dei sistemi più complicati. Al di là della loro rilevanza fisica e/o biologica, questi modelli sono un esempio di un sistema dinamico discreto che può essere simulato esattamente su un computer. Più in dettaglio un automa cellulare è un sistema dinamico in cui: Lo spazio è discretizzato, ossia il sistema è definito su un reticolo; Le variabili di interesse sono definite solo sui siti del reticolo e possono assumere solo una sequenza discreta di valori; Il tempo è discreto per cui l evoluzione avviene ad intervalli regolari; Lo stato delle variabili su ogni sito cambia ad ogni intervallo di tempo con una regola locale che dipende solo dallo stato del sito e dei suoi vicini. L evoluzione è parallela, ossia il valore delle variabili viene cambiato simultaneamente in tutti i siti. A causa della sua origine biologica spesso i siti di un automa cellulare sono chiamati celle, noi useremo indifferentemente il nome cella o sito. Gli automi cellulari trovano una vasta applicazioni in molti campi della fisica che vanno dalla fluidodinamica alle galassie. Automi Cellulari Unidimensionali L esempio più semplice di automa cellulare sono gli automi cellulari Booleani Unidimensionali in cui i vicini di un sito sono il sito immediatamente a sinistra e quello immediatamente a destra. Le variabili definite su ogni sito possono assumere solo due valori (automa Booleano) che per comodità, e senza perdere di generalità, vengono indicati con 0 e 1. L automa di evolve nel tempo con una regola di evoluzione definita associando ad ogni configurazione di un sito e dei suoi due primi vicini il nuovo stato del sito: 1

2 i 1 i i+1 t rule t+1 La regola di evoluzione può essere facilmente espressa mediante una tavola che riporti nella prima riga le possibili configurazioni dei tre siti al tempo t e nella seconda il corrispondente lo stato del sito centrale al tempo successivo t + 1, come mostra il seguente esempio t t I tre siti possono trovarsi in 8 configurazioni differenti per cui vi sono 2 8 = 256 regole diverse. Le differenti regole sono usualmente indicate con un codice numerico ottenuto scrivendo nella prima riga della tavola della regola i possibili stati dei tre siti ordinati da sinistra a destra in modo che corrispondano alla rappresentazione binaria dei numeri 7, 6, 5, 4, 3, 2, 1, 0 e leggendo la seconda riga come rappresentazione binaria di un numero decimale. Il numero cosìottenuto rappresenta il codice numerico della regola. Ad esempio nel caso della regola espressa dalla tavola precedente si ha = 90 per cui questa regola viene indicata come la regola 90. Dalla tavola si vede facilmente che questa regola equivale a prendere la somma modulo 2 dei siti vicini per cui questa è anche nota come la regola modulo 2, o regola xor perchè lo stato dello spin al tempo t + 1 è 1 solo e lo stato di uno solo dei suoi primi vicini è 1. Il seguente programma simula un automa cellulare Booleano unidimensionale. Il programma prende come input il codice numerico della regola, il numero di passi che si vuole effettuare ed informazioni sulla configurazione iniziale. Quest ultima può essere sia random che data. Programma: cell aut-1d.c /**************************************************************** - Descrizione : Simulazione di un Automa Cellulare Booleano unidimensionale con condizioni periodiche al bordo. - Input : Numeri di siti dell automa Codice numerico regola Passi di evoluzione temporale 2

3 Configurazione iniziale random: seed e probabilita stato 1 Configurazione iniziale data posizioni siti con stato 1 - Output : Sul file OUT_F siti con stato 1 versus tempo - Parametri : OUT_F -> File output - $Id: cell_aut -1d.c v AC *****************************************************************/ #include <s t d i o. h> # include <math. h> #include <s t d l i b. h> /* Macros */ #define OUT F "cell_aut.dat" /* sito automa cellulare */ typedef unsigned short int cell_t ; /* automa cellulare */ typedef struct unsigned int size ; /* numero sito automa */ cell_t site ; /* puntatore al primo sito */ cellular_t ; /* Prototipi */ cell_t create_site ( int n ) ; void table_rule ( cell_t rule, cell_t rule_code ) ; void bit_to_str ( char str, int nchar, int n ) ; void init_state ( cellular_t aut, unsigned long seed ) ; void update_state ( cellular_t aut, cell_t rule ) ; int main ( void ) int i ; /* indice sito automa */ int n_step ; /* # intervalli temporali */ int step ; /* contatore passi temp */ cellular_t automata ; /* automa cellulare */ cell_t rule [ 8 ] ; /* tavola regola */ cell_t rule_code ; /* codice numerico regola */ unsigned long seed ; /* seme generatore n. r. */ char line [ 8 1 ] ; /* input buffer */ FILE fp ; /* puntatore file out */ /* Automa */ automata = ( cellular_t ) malloc ( sizeof ( cellular_t ) ) ; 3

4 if ( automata == NULL ) fprintf ( stderr, " Non enough space for automata\n" ) ; return 1 ; /* Parametri Automa */ printf ( "Numero siti automa : " ) ; sscanf ( line, "%ud", &automata >size ) ; printf ( " Codice numerico regola : " ) ; sscanf ( line, "%hu", &rule_code ) ; printf ( "Passi temporali : " ) ; sscanf ( line, "%d", &n_step ) ; printf ( " Seed condizione iniziale (== 0 fissa) : " ) ; sscanf ( line, "%lu", &seed ) ; /* Tavola della regola */ table_rule ( rule, rule_code ) ; /* Variabili sul reticolo */ automata >site = create_site ( automata >size ) ; /* Inizializzazione Automa */ init_state ( automata, seed ) ; /* File di output */ fp = fopen ( OUT_F, "w" ) ; if ( fp == NULL ) fprintf ( stderr, " File open failure\n" ) ; return 1 ; /* Configurazione iniziale */ for ( i = 0 ; i < automata >size ; ++i ) if ( automata >site [ i ] ) fprintf ( fp, "%d %d\n", 0, i + 1 ) ; /* Evoluzione */ for ( step = 1 ; step <= n_step ; ++step ) update_state ( automata, rule ) ; for ( i = 0 ; i < automata >size ; ++i ) if ( automata >site [ i ] ) fprintf ( fp, "%d %d\n", step, i +1); fclose ( fp ) ; 4

5 return 0 ; /* ---- * create_site() * */ cell_t create_site ( int n ) cell_t c ; c = ( cell_t ) malloc ( n sizeof ( cell_t ) ) ; if ( c == NULL ) fprintf ( stderr, " Memory allocation failure\n" ) ; exit ( 1 ) ; return c ; /* ---- * table_rule() * */ void table_rule ( cell_t rule, cell_t rule_code ) int i ; char str [ 4 ] ; /* stampa le configurazioni */ fprintf ( stdout, "tavola regola " ) ; for ( i = 7 ; i >= 0 ; i ) bit_to_str ( str, 3, i ) ; printf ( "%s ", str ) ; printf ( "\n" ) ; fprintf ( stdout, " codice %3d ", rule_code ) ; /* Tavola */ for ( i = 0 ; i <= 7 ; ++i ) rule [ i ] = rule_code & 1 ; rule_code >>= 1 ; /* stampa la tavola */ for ( i = 7 ; i >= 0 ; i ) printf ( " %1d ", rule [ i ] ) ; printf ( "\n" ) ; return ; 5

6 /* ---- * bit_to_str() * */ void bit_to_str ( char str, int nchar, int n ) int i ; unsigned int mask ; mask = 1 << ( nchar 1 ) ; for ( i = 0 ; i < nchar ; ++i ) str [ i ] = ( ( n & mask )!= 0)? 1 : 0 ; mask >>= 1 ; str [ nchar ] = \0 ; return ; /* ---- * init_state() * */ void init_state ( cellular_t aut, unsigned long int seed ) int i ; double r ; double p_one ; char line [ 8 1 ] ; if ( seed > 0) /* configurazione random */ printf ( " Configurazione random: %d siti\n", aut >size ) ; printf ( " Probabilita valore 1: " ) ; sscanf ( line, "%lf", &p_one ) ; srand ( seed ) ; for ( i = 0 ; i < aut >size ; ++i ) r = ( double ) rand ( ) / ( RAND_MAX ) ; aut >site [ i ] = ( r < p_one )? 1 : 0 ; else /* configurazione data */ for ( i = 0 ; i < aut >size ; ++i ) aut >site [ i ] = 0 ; printf ( " Configurazione data: %d siti\n", aut >size ) ; 6

7 printf ( " Specificare posizione siti 1\ n" ) ; while ( 1 ) printf ( "Posizione ( =< 0 fine): " ) ; sscanf ( line, "%d", &i ) ; if ( i < 1 i > aut >size ) break ; if (! aut >site [ i 1]) aut >site [ i 1] = 1 ; else printf ( "Sito non valido, gia scelto\n" ) ; return ; /* ---- * update_state() * */ void update_state ( cellular_t aut, cell_t rule ) int i ; /* indice sito */ int im1, ip1 ; /* indice sito a sx e dx */ int conf_index ; /* codice num conf 3 siti */ cell_t new_site ; /* nuova configurazione aut */ /* configurazione temporanea per evoluzione parallela */ new_site = create_site ( aut >size ) ; /* Usiamo condizioni periodiche al bordo */ /* Vicino a sinistra di 0 e N-1 */ /* Vicino a destra di N-1 e 0 */ for ( i = 0 ; i < aut >size ; ++i ) im1 = ( i 1 + aut >size ) % aut >size ; ip1 = ( i+1) % aut >size ; conf_index = 4 aut >site [ im1 ] + 2 aut >site [ i ] + aut >site [ ip1 ] ; new_site [ i ] = rule [ conf_index ] ; for ( i = 0 ; i < aut >size ; ++i ) aut >site [ i ] = new_site [ i ] ; free ( new_site ) ; return ; 7

8 Il programma utilizza per l automa cellulare l oggetto automata di tipo cellular t che contiene la sia il numero di celle dell automa, campo size, che il puntatore alla prima cella dell automa, campo site. Da momento che ciascuna cella può assumere solo il valore 0 o 1 le celle sono di tipo cell t definito come unsigned short int. Le celle dell automa sono create con la funzione create site() automata >site = create_site ( automata >size ) ; che alloca lo spazio di memoria per le automata->size celle dell automa e ritorna il puntatore alla prima cella. Tavola: funzione table rule() Il programma utilizza direttamente la tavola della regola che associa a ciascuna delle 8 configurazioni di tre siti consecutivi il nuovo valore del sito centrale. Questa scelta non è necessariamente la più efficiente ma sicuramente è la più flessibile. La tavola della regola è costruita dalla funzione table rule() che trasforma il codice numerico della regola nella tavola corrispondente. Interpretando lo stato di tre celle consecutive come la rappresentazione binaria di un numero intero le 8 configurazioni possibili sono identificate univocamente dal valore di un indice i = 0,..., 7 cosicchè la tavola della regola può essere facilmente codificata con l ausilio dell array di 8 elementi rule assegnando all elemento i-esimo di rule il nuovo valore del sito centrale per la configurazione dei tre siti identificata dal valore dell indice i. for ( i = 0 ; i <= 7 ; ++i ) rule [ i ] = rule_code & 1 ; rule_code >>= 1 ; Per trasformare il codice numerico della regola nella tavola si utilizza l espressione rule_code & 1 il cui valore è 0 o 1 a seconda che il primo bit a destra, quello meno significativo, di rule code sia un bit 0 o un bit 1. Gli 8 bits della rappresentazione numerica della regola vengono letti spostando successivamente a destra i bits di rule code, rule_code >>= 1 ; Dal momento che si leggono solo i primi 8 bits non ha importanza se lo shift a destra sia logico od aritmetico. Tuttavia sebbene rule code sia un tipo intero senza segno se il codice della regola viene dato in input con un segno negativo il risultato di queste operazioni dipende dalla rappresentazione utilizzata dal computer per i numeri negativi. Ad esempio nella rappresentazione in complemento a due i primi otto bits di rule code conterranno la rappresentazione in complemento a due del codice della regola mentre nella rappresentazione in true magnitude i primi otto bits conterranno la rappresentazione binaria del modulo del codice della regola. Il fatto che rule code sia letto con la direttiva di conversione %hu sscanf ( line, "%hu", &rule_code ) ; 8

9 non vuol dire infatti che un valore negativo è convertito nell equivalente valore positivo ma solo che la rappresentazione binaria del valore negativo è interpretata come la rappresentazione binaria di un valore positivo. Di conseguenza se si vuole essere certi che per il codice della regola vengano utilizzati solo valori positivi bisogna aggiungere un controllo esplicito nel programma. In alternativa agli operatori bit-a-bit si può utilizzare for ( i = 0 ; i <= 7 ; ++i ) rule [ i ] = rule_code % 2 ; rule_code /= 2 ; Anche in questo caso valgono ovviamente considerazioni analoghe alle precedenti se il codice della regola viene dato in input con un segno negativo. Per controllare che la tavola generata corrisponda alla regola voluta la funzione table rule() ne stampa il contenuto utilizzando la funzione void bit_to_str ( char str, int nchar, int n ) che converte i primi nchar bits della rappresentazione binaria del numero intero n nella stringa puntata da str. Configurazione Iniziale: funzione init state() Il programma permette di scegliere tra una configurazione iniziale random o specificata nel caso il valore del seme seed sia uguale a zero. Nel caso di configurazione random alle celle viene assegnato il valore 1 con probabilità p one for ( i = 0 ; i < aut >size ; ++i ) r = ( double ) rand ( ) / ( RAND_MAX ) ; aut >site [ i ] = ( r < p_one )? 1 : 0 ; Se il valore di seed è 0 la configurazione iniziale deve essere data specificando la posizione delle celle con valore 1. while ( 1 ) printf ( "Posizione ( =< 0 fine): " ) ; sscanf ( line, "%d", &i ) ; if ( i < 1 i > aut >size ) break ; if (! aut >site [ i 1]) aut >site [ i 1] = 1 ; else printf ( "Sito non valido, gia scelto\n" ) ; Le celle vengono inserite utilizzando un ciclo infinito 9

10 while ( 1 )... interrotto dall istruzione break quando viene inserita una posizione non valida. viene anche controllato che le posizioni non vengano inserite più volte if (! aut >site [ i 1]) aut >site [ i 1] = 1 ; else printf ( "Sito non valido, gia scelto\n" ) ; Nel ciclo Evoluzione: funzione update state() Lo stato delle cellette deve essere aggiornato simultaneamente, in altre parole il nuovo valore delle cellette al tempo t + 1 deve essere determinato usando per tutte le cellette il valore al tempo t. Questo tipo di evoluzione viene chiamata sincrona o parallela. Il modo più semplice di realizzare una evoluzione sincrona è utilizzando un array temporaneo su cui viene memorizzato il nuovo valore delle cellette generato a partire dai valori vecchi. La funzione update state() usa a questo scopo l array temporaneo new site. cell_t new_site ;... new_site = create_site ( aut >size ) ; Quando lo stato di tutte le cellette è stato cambiato l array temporanea viene copiata su quella che contiene la configurazione dell automa for ( i = 0 ; i < aut >size ; ++i ) aut >site [ i ] = new_site [ i ] ; e lo spazio utilizzato dall array temporaneo restituito al sistema free ( new_site ) ; L uso di un array ausiliario non è efficiente da un punto di vista dell utilizzo della memoria, ed in effetti l evoluzione sincrona dell automa può essere realizzata utilizzando solo due variabili temporanee ausiliarie. La scrittura dell algoritmo diventa però più complessa e meno trasparente, e viene lasciato come esercizio. Il nuovo valore di ogni cella i viene determinato dalla la tavola della regola rule calcolando il valore dell indice della configurazione dei tre siti adiacenti: conf_index = 4 aut >site [ im1 ] + 2 aut >site [ i ] + aut >site [ ip1 ] ; dove im1 e ip1 individuano il vicino si sinistra e di destra del sito i, ed assegnando al sito i il valore ottenuto dalla tavola new_site [ i ] = rule [ conf_index ] ; 10

11 Condizioni al bordo L automa cellulare vive in uno spazio finito di L siti di conseguenza il primo ed l ultimo sito hanno un vicino in meno. Per ovviare a questo inconveniente si usano le Condizioni Periodiche al Bordo associando come vicino di sinistra del primo sito l ultimo sito, e come vicino di destra dell ultimo sito il primo sito. Geometricamente questo vuol dire che l automa cellulare vive su un anello: L 2 L 1 Nel programma questo è realizzato con le istruzioni im1 = ( i 1 + aut >size ) % aut >size ; ip1 = ( i+1) % aut >size ; come è facile convincersi considerando, ad esempio, i casi i=0, i=1 e i=aut->size-1. Questo non è l unico modo di realizzare le condizioni periodiche al bordo. Ad esempio si potrebbe eseguire il ciclo partendo dalla seconda cella sino fino alla penultima e scrivere esplicitamente la regola per la prima e l ultima cella. Questo metodo è chiaramente più efficiente di quello che richiede le operazioni di modulo, ma ha lo svantaggio che se la regola di evoluzione è piuttosto complicata, non come in questo caso, è più facile fare errori in quanto questa va replicata tre volte: una volta per le celle a ciascun estremo ed una volta per tutte le altre celle. Il numero di repliche inoltre aumenta con il numero di dimensioni del sistema, per cui se sono tre in una dimensione saranno nove in due e cosìvia. Un altro metodo è quello di utilizzare tavole dei vicini che per ogni sito contengano gli indici dei siti primi vicini, come fatto ad esempio per il Random Walk in due dimensioni. Questo metodo è piuttosto flessibile e per questo viene utilizzato quando il sistema è definito su geometrie particolari o se il numero di vicini può variare nel tempo come ad esempio nelle simulazioni di dimanica molecolare. c AC

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio I/O da tastiera + costrutti while e if Alessandra Giordani [email protected] Lunedì 2 maggio 2011 http://disi.unitn.it/~agiordani/ Ripasso funzione printf() Usata per stampare il contenuto di una

Dettagli

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

IL CONCETTO DI FILE. È illecito operare oltre la fine del file. IL CONCETTO DI FILE Un file è una astrazione fornita dal sistema operativo, il cui scopo è consentire la memorizzazione di informazioni su memoria di massa. Concettualmente, un file è una sequenza di registrazioni

Dettagli

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

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,

Dettagli

File binari e file di testo

File binari e file di testo I file File binari e file di testo distinzione tra file binari file di testo si possono usare funzioni diverse per la gestione di tipi di file diversi Programmazione Gestione dei file 2 File binari e file

Dettagli

Scrittura formattata - printf

Scrittura formattata - printf Esercizi su Input/Output con formato FormattedIO 1 Scrittura formattata - printf Funzione printf int printf ( , ) La funzione restituisce un valore intero uguale ai caratteri

Dettagli

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

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione

Dettagli

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010 Tipi di dati scalari (casting e puntatori) Alessandra Giordani [email protected] Lunedì 10 maggio 2010 http://disi.unitn.it/~agiordani/ I tipi di dati scalari I tipi aritmetici, i tipi enumerativi

Dettagli

Esercitazione 11. Liste semplici

Esercitazione 11. Liste semplici Esercitazione 11 Liste semplici Liste semplici (o lineari) Una lista semplice (o lineare) è una successione di elementi omogenei che occupano in memoria una posizione qualsiasi. Ciascun elemento contiene

Dettagli

Caratteri e stringhe

Caratteri e stringhe Caratteri e stringhe Caratteri Dato che un computer può memorizzare esclusivamente sequenze di bit, per memorizzare un carattere (e quindi testi) è necessario stabilire una convenzione che associa a un

Dettagli

C: panoramica. Violetta Lonati

C: panoramica. Violetta Lonati C: panoramica Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica AA 2009/2010 Violetta Lonati

Dettagli

Input/output in C e in C++

Input/output in C e in C++ FONDAMENTI DI INFORMATICA Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI Facoltà di Ingegneria Università degli Studi di Udine Input/output in C e in C++ 2001 Pier Luca Montessoro - Davide Pierattoni

Dettagli

Gestione dei file in C

Gestione dei file in C Gestione dei file in C Fondamenti di Informatica Che cos è un file e a cosa serve? Memoria di massa vs memoria centrale q La memoria di massa (disco fisso) è un dispositivo di memorizzazione generalmente

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002 I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002 dott.ssa Francesca A. Lisi [email protected] Sommario Generalità sui file in C I file ad accesso sequenziale I file di testo Riferimenti

Dettagli

PROGRAMMA = ALGORITMO

PROGRAMMA = ALGORITMO Corso di Laurea Scienze Prof. San. Tec., Area Tecnico-Assistenziale SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI Anno Accademico 2005-2006 Prof. Fausto Passariello Corso Integrato Metodologia della Ricerca

Dettagli

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI

SULL USO DEI CARATTERI. char x; si legge con ( %c,&x) e si stampa con ( %c,x) ma anche con ( %d,x) DUE ESEMPI SULL USO DEI CARATTERI Ricordiamo che: int x; si legge con ( %d,&x) e si stampa con ( %d,x) float x; si legge con ( %f,&x) e si stampa con ( %f,x) double x;si legge con ( %lf,&x) e si stampa con ( %f,x)

Dettagli

Il linguaggio C. Notate che...

Il linguaggio C. Notate che... Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione

Dettagli

L'Allocazione Dinamica della Memoria nel linguaggio C

L'Allocazione Dinamica della Memoria nel linguaggio C L'Allocazione Dinamica della Memoria nel linguaggio C Prof. Rio Chierego [email protected] http://www.riochierego.it/informatica.htm Sommario Questo documento tratta l'allocazione dinamica della memoria

Dettagli

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo. int a = 5; a 5 α=&a Esistono in C particolari variabili dette puntatori che possono

Dettagli

Esercizi. Filtraggio

Esercizi. Filtraggio Politecnico di Milano Esercizi Preparazione alla prima prova intermedia Filtraggio L utente inserisce un array di numeri reali non negativi (un numero negativo indica la fine della fase di inserimento)

Dettagli

Formattazione avanzata. I/O Avanzato e File. Formattazione dell output. Formattazione avanzata. Forma completa degli specificatori

Formattazione avanzata. I/O Avanzato e File. Formattazione dell output. Formattazione avanzata. Forma completa degli specificatori Formattazione avanzata Modificatori di o in output Modificatori di o in input Stream predefiniti I/O Avanzato e File 2 Formattazione dell output Formattazione avanzata L output (su schermo o su file) viene

Dettagli

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE Input/output da file Il linguaggio C non contiene istruzioni di I/O, in quanto tali operazioni vengono eseguite tramite funzioni di libreria standard. Questo approccio rende estremamente flessibile e potente

Dettagli

Qualsiasi programma in C++ segue lo schema:

Qualsiasi programma in C++ segue lo schema: Qualsiasi programma in C++ segue lo schema: #include // libreria che gestisce flusso di input e output using namespace std; // uso di librerie standard del C++ int main() { // dichiarazioni

Dettagli

Formattazione avanzata. Modificatori di formato in output Modificatori di formato in input Stream predefiniti

Formattazione avanzata. Modificatori di formato in output Modificatori di formato in input Stream predefiniti I/O Avanzato e File Formattazione avanzata Modificatori di formato in output Modificatori di formato in input Stream predefiniti 2 Formattazione avanzata Formattazione dell output L output (su schermo

Dettagli

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

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C Tipi di dati strutturati e Linguaggio C Record o strutture Il costruttore struct in C Dati strutturati Record Un record o struttura è una struttura dati ottenuta aggregando elementi di tipo diverso che

Dettagli

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

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Fondamenti di Informatica - Programma Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica - Programma Un programma è una formulazione

Dettagli

Parte 1: tipi primitivi e istruzioni C

Parte 1: tipi primitivi e istruzioni C Parte 1: tipi primitivi e istruzioni C Esercizio 1 Scrivere un programma che stampa la somma di una sequenza di N numeri inseriti dall utente. Esercizio 2 Scrivere un programma che stampa la somma di una

Dettagli