Ricerca binaria ricorsiva!

Documenti analoghi
Esercizio 1 - Soluzione

ESERCIZIO 1 ESERCIZIO 2

Esercizio 1 - Soluzione

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

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

ESERCIZIO: Lettura/Scrittura Array

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Esercizio 1. Esercizio 1 Soluzione

Esempio di Prova Scritta

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

Esercizio 1. Esercizio - 1

Fondamenti di Informatica T-1

Esercizio 1: funzione con valore di ritorno di tipo puntatore

1. Realizzare una funzione: int trovaritardatari(file *fprestiti, FILE *frate, Prestito *dest, int dim)

Esercitazione 12. Esercizi di Ricapitolazione

Esercitazione 11. Liste semplici

1. Realizzare una funzione int trovaevasori(file * fcatasto, FILE * ftasse, Lotto * dest, int dim)

Esercizio 1. Esercizio 1 - Soluzione

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

Obiettivi di questa esercitazione

Fondamenti di Informatica T-1 Modulo 2

ARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.

Laboratorio di Programmazione: Linguaggio C Lezione 21 del 19 maggio 2014

Esercizi. Stringhe. Stringhe Ricerca binaria

Esercitazione 6. Array

Stringhe e allocazione dinamica della memoria

1 (4) 2 (4) 3 (12) 4 (6) 5 (6)

ELEMENTI DI INFORMATICA LB ESERCITAZIONE (del 09/03/2007) Files, Strutture e Liste

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

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Esercizi. La funzione swapint() primo tentativo

Esercizio 1 Liste: calcolo perimetro di un poligono

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

Informatica 1. Prova di recupero 21 Settembre 2001

C: panoramica. Violetta Lonati

Lab 10 Passaggio per riferimento

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

Stringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche

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

Strutture Dati Dinamiche

Esercizio 1. Esercizio 1

Alcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli

1. Realizzare una funzione int trovaevasori(file * fcomune, FILE * ftasse, Recapito * dest, int dim)

Es. 1. interi, li stampi a video ponendo prima i numeri pari e poi i numeri dispari. Es. 1. int readlength(file *f, int *even, int *odd)

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Fondamenti di Informatica T-1, 2011/2012 Modulo 2. Prova d Esame 2A di Giovedì 12 Gennaio 2012 tempo a disposizione 2h

Programmazione I (Classe 1)

Informatica B

Esercizio 1 (15 punti)

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

Linguaggio C - Array. Array: tipo nome_array[num_elementi]

Sommario. Manipolazione sequenziale di file in C Funzioni di base per I/O di file

LA COMPLESSITA DEGLI ALGORITMI

1. Esercizio tipo per prova pratica

Fondamenti di Informatica T-1

Esercizio 1: Puntatori impiegati che sono manager

Array Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione

Esercizi di programmazione in linguaggio C English Dictionary

FUNZIONI che operano su LISTE

Il presente plico contiene 4 esercizi e deve essere debitamente compilato con cognome e nome, numero di matricola.

Esercizi Programmazione I

Complessità degli algoritmi. Obiettivi: Calcolare (valutare) la complessità di un algoritmo Confrontare algoritmi risolutivi del medesimo problema

Corso di Informatica 1 Esercitazione n. 4

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

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

È dato un file di testo PEOPLE.TXT che più di 20), una persona per riga

Politecnico di Milano - Dipartimento di Elettronica, informazione e Bioingegneria Prof. Mauro Negri

Record in C: il costruttore struct.

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Esercizio 1: calcolo insieme intersezione

Fondamenti di Informatica T-1, 2013/2014 Modulo 2. Prova d Esame 6A di Giovedì 11 Settembre 2014 tempo a disposizione 2h

Appello di Informatica B

- matrici - stringhe - file (lettura/scrittura, di testo/binari) - strutture, puntatori - allocazione dinamica della memoria (malloc)

Puntatori. Un puntatore contiene un numero che indica la locazione di memoria dove è presente la variabile puntata

Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

Programmazione di base

Esercizi di preparazione alla prova scritta

Esercizio 1 - cicli. Esercizio 1 cicli - Soluzione

Laboratorio di Algoritmi e Strutture Dati

Stringhe Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

1 (6) 2 (7) 3 (7) 4 (7) 5 (6)

Esercitazione. Argomenti che verranno trattati in questa e nella prossima esercitazione: Matrici

Parametri Formali di una Funzione e Record di Attivazione

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Fondamenti di Informatica T-1, 2010/2011 Modulo 2. Prova d Esame 5A di Mercoledì 13 Luglio 2011 tempo a disposizione 2h

int ninv; /* numero di inventario */

Precedenza e associatività. Complementi sul C - 2. Esempi. Esempi

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Le Funzioni e la Ricorsione

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

dott. Sabrina Senatore

L'Allocazione Dinamica della Memoria nel linguaggio C

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

Allocazione dinamica della memoria

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Tutorato Programmazione 1 Modulo 2

Il linguaggio C Strutture

Transcript:

ESERCIZIO: RICERCA BINARIA! Soluzione Iterativa! int ricerca_bin (int vet[], int el) {int first=0, last=n-1, med=(first+last)/2; int T=0; while ((first<=last)&&(t==0)) { if (el==vet[med]) else T=1; if (el < vet[med]) last=med-1; else first=med+1; med = (first + last) / 2; return T;! 1 Ricerca binaria ricorsiva!!" Parametri in ingresso: " Array in cui cercare " Indice first da cui partire " Indice last a cui fermarsi nella ricerca " Elemento da cercare!" Valori in uscita: " Successo della ricerca " Posizione dell elemento nell array ""I due valori sono condensabili? ""La posizione in un array è sempre maggiore o uguale a zero ""Un numero negativo può essere considerato un insuccesso nella ricerca... 2

RICERCA BINARIA RICORSIVA! int ricerca_bin (int vet[], int first, int last, int el) { int med; if (first > last) return -1; else { med = (first + last) / 2; if (el == vet[med]) return med; else if (el > vet[med]) return ricerca_bin(vet, med+1, last, el); else return ricerca_bin(vet, first, med-1, el); RICERCA BINARIA RICORSIVA# Versione compatta! int binarysearch(int vet[], int dim, int el) { int startpos; int med = dim / 2; if (vet[med] == el) return med; if (med == 0) return -1; if (el < vet[med]) { return binarysearch(vet, med, el); else { startpos = med + 1; return startpos + binarysearch(&vet[startpos], dim - startpos, el); 4

Ricerca binaria: note!!" &vet[startpos] " Indirizzo dell elemento di posizione startpos " Sotto-array parzialmente sovrapposto all array di partenza (vet) i cui elementi sono quelli compresi fra startpos (compreso) e la fine dell array!" startpos + binarysearch(&vet[startpos], dim - startpos, el); " La ricerca riparte dal sotto-array che inizia da startpos " occorre sommare la posizione di partenza al risultato della sottoricerca " la dimensione del sotto-array è dim startpos " l elemento da cercare è sempre lo stesso... 5 Il seguente programma C compila correttamente? In caso affermativo, quali sono i valori stampati a tempo di esecuzione? (si motivi opportunamente la risposta data) #include <stdio.h> void F(int v[], int pos) { int N=4; N--; *(v+pos+1) = *(v+pos+1) + *(v+pos); return; int main() { int N=4, v[5], i; { ++N; for (i=0; i<n; i++) v[i]=2*i+1; for (i=0; i<n-1; i++) if (v[i]) F(v, i); printf("adesso N vale: %d\n", N); for (i=1; i++ < (i?n:0); ) printf("%d\n", v[i-1]); return 0; 6

Il programma compila correttamente e stampa: Adesso N vale: 5 4 9 16 25 " " " la funzione F si limita a modificare il valore dell array con indice (pos+1) sommandogli il valore contenuto all indice pos, Nel main, il primo ciclo for provvede ad inizializzare l array v ai valori {1,3,5,7,9; il secondo ciclo invece invoca ripetutamente la funzione F, ed all uscita dal ciclo il vettore viene a valere {1,4,9,16,25. Infine viene stampato il il valore di N (che in seguito al preincremento inziale passa da 4 a 5), e poi con un ultimo ciclo viene stampato il contenuto del vettore v (però solo le ultime 4 posizioni). 7 Il seguente programma C compila correttamente? In caso affermativo, quali sono i valori stampati a tempo di esecuzione? (si motivi opportunamente la risposta data) #include <stdio.h> #include <stdlib.h> #define DIM 9 int Funz(char y[], int *N, int *M) { int i; (*N)++; for (i=(*n)-1; i<*n; i++) y[i] = y[*m]; return *N; int main () { char s[] = "Paperone"; char ss[dim]; int i=3, N = 2; N = (++N)-2; N = Funz(s, &N, &i); printf("n vale adesso: %d\n",n); { for (i=0; i<dim; ++i) { *(ss+i) = s[i]; printf("%c", *(ss+i)); return 0; 8

Il programma compila correttamente e stampa: N vale adesso: 2 Peperone "La funzione Funz incrementa il valore riferito da N, e poi assegna all elemento in posizione *N-1 del vettore y il valore in posizione *M; restituisce infine il nuovo valore riferito da N "Il main inizia dichiarando alcune vairabili, instanziando N a 2 e poi modificandolo con un assegnamento al valore 1 "Viene poi invocata la funzione Funz, con parametri ( Paperone,1,3); per quanto detto, viene modificato l elemento in posizione 1 ( a ), a cui viene assegnato il valore in posizione 3 ( e ) "Inifine l array s viene copiato (elemento per elemento) nell array ss, che viene poi stampato a video 9 Si consideri la seguente funzione: int funzione(float a, float b) { a = a+b; b--; if (b > 0) return funzione(a, b); else return a; Si scriva il risultato della funzione quando invocata come: funzione(2.5, 3.5) e si disegnino i corrispondenti record di attivazione (si faccia particolare attenzione al fatto che la funzione restituisce un valore intero). 10

10 10 10 10 a= 2.5 6.0 b= 3.5 2.5 a= 6.0 8.5 b= 2.5 1.5 a= 8.5 10.0 b= 1.5 0.5 a= 10.0 10.5 b= 0.5-0.5 11 Si consideri la seguente funzione W: double W(int x){ if (x<0) { x++; return W(x)+W(x/2); x++; else return -1; Si scriva il risultato della funzione quando invocata come W(-2) e si disegnino i corrispondenti record di attivazione. 12

La funzione restituisce il valore 3.00. Supponendo che la valutazione degli addendi nella somma venga fatta a partire da sinistra, si ottiene prima: -1 x= -2.0-1.0 x= -1.0 0.0 x= 0.0 poi l eliminazione dell ultimo record, e 13 dove viene fatta l ultima invocazione di W(0), con somma finale restituita alla prima invocazione di W. -2-1 x= -2.0-1.0 x= -1.0 0.0 x= 0.0 Quindi viene fatta la prima somma con risultato -2.00, restituita indietro 14

poi l eliminazione dell ultimo record, e un nuovo ulteriore record di attivazione per W(0): -3-1 x= -2.0-1.0 x= 0.0 La somma finale è restituita alla prima invocazione di W. 15 Uno dei più antichi sistemi di codificazione di messaggi segreti si basa sulla sostituzione, secondo un certo ordine, dei caratteri componenti il messaggio. Ad esempio, dato un messaggio composto dalle lettere: {a, b, c E data una chiave di sostituzione che, per ogni lettera ne associa un altra: a! x b! y c! z Il messaggio originale può essere così riscritto: {x, y, z 16

Si vuole costruire un sistema di codifica/decodifica di questo tipo, facendo le seguenti assunzioni: 1." Le lettere componenti il messaggio sono tutte minuscole, ed i messaggi non possono contenere altri caratteri che lettere (no spazi, no numeri) 2." Il codice di sostituzione è dato da un array di 26 caratteri, che viene interpretato nel seguente modo: nella posizione ad indice 0 vi è il carattere che deve sostituire la lettera a, in posizione con indice 1 vi è il carattere che deve sostituire la lettera b, etc. 17 Si strutturi la soluzione implementando due funzioni: void crypt( char source[], int length, char code[dim_alpha], char dest[]); void decrypt( char source[], int length, char code[dim_alpha], char dest[]); Ed infine si scriva un semplice main di prova. 18

void crypt(char source[], int length, char code [DIM_ALPHA], char dest[]) { int i; for (i=0; i<length; i++) { dest[i] = code[source[i] - 'a']; 19 void decrypt(char source[], int length, char code [DIM_ALPHA], char dest[]) { int i; int j; int pos= -1; for (i=0; i<length; i++) { for (j=0; j<dim_alpha && pos<0; j++) { if(source[i] == code[j]) pos = j; dest[i] = 'a' + pos; pos = -1; 20

#define DIM 256 #define DIM_ALPHA 26 int main() { char source[dim] = "abc"; char dest1[dim] = {'\0',...; char dest2[dim] = {'\0',...; char codice[dim_alpha] = "cab"; printf("originale: %s\n", source); crypt(source, 3, codice, dest1); printf("criptato: %s\n", dest1); decrypt(dest1, 3, codice, dest2); printf("de-criptato: %s\n", dest2); return 0; 21 Si vuole implementare un programma per il calcolo dell inflazione su determinati prodotti commerciali. A tal scopo ogni prodotto è rappresentato tramite una struttura item, definita da una stringa name con il nome del prodotto, e da due float old_price e new_price rappresentanti i prezzi. 22

a) Si scriva una funzione lettura() che riceva come parametri di ingresso un vettore prezzi di strutture item, la dimensione fisica max del vettore prezzi, e un puntatore a intero num che rappresenta la dimensione logica del vettore. La funzione deve leggere da standard input il nome del prodotto ed i due prezzi, e deve copiare tale informazione nella prima posizione libera nel vettore prezzi. 23 La funzione deve terminare se l utente inserisce come nome del prodotto il termine fine, oppure se viene raggiunta la dimensione fisica del vettore. La dimensione logica del vettore prezzi così riempito deve essere restituita tramite il parametro num (passato appunto per riferimento). Al termine della lettura dei dati la funzione deve restituire il valore 0. 24

b) Si scriva un programma main che, dopo aver definito un vettore di strutture item (di dimensione massima MAX_ITEM), invochi la funzione lettura () per riempire tale vettore. Il programma stampi poi a video nome e tasso d inflazione per ogni prodotto, utilizzando la formula: 25 #include <stdio.h> #include <string.h> #define DIM 21 #define MAX_ITEM 100 typedef struct { char name[dim]; float old_price; float new_price; item;... 26

int lettura (item prezzi[], int max, int * num) { char name[dim]; *num = 0; printf("inserire nome prodotto: "); scanf("%s", name); while ((strcmp(name, "fine")) && (*num < max)) { strcpy(prezzi[*num].name, name); printf("inserire old price: "); scanf("%f", &prezzi[*num].old_price); printf("inserire new price: "); scanf("%f%*c", &prezzi[*num].new_price); (*num)++;... printf("inserire nome prodotto: "); scanf("%s", name); return 0; 27 int main() { item V[MAX_ITEM]; int num, i, result; float infl; result = lettura(v, MAX_ITEM, &num); if (result!=0) { printf("problemi durante la lettura...\n"); exit(-1);... for (i=0; i < num; i++) { infl = (V[i].new_price/V[i].old_price -1)*100; printf("inflazione del prodotto %s: %6.2f%%\n", V[i].name, infl); return 0; 28