Esercitazione 3 (14 marzo 2012)

Post on 13-Jun-2015

361 views 2 download

Transcript of Esercitazione 3 (14 marzo 2012)

Esercitazione 3

Introduzione al C

Prof. Antonino Stelitano

Dipartimento Ingegneria Chimica Materiali Ambiente

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 antonino.stelitano@uniroma1.it

stelitano.a@libero.it

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

Menù di oggi

Vettori e matrici

Funzioni

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

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

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

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".

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

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");

}

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 . . .

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

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.

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");

}

Output Fibonacci

0

1

1

2

3

5

8

13

21

34

55

89

Premere un tasto per continuare . . .

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]

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)

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;

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");

}

Output Matrici

matrice[0][0] = 1

matrice[0][1] = 2

matrice[1][0] = 3

matrice[1][1] = 4

Premere un tasto per continuare . . .

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

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 >").

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.

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");

}

Output stampa di una stringa

inserisci il tuo nome:

antonio

NOME: antonio

NOME IN ALTRO MODO: antonio

Premere un tasto per continuare . . .

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.

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.

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");

}

Output esercizio Stringhe

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

RI-prova stampa DINO = DINO

Premere un tasto per continuare . . .

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ÂÇ|¿ #)

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)

}

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.

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

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.

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

}

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

}

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

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

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.

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.

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.

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).

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.

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

}

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.

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 . . .

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");

}

}

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.

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.

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