Il linguaggio C Strutture

Documenti analoghi
4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Gestione di files Motivazioni

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

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

Laboratorio di Algoritmi e Strutture Dati

4 GLI ARRAY E LE STRINGHE

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

3. Terza esercitazione autoguidata: progetto gestione voli

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

Appello di Informatica B

I puntatori e l allocazione dinamica di memoria

Problem solving elementare su dati vettoriali

Files in C++ Fondamenti di Informatica. R. Basili. a.a

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

Input/output in C e in C++

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Lezione 9: Strutture e allocazione dinamica della memoria

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

Allocazione dinamica della memoria - riepilogo

Esercitazione 4. Comandi iterativi for, while, do-while

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Introduzione a Visual Basic Lezione 2 Cicli e anomalie

public double getlato() restituisce la lunghezza del lato del quadrato che esegue il metodo.

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Laboratorio di Algoritmi e Strutture Dati

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

Fondamenti di Programmazione

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

La gestione della memoria

AE RZT QSO RKPT SQZC

INFORMATICA 1 L. Mezzalira

Sono file di caratteri, organizzati in linee. Ogni linea e` terminata da una marca di fine linea (newline, cara ttere '\n').

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

puntatori Lab. Calc. AA 2007/08 1

Esame di Informatica Generale 25 giugno 2010 Professori: Carulli, Fiorino, Mazzei

La codifica. dell informazione

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

Progettazione di Algoritmi

Compito di Fondamenti di Informatica

CARATTERI E STRINGHE Caratteri e stringhe Funzioni della libreria standard I/O Funzioni della libreria di gestione delle stringhe

Introduzione alla programmazione in C

INTRODUZIONE ALLE BASI DATI RELAZIONALI

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

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 4A di Martedì 21 Giugno 2011 tempo a disposizione 2h

Esercitazione 10. Strutture ed Enumerazioni. Allocazione dinamica di memoria

(1) - - (4) R4 = R7 * R7 (4) (2) (3) 5 - (4) rinviata perché in WAW con (3) 6 (3) e (4) ritirabili ma attendono il completamento di (2) (2) (3) (4)

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

ACCESS. Database: archivio elettronico, dotato di un programma di interfaccia che facilita la registrazione e la ricerca dei dati.

Laboratorio di Informatica L-A 1. ne: M se macchina, P se parte Nel caso di macchina seguono: L identificatore

Introduzione alla programmazione ricorsiva

Esercitazione 7. Procedure e Funzioni

Funzioni in C. Violetta Lonati

Corso di Informatica

Progetto B. Utenti. Di conseguenza si potranno avere solo utenti di questi tipi

PROGRAMMAZIONE AVANZATA JAVA E C. Massimiliano Redolfi. Lezione 7: Code, Stack, Liste PAJC. Ricerca. prof. Massimiliano Redolfi PAJC

RICERCA DI UN ELEMENTO

Vettori Algoritmi elementari di ordinamento

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.

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

Manutenzione periodica al PIANO DEI CONTI

Algoritmi e Strutture Dati

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

Linguaggio C - Funzioni

Informatica Medica C++ Informatica Medica I semestre Docenti: Fabio Solari e Manuela Chessa. Sviluppo di un applicazione eseguibile

Il file system. Le caratteristiche di file, direttorio e partizione sono del tutto indipendenti dalla natura e dal tipo di dispositivo utilizzato.

Corso di Informatica Medica Esercitazione 1I ! Alessandro A. Nacci - alessandronacci.com

Breve riepilogo della puntata precedente:

Layout Editor e Stampa

GUIDA STUDENTE PIATTAFORMA ELEARNING MOODLE

Tipi di Dato Ricorsivi

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

Fondamenti di Informatica T. Linguaggio C: i puntatori

Lezione 4. Sommario. L artimetica binaria: I numeri relativi e frazionari. I numeri relativi I numeri frazionari

Manuale utente Soggetto Promotore Erogatore Politiche Attive

Gestione dei file. Linguaggio ANSI C Input/Output - 13

DOTT. ING. LEONARDO RIGUTINI DIPARTIMENTO INGEGNERIA DELL INFORMAZIONE UNIVERSITÀ DI SIENA VIA ROMA SIENA UFF

XML e Windows Phone. Semplice tutorial per l'utilizzo di documenti e dati XML in un'app per Windows Phone.

3.5.1 PREPARAZ1ONE I documenti che si possono creare con la stampa unione sono: lettere, messaggi di posta elettronica, o etichette.

Sistemi Operativi (M. Cesati)

Ingegneria del Software

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 L. Mezzalira

per immagini guida avanzata Modificare il contenuto del foglio di lavoro Geometra Luigi Amato Guida Avanzata per immagini Excel

Visualizzare o modificare il codice sorgente del documento (per utenti avanzati,linguaggio HTML).

GeCoTi WEB. Modulo Gestione commesse

PROGRAMMI LINGUAGGIO C

Fondamenti di Informatica 2

LISTE, INSIEMI, ALBERI E RICORSIONE

Java Native Interface Appunti

Funzioni. Corso di Fondamenti di Informatica

Sottoprogrammi: astrazione procedurale

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Manuale Sito Videotrend

Esempio: Array di struct

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

dall argomento argomento della malloc()

Transcript:

Il linguaggio C Strutture Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/

Linguaggio C -- Strutture 2

Ringraziamenti Questi lucidi si basano su materiale fornito dal prof. Mirko Viroli, Università di Bologna Linguaggio C -- Strutture 3

Nuovi Tipi di Dato in C Ricordiamo cos'è un tipo di dato: nome: int, float, int[], int *,... valori: associati a quel tipo di dato int -2147483648,, 2147483647 char 'a', 'b', 'A', 'B',..... operatori: funzionalità per manipolare i valori Operatori binari, es. +, -, *, /, %, &,, ^ Operatori unari, es. +,-,~ Molti linguaggi consentono di definire i propri tipi di dato struct e union nel linguaggio C Linguaggio C -- Strutture 4

Nuovi tipi in C: struct Le strutture (struct) sono costituite da un insieme di campi Ogni campo ha un nome e un tipo Es: struct complex ha i campi re di tipo double (parte reale) im di tipo double (parte complessa) /* complex.c */ #include <stdio.h> struct complex double re; double im; ; int main( void ) struct complex v1, v2, s; v1.re = 1.0; v1.im = -3.0; v2.re = 2.0; v2.im = 2.0; s.re = v1.re + v2.re; s.im = v1.im + v2.im; printf("%f + (%fi)\n", s.re, s.im); return 0; Linguaggio C -- Strutture 5

Dichiarare variabili di tipo struttura Dichiarazione senza inizializzazione struct complex val; Dichiarazione con inizializzazione struct complex val = 1.0, 2.0; Attenzione: ANSI C richiede che i valori dell'inizializzazione siano letterali #include <stdio.h> struct complex double re, im; ; int main( void ) struct complex v1 = 1.0, -3.0, v2 = 2.0, 2.0, s; s.re = v1.re + v2.re; s.im = v1.im + v2.im; printf("%f + (%fi)\n", s.re, s.im); return 0; Linguaggio C -- Strutture 6

Strutture come parametri di funzioni /* somma-complex.c: somma due numeri complessi */ #include <stdio.h> struct complex double re, im; ; struct complex somma(struct complex v1, struct complex v2) struct complex r; r.re = v1.re + v2.re; r.im = v1.im + v2.im; return r; int main( void ) struct complex a = 1.0, 2.0; struct complex b = -1.0, 3.0; struct complex s = somma(a, b); printf("%f+(%fi)\n", s.re, s.im); return 0; Linguaggio C -- Strutture 7

Puntatori a strutture /* incr-complex.c: passaggio di puntatori a strutture */ #include <stdio.h> struct complex double re, im; ; void incr(struct complex *v) (*v).re = (*v).re + 1.0; (*v).im = (*v).im + 1.0; int main( void ) struct complex a = 1.0, -3.0; incr( &a ); printf("%f+(%fi)\n", a.re, a.im); return 0; Linguaggio C -- Strutture 8

Puntatori a strutture /* incr-complex.c: passaggio di puntatori a strutture */ #include <stdio.h> struct complex double re, im; ; void incr(struct complex *v) (*v).re = (*v).re + 1.0; (*v).im = (*v).im + 1.0; 1.0-3.0 a.re a.im int main( void ) struct complex a = 1.0, -3.0; incr( &a ); printf("%f+(%fi)\n", a.re, a.im); return 0; Memoria Linguaggio C -- Strutture 9

Puntatori a strutture /* incr-complex.c: passaggio di puntatori a strutture */ #include <stdio.h> struct complex double re, im; ; 1.0-3.0 a.re a.im void incr(struct complex *v) (*v).re = (*v).re + 1.0; (*v).im = (*v).im + 1.0; v int main( void ) struct complex a = 1.0, -3.0; incr( &a ); printf("%f+(%fi)\n", a.re, a.im); return 0; Memoria Linguaggio C -- Strutture 10

Puntatori a strutture /* incr-complex.c: passaggio di puntatori a strutture */ #include <stdio.h> struct complex double re, im; ; 2.0-2.0 a.re a.im void incr(struct complex *v) (*v).re = (*v).re + 1.0; (*v).im = (*v).im + 1.0; v int main( void ) struct complex a = 1.0, -3.0; incr( &a ); printf("%f+(%fi)\n", a.re, a.im); return 0; Memoria Linguaggio C -- Strutture 11

Allocare strutture con malloc() /* struct-malloc.c : allocare strutture con malloc() */ #include <stdio.h> #include <stdlib.h> /* per usare malloc() */ struct complex double re, im; ; void incr(struct complex *v) (*v).re = (*v).re + 1.0; (*v).im = (*v).im + 1.0; int main( void ) struct complex *pa; pa = (struct complex*)malloc(sizeof(struct complex)); (*pa).re = 1.0; (*pa).im = -2.0; incr( pa ); printf("%f+(%fi)\n", (*pa).re, (*pa).im); free(pa); return 0; Linguaggio C -- Strutture 12

Note In C esiste una notazione più pratica per accedere ai campi di un puntatore a struttura Al posto di (*pa).re si può scrivere pa->re Linguaggio C -- Strutture 13

Allocare strutture con malloc() /* struct-malloc.c : allocare strutture con malloc() */ #include <stdio.h> #include <stdlib.h> /* per usare malloc() */ struct complex double re, im; ; void incr(struct complex *v) v->re = v->re + 1.0; v->im = v->im + 1.0; int main( void ) struct complex *pa; pa = (struct complex*)malloc(sizeof(struct complex)); pa->re = 1.0; pa->im = -2.0; incr( a ); printf("%f+(%fi)\n", pa->re, pa->im); free(pa); return 0; Linguaggio C -- Strutture 14

Varianti di dichiarazione/uso /* varianti-struct.c */ #include <stdio.h> #include <stdlib.h> int main( void ) struct complex double re, im; *c1, *c2; Dichiarazione locale di struct complex: il tipo è visibile solo dentro il blocco in cui è dichiarato Dichiarazione contestuale di variabili (puntatori) struct complex; c1 = (struct complex *)malloc(sizeof(struct complex)); c1->re=1.0; c1->im=2.0; c2 = (struct complex *)malloc(sizeof(struct complex)); c2->re=2.0; c2->im=-7.0; free(c1); free(c2); return 0; Linguaggio C -- Strutture 15

Array di strutture /* array-struct.c : Esempio di array di strutture */ #include <stdio.h> #include <stdlib.h> struct complex double re, im; ; #define N 5 0.000000+(0.000000i) 1.000000+(1.000000i) 2.000000+(2.000000i) int main( void ) 3.000000+(3.000000i) 4.000000+(4.000000i) struct complex v[n]; int i; for (i=0; i<n; i++) v[i].re = i; v[i].im = i; printf("%f+(%fi)\n", v[i].re, v[i].im); return 0; Linguaggio C -- Strutture 16

Array di strutture Dichiarazione senza inizializzazione struct complex v[3]; Dichiarazione con inizializzazione struct complex v[3]= 1.0,1.0, 1.0,-3.0, 7.5,3.2 ; oppure omettendo la dimensione dell'array struct complex v[] = 1.0,1.0, 1.0,-3.0, 7.5,3.2 ; Accesso agli elementi v[2].re = 0.2; Linguaggio C -- Strutture 17

Esempio Persona /* struct-persona.c */ #include <stdio.h> struct persona char *nome; int eta; ; struct persona crea(char *n, int a) struct persona p; p.nome = n; p.eta = a; return p; void stampa(struct persona *p) printf("nome = %s, Eta' = %d\n", p->nome, p->eta); int main(void) struct persona p1 = crea("mario", 50); struct persona p2 = crea("luca", 30); stampa(&p1); stampa(&p2); return 0; Linguaggio C -- Strutture 18

Strutture con strutture E' possibile definire strutture i cui membri siano a loro volta strutture /* struct-intervallo.c */ struct orario int hh, mm, ss; ; struct intervallo struct orario inizio; struct orario fine; ; struct intervallo i1 = 10,5,0, 12,20,30 ; struct intervallo i2; i2.inizio.hh = 10; i2.inizio.mm = 5; i2.inizio.ss = 0; i2.fine.hh = 12; i2.fine.mm = 20; i2.fine.ss = 30; Linguaggio C -- Strutture 19

Le Liste Una lista è una sequenza (anche vuota) di nodi Ogni nodo contiene Una informazione (es., un intero) Un puntatore al nodo successivo, oppure a NULL se non c'è nodo successivo Esempio: lista L che contiene i valori (1, 1, 2, 3, 5, 8) L 1 1 2 3 5 8 NULL Linguaggio C -- Strutture 20

Array vs Liste Array Lunghezza fissa definita all'atto della definizione o allocazione con malloc() E' possibile l'accesso diretto all'i-esimo elemento Non è possibile inserire o cancellare un elemento Liste Lunghezza variabile: è possibile aggiungere o rimuovere nodi dalla lista a piacimento In generale non è possibile l'accesso diretto all'i-esimo elemento E' possibile inserire o cancellare nodi dalla lista in qualunque posizione Linguaggio C -- Strutture 21

Liste in C #include <stdio.h> #include <stdlib.h> struct list int val; struct list *next; ; struct list val next struct list *list_create(int v, struct list *n) struct list *r=(struct list *)malloc(sizeof(struct list)); r->val = v; r->next = n; return r; Linguaggio C -- Strutture 22

Uso delle liste Usando solo la funzione list_create(), come facciamo a creare una lista L come la seguente? L 15 5 2017 NULL Linguaggio C -- Strutture 23

Uso delle liste Usando solo la funzione list_create(), come facciamo a creare una lista L come la seguente? L 15 5 2017 NULL struct list *L = NULL; L = list_create(2017, L); /* lista 2017 NULL */ L = list_create(5, L); /* lista 5 2017 NULL */ L = list_create(15, L); /* lista 15 5 2017 NULL */ Linguaggio C -- Strutture 24

Uso delle liste L 15 5 2017 NULL /* Creazione della lista L di elementi (15, 5, 2017) */ struct list *L = NULL; L = list_create(2017, L); L = list_create(5, L); L = list_create(15, L); /* Stampa il secondo elemento di L */ printf("%d\n", L->next->val); /* Modifica del terzo elemento in L; diventa (15, 5, 11) */ L->next->next->val = 11; /* Aggiunta di 25 fra il primo e secondo elemento L diventa (15, 25, 5, 2017) */ L->next = list_create(25, L->next); Linguaggio C -- Strutture 25

L Uso delle liste 15 5 2017 NULL Realizziamo un algoritmo per stampare il contenuto di una lista L (anche vuota) Iniziamo con uno schema ad alto livello struct list *p = "indirizzo di memoria del primo nodo di L" while ("p non è NULL") "stampa il contenuto del nodo puntato da p" p = "nodo successivo" Linguaggio C -- Strutture 26

L Uso delle liste 15 5 2017 NULL Realizziamo un algoritmo per stampare il contenuto di una lista L (anche vuota) Raffinamento struct list *p = L; while (p!= NULL) printf("%d ", p->val); p = p->next; Linguaggio C -- Strutture 27

Altre funzioni che operano su liste int is_empty(struct list *L) ritorna 1 se L è la lista vuota (L è NULL), 0 altrimenti int list_length(struct list *L) ritorna la lunghezza (numero di nodi) di L; la lista vuota ha lunghezza 0 void list_destroy(struct list *L) distrugge (libera la memoria con free()) tutti i nodi della lista L dopo questa operazione il puntatore L non deve essere usato perché punta a memoria non più riservata void list_print(struct list *L) Stampa a video il contenuto di L Linguaggio C -- Strutture 28

Altre funzioni che operano su liste struct list *nth_element(struct list *L, int n) restituisce il puntatore all'n-esimo nodo della lista (n=0 è il primo nodo della lista, n=1 è il secondo,...) restituisce NULL se la lista ha meno di (n - 1) nodi struct list *list_from_array(int v[], int n) crea e restituisce il puntatore ad una nuova lista con n nodi, in cui il nodo i-esimo contiene il valore v[i] (il nodo 0 è il primo nodo della lista) struct list *list_concat(struct list *L1, struct list *L2) restituisce un puntatore alla lista contenente tutti gli elementi di L1 seguiti dagli elementi di L2 dopo questa chiamata,l1 e L2 non andrebbero più usati Linguaggio C -- Strutture 29

Alcune implementazioni...il resto sarà l'oggetto del prossimo laboratorio int list_length(struct list *L) if ( NULL == L ) return 0; else return (1 + list_length(l->next)); void list_destroy(struct list *L) if ( L!= NULL ) list_destroy(l->next); L->next = NULL; /* non necessario... */ free(l); Linguaggio C -- Strutture 30

Alcuni suggerimenti In molti casi esiste una soluzione ricorsiva molto semplice (più semplice della corrispondente soluzione iterativa) Esempio: list_concat(l1, L2) Se L1 è la lista vuota, il risultato è L2; Altrimenti, se L2 è la lista vuota, il risultato è L1; Altrimenti, il risultato è il primo nodo di L1, seguito dal resto di L1 concatenato con L2 Linguaggio C -- Strutture 31