Esercitazione 7. Procedure e Funzioni



Похожие документы
AA LA RICORSIONE

Ricorsione. Corso di Fondamenti di Informatica

Funzioni in C. Violetta Lonati

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Esercizi di programmazione in C

RICERCA DI UN ELEMENTO

RICORSIONE - schema ricorsivo (o induttivo) si esegue l'azione S, su un insieme di dati D, mediante eventuale esecuzione di

void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Ricorsione. (da lucidi di Marco Benedetti)

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

MAGAZZINO.CPP January 2, 2008 Page 1

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Introduzione al Linguaggio C

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Algoritmi di Ricerca. Esempi di programmi Java

10 - Programmare con gli Array

Esercitazione 6. Array

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Esercitazione 3. Corso di Fondamenti di Informatica

2. Spiegare brevemente qual è la funzione del compilatore e la sua importanza per il programmatore.

Breve riepilogo della puntata precedente:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Una funzione è detta ricorsiva se chiama, direttamente o indirettamente, se stessa. In C tutte le funzioni possono essere usate ricorsivamente.

La selezione binaria

LABORATORIO DI PROGRAMMAZIONE EDIZIONE 1, TURNO B

Lab 11 Gestione file di testo"

Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )

Fondamenti di Informatica 2

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO V Indice

Appello di Informatica B

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE

Programmazione C Massimo Callisto De Donato massimo.callisto@unicam.it

Lab 04 Istruzioni, cicli e array"

Record in C: il costruttore struct.

Corso di Informatica Medica Esercitazione 1I ! Alessandro A. Nacci - alessandronacci.com

Thread: sincronizzazione Esercitazioni del 09 Ottobre 2009

puntatori Lab. Calc. AA 2007/08 1

Esame del 3 febbraio 2010

Linguaggio C - Stringhe

La ricorsione. Politecnico di Milano Sede di Cremona

Esercizi Capitolo 6 - Alberi binari di ricerca

Laboratorio di programmazione

Corso di Informatica

Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

ESERCIZIO: Analisi di un programma. Dato il seguente programma C:

Gestione dei File in C

Caratteri e stringhe Esercizi risolti

Introduzione al linguaggio C Gli array

Esame di Informatica Generale 25 giugno 2012 Professori: Carulli, Fiorino. Docente Risultati Scritto Fiorino Carulli

Codifica: dal diagramma a blocchi al linguaggio C++

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

SOLUZIONE ESERCIZIO 1

Funzioni. Il modello console. Interfaccia in modalità console

Introduzione alla programmazione in C

Ricerche, ordinamenti e fusioni. 5.1 Introduzione. 5.2 Ricerca completa

Parte 1. Vettori di bit - AA. 2012/13 1.1

Gestione dei File. dischi nastri cd

FUNZIONI. La libreria standard del C fornisce una ricca collezione di funzioni, come le funzioni:

Esempio: Array di struct

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi terza

Corso di Informatica

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

MIPS Instruction Set 2

ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza

I puntatori e l allocazione dinamica di memoria

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

3) Il seguente numerale A1F0 in base 16 a quale numero in base 10 corrisponde?

Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli

Testi di Esercizi e Quesiti 1

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

Esercizio 1. Esercizio 1

Primi programmi in C

Programmazione dinamica

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Verifica che una grammatica sia Context Free nel GrammaReader

Vettori Algoritmi elementari di ordinamento

Laboratorio di Algoritmi e Strutture Dati

[MANUALE VISUAL BASIC SCUOLA24ORE PROF.SSA PATRIZIA TARANTINO] 14 dicembre 2008

La somma di 12 e 30 è 42

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni

Algoritmi di ordinamento

Header. Unità 9. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Gestione delle stringhe in C

Esercitazione 11. Liste semplici

Транскрипт:

Esercitazione 7 Procedure e Funzioni

Esercizio Scrivere un programma che memorizza in un array di elementi di tipo double le temperature relative al mese corrente e ne determina la temperatura massima, la temperatura minima e la temperatura media. ALGORITMO Scomponiamo il problema nei seguenti sottoproblemi più semplici: scrivere una procedura leggitemperature che inizializza un array di double; scrivere una funzione massima che calcola il massimo elemento di un array di double; scrivere una funzione minima che calcola il minimo elemento di un array di double; scrivere una funzione media che calcola il valore medio di un array di double.

PROGRAMMA #include <stdio.h> /* procedura che inizializza un array generico di elementi di tipo double con i valori delle temperature inseriti dall utente */ void leggitemperature (double temperature [ ], int dim) { int i; for (i=0; i<dim; i++) { printf ( inserisci la temperatura del giorno %d, i+1); scanf( %lf, &temperature[i]); /* fine procedura leggitemperature */

/* procedura che calcola il maggiore di un array generico di double */ double massima (double arr [ ], int n) { int i; double max = arr [0]; for (i=1; i<n; i++) if (arr [i] > max) max = arr [i]; return max; /* procedura che calcola il minore di un array generico di double */ double minima (double arr [ ], int n) { int i; double min = arr [0]; for (i=1; i<n; i++) if (arr [i] < min) min = arr [i]; return min;

/* procedura che calcola la media di un array generico di double */ double media (double arr [ ], int n) { int i; double media; media = arr[0]; for (i=1; i<n; i++) media += arr[i]; media /= n; return media;

/* funzione principale main */ #define N 31 main ( ) { int n; double max, min, med; double temperature [N]; printf ( TEMPERATURE DEL MESE CORRENTE \n\n ); printf ( Inserisci il numero di giorni del mese corrente: ); scanf( %d, &n); leggitemperature (temperature, n); /* invocazione di procedura */ max = massima (temperature, n); min = minima (temperature, n); med = media (temperature, n); printf ( Massima= %lf, Minima=%lf, Media=%lf\n, max, min, med);

Esercizio Scrivere una funzione che dato un array di elementi di tipo double contenente i valori delle temperature del mese corrente, restituisce il numero di giorni del mese in cui la temperatura è scesa sotto zero. ALGORITMO Scriviamo una funzione conta_giorni_sotto_zero che, dato un array arr di double e la sua dimensione dim, restituisce il numero di elementi dell array che hanno valore strettamente minore di 0.

/* definizione della funzione conta_giorni_sotto_zero */ { int conta_giorni_sotto_zero (double arr [ ], int dim) int i; int giorni_contati = 0; for (i=0; i<dim; i++) { if (arr [i] < 0) giorni_contati++; return (giorni_contati);

Esercizio Scrivere una procedura che memorizza in un array i numeri naturali multipli di 3 compresi tra 0 e N (cioè 0+3+6+9+...) e ne restituisca la somma. int somma_terzi_numeri (int arr[ ], int dim, int N) { int i, j, somma; i = 0; j = 0; somma = 0; while ((i <= N) && (j<dim)) { arr[j]=i; somma +=arr[j]; i+=3; j++; return somma;

Le Torri di Hanoi Quello delle Torri di Hanoi è un gioco che si svolge con tre paletti e alcuni dischi di diametro differente con un foro al centro in modo da poter essere infilati nei paletti. Inizialmente i dischi sono tutti impilati a piramide sul primo paletto. Il disco più grande è in basso, il più piccolo in alto.

SCOPO DEL GIOCO Lo scopo del gioco è quello di trasferire i dischi dal paletto di sinistra a quello di destra, senza mai mettere un disco su un altro di dimensione più piccola. REGOLE DEL GIOCO È possibile spostare un solo disco alla volta; tutti i dischi devono essere sempre infilati nei paletti. STRATEGIA La strategia consiste nel considerare uno dei paletti come origine e un altro come destinazione. Il terzo paletto sarà utilizzato come deposito temporaneo.

ALGORITMO Supponiamo di avere n dischi, numerati dal più piccolo al più grande. Inizialmente sono tutti impilati nel paletto di sinistra. Il problema di spostare n dischi sul paletto di destra può essere descritto in modo ricorsivo così: Spostare i primi n-1 dischi dal paletto di sinistra a quello di centro. Spostare il disco n-esimo (il più grande) sul paletto di destra. Spostare i rimanenti n-1 dischi dal paletto di centro a quello di destra. In questo modo il problema può essere risolto per qualsiasi valore di n>0 (n=0 è la condizione di stop della ricorsione).

PROGRAMMA Per programmare questo gioco indichiamo il primo paletto (quello di sinistra) con L il secondo paletto (quello di centro) con C il terzo paletto (quello di destra) con R Definiamo la procedura ricorsiva transfer, che trasferisce n dischi da un paletto all altro.

void transfer (int n, char from, char to, char temp) { /* n indica il numero di dischi che si vuole trasferire, from indica il paletto di origine, to indica il paletto di arrivo e temp indica il paletto che viene usato per la sosta temporanea */ if (n > 0) { /* sposta n-1 dischi dall origine alla sosta temporanea */ transfer (n-1, from, temp, to); /* sposta il disco n-esimo dall origine alla destinazione */ printf ( Sposta il disco %d da %c a %c\n, n, from, to); /* sposta n-1 dischi dalla sosta temporanea alla destinazione*/ transfer (n-1, temp, to, from); return;

/* programma principale per il gioco delle TORRI DI HANOI */ /* realizzato con una procedura ricorsiva */ #include <stdio.h> void transfer (int n, char from, char to, char temp); main ( ) { int n; printf ( Benvenuto nelle TORRI DI HANOI\n\n ); printf ( Quanti dischi? ); scanf ( %d, &n); transfer (n, L, R, C );

Eseguendo il programma con n=3 si otterrà il seguente output: Benvenuto nelle TORRI DI HANOI Quanti dischi? 3 Sposta il disco 1 da L a R Sposta il disco 2 da L a C Sposta il disco 1 da R a C Sposta il disco 3 da L a R Sposta il disco 1 da C a L Sposta il disco 2 da C a R Sposta il disco 1 da L a R

Esercizio Scrivere una funzione ricorsiva che calcoli la somma degli interi pari tra 2 e N

PROGRAMMA int SommaPari (int N) { if (N<2) return 0; else if (( N%2) == 0) return N + SommaPari (N-2); else return SommaPari (N-1);

ESERCIZIO Si consideri la seguente funzione F la cui specifica è data in modo ricorsivo (si supponga N intero): F(N) = restituisce 1 se N <= 0, -1+4*F(N-1) + F(N-2), altrimenti. Si scriva la funzione C che realizzerebbe tale specifica SOLUZIONE: int F(int N) { if (N<=0) return 1 else return -1+4*F(N-1) + F(N-2);

Esercizio Scrivere una procedura ricorsiva che, dato un array di interi di lunghezza n, calcoli la somma dei suoi elementi. Esempio int a[1]; somma_ricorsiva(a, 1)=a[0]; int a[6]; somma_ricorsiva(a, 6)=somma_ricorsiva(a, 5) + a[5]; 0 1 2 3 4 5

Soluzione 1 #include <stdio.h> #define DIM 10 int somma_ricorsiva (int a[ ], int dim) { if (dim == 1) return a[0]; else return somma_ricorsiva (a, dim-1) + a[dim-1]; main ( ) { int sum; int mio_array [DIM]; inizializza_array (mio_array, DIM); /*supponiamo che questa procedura sia stata definita*/ sum = somma_ricorsiva (mio_array, DIM);

Un altra soluzione Esempio int a[1]; somma_ricorsiva(a, 0, 0)=a[0]; int a[6]; somma_ricorsiva(a, 0, 5)=a[0] + somma_ricorsiva(a, 1, 5); 0 1 2 3 4 5 inf inf+1 sup

Soluzione 2 #include <stdio.h> #define DIM 10 int somma_ricorsiva (int a[ ], int inf, int sup) { if (inf == sup) return a[inf]; else return a[inf] + somma_ricorsiva (a, inf+1, sup); main ( ) { int sum; int mio_array [DIM]; inizializza_array (mio_array, DIM); sum = somma_ricorsiva (mio_array, 0, DIM-1);

Inversione di una sequenza di caratteri Scrivere un programma che legge una sequenza di caratteri terminata da \n in ingresso e la stampa invertita usando prima una funzione iterativa void invertiinputiterativa (void) e poi una funzione ricorsiva void invertiinputricorsiva (void). Si usino le funzioni getchar e putchar.

#include <stdio.h> #define LUNGMAX 10 void invertiinputiterativa (void) /* Inverte una sequenza di caratteri letti in input. Versione iterativa */ { char parola[lungmax]; int lung = 0; int i; char ch; ch = getchar(); while (ch!= '\n' && lung < LUNGMAX){ /* lettura e memorizzazione in un array */ parola[lung] = ch; lung++; ch = getchar(); for (i = lung-1; i >= 0; i--) /* stampa della sequenza invertita */ putchar(parola[i]);

void invertiinputricorsiva (void) /* Inverte una sequenza di caratteri letti in input. Versione ricorsiva */ { char ch; ch = getchar(); if (ch!= '\n') { invertiinputricorsiva(); /* chiamata ricorsiva */ putchar(ch); /* al ritorno dalla chiamata ricorsiva viene stampato il carattere letto */ int main(void) { printf("immetti una sequenza di caratteri (lunga al piu' %d)!\n", LUNGMAX); invertiinputiterativa(); printf("\n Immetti una sequenza di caratteri (di lunghezza qualsiasi)!\n"); invertiinputricorsiva(); putchar('\n');