Corso di Laurea in Matematica

Documenti analoghi
Corso di Informatica 1 (IN110) Tutorato n. 4

Esercizio 1: media di numeri reali (uso funzioni e struct)

Alcuni Soluzioni. Fornire la specifica di un algoritmo risolutivo utilizzando lo pseudocodice visto a lezione.

FUNZIONI. attribuire un nome ad un insieme di istruzioni parametrizzare l esecuzione del codice

Esercizio 1: funzione con valore di ritorno di tipo puntatore

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Programmazione ricorsiva: cenni

Introduzione alla Ricorsione

Programmazione ricorsiva.

Informatica B

acquisizione numero elementi del primo insieme e del secondo insieme, finché elprimoinsieme oppure elsecondoinsieme > EL_INS

Informatica B

Esercizio 1: calcolo insieme intersezione

Cominciamo con un esempio... Utilizzando un sottoprogramma 16/12/2017

Corso di Informatica 1 Esercitazione n. 4

Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);

Fondamenti di Informatica L-A

Programmazione ricorsiva

Informatica 1. Prova di recupero 21 Settembre 2001

Esercitazioni di Fondamenti di Informatica - Lez. 5 30/10/2018

Informatica A (per gestionali) A.A. 2004/2005. Esercizi di programmazione C Stringhe Ricerca binaria

Ricorsione: C era una volta un Re

(*lista == NULL (*lista)->info >= elem) accede al campo next di *lista solo se *lista non e' NULL. */ #include <stdio.h> #include <stdlib.

Esercizio 1 File: ordinamento di un archivio di studenti (file binario)

RICORSIONE. Informatica B - A.A. 2013/2014

Esercitazione 6. Array

INFORMATICA - CdL in FISICA. COMPITO del 28/05/2003 SOLUZIONI PROPOSTE

Aritmetica dei puntatori

giapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL

Astrazione sui Dati Vettori di variabili

Esercizio 1: Puntatori impiegati che sono manager

Java: esempi di programmazione

Java: esempi di programmazione

Algoritmi di ordinamento

Corso di Laurea in Matematica

Esempi di programmazione in C

Corso di Informatica 1 Esercitazione n. 2

- Dispensa IV - PROGRAMMAZIONE C (Parte II)

Laboratorio di Informatica I

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

Elementi di Informatica e Programmazione Allievi Ingegneria Informatica, Elettronica e delle Telecomunicazioni, Automazione Industriale

Università degli Studi di Verona. Esercizi. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Lezione 6: Array e puntatori

- int nbrani = 0; //numero di brani presenti in archivio. int creaplaylist(tipobrano[] playlist, int n, TipoGenere g, TipoFile t);

Informatica (A-K) 14. Linguaggio C -4

Algoritmi di ordinamento

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 28 Gennaio 1999 PROVA SCRITTA

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

Lezione 8: Stringhe ed array multidimensionali

Array. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali

ESERCIZIO: SHIFT ARRAY (1)

Laboratorio di informatica Ingegneria meccanica

Esercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf

Ricorsione. Libro cap. 5 (da 5.14 in poi)

Corso di Laurea in Matematica. LABORATORIO DI INFORMATICA Compito Totale - 21 Marzo Soluzione degli Esercizi

Fondamenti di Informatica

char *s; s = (char *) malloc(5*sizeof(char)); scanf( %s, s); Stringhe

Esercizio 1: calcolo del massimo di una sequenza (versione 1)

Linguaggio C: Array Valeria Cardellini

Esercitazione Matrici e Struct

Fondamenti di Informatica: Ingegneria Meccanica Prova scritta del 12 luglio 2008

Opinione calcolamedia( ) Opinione inverti( )

Anche se due variabili vettore sono dello stesso tipo, NON è possibile l assegnamento diretto:

ESERCIZIO: Lettura/Scrittura Array

Esercizi. Stringhe. Stringhe Ricerca binaria

Ricerca in una sequenza ordinata

Ricorsione. Lucidi a cura di Gianpaolo Cugola, Carlo Ghezzi, Gian Pietro Picco Dipartimento di Elettronica e Informazione

Le strutture /3. Riprendiamo ora la struttura definita alcune lezioni fa e completiamo il set di funzioni che servono per gestire un elenco di libri.

