FONDAMENTI di INFORMATICA - Intranet...
-
Upload
nguyendung -
Category
Documents
-
view
213 -
download
0
Transcript of FONDAMENTI di INFORMATICA - Intranet...
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
FONDAMENTI di INFORMATICA Prof. Lorenzo Mezzalira
Appunti del corso
5 Linguaggio C Costrutti di controllo e strutture dati Indice 1. Istruzioni di selezione 2. I cicli 3. Array 4. Record 5. Puntatori 6. Funzioni di I/O
Linguaggio C – Costrutti di controllo e strutture dati ... 1
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTI DI CONTROLLO DELL’ESECUZIONE ISTRUZIONI DEL LINGUAGGIO C
Per tipologia
• istruzioni di assegnamento • istruzioni composte • costrutti di (modifica del flusso di) controllo (istruzioni di
selezione, istruzioni cicliche) • “istruzioni” di ingresso e uscita • chiamate di sottoprogrammi (funzioni) ISTRUZIONI COMPOSTE (BLOCCO DI ISTRUZIONI) Una successione di istruzioni assume l’”identità” di blocco quando è racchiusa tra parentesi graffe.
{ istr1; istr2; istr3; …… }
Blocco di istruzioni
I blocchi di istruzioni possono essere a loro volta annidati, cioè inseriti all’interno di altri blocchi, consentendo così di impostare una struttura che rispecchia i livelli di astrazione.
Nel processo di sviluppo di un programma per raffinamenti successivi si “espandono” man mano i blocchi più interni (annidati) che corrispondono ai dettagli dei livelli di astrazione inferiori. Sintatticamente un blocco può essere collocato dovunque sia lecito scrivere un’istruzione.
Linguaggio C – Costrutti di controllo e strutture dati ... 2
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ISTRUZIONI CONDIZIONALI DI SELEZIONE Consentono di prescrivere l’esecuzione, o meno, di diverse parti di programma, sulla base del verificarsi delle condizioni indicate da espressioni logiche. SELEZIONE SEMPLICE Sintassi
condizionesi no
blocco
istruzione
if (<condizione>) { <blocco> } <istruzione>
SELEZIONE DOPPIA Sintassi
if (<condizione>) {
condizionesi no
blocco_1 blocco_2
istruzione
<blocco_1> } else { <blocco_2> } <istruzione>
Linguaggio C – Costrutti di controllo e strutture dati ... 3
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ISTRUZIONI IF ANNIDATE Es.1
if (<condizione1>) if (<condizione2>)
istr1; else
istr2; istr3;
Nota: in Es.1 • istr1 viene eseguita se condizione1 è vera e condizione2 è
vera. • Istr2 viene eseguita se condizione1 è vera e condizione 2 è
falsa • Istr3 viene eseguita sempre else viene automaticamente associato all’ultimo if “aperto” quindi se else va associato ad un altro if occorre indicarlo esplicitamente con parentesi graffe. Es. 2
if (<condizione1>) { if (<condizione2>)
istr1; } else /* condizione1 falsa */ istr2; istr3;
Nota: in Es.2 • istr1 viene eseguita se condizione1 è vera e condizione2 è
vera. • Istr2 viene eseguita se condizione1 è falsa • Istr3 viene eseguita sempre
Linguaggio C – Costrutti di controllo e strutture dati ... 4
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTI CICLICI Costituiscono un modo per indicare che un blocco di istruzioni va rieseguito ciclicamente. I cicli costituiscono costrutti estremamente potenti generali e compatti. • Possono essere usati per eseguire determinate operazioni
anche su un elevato numero di dati omogenei, aggregati in array (o in liste).
• Possono essere utilizzati per il calcolo di un risultato per approssimazioni successive.
• Possono essere usati per realizzare algoritmi di ricerca di una soluzione ottima nello spazio delle soluzioni di un problema.
Elementi essenziali per un costrutto di iterazione (ciclico): • inizializzazione
le variabili interessate, ed in particolare quelle usate nell’espressione della condizione, devono essere inizializzate prima della valutazione della condizione.
• test deve essere prevista una fase di valutazione della condizione (di permanenza nel ciclo) che determini la ripetizione o la terminazione del ciclo
• modifica almeno una delle variabili della condizione deve essere modificata all’interno del ciclo, in modo che prima o poi la condizione di ripetizione diventi falsa (terminazione).
Linguaggio C – Costrutti di controllo e strutture dati ... 5
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
CICLO A CONDIZIONE INIZIALE
condizione
si
no
blocco
istruzione
Sintassi
while (<condizione>) { <blocco> } <istruzione>
Non viene eseguito neppure una volta se all’inizio la condizione vale FALSE. Le inizializzazioni devono essere effettuate nelle istruzioni precedenti il ciclo. CICLO A CONDIZIONE FINALE
condizionesi
no
blocco
istruzione
Sintassi
do { blocco } while (<condizione>); <istruzione>
Viene sempre eseguito almeno una volta. Le inizializzazioni possono essere eventualmente effettuate all’interno del blocco del ciclo.
Linguaggio C – Costrutti di controllo e strutture dati ... 6
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ESEMPIO 5 - CALCOLO DELLA MEDIA DI UNA SUCCESSIONE DI VALORI POSITIVI TERMINATI DAL VALORE 0 (“TAPPO”) (con ciclo a condizione finale)
#include <stdio.h> void main () { int num, numel, somma; float media; numel=0; /* inizializzazioni */ somma=0; do { printf("introdurre un numero "); scanf("%d",&num); numel++; /* conto anche il “tappo” */ somma=somma+num; }while(num!=0); numel--; /* avevo contato anche il “tappo” */ if(numel>0) /* verifica importante */ { media=(float)somma/numel; printf("la media di %d elementi vale %f\n", numel, media); } else { printf("la media di 0 elementi non esiste\n"); } }
Linguaggio C – Costrutti di controllo e strutture dati ... 7
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ESEMPIO6 - CALCOLO DELLA MEDIA DI UNA SUCCESSIONE DI VALORI POSITIVI TERMINATI DAL VALORE 0 (con ciclo a condizione iniziale)
#include <stdio.h> void main () {int num, numel, somma; float media; numel=0; somma=0; printf("introdurre un numero "); scanf("%d",&num); /* completa inizializz. */ while(num!=0) { numel++; /* conto solo elem. Validi */ somma=somma+num; printf("introdurre un numero "); scanf("%d",&num); } if(numel>0) { media=(float)somma/numel; printf("la media di %d elementi vale %f\n", numel,media); } else { printf("la media di 0 elementi non esiste\n"); } }
Linguaggio C – Costrutti di controllo e strutture dati ... 8
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
CICLO A CONTEGGIO: CICLO FOR Se si ha un ciclo come il seguente: var_cont = val_iniz; /* inizializzazione */ while (var_cont <= val_fin) /* test */ { <istruzioni del corpo del ciclo> var_cont = var_cont +1; /* modifica */ } Il linguaggio C prevede anche un costrutto di ciclo che racchiude inizializzazione, test e modifica di una variabile. for (espr1; espr2; espr3)
espr2
si
no
blocco
istruzione
espr1
espr3
{ <istr del ciclo> } <istruzione> espressione1: deve definire il valore iniziale della variabile di
conteggio espressione2: deve definire la condizione sul valore finale della
variabile di conteggio espressione3: deve definire la modifica della variabile di
conteggio for (var_cont=val_iniz; var_cont<=val_fin;var_cont++) { <istruzioni del corpo del ciclo> } <istruzione>
Linguaggio C – Costrutti di controllo e strutture dati ... 9
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
TIPI STRUTTURATI DEL C - COSTRUTTORE ARRAY - 1 Consente di dichiarare variabili che tramite un unico identificatore rappresentano un aggregato ordinato di informazioni omogenee. Costruttore array [ ] • un array è definito come una sequenza di lunghezza fissata di
elementi omogenei (cioè dello stesso tipo) • ogni elemento è individuato tramite un indice che rappresenta
la sua posizione nell’array • un array rappresenta in modo implicito un ordinamento tra gli
elementi, legato alla loro posizione (indice) • se DIM è la dimensione dell’array (DIM costante intera),
l’indice degli elementi assume valori da 0 a DIM -1 Dichiarazione di una variabile array: sintassi C tipo_elem nome_array [DIM] DIM
è un’espressione costante di tipo intero che definisce la dimensione dell’array, cioè quanti elementi può contenere.
tipo_elem è il tipo degli elementi (predefinito o definito dall’utente, semplice o strutturato)
nome_array è l’identificatore (nome) di una variabile “collettiva” (di tipo) array costituita da DIM elementi ognuno di tipo tipo_elem
Linguaggio C – Costrutti di controllo e strutture dati ... 10
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE ARRAY - 2 Accesso ai singoli elementi: tramite indice (operazione legata al costruttore di tipo) nome_array[i]: con questa notazione si individua il valore dell’elemento in posizione i i designa un valore (che rappresenta l’indice, cioè la posizione, dell’elemento nell’array) di tipo integral i cui valori significativi per accedere agli elementi dell’array sono da 0 a DIM –1. L’indice può essere espresso con una variabile o un’espressione Operatori utilizzabili per i singoli elementi di un array:
tutti gli operatori “leciti” per il tipo degli elementi Spazio di memoria allocato per una variabile di tipo array (numero di byte)
DIM * sizeof(tipo_elem) lo spazio di memoria viene allocato ad indirizzi fisici contigui Rappresentazione in memoria di un array: int vett[4] vett[0] valore di vett[0] vett[1] valore di vett[1] vett[2] valore di vett[2] vett[3] valore di vett[3]
Linguaggio C – Costrutti di controllo e strutture dati ... 11
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE ARRAY - 3 La dichiarazione di una variabile di tipo array
• alloca lo spazio di memoria sufficiente a contenere la variabile • associa al nome della variabile (nome_array) l’indirizzo del
primo byte che contiene il primo elemento dell’array (quello di indice pari a 0)
• il valore associato a nome_array è quindi un indirizzo ed è costante
• a nome_array, oltre all’indirizzo è associata anche l’informazione sul tipo degli elementi che lo compongono e, in particolare, sulla quantità di memoria allocata per quel tipo. Questa “associazione” viene fatta dal compilatore in fase di traduzione del programma.
int vett[30]; Aritmetica degli indirizzi per gli array: Le coppie di notazioni seguenti sono equivalenti
vett e &vett[0] vett + 1 e &vett[1] vett + k e &vett[k]
cioè definiscono lo stesso indirizzo di memoria, e
• l’espressione (vett + i) - (vett + j) se i > j fornisce un valore intero pari al numero di elementi tra j (escluso) e i (compreso)
Linguaggio C – Costrutti di controllo e strutture dati ... 12
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE ARRAY USO DEGLI ARRAY Gli array sono usati per contenere elenchi ordinati di informazioni omogenee. La dimensione di un array viene stabilita al momento della compilazione: durante l’esecuzione del programma non può essere modificata. La dimensione va quindi fissata in base al massimo numero di elementi che potranno essere contenuti. E’ molto importante adottare tecniche per indicare quanti elementi significativi sono contenuti nell’array in ogni momento dell’esecuzione del programma. Uso di una variabile di servizio; ad es. int numelem
Si mantiene il valore della variabile in modo che rispecchi sempre il numero di elementi significativi, che dovranno sempre essere i primi nell’ordine.
Uso di valori indicatori di “non significativo” (se possibile)
Se esiste un valore che nel particolare problema non è significativo (ad es. –1 in un elenco di voti) esso può essere assegnato agli elementi “vuoti”, rendendoli così intrinsecamente riconoscibili.
Linguaggio C – Costrutti di controllo e strutture dati ... 13
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ARRAY DI ARRAY - 1 L’elemento di un array può essere a sua volta un array. La dichiarazione int matrice[Dim2][Dim1]; • definisce la variabile matrice come un array di Dim2
elementi, dove ciascun elemento è un array di Dim1 elementi interi.
• alloca spazio in memoria (in locazioni fisiche contigue) adatto a contenere Dim1 x Dim2 interi.
• il nome dell’array (matrice) equivale a &matrice[0][0] (e a matrice[0]) e rappresenta l’indirizzo del primo byte di un array di Dim1 interi, che è anche l’indirizzo del primo byte allocato per la variabile matrice
Linguaggio C – Costrutti di controllo e strutture dati ... 14
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ARRAY DI ARRAY - 2 Rappresentazione in memoria di un array a 2 dimensioni: mappa di memorizzazione int matrice [2][3]; matrice[0] valore di matrice[0][0] valore di matrice[0][1] valore di matrice[0][2] matrice[1] valore di matrice[1][0] valore di matrice[1][1] valore di matrice[1][2] Accesso ai singoli elementi matrice[i][j] denota il valore del (j-1)-mo elemento
dell’(i-1)-mo array di interi Simili a righe (i) e colonne (j) e quindi nella mappa di memorizzazione varia più velocemente l’indice più a destra Le notazioni &matrice[i][j] e &matrice[0][0] + Dim1*i + j definiscono entrambe l’indirizzo del primo byte dell’elemento (i,j)
Linguaggio C – Costrutti di controllo e strutture dati ... 15
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
TIPI STRUTTURATI DEL C - COSTRUTTORE STRUCT - 1 Consente di dichiarare variabili che tramite un unico identificatore rappresentano un aggregato di informazioni non omogenee (detto anche record). Costruttore struct {} • una struttura (record) è definita come un insieme prefissato di
campi (elementi) non omogenei • ogni campo è dotato di nome e di tipo Dichiarazione di una variabile di tipo record SINTASSI struct { tipo_campo1 nome_campo1; tipo_campo2 nome_campo2; tipo_campo3 nome_campo3; } nome_var; SEMANTICA • nome_var rappresenta il valore della variabile (valore visto
come aggregato di valori di tutti i suoi campi) • &nome_var rappresenta l’indirizzo del primo byte allocato per
la variabile
Linguaggio C – Costrutti di controllo e strutture dati ... 16
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE STRUCT - 2 Accesso ai campi della struttura: sintassi C (operazione legata al costruttore di tipo): notazione puntata nome_var. nome_campo1 struct { char cognome[30]; char nome[30]; int matricola; int votiesa[29]; } studente; studente.matricola studente.votiesa[3] studente.cognome[0] Operatori utilizzabili per i singoli campi:
tutti gli operatori “leciti” per il tipo del campo Operazioni “globali”: l’assegnamento globale è lecito typedef struct { char cognome[30]; char nome[30]; int matricola; int votiesa[29]; } STUDENTE; STUDENTE studente1,studente2; studente2=studente1; // assegnamento lecito
Linguaggio C – Costrutti di controllo e strutture dati ... 17
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
Spazio di memoria allocato per una variabile di tipo struct
• adeguato a contenere i valori dei suoi campi • lo spazio di memoria viene allocato ad indirizzi fisici non sempre
contigui (dipende dal particolare compilatore)
Rappresentazione in memoria di una struttura studente.cognome Valore di studente.cognome[0] ------------ ------------ Valore di studente.cognome[29] studente.nome Valore di studente.nome[0] ------------ ------------ Valore di studente.nome[29] studente.matricola Valore di studente.matricola studente.votiesa Valore di studente.votiesa[0] ------------ ------------ Valore di studente.votiesa[28]
Uso di variabili aggregate STRUCT Nei problemi applicativi si presenta frequentemente il caso di dover trattare entità corredate da diversi attributi: • Persone dotate di nome, data di nascita, codice fiscale,
residenza …. • Automobili dotate di targa, modello, proprietario, Km
percorsi ….. • Caldaie dotate di temperatura, pressione, portata d’acqua • Ecc., ecc. ….. E’ molto importante che l’appartenenza di informazioni ad una stessa entità sia evidenziata adottando per tale entità una variabile aggregata struct, i cui campi costituiscono gli attributi rilevanti per il problema da trattare.
Linguaggio C – Costrutti di controllo e strutture dati ... 18
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ARRAY DI STRUTTURE Gli elementi di un array possono essere delle strutture, tipicamente per rappresentare elenchi di informazioni articolate. #define N 1000 typedef struct { char cognome[30]; char nome[30]; int matricola; int votiesa[29]; } STUDENTE; Dichiarazioni di array della struttura STUDENTE: STUDENTE iscrittiinf[N], iscrittieln[N], iscrittimec[N]; Esempi di accesso a singole informazioni iscrittiinf[20].matricola
è la matricola del ventunesimo allievo informatico
iscrittimec[299].votiesa[20] è il voto del ventunesimo esimo esame del trecentesimo allievo meccanico
Linguaggio C – Costrutti di controllo e strutture dati ... 19
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE PUNTATORE - 1 (costruttore * ). Consente di dichiarare delle variabili i cui valori sono gli indirizzi di memoria di variabili di un certo tipo. Dichiarazione di una variabile puntatore: sintassi C
<tipo_dato> *P; Semantica: P è una variabile che può assumere come valori gli indirizzi di un dato (una variabile) di tipo tipo_dato. Si dice che P punta ad una variabile di tipo tipo_dato.
La dichiarazione di una variabile puntatore: • alloca lo spazio di memoria necessario a contenere i valori di P
(spazio necessario a contenere l’indirizzo di una variabile di tipo tipo_dato)
• a P è associata l’informazione su tipo_dato. Questa associazione (così come negli array) viene fatta dal compilatore in fase di traduzione del programma.
Rappresentazione in memoria P &P valore di P = indirizzo area di
memoria adatta a contenere un valore di tipo tipo_dato
Linguaggio C – Costrutti di controllo e strutture dati ... 20
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE PUNTATORE - 2 typedef int *Punt; Punt P; /* puntatore a intero */ int x; ASSEGNAMENTO (e inizializzazione) P=&x; /* adesso p punta alla variabile x */
Significato: il valore di P è l’indirizzo di memoria associato alla variabile x (P punta a x)
Attenzione: un puntatore, anche prima dell’inizializzazione, ha un valore e cioè punta (in modo non significativo) ad una qualche parola di memoria. ASSEGNAMENTO DEL VALORE SPECIALE NULL (NULL è un identificatore riservato del C)
P=NULL;
Significato: il valore di P è un particolare indirizzo che corrisponde ad una parola di memoria “riservata”. Si intende che P non punta ad alcuna informazione significativa: si dice che “P non punta ad alcunchè”. Rappresentazione tipica delle variabili puntatore P
Indirizzo valori di tipo <tipo_dato>
P
P=NULL; NULL
Linguaggio C – Costrutti di controllo e strutture dati ... 21
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE PUNTATORE - 3 ACCESSO ALLA VARIABILE PUNTATA (operazione di dereferenziazione) typedef int *Punt; Punt P; /* puntatore a intero */ int x, y;
P=&y; x=3; *P=x; /* qui y vale 3 */
P=&y; y=5; x=*P; /* qui x vale 5 */
PUNTATORI E TIPI PUNTATI (COMPATIBILITÀ TRA TIPI) Ad ogni puntatore è associata l’informazione del tipo puntato. int *P; /*puntatore a intero*/ float *Q; /*puntatore a float*/ int x; float v; P=&x; Q=P; WARNING Q=&v; v=13.5; *P=*Q; WARNING
Linguaggio C – Costrutti di controllo e strutture dati ... 22
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE PUNTATORE - 4 Operatore -> Dereferenziazione per accesso a elementi di strutture typedef struct { char cognome[30]; char nome[30]; data data_di_nascita; char codice_fiscale; } dati_anagrafici; dati_anagrafici *P; dichiara il puntatore dati_anagrafici persona; dichiara una variabile P = &persona
Accesso ai campi della struttura (*P).data_di_nascita.giorno (*P).cognome[0]
le notazioni seguenti (con l’operatore -> ) sono equivalenti, e più eleganti ed usate: P->data_di_nascita.giorno P->cognome[0]
Linguaggio C – Costrutti di controllo e strutture dati ... 23
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
COSTRUTTORE PUNTATORE - 5 OPERAZIONI LECITE per le variabili puntatore • assegnamento (operatore &, tra puntatori, NULL) • dereferenziazione: contenuto della parola di memoria puntata • confronto tra puntatori • operazioni aritmetiche (aritmetica dei puntatori) USO DELLE VARIABILI PUNTATORE • nelle funzioni • per creare strutture dati dinamiche EFFETTI COLLATERALI CON L’USO DI VARIABILI PUNTATORE: modifica non voluta di valori di variabili puntate
int *P; int x, y; P=&y; x=3; *P=x; /* y vale 3*/
int *P, *Q; int x, y; P=&x; Q=&y; *P=3; /*x vale 3*/ *Q=5; /*y vale 5 */ P=Q; /*P punta a y*/ *Q =7; /* adesso anche *P
vale 7 */
Linguaggio C – Costrutti di controllo e strutture dati ... 24
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
DOPPIO PUNTATORE float **DPunt; float *Punt; float v; Significato: DPunt è una variabile puntatore che contiene l’indirizzo di un’area di memoria che, a sua volta, contiene l’indirizzo di un tipo float. (DPunt punta a un puntatore a float) Rappresentazione DPunt Punt valore di
tipo float Dopo la dichiarazione: (ma con variabili non ancora inizializzate) DPunt Punt v &DPunt valore ? &Punt valore ? &v valore?
DPunt = &Punt; /* adesso DPunt punta a Punt */ Punt=&v; /* adesso Punt punta a v */ **DPunt = 13.5; /* adesso v vale 13.5 */ Dopo gli assegnamenti precedenti DPunt Punt v &DPunt &Punt &v 13.5
Linguaggio C – Costrutti di controllo e strutture dati ... 25
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
VARIABILI PUNTATORE E ARRAY: ARITMETICA DEGLI INDIRIZZI int i; int vett[10]; int *P; vett: • è l’indirizzo del primo byte dell’array di interi (indirizzo primo
byte di un intero) • ha associato il tipo degli elementi (cioè interi) • ha un valore costante (cioè non modificabile) vett si comporta come un puntatore “fisso”, cioè costante vett[i] equivale a *(vett+i) *(P+i) equivale a P[i] P=vett equivale a P=&vett[0] P=vett+i equivale a P=&vett[i] (P+i) - (P+j) valore intero pari al numero di elementi (interi) tra i e j
Linguaggio C – Costrutti di controllo e strutture dati ... 26
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
UTILITA’ DEI PUNTATORI Accesso ad indirizzi di memoria prefissati
Assegnando ad un puntatore un valore costante (spesso hex) si può accedere proprio a quell’indirizzo. Ad es. EPROM.
Accesso tramite lo stesso puntatore a diverse variabili Utile quando un pezzo di programma deve usare di volta in volta diverse variabili, ovviamente dello stesso tipo, che non sia opportuno inserire in un array.
Accesso a variabili fuori dal campo di visibilità Tramite puntatori un pezzo di programma (in genere un sottoprogramma) può accedere in lettura e in scrittura anche a variabili cui non potrebbe accedere direttamente (fuori scope). Naturalmente occorre far attenzione ad evitare accessi scorretti.
Accesso ad aree di memoria allocate dinamicamente Questo punto verrà discusso più avanti.
ATTENZIONE! – Rischi nell’uso dei puntatori In generale l’uso dei puntatori consente anche accessi (run-time) non controllabili dal compilatore (compile-time). Si tratta quindi di uno strumento potente ma potenzialmente pericoloso, il cui uso corretto è responsabilità del programmatore, che deve assicurarsi di usare solo puntatori cui ha assegnato indirizzi corretti di aree di memoria lecitamente accessibili. Nei sistemi più evoluti esistono meccanismi che impediscono l’accesso, sia pure con puntatori, a determinate aree di memoria, come ad esempio quelle allocate al sistema operativo.
Linguaggio C – Costrutti di controllo e strutture dati ... 27
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
STRUTTURA DATI DI UN PROGRAMMA Si dice struttura dati di un programma l’insieme delle variabili semplici ed aggregate su cui operano gli algoritmi del programma. E’ importante notare che una struttura dati ben progettata deve rispecchiare in modo chiaro le relazioni esistenti tra i dati dell’applicazione Poiché le modalità di accesso agli elementi di variabili aggregate dipendono dai costruttori usati, è importante che le strutture dati vengano progettate accuratamente prima di scrivere la forma definitiva dei programmi.
Linguaggio C – Costrutti di controllo e strutture dati ... 28
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ESEMPIO1 - CALCOLO DEL FATTORIALE #include <stdio.h> main () { int n,i,fattoriale; fattoriale=1; printf("Inserisci il numero \n"); scanf("%d",&n); if(n!=0) { for(i=1;i<=n;i=i+1) fattoriale=fattoriale*i; } printf("il fattoriale di %d e' %d\n", n, fattoriale); }
Linguaggio C – Costrutti di controllo e strutture dati ... 29
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ESEMPIO2 - CALCOLO DEI DIVISORI DI UN INTERO #include <stdio.h> main () { int k,j; printf("Inserisci il numero \n"); scanf("%d",&k); if(k!=0) { for(j=1;j<=k;j=j+1) if (k%j==0) printf("%d e' divisore di %d \n", j,k); } else printf("Non c'e' alcun divisore di %d\n",k); }
Linguaggio C – Costrutti di controllo e strutture dati ... 30
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ESEMPIO3 - CALCOLO PRODOTTO MATRICE PER VETTORE (vris = mat*vett) ................... int vett[M], mat[N][M], vris[N]; int i,j; .......................... for(i=0;i<=N-1;i++) { vris[i]=0; for (j=0; j<=M-1;j++) vris[i]=vris[i]+mat[i][j]*vet[j]; } ESEMPIO4 - CALCOLO PRODOTTO MATRICE PER MATRICE (ris = mat1*mat2) ................... int mat1[N][M], mat2[M][K], ris[N][K]; int i,j,k; .......................... for(i=0;i<=N-1;i++) { for (k=0;k<=K,k++) { ris[i][k]=0; for (j=0; j<=M-1;j++) ris[i][k]=ris[i][k]+mat1[i][j]*mat2[j][k]; } }
Linguaggio C – Costrutti di controllo e strutture dati ... 31
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
FUNZIONI DI INGRESSO E USCITA In C non esistono istruzioni proprie del linguaggio per l’ingresso e uscita di dati.
L’ingresso e uscita avvengono tramite chiamate (attivazioni) di funzioni (sottoprogrammi) disponibili nella Standard Library del C.
STANDARD LIBRARY: è una collezione di funzioni (organizzate per tipologia) disponibili nell’ambiente C e utilizzabili dai programmi applicativi.
Funzioni: • di ingresso e uscita da terminale e da file • gestione di stringhe • funzioni matematiche • funzioni grafiche ....
Le due componenti della STANDARD LIBRARY:
1. collezione di header file (stdio.h, string.h, math.h) ⇒ un header file contiene le dichiarazioni di tipi, costanti
simboliche predefinite, e prototipi di funzione (nomi) esportati dalla libreria.
⇒ la direttiva di inclusione (# include) consente ad un programma qualsiasi di importare, cioè utilizzare questi identificatori, che non sono stati dichiarati all’interno del programma stesso.
2. insieme di file in codice oggetto, dove ciascun file è costituito dal codice oggetto delle funzioni (nomefile.lib)
Compiti del pre-processore C: includere nel programma sorgente applicativo i file header per risolvere, a livello di sorgente, i riferimenti esterni Compiti del linker: includere nel programma oggetto il codice oggetto delle funzioni di libreria per risolvere, a livello di eseguibile, i riferimenti esterni
Linguaggio C – Costrutti di controllo e strutture dati ... 32
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
AMBIENTE C Ambiente di programmazione C Programma applicativo
pre-processoreC
compilatore
linker
compilatore codice oggetto delle funzioni definite nella Standard Library
stdio.h
math.h
file1.h
file1.c
file1.obj
programma.c
programma.obj
programma.exe
f1.lib
f2.lib
f3.lib
header file Standard Library: in linguaggio C: dichiarazione di tipi, funzioni…… esportate
header file definiti dall’utente in linguaggio C: dichiarazione di tipi, funzioni……esportate
codice oggetto delle funzioni esportate dalla libreria definita dall’utente
codice sorgente C delle funzioni esportate dalla libreria definita dall’utente
Librerie (moduli) definiti dall’utente
Linguaggio C – Costrutti di controllo e strutture dati ... 33
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
FUNZIONI DI I/O PER VIDEO E TASTIERA Stampa su video printf(stringa di controllo, elementi da stampare) dove: • printf ( ) è l’identificatore riservato della funzione • stringa di controllo è racchiusa tra “ e “ e contiene
⇒caratteri alfanumerici da stampare direttamente su video ⇒caratteri di conversione e/o di formato preceduti dal
simbolo % che vengono utilizzati al momento di interpretare per la stampa i valori degli elementi da stampare. Esempi di caratteri di conversione d, f, c ....
⇒caratteri di controllo della stampa (che sono caratteri ASCII cui non corrisponde alcun simbolo stampabile e che hanno come effetto quello di linea nuova (\n), tabulazione, salto pagina…
• elementi da stampare è una lista di identificatori di variabili, identificatori di costanti, espressioni, il cui valore deve essere stampato. La lista è ordinata rispetto ai caratteri di conversione.
Significato e funzionamento: • l’istruzione printf (stringa dicontrollo, elementi da stampare);
è la chiamata alla funzione e quindi attiva l’esecuzione del sottoprogramma associato.
• vengono stampati gli eventuali caratteri alfanumerici tra doppi apici e nella posizione del carattere di conversione viene stampato il valore dell’identificatore corrispondente nella lista di elementi da stampare. I caratteri di controllo stampa spostano il cursore (posizione di stampa) in posizione opportuna.
Linguaggio C – Costrutti di controllo e strutture dati ... 34
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
Ingresso da tastiera
scanf(stringa di controllo, variabili cui associare il valore letto)
dove: • scanf( ) è l’identificatore riservato della funzione • stringa di controllo è racchiusa tra “ e “ e contiene
⇒caratteri di conversione e/o di formato preceduti dal simbolo % che vengono utilizzati al momento di interpretare il codice associato alla pressione dei tasti della tastiera per la memorizzazione dei valori nelle variabili (con la codifica adeguata). Esempi di caratteri di conversione d, f, c ....
• variabili cui associare il valore letto è una lista di identificatori di variabili. Le variabili devono essere indicate tramite il loro indirizzo: &nome_var. La lista è ordinata con corrispondenza uno a uno rispetto ai caratteri di conversione.
Significato e funzionamento: • l’istruzione scanf (stringa dicontrollo, lista di variabili);
è la chiamata alla funzione e quindi si attiva l’esecuzione del sottoprogramma associato.
• ad ogni pressione di tasto la funzione fa eco su video, visualizzando il carattere alfanumerico premuto
• la sequenza di tasti premuti deve terminare con la pressione del tasto ENTER.
• la funzione assegna, con l’opportuna codifica binaria, il valore alle variabili, fin quando possibile.
E’ da usare con attenzione. • Carattere di conversione %d: la sequenza di cifre è interpretata
come un valore intero da assegnare. • Carattere di conversione %f: la sequenza di cifre con il punto è
interpretata come un valore float da assegnare. • Carattere di conversione %c: il singolo carattere alfanumerico
è interpretato come un carattere ASCII da assegnare.
Linguaggio C – Costrutti di controllo e strutture dati ... 35
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
ESEMPIO Programma che riceve in ingressso nome e cognome separati da uno spazio e visualizza cognome e nome separati da uno spazio #include <stdio.h> #define N 30 main () { char Cognome[N], Nome[N]; int indiceC, indiceN,i; char carattere, proseguire,tappo; do { printf("\nInserire Nome e Cognome separati da uno spazio\n"); indiceN=0; /*legge un carattere del nome fa eco e lo inserisce in Nome */ scanf("%c", &carattere); while (carattere != ' ') { Nome[indiceN]=carattere; indiceN=indiceN+1; scanf("%c", &carattere); }
Linguaggio C – Costrutti di controllo e strutture dati ... 36
Fondamenti di Informatica – Corso di Laurea Prof. L. Mezzalira
indiceC=0; /*legge un carattere del cognome fa eco e lo inserisce in Cognome */ scanf("%c", &carattere); while (carattere != '\n') { Cognome[indiceC]=carattere; indiceC=indiceC+1; scanf("%c", &carattere); } /*ciclo per la scrittura del Cognome*/ for (i=0; i<indiceC; i++) /*scrive un carattere del Cognome*/ printf("%c", Cognome[i]); printf(" "); /* scrive uno spazio */ /*ciclo per la scrittura del Nome*/ for (i=0; i<indiceN; i++) /*scrive un carattere del Nome*/ printf("%c", Nome[i]); printf("\nVuoi inserire un altro nome (S\N)? "); scanf("%c", &proseguire); scanf("%c", &tappo); } while(proseguire == 'S'); } /* fine main */
Linguaggio C – Costrutti di controllo e strutture dati ... 37