vuoi
o PayPal
tutte le volte che vuoi
Le funzioni scanf() e printf() sono le più importanti e basilari funzioni di input-output. Per poter
utilizzarle bisogna includere la libreria <stdio.h>. (#include <stdio.h>)
Appunti per l’utilizzo
Esempio 1
scanf( “%f ”, &cifra); /* Legge da tastiera un carattere, riconosce un numero reale (se è stata
scritta una lettera, riconosce il suo codice ascii) e memorizza il valore
letto nella variabile cifra, anch’essa di tipo float. */
In genere la scanf legge solo un valore per volta, quindi, nel caso in cui dovessero essere letti dei
numeri da sistemare in un array o magari delle lettere da una stringa, si dovrebbe organizzare un
ciclo di letture ripetute. Tuttavia per tali operazioni è consigliabile usare altre funzioni più affidabili
come la gets.
La scanf() ritorna:
- il numero delle variabili a cui sono stati assegnati i valori letti da tastiera, se è tutto ok;
- EOF, in caso di errore.
Esempio 2
printf(“ Il numero inserito vale %d, la sua radice vale %f ”, num, radice);
/* Stampa a video i caratteri ordinari inseriti tra virgolette “ ”; le direttive di conversione (che
iniziano con il carattere ‘%’, seguito da una precisa lettera (d,f,c…) determinante un
corrispondente formato (intero, reale, carattere…)) specificano il formato in cui devono essere
stampati gli argomenti passati, ovvero gli argomenti scritti in ordine, separati da virgole, dopo la
chiusura delle virgolette. */
N.B. Tra il carattere di inizio % e il carattere di conversione possono essere inseriti degli
specificatori di formato di stampa. (vedi tabelle in <Specificatori di formato>)
La printf() ritorna:
- il numero di caratteri stampati a video, se è tutto ok;
- un valore negativo, in caso di errore.
Vettori
Un vettore (array) è una sequenza ordinata di elementi tutti dello stesso tipo. Caratteristiche
tipiche di un vettore sono l’omogeneità e l’ordinamento, quest’ultimo ottenuto mediante dei valori
interi (indici) che consentono di accedere ad ogni singolo elemento della struttura dati così definita.
Sintassi <Tipo di dati> <Nome vettore> [Dimensione];
dove:
- <Tipo di dati> è l’identificatore di tipo degli elementi componenti;
- <Nome vettore> è l’identificatore del vettore;
- [Dimensione] è il numero degli elementi componenti (è una costante intera o un valore numerico,
non una variabile).
In buona sostanza, un vettore può essere immaginato come una fila di elementi tutti dello stesso
tipo; per accedere ad ogni singolo elemento basta utilizzare correttamente l’indice a cui corrisponde,
ovvero alla sua posizione nella sequenza.
Ad esempio, se si vuole accedere al primo elemento del vettore di interi di nome VET, si scrive
VET [0], per il secondo elemento si scrive VET [1], per l’ottavo elemento VET [7] e così a seguire
(si noti che gli indici partono da 0 e non da 1).
N.B. Si faccia attenzione a non accedere ad elementi che non esistono nel vettore, ovvero a non
andare oltre la sua dimensione.
Per inserire da tastiera dei valori all’interno di un vettore, per stamparlo a video o per eseguire
altre operazioni simili, è necessario impostare dei cicli tali per cui il programma esegue le suddette
operazioni per una cella alla volta, singolarmente.
Appunti per l’utilizzo
(i) Per inserire da tastiera dei valori all’interno di un vettore si può usare la funzione scanf()
all’interno di un ciclo;
Esempio 1
...
#define max_num 100 /* definizione della costante max_num */
...
int VET[max_num]; /* definizione del vettore VET di max_num elementi, ancora non
inizializzati */
...
for( i=0; i<max_num; i++) { /* max_num è la dimensione del vettore */
scanf( “%d”, &VET[i] ); /* La funzione scanf legge il valore inserito da tastiera e, quando ‘i’
vale 0, lo inserisce nella prima cella del vettore; successivamente
l’indice ‘i’ viene incrementato e allora il secondo valore letto viene
inserito nella seconda cella, e così a seguire */
}
...
(ii) Per stampare i valori contenuti all’interno di un vettore si può usare la funzione printf()
all’interno di un ciclo;
Esempio 2
...
for( i=0; i<max_num; i++) { /* max_num è la dimensione del vettore */
printf( “Posizione: %d – Valore: %d”, i, v[i]); /* Quando ‘i’ vale 0, la funzione printf stampa il
valore contenuto nella prima cella del vettore;
successivamente l’indice ‘i’ viene incrementato
e allora viene stampato il valore della seconda
cella, e così a seguire */
}
...
Stringhe
Una stringa, in qualsiasi linguaggio di programmazione, è un vettore di caratteri, cioè una
sequenza di caratteri. All’interno di questo ‘particolare vettore’ vengono memorizzati i vari codici
ascii dei corrispondenti caratteri.
Il codice ascii di un carattere è il corrispondente valore numerico utilizzato per la sua stessa
codifica. Esiste una tabella predefinita dove sono indicati i codici ascii di tutti i caratteri.
Una stringa viene terminata dal carattere ‘\0’ (NUL), ovvero un carattere aggiuntivo il cui codice
ascii vale 0 e il cui scopo è quello di terminare correttamente una stringa e quindi indicare la sua
lunghezza.
Sintassi char <Nome stringa> [Dimensione];
dove:
- <Nome stringa> è l’identificatore della stringa;
- [Dimensione] è la lunghezza della stringa, ovvero il numero di caratteri che può contenere.
N.B. I caratteri effettivi che una stringa può contenere sono uguali Dimensione-1, poiché il
carattere terminale viene utilizzato per chiudere la stringa. In generale per memorizzare una
stringa di k caratteri si dovrà utilizzare array di tipo char di dimensione ≥ k + 1.
Esempio 1
...
#define max_num 100 /* definizione della costante max_num */
...
char str[max_num]; /* definizione della stringa str di max_num caratteri, ancora non
inizializzati */
...
for( i=0; i<max_num; i++) { /* max_num è la dimensione della stringa */
scanf( “%c”, &str[i] ); /* La funzione scanf legge il carattere inserito da tastiera e, quando ‘i’
vale 0, lo inserisce nella prima cella della stringa; successivamente
l’indice ‘i’ viene incrementato e allora il secondo carattere letto
viene inserito nella seconda cella, e così a seguire */
}
...
Data l’evidente importanza delle stringhe, è stata scritta tutta una serie di funzioni incluse nella
libreria <string.h> che lavorano sulle stringhe opportunamente terminate (ad esempio la strlen che
serve per conoscere la lunghezza di una stringa, o la strcmp che confronta due stringhe).
Matrici
Nel linguaggio C, una matrice è una struttura dati bidimensionale (a due indici) che possiamo
benissimo immaginare come una tabella. Si definisce un vettore di vettori, ovvero un vettore di
righe, di cui ciascuna riga è un normale vettore di celle.
Sintassi <Tipo di dati> <Nome matrice> [Numero di righe] [Numero di colonne];
N.B Si faccia attenzione a non inserire la virgola tra [Numero di righe] [Numero di colonne],
poiché il calcolatore non lo considera un errore, però ha un altro significato.
Esempio 1 Prototipo di cicli che stampa il contenuto di una matrice di numeri reali
...
#define N 10 /* N numero di righe */
#define M 10 /* M numero di colonne */
...
int mat [N][M];
printf (“Dimensione Matrice: %d x %d\n”, N, M); /* N righe ed M colonne */
for ( i=0; i<N; i++) {
for( j=0; j<M; j++) {
printf (“%f”, mat[i][j]); /* Stampa la riga i-esima: i è costante e j sta variando */
}
printf (“\n”);
}
...
Strutture
Tutti i linguaggi di programmazione hanno la possibilità di definire dei tipi di dato nuovi ottenuti
aggregando tra di loro dei tipi di dato più semplici. In C questi tipi di dato prendono il nome di
strutture.
Sintassi struct <Nome struttura> {
<Tipo campo 1> <Nome campo 1>;
<Tipo campo 2> <Nome campo 2>;
<Tipo campo 3> <Nome campo 3>;
…
};
La definizione di una nuova struttura viene fatta prima della funzione main, in modo tale che tutto
il resto del programma, comprese le funzioni esterne, possano riconoscere la struttura stessa.
Dunque, struct <Nome struttura> diventa un nuovo tipo di dato (come int, float, char..), che
possiamo tranquillamente usare per definire delle variabili; la differenza sostanziale sta nel fatto che
per lavorare con una variabile di tipo struct <Nome struttura> è necessario accedere ai singoli
campi, il che è possibile utilizzando la seguente sintassi:
/* DICHIARAZIONE DELLA VARIABILE */
struct <Nome struttura> <Nome variabile>;
/* UTILIZZO DELLA VARIABILE */
<Nome variabile> . <Nome campo>
Esempio 1
struct esame {
char materia;
int data;
float voto;
}
int main {
struct esame mio_esame; /* mio_esame è una variabile di tipo struct esame */
...
printf(“materia: %s\n”, mio_esame.materia);
printf(“data: %d\n”, mio_esame.data);
prinft(“voto: %f\n”, mio_esame.voto);
...
}
Funzioni
Nel corso del programma, a volte può risultare utile fare riferimento a delle funzioni esterne, al
fine di rendere la progettazione del programma più organica e di far sì che tali funzioni possano
essere utilizzate anche più di una volta, senza dover di volta in volta riscrivere gli stessi pezzi di
codice.
In buona sostanza, c’è una funzione chiamante (generalmente il main) che, ad un certo punto del
programma, chiama una funzione esterna: vengono così eseguite le righe di codice di tale funzione
esterna e, al termine di questa elaborazione, si ritorna alla funzione chiamante.
Generalmente, una funzione riceve dei parametri in ingresso, lavora su questi parametri e
restituisce un valore di ritorno che è il risultato finale della sua elaborazione.
Sintassi <Tipo risultato>< Nome funzione> (<Parametri>) {
<Istruzioni>;
}
dove:
- <Tipo risultato> indica il tipo del valore di ritorno;
- <Parametri> indicano i tipi+nomi dei parametri (o argomenti) su cui la funzione lavora.
Una funzione di questo genere può:
(i) eseguire delle istruzioni non modificando i parametri in ingresso, come se lavorasse su
delle copie di quest’ultimi: in questo caso si dice che si opera by value.
(ii) eseguire delle istruzioni modificando i parametri in ingresso che, quindi, alla fine
dell’esecuzione della funzione hanno dei valori in gen