Laboratorio di Algoritmi e Strutture Dati

Prima prova di esonero 2 novembre 2015

Allocazione dinamica memoria

Esercizi di programmazione in linguaggio C Ricerca

Esercizio 1. float m; //media dei voti int vett_voti[max]; //array che contiene i voti di uno studente

Esercitazioni di Prog. II (funzioni su insiemi) Chiara Petrioli

FONDAMENTI DI PROGRAMMAZIONE ESERCITAZIONI Corso di Laurea in MATEMATICA a.a. 2018/19

La ricorsione. Induzione nel progetto e nella verifica di programmi ricorsivi. Le forme della ricorsione

Informatica B

Esercitazione 7. Soluzione:

Esercitazione 2. Corso di Fondamenti di Informatica

PARTE

#include <stdio.h> #include <stdlib.h> //necessaria per la malloc #include <string.h> // costante #define MAX_L 30

if(vocale == true && stringa[i+1] == stringa[i]){ cont++; printf("la vocale ripetuta e' %c\nil numero di coppie e' %d\n", stringa[i], cont); }

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

Algoritmi di ordinamento e ricerca. Classe SelSort.java

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

Esercitazione 11. Liste semplici

Corso di Laboratorio di Sistemi Operativi A.A

Fondamenti di Informatica 1 - Compito A

Politecnico di Milano - Facoltà di Ingegneria INFORMATICA A - Corso per allievi GESTIONALI - Prof. C. SILVANO A. A. 2003/ novembre 2003

Ricorsione. Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna

INFORMATICA 2010/11 - CdL in FISICA TERZO APPELLO 8/09/2011: SOLUZIONI PROPOSTE

Università degli Studi di Verona. Esercizi (seconda parte) Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

Informatica (A-K) 5. Algoritmi e pseudocodifica

Ambienti di Programmazione per il Software di Base

Sistemi operativi A, Unix+C, 26/09/2017. Nome: Cognome: Matricola:

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Pascal: esempi di programmazione

Transcript:

Corso di Laurea in Matematica Laboratorio di Informatica (a.a. 2003-04) Esercizi di programmazione in C: funzioni e procedure 1 Docente: Monica Nesi Nota Nelle soluzioni di alcuni degli esercizi riportati si suppone di avere le seguenti direttive e definizioni globali: #include <stdio.h> #define lung 10 typedef enum false,true boolean; Esercizi 1. Scrivere una funzione che, dati un intero n ed un array di interi a, restituisce true se n occorre in a, false altrimenti. boolean occorre (int n, int a[], int l) if (n == a[i]) return true; return false; Scrivere una funzione che, dati un intero n ed un array di interi a, restituisce il numero delle occorrenze di n in a. int occorrenze (int n, int a[], int l) int i, conta; conta = 0; if (n == a[i]) conta = conta+1; return conta; Scrivere una funzione che, dati un intero n ed un array di interi a, restituisce la posizione della prima occorrenza di n in a (se n occorre in a), altrimenti restituisce 1. int posizione (int n, int a[], int l) int i, pos; pos = 1; 1 Si prega di segnalare ogni eventuale errore all indirizzo di posta elettronica monica@di.univaq.it. 1

if (n == a[i]) return pos; pos = pos+1; return -1; Utilizzando tutte le funzioni finora definite, si può avere il seguente programma in C: main() int a[lung]; int i, num, c, p; boolean occorre (int n, int a[], int l); /* prototipo funzioni */ int occorrenze (int n, int a[], int l); int posizione (int n, int a[], int l); i = 0; scanf("%d%d", &num, &a[i]); while (a[i]!= 0 && i < lung) i = i+1; scanf("%d", &a[i]); /* i = lunghezza sequenza */ if (occorre(num,a,i)) c = occorrenze(num,a,i); p = posizione(num,a,i); printf("il numero %d occorre nella sequenza %d volte e la sua prima occorrenza si trova in posizione %d della sequenza.\n", num, c, p); printf("il numero %d non occorre nella sequenza.\n", num); boolean occorre (int n, int a[], int l) if (n == a[i]) return true; return false; int occorrenze (int n, int a[], int l) int i, conta; conta = 0; if (n == a[i]) conta = conta+1; return conta; int posizione (int n, int a[], int l) 2

int i, pos; pos = 1; if (n == a[i]) return pos; pos = pos+1; return -1; 2. Scrivere una funzione che, dato un numero intero positivo n, restituisce true se n è un numero primo, altrimenti restituisce false. boolean primo (int n) int cont; boolean div; if (n == 1) return false; cont = 2; div = false; while (cont <= n/2 &&!div) if (n%cont == 0 ) div = true; cont = cont+1; if (div) return false; return true; 3. Scrivere due funzioni che, dati due numeri interi positivi, restituiscono, rispettivamente, il loro massimo comun divisore ed il loro minimo comune multiplo. int MCD (int n, int m) int x, y; x = n; y = m; while (y!= x) if (y > x) y = y-x; x = x-y; return x; int mcm (int n, int m) int cont, prodotto; boolean trovato; prodotto = n*m; trovato = false; if (n > m) cont = n; 3

cont = m; while (cont < prodotto &&!trovato) if (cont%n == 0 && cont%m == 0) trovato = true; cont = cont+1; return cont; 4. Scrivere una funzione che calcola il fattoriale di un numero naturale n. int fattoriale (int n) /* Soluzione iterativa */ int f, i; if (n < 0) return -1; f = 1; for (i=1; i<=n; i++) f = f*i; return f; int fattric (int n) /* Soluzione ricorsiva */ if (n < 0) return -1; if (n == 0) return 1; return n*fattric(n-1); 5. Scrivere una funzione che calcola l n-esimo numero di Fibonacci: fib(0) = 1 fib(1) = 1 fib(n) = fib(n 2) + fib(n 1) n>1 int fibonacci (int n) /* Soluzione iterativa */ int fib, x, i, temp; if (n < 0) return -1; fib = 1; x = 0; for (i=1; i<=n; i++) temp = x+fib; x = fib; fib = temp; return fib; int fibric (int n) /* Soluzione ricorsiva */ if (n < 0) return -1; if (n < 2) return 1; return fibric(n-2) + fibric(n-1); 4

6. Scrivere due funzioni che, dato un array di interi a, restituiscono, rispettivamente, il valore minimo ed il valore massimo di a. Nota: le versioni ricorsive scorrono l array dall ultimo elemento fino al primo. Il parametro l indica la prima posizione libera nell array e coincide con la lunghezza dell array se l array è stato tutto riempito. int minimo (int a[], int l) /* Soluzione iterativa */ int i, min; i = 0; min = a[0]; while (i < l) if (a[i] < min) min = a[i]; i = i+1; return min; int minimoric (int a[], int l) /* Soluzione ricorsiva */ int minimoricaux (int a[], int i, int min); return minimoricaux(a,l-1,a[l-1]); int minimoricaux (int a[], int i, int min) if (i < 0) return min; if (a[i] < min) min = a[i]; return minimoricaux(a,i-1,min); int massimo (int a[], int l) /* Soluzione iterativa */ int i, max; i = 0; max = a[0]; while (i < l) if (a[i] > max) max = a[i]; i = i+1; return max; int massimoric (int a[], int l) /* Soluzione ricorsiva */ int massimoricaux (int a[], int i, int max); return massimoricaux(a,l-1,a[l-1]); int massimoricaux (int a[], int i, int max) if (i < 0) return max; 5

if (a[i] > max) max = a[i]; return massimoricaux(a,i-1,max); 7. Scrivere una funzione che, dato un array di interi (non vuoto), restituisce true se l array è ordinato in modo non decrescente, altrimenti restituisce false. boolean nondecr (int a[], int l) /* versione iterativa */ i = 0; while (i < l-1) if (a[i] > a[i+1]) return false; i = i+1; return true; boolean nondecrric (int a[], int l) /* versione ricorsiva */ boolean nondecrricaux (int a[], int l, int i); return nondecrricaux (a,l,0); boolean nondecrricaux (int a[], int l, int i) if (i == l-1) return true; if (a[i] > a[i+1]) return false; return nondecrricaux(a,l,i+1); 8. Scrivere una procedura che, dato un array di interi a ed un intero n, inserisce n nella prima posizione libera di a. Soluzione con variabili globali typedef int MioArray[lung]; MioArray a; int cont; main() int n; void inserisciint (int n); /* prototipo procedure */ void stampamioarray(); cont = 0; scanf("%d", &n); while (n!= 0 && cont < lung) inserisciint(n); scanf("%d", &n); /* cont = lunghezza sequenza */ 6

printf("l array e il seguente:\n"); stampamioarray(); void inserisciint (int n) if (cont < lung) /* condizione sempre verificata dal main */ a[cont] = n; cont = cont+1; printf("array pieno"); void stampamioarray() for (i=0; i<cont; i++) printf("%d ",a[i]); printf("\n"); Soluzione con parametri di tipo puntatore main() int n, cont; int a[lung]; void inserisciint (int x, int a[], int l, int *pcont); void stampaarray (int a[], int l); cont = 0; scanf("%d", &n); while (n!= 0 && cont < lung) inserisciint(n,a,lung,&cont); scanf("%d", &n); /* cont = lunghezza sequenza */ printf("l array e il seguente:\n"); stampaarray(a,cont); void inserisciint (int x, int a[], int l, int *pcont) if (*pcont < l) a[*pcont] = x; *pcont = *pcont + 1; printf("array pieno"); 7

void stampaarray (int a[], int l) printf("%d ",a[i]); printf("\n"); 9. Scrivere una procedura che, dato un array di interi a ordinato in modo non decrescente ed un intero n, inserisce n in a in modo tale che l array risultante sia ancora ordinato in modo non decrescente (ordinamento di un array per inserimento). void inserisciord (int n) /* Soluzione con variabili globali */ /* MioArray a; int cont; */ int i,j; boolean trovato; if (cont < lung) i = 0; trovato = false; while (i < cont &&!trovato) /* si ricerca la posizione in */ if (a[i] <= n) /* cui inserire l elemento */ i++; trovato = true; for (j = cont; j > i; j--) /* si spostano gli elementi in */ a[j] = a[j-1]; /* posiz. > i a partire dall ultimo */ a[i] = n; /* si inserisce l elemento */ cont++; printf("array pieno"); 10. Scrivere una procedura che, dato un array di interi, lo ordina in modo non decrescente (ordinamento di un array per selezione). void sort (int a[], int l) int k, minpos; int minpos (int a[], int l, int from); void swap (int a[], int i, int j); for (k=0; k< l; k++) minpos = minpos(a,l,k); if (minpos!= k) swap(a,minpos,k); int minpos (int a[], int l, int from) int minpos, i; minpos = from; for (i=from+1; i<l; i++) 8

if (a[i] < a[minpos]) minpos = i; return minpos; void swap (int a[], int i, int j) int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; 11. Scrivere una funzione che, dato un array di interi a ed un un intero n, restituisce la posizione di n in a se n occorre in a, altrimenti restituisce -1. (Simile alla funzione posizione che però conta la posizione a partire da 1.) int ricercaseq (int n, int a[], int l) /* ricerca sequenziale o lineare */ int i, pos; /* versione iterativa */ pos = 0; if (n == a[i]) return pos; pos = pos+1; return -1; int ricercaseqric (int n, int a[], int l) /* versione ricorsiva */ int ricercaseqricaux (int n, int a[], int l, int i); return ricercaseqricaux(n,a,l,0); int ricercaseqricaux (int n, int a[], int l, int i) if (i == l) return -1; if (a[i] == n) return i; return ricercaseqricaux(n,a,l,i+1); 12. Scrivere una funzione che, dato un array di interi a ordinato in modo non decrescente ed un intero n, restituisce la posizione di n in a se n occorre in a, altrimenti restituisce -1. int ricercaseqord (int n, int a[], int l) /* ricerca sequenziale o lineare */ i = 0; while (i < l) if (a[i] < n) i = i+1; if (a[i] == n) return i; return -1; 9

return -1; int ricercabin (int v, int a[], int l) /* ricerca binaria */ int from, to, mid; /* versione iterativa */ from = 0; to = l-1; while (from <= to) mid = (from+to)/2; if (a[mid] == v) return mid; if (a[mid] < v) from = mid+1; to = mid-1; return -1; int ricercabinric (int v, int a[], int l) /* versione ricorsiva */ int ricercabinricaux (int v, int a[], int from, int to); return ricercabinricaux(v,a,0,l-1); int ricercabinricaux (int v, int a[], int from, int to) int mid; if (from > to) return -1; mid = (from+to)/2; if (a[mid] == v) return mid; if (a[mid] < v) return ricercabinricaux(v,a,mid+1,to); return ricercabinricaux(v,a,from,mid-1); 13. Scrivere una funzione ricorsiva che, dato un array di interi (non vuoto), restituisce true se ogni elemento dell array (tranne il primo) è il triplo dell elemento che lo precede, altrimenti restituisce false (versione con funzione ricorsiva di un esercizio della prova intermedia del 13/2/2003 ). boolean triplo (int a[], int l) boolean triploric (int a[], int l, int i); return triploric (a,l,1); boolean triploric (int a[], int l, int i) 10

if (i == l) return true; if (a[i]!= 3*a[i-1]) return false; return triploric(a,l,i+1); oppure scorrendo l array dall ultimo al primo elemento ed utilizzando solo l, parametro che indica la prima posizione libera dell array: boolean triploa (int a[], int l) if (l == 1) return true; if (a[l-1]!= 3*a[l-2]) return false; return triploa(a,l-1); 14. Scrivere una procedura ricorsiva che, dati tre interi i, j ed n (n 2), stampa una sequenza di n numeri, i cui primi due elementi sono i e j, ed ogni elemento successivo è uguale al prodotto dei due elementi che lo precedono nella sequenza (versione con procedura ricorsiva di un esercizio della prova intermedia del 13/2/2003 ). void prodottoelem (int i, int j, int n) void prodottoelemric (int i, int j, int n, int k); printf("%d %d", i, j); prodottoelemric(i,j,n,2); void prodottoelemric (int i, int j, int n, int k) if (k == n) printf("\n"); printf(" %d", i*j); prodottoelemric(j,i*j,n,k+1); 15. Scrivere una procedura ricorsiva che, dato un array di interi a, stampa la sequenza di quegli elementi che compaiono esattamente una volta in a nello stesso ordine in cui compaiono nell array (versione con procedura ricorsiva di un esercizio della prova intermedia del 13/2/2003 ). void occorr1 (int a[], int l) void occorr1ric (int a[], int l, int i); occorr1ric(a,l,0); void occorr1ric (int a[], int l, int i) int conta (int n, int a[], int l); if (i == l) printf("\n"); 11

if (conta(a[i],a,l) == 1) printf("%d ", a[i]); occorr1ric(a,l,i+1); int conta (int n, int a[], int l) int contaric (int n, int a[], int i, int k); return contaric(n,a,l,0); int contaric (int n, int a[], int i, int k) if (i == 0) return k; if (a[i-1] == n) k++; return contaric(n,a,i-1,k); 16. Scrivere una procedura ricorsiva che stampa le mosse che risolvono il problema delle torri di Hanoi (vedere Esercizio 8.3 del testo di riferimento per una descrizione di tale problema). Si supponga di indicare con i numeri 1, 2 e 3 i pioli di sorgente, tramite e destinazione. Sia n il numero dei dischi da spostare. main() int n; void hanoi (int n, int s, int d, int t); scanf("%d", &n); printf("le mosse per %d dischi sono le seguenti:\n", n); hanoi(n,1,3,2); void hanoi (int n, int s, int d, int t) if (n == 1) printf("sposta disco da piolo %d a piolo %d\n", s, d); hanoi(n-1,s,t,d); hanoi(1,s,d,t); hanoi(n-1,t,d,s); 17. Scrivere una procedura ricorsiva che, data una stringa s, stampa tutti gli anagrammi di s. #include <stdio.h> #include <string.h> #define lung 10 12

main() int contatore; char s[lung]; void anagrammi (char prefix[], char s[]); scanf("%s", &s); printf("anagrammi:\n"); anagrammi("",s); void anagrammi (char prefix[], char s[]) if (strlen(s) == 1) printf("%s%s\n",prefix,s); for (i=0; i<strlen(s); i++) char sub1[lung]; char sub2[lung]; /* Primo argomento */ strcpy(sub1,prefix); strncat(sub1,s+i,1); /* Secondo argomento */ strncpy(sub2,s,i); sub2[i]= \0 ; strcat(sub2,s+i+1); /* Chiamata ricorsiva */ anagrammi(sub1,sub2); 13