49
Esercitazione 3 Introduzione al C Prof. Antonino Stelitano Dipartimento Ingegneria Chimica Materiali Ambiente

Esercitazione 3 (14 marzo 2012)

Embed Size (px)

Citation preview

Page 1: Esercitazione 3 (14 marzo 2012)

Esercitazione 3

Introduzione al C

Prof. Antonino Stelitano

Dipartimento Ingegneria Chimica Materiali Ambiente

Page 2: Esercitazione 3 (14 marzo 2012)

Docente Antonino

Stelitano

Tutor

Lezioni Lunedì

Mercoledì

14:00 – 17:30 aula 16 Lab. Paolo Ercoli – via Tiburtina 205

15:45 – 19:00 aula 5 Viale del C. Laurenziano

Ricevimento: Su richiesta [email protected]

[email protected]

Sito web: http://w3.uniroma1.it/ab_informatiche/

Page 3: Esercitazione 3 (14 marzo 2012)

Menù di oggi

Vettori e matrici

Funzioni

Page 4: Esercitazione 3 (14 marzo 2012)

Cos‟è un vettore

Un vettore, o meglio, un array è un insieme ordinato di elementi,

tutti di uno stesso tipo.

Può essere visualizzato idealmente come una lista di celle

numerate univocamente

Array di 6 elementi

0 1 2 3 4 5

indice

cella

Page 5: Esercitazione 3 (14 marzo 2012)

Gli Arrays

Un esempio di definizione di un array in C e' :

int elenco_numeri[50];

e si accede agli elementi dell'array nel seguente modo:

terzo_numero = elenco_numeri[2];

elenco_numeri[49] = 100;

tipo

dimensione nome array

Page 6: Esercitazione 3 (14 marzo 2012)

Gli Arrays: rappresentazione ideale

? ? ? ? ?

0 1 2 3 4 9

int elenco_numeri[50];

terzo_numero = elenco_numeri[2];

elenco_numeri[49] = 100;

? ? X ? 100

0 1 2 3 4 9

terzo_numero

Page 7: Esercitazione 3 (14 marzo 2012)

Indicizzazione degli array

In C gli indici delle celle iniziano da 0 e finiscono alla dimensione

dell'array meno uno. Nell'esempio precedente il range è 0-49, cioè

elenco_numeri è un array di 50 elementi e si ha:

elenco_numeri[0], elenco_numeri[1], ..., elenco_numeri[49]

Questa è una caratteristica tipica dei moderni linguaggi di

programmazione e richiede un po' di pratica per raggiungere "la

giusta disposizione d'animo".

Page 8: Esercitazione 3 (14 marzo 2012)

Esempio Array

Creare un array di 10 elementi di tipo integer (int)

Assegnare ad esso 10 valori a piacere

Stampare il contenuto dell‟array che si è creato

Page 9: Esercitazione 3 (14 marzo 2012)

Soluzione Array

#include <stdio.h>

#include <stdlib.h>

int main()

{

int arrayInteri[10];

arrayInteri[0] = 15;

int i;

for(i = 1; i < 10; i++)

{

arrayInteri[ i ] = (arrayInteri[ i – 1 ] + 10);

}

for(i = 0; i < 10; i++)

{

printf("cella %d = %d\n", i, arrayInteri[ i ]);

}

system("PAUSE");

}

Page 10: Esercitazione 3 (14 marzo 2012)

Output soluzione array

cella 0 = 15

cella 1 = 25

cella 2 = 35

cella 3 = 45

cella 4 = 55

cella 5 = 65

cella 6 = 75

cella 7 = 85

cella 8 = 95

cella 9 = 105

Premere un tasto per continuare . . .

Page 11: Esercitazione 3 (14 marzo 2012)

Esercizio Fibonacci

Scrivere un programma che generi i primi 12 interi

della successione di Fibonacci, li salvi in un array di interi e

stampi la successione a video

Qual è l‟espressione analitica della successione di Fibonacci?

Help:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89

Page 12: Esercitazione 3 (14 marzo 2012)

Successione di Fibonacci

La successione di Fibonacci è una sequenza di numeri interi

naturali definibile assegnando i valori dei due primi termini,

F0:= 0 ed F1:= 1, e chiedendo che per ogni successivo sia

Fn := Fn-1 + Fn-2.

Il termine F0 viene aggiunto nel caso si voglia fare iniziare la

successione con 0; storicamente il primo termine della

successione è F1:= 1.

Page 13: Esercitazione 3 (14 marzo 2012)

Soluzione Fibonacci

#include <stdio.h>

#include <stdlib.h>

int main()

{

int successione_Fibonacci[12];

int f0 = 0, f1 = 1, i;

successione_Fibonacci[0] = 0; successione_Fibonacci[1] = 1;

for(i = 2; i < 12; i++){

successione_Fibonacci[i] =

successione_Fibonacci[ i – 1 ] + successione_Fibonacci[ i – 2 ];

}

for(i = 0; i < 12; i++){

printf("%d\n", successione_Fibonacci[ i ]);

}

system("PAUSE");

}

Page 14: Esercitazione 3 (14 marzo 2012)

Output Fibonacci

0

1

1

2

3

5

8

13

21

34

55

89

Premere un tasto per continuare . . .

Page 15: Esercitazione 3 (14 marzo 2012)

Le matrici

Le matrici non sono altro che array

multidimensionali

righe

colonne

Notazione C:

matrice[righe][colonne]

0

1

0 1

[0][0]

[1][0]

[0][1]

[1][1]

Page 16: Esercitazione 3 (14 marzo 2012)

Gli Array multidimensionali

Gli array multidimensionali sono cosi definiti:

int tabella_numeri[50][50]

(per due dimensioni)

int big_D[20][30][10][40]

(per più di due dimensioni)

Page 17: Esercitazione 3 (14 marzo 2012)

Indicizzazione degli Array multidimensionali

si accede agli elementi di un array multidimensionale nel

seguente modo:

numero = tabella_numeri[5][32];

tabella_numeri[1][23] = 100;

Page 18: Esercitazione 3 (14 marzo 2012)

Esempio Matrici

#include <stdio.h>

#include <stdlib.h>

int main()

{

int matrice[2][2], i, j;

matrice[0][0] = 1;

matrice[0][1] = 2;

matrice[1][0] = 3;

matrice[1][1] = 4;

for(i = 0; i < 2; i++)

for(j = 0; j < 2; j++)

printf("matrice[%d][%d] = %d\n", i, j, matrice[ i ][ j ]);

system("PAUSE");

}

Page 19: Esercitazione 3 (14 marzo 2012)

Output Matrici

matrice[0][0] = 1

matrice[0][1] = 2

matrice[1][0] = 3

matrice[1][1] = 4

Premere un tasto per continuare . . .

Page 20: Esercitazione 3 (14 marzo 2012)

Le stringhe

In C le stringhe sono definite come array di caratteri.

Ad esempio, la seguente istruzione definisce una stringa

di 50 caratteri:

char name[50];

Page 21: Esercitazione 3 (14 marzo 2012)

Gestione delle stringhe

Il C non ha un sistema maneggevole per costruire le stringhe, così le

seguenti assegnazioni NON SONO VALIDE:

char firstname[50], lastname[50], fullname[50];

firstname = "Mario" /* illegale */

lastname = "Rossi" /* illegale */

fullname = "Sig."+firstname+lastname /* illegale */

Esiste pero' una libreria di routines per il trattamento delle stringhe ("<

string.h >").

Page 22: Esercitazione 3 (14 marzo 2012)

Stampare una stringa

Per stampare una stringa si usa printf() con lo speciale

carattere di controllo %s:

printf("%s", nome);

Nota: è sufficiente avere il nome della stringa.

Page 23: Esercitazione 3 (14 marzo 2012)

Esempio stampa di una stringa

#include <stdio.h>

#include <stdlib.h>

main()

{

char string_nome[80];

printf("inserisci il tuo nome:\n");

scanf("%s", string_nome);

printf("NOME: %s\n", string_nome);

//ulteriore modo di stampare il nome

printf("NOME IN ALTRO MODO: %s\n", &string_nome[0]);

system("PAUSE");

}

Page 24: Esercitazione 3 (14 marzo 2012)

Output stampa di una stringa

inserisci il tuo nome:

antonio

NOME: antonio

NOME IN ALTRO MODO: antonio

Premere un tasto per continuare . . .

Page 25: Esercitazione 3 (14 marzo 2012)

il carattere „\0‟

Al fine di permettere l'utilizzo di stringhe con lunghezza

variabile, il carattere \0 viene utilizzato per indicare la fine di

una stringa.

In questo modo, se abbiamo una stringa dichiarata di 50

caratteri (char name[50];), e la utilizziamo per memorizzare il

nome "Dave", il suo contenuto (a partire da sinistra) sarà la

parola Dave immediatamente seguita dal segno di fine stringa

\0, e quindi tutti gli altri caratteri (fino ad arrivare alla

lunghezza di 50) risulteranno vuoti.

Page 26: Esercitazione 3 (14 marzo 2012)

Esercizio Stringhe

Dichiarare un array di 6 elementi di tipo char.

Inserire in tale array la stringa “DINO”

Stampare a video il contenuto dell‟array di 6 elementi

dichiarato in precedenza.

Page 27: Esercitazione 3 (14 marzo 2012)

Soluzione esercizio Stringhe

#include <stdio.h>

#include <stdlib.h>

int main()

{

char nome[6];

nome[0] = 'D';

nome[1] = 'I';

nome[2] = 'N';

nome[3] = 'O';

printf("prova stampa DINO = %s\n", nome);

nome[4] = '\0';

printf("RI-prova stampa DINO = %s\n", nome);

system("PAUSE");

}

Page 28: Esercitazione 3 (14 marzo 2012)

Output esercizio Stringhe

prova stampa DINO = DINO$³¨☻CÂÇ|¿ #

RI-prova stampa DINO = DINO

Premere un tasto per continuare . . .

Page 29: Esercitazione 3 (14 marzo 2012)

Spiegazione esercizio Stringhe

? ? ? ? ? ? char nome[6];

D I N O ? ?

nome[0] = 'D';

nome[1] = 'I';

nome[2] = 'N';

nome[3] = 'O';

D I N O \0 ? nome[4] = „\0';

Senza „\0‟ la printf non può conoscere la fine della

stringa che si vuole stampare, quindi vengono stampati anche

valori ignoti (tipo $³¨☻CÂÇ|¿ #)

Page 30: Esercitazione 3 (14 marzo 2012)

Le Funzioni

il C considera "main()" come una funzione.

La forma generale di una funzione e':

returntype function_name (param1, param2, ...)

{

local variables

function code (C statements)

}

Page 31: Esercitazione 3 (14 marzo 2012)

Tipo di ritorno

Se manca la definizione del tipo della funzione

("returntype", tipo della variabile di ritorno della

funzione), il C assume che il ritorno della funzione

sia di tipo integer (int);

ATTENZIONE: questo può essere una delle cause

di problemi nei programmi.

Page 32: Esercitazione 3 (14 marzo 2012)

Esempio

Esempio di una funzione che calcola la media tra due

valori:

float calcolamedia(float a, float b)

{

float media;

media = (a + b) / 2;

return(media);

}

valore di ritorno argomenti

Page 33: Esercitazione 3 (14 marzo 2012)

Eseguire una funzione

Per richiamare tale funzione si procede nel seguente modo:

main()

{

float a = 10, b = 25, risultato;

risultato = calcolamedia(a, b);

printf("Valore medio = %f\n",

risultato);

}

Nota: l'istruzione "return" porta il risultato della funzione al

programma principale.

Page 34: Esercitazione 3 (14 marzo 2012)

Programma calcola media

#include <stdio.h>

#include <stdlib.h>

float calcolamedia(float a, float b)

{

float media;

media = (a + b) / 2;

return(media);

}

main()

{

float a = 10, b = 25, risultato;

risultato = calcolamedia(a, b);

printf("Valore medio = %f\n",

risultato);

}

Page 35: Esercitazione 3 (14 marzo 2012)

Domanda

Cosa succede se inverto l‟ordine delle funzioni?

#include <stdio.h>

#include <stdlib.h>

main(){

float a = 10, b = 25, risultato;

risultato = calcolamedia(a, b);

printf("Valore medio = %f\n",

risultato);

}

float calcolamedia(float a, float b){

float media;

media = (a + b) / 2;

return(media);

}

Page 36: Esercitazione 3 (14 marzo 2012)

Risposta

Il compilatore non può sapere cos‟è “calcolamedia”

#include <stdio.h>

#include <stdlib.h>

float calcolamedia(float a, float b);

main(){

float a = 10, b = 25, risultato;

risultato = calcolamedia(a, b);

printf("Valore medio = %f\n",

risultato);

}

float calcolamedia(float a, float b){

float media;

media = (a + b) / 2;

return(media);

}

la funzione

prima

va dichiarata

poi

va usata

Page 37: Esercitazione 3 (14 marzo 2012)

Prototipi di funzioni

Prima di usare una funzione, il C deve

riconoscere il tipo di ritorno e il tipo dei

parametri che la funzione si aspetta.

Lo standard ANSI del C ha introdotto un nuovo e migliore

metodo per fare questa dichiarazione rispetto alle vecchie

versioni di C (ricordiamo

che le moderne versioni del C aderiscono allo standard

ANSI).

Va fatta una dichiarazione

Page 38: Esercitazione 3 (14 marzo 2012)

Dichiarazione di funzione

L'importanza della dichiarazione e' doppia:

- viene fatta per avere un codice sorgente più

strutturato e perciò facile da leggere ed

interpretare;

- permette al compilatore C di controllare la

sintassi delle chiamate di funzioni.

Page 39: Esercitazione 3 (14 marzo 2012)

Dichiarazione di funzione (2)

Fondamentalmente, se una funzione e' stata definita prima di

essere usata (call) allora è possibile semplicemente usare la

funzione.

Nel caso contrario, è obbligatorio dichiarare la funzione;

la dichiarazione stabilisce in modo semplice il ritorno della

funzione ed il tipo dei parametri utilizzati da questa.

E' buona norma (e solitamente viene fatto) dichiarare tutte le

funzioni all'inizio del programma, sebbene non sia

strettamente necessario.

Page 40: Esercitazione 3 (14 marzo 2012)

Dichiarazione di funzione (3)

Per dichiarare un prototipo di funzione bisogna

semplicemente stabilire il ritorno della funzione, il nome della

funzione e tra le parentesi elencare

il tipo dei parametri nell'ordine in cui compaiono nella

definizione di funzione.

Ad esempio:

int strlen(char[]);

Questo dichiara che una funzione di nome "strlen" ritorna un

valore integer ed accetta una singola stringa come parametro.

Page 41: Esercitazione 3 (14 marzo 2012)

Una scorciatoia

le funzioni e le variabili possono essere dichiarate sulla stessa linea

di codice sorgente. Questa procedura era molto piu' diffusa nei

giorni del pre-ANSI C; da allora le funzioni solitamente vengono

dichiarate separatamente all'inizio del programma. La prima

procedura

risulta ancora perfettamente valida, purchè venga rispettato l'ordine

in cui gli oggetti compaiono nella definizione della funzione.

int length, strlen(char[]);

dove "length" e' una variabile, e "strlen" e' la funzione (come

nell'esempio precedente).

Page 42: Esercitazione 3 (14 marzo 2012)

Funzioni “void”

Se non si vuole ritornare alcun valore da una funzione è sufficiente dichiararla di tipo

void ed omettere il return.

void cento(){

int loop;

for (loop = 0; loop < 10; loop++);

printf("%d\n", loop * loop);

}

main(){

cento();

}

Nota: è obbligatorio mettere le parentesi () dopo il nome della

funzione anche se non ci sono parametri.

Page 43: Esercitazione 3 (14 marzo 2012)

Funzioni ed array

Possono essere passati alle funzioni come parametri anche array singoli o

multidimensionali.

Gli array monodimensionali possono essere passati nel seguente modo:

float trovamedia(int size,float list[]){

int i;

float sum = 0.0;

for (i = 0; i < size; i++)

sum += list[i];

return(sum/size);

}

Page 44: Esercitazione 3 (14 marzo 2012)

Spiegazione

Nella precedente funzione “trovamedia” la

dichiarazione "float list[]" dichiara al C che

"list" è un array di float.

Non viene specificata la dimensione di un array

quando è un parametro di una funzione.

Page 45: Esercitazione 3 (14 marzo 2012)

Esempio d‟uso per “trovamedia”

#include <stdio.h>

#include <stdlib.h>

//dichiarazione di funzione

float trovamedia(int size, float list[]);

//main

main(){

float numeri[2];

numeri[0] = 1.2; numeri[1] = 3.6;

float media = trovamedia(2, numeri);

printf("la media e' %f\n", media);

system("PAUSE");

}

//codice della funzione

float trovamedia(int size,float list[]){

int i;

float sum = 0.0;

for (i = 0; i < size; i++)

sum += list[i];

return(sum/size);

}

OUTPUT

la media e' 2.400000

Premere un tasto per continuare . . .

Page 46: Esercitazione 3 (14 marzo 2012)

Funzioni ed array multidimensionali

Array multidimensionali possono essere passati alle

funzioni nel seguente modo:

void stampatabella(int xsize, int ysize,

float tabella[][5])

{

int x,y;

for (x = 0; x < xsize; x++) {

for (y = 0; y < ysize; y++)

printf(“\t%f ”, tabella[x][y]);

printf("\n");

}

}

Page 47: Esercitazione 3 (14 marzo 2012)

Spiegazione

Nella precedente funzione “stampatabella”, la parte di

codice "float tabella[][5]" dichiara al C che tabella è un array

di float di dimensioni nx5.

E' importante notare che dobbiamo specificare la seconda

dimensione (e le successive) del vettore, ma non la prima

dimensione.

Page 48: Esercitazione 3 (14 marzo 2012)

Riepilogo: array e funzioni

riepilogando,

nel caso di array singoli non e' necessario specificare

la dimensione dell'array nella definizione come

parametro della funzione,

mentre nel caso di array multidimensionali si può

non specificare solo la prima dimensione.

Page 49: Esercitazione 3 (14 marzo 2012)

Esercizio: array e funzioni

Si scriva un programma che prenda in ingresso

da tastiera 10 interi, li memorizzi in un array,

ordini tale array e stampi la lista dei numeri

inseriti dall‟utente e la stessa lista ordinata.

Esempio:

Input: 1 3 2 23 43 521 98 43 9 10

Output: 1 2 3 9 10 23 43 43 98 521