Appunti di programmazione

Appunti per il corso universitario di programmazione, riferito al linguaggio ANSI C
Redatti all'università di Venezia

ARGOMENTI

STRUTTURA COMPUTER

DEFINIZIONI

TASTIERA E TIPI

AMBIENTE E MEMORIA

COMANDI

FUNZIONI E PROCEDURE

TIPI DERIVATI

PUNTATORI

STRINGHE

ARRAY DI PUNTATORI

STRUTTURE

TYPEDEF E ENUM

PUNTATORI A PROCEDURE

ALLOCAZIONE DINAMICA

LISTE

ALGORITMI

ERRORI

STRUTTURE

struct nome_struttura {

tipo_campo1 nome_campo1;

tipo_campo2 nome_campo2;

...

tipo_campoN nome_campoN;

} ;


utili per memorizzare sequenze contigue di valori non omogenei (limite degli array)

gli elementi di una struttura sono detti campi, identificati da un nome e da un tipo (fondamentale o derivato)

es.

libretto universitario:

libretto 30 linee nome esame data voto


struct Esame{

char nome[10];

char data[7];

int voto

}


“Esame” mi caratterizza triple di nome-data-voto

ARRAY

STRUTTURE

elementi omogenei

no

contiguità garantita

niente contiguità => utilizzo i selettori

non posso utilizzare gli operatori “==” ”!=” per testare il contenuto

idem

NO = (operatore di assegnamento tra 2 elementi, con 2 array devo utilizzare strcpy, con 2 strutture invece posso utilizzarlo)

SI = (si possono assegnare variabili di tipo struttura a variabili dello stesso tipo struttura)

memoria condivisa nelle chiamate a funzioni (passaggio per indirizzo)

NO


Per accedere ai campi di una variabile di tipo struttura si fa uso dell’operatore punto (.)

d.nome = “Programmazione”; NO, devo utilizzare:

strcpy(d.nome, “Programmazione”);

d.data = “100105” NO:

strcpy(d.data, “150105”);

d.voto = 18;


è possibile definire strutture di strutture: le strutture che compaiono nei campi di una struttura devono essere state definite prima della struttura chele contiene

es.

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];


posso fare affidamento all'ordine in cui ho dichiarato gli elementi della struttura solo nel momento in cui la inizializzo:


struct Data{

int giorno;

int mesi;

int anno;

}

struct Data g = {15,1,2005}


quando passo g a una funzione non sto passando un indirizzo ma un valore (a differenza degli array)


struct A{

char *p;

int p;

}a;


struct B{

char p[5];

int q;

}b;


se io voglio passare un array ad una procedura senza che i suoi valori possano essere modificati dalla procedura stessa è sufficiente che io dichiari un array come valore di tipo struttura


se per problemi di efficienza devo evitare copie degli array:


struct T2{

int *a;

};


struct T{

int a, b;

int c[10];

struct T d; //NO! (non sa quanta memoria deve allocare => allocazione ricorsiva (saturazione))

struct T *e; // posso farlo

};

vedi disegno albero

struct Nodo{

int tag;

struct Nodo *sin;

struct Nodo *des;

};


struct Nodo nodo2, nodo7, nodo1, nodo9, nodo8;


nodo9.tag = 9;

nodo9.sin = NULL;

nodo9.des = NULL;

nodo8.tag = 7;

nodo8.sin = NULL;

nodo8.des = NULL;

nodo7.tag = 7;

nodo7.sin = & nodo9;

nodo7.des= & nodo8;

nodo3.tag = 7;

nodo3.sin = & nodo7;

nodo3.des= & nodo1;

Ritorna sopra | Home page