Anteprima
Vedrai una selezione di 5 pagine su 17
Linguaggio C Pag. 1 Linguaggio C Pag. 2
Anteprima di 5 pagg. su 17.
Scarica il documento per vederlo tutto.
Linguaggio C Pag. 6
Anteprima di 5 pagg. su 17.
Scarica il documento per vederlo tutto.
Linguaggio C Pag. 11
Anteprima di 5 pagg. su 17.
Scarica il documento per vederlo tutto.
Linguaggio C Pag. 16
1 su 17
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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

Dettagli
A.A. 2015-2016
17 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher PeppeCampagnolo di informazioni apprese con la frequenza delle lezioni di Elementi di informatica e programmazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Politecnico di Torino o del prof Corno Fulvio.