Fondamenti di Informatica

Documenti analoghi
Strutture dati. Le liste

Esempio di prova scritta di Fondamenti di Informatica

Fondamenti di Informatica AA 2016/2017

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Strutture Dinamiche. Fondamenti di Informatica

Il linguaggio C. Puntatori e Array

Fondamenti di Informatica e Laboratorio T-AB T-15 Strutture dati

Il linguaggio C. Puntatori e dintorni

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

Costo di esecuzione e complessità. Modello di costo e complessità di un algoritmo

Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Introduzione al linguaggio C Puntatori

Esercizi. La funzione swapint() primo tentativo

La programmazione nel linguaggio C

Il linguaggio C. Notate che...

Esercizio 1: funzione con valore di ritorno di tipo puntatore

Il linguaggio C Strutture

Inserimento di un elemento in coda. quale va collegato quello nuovo. ultimo. *lista 8 3. aux. ultimo. *lista 8 3. aux

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Strutture dati dinamiche in C (II)

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

PILE E CODE. Pile (stack):

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

L'Allocazione Dinamica della Memoria nel linguaggio C

Informatica 1. Prova di recupero 21 Settembre 2001

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

C: panoramica. Violetta Lonati

Fondamenti di Informatica CdL Ingegneria Meccanica A.A. 2013/14

Programmazione I - Laboratorio

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Informatica 1. Prova di recupero 15 Febbraio 2005

Laboratorio di Programmazione

ADT LISTA: altre operazioni non primitive ADT LISTA COSTRUZIONE ADT LISTA COSTRUZIONE ADT LISTA (2)

Architettura degli Elaboratori. Classe 3 Prof.ssa Anselmo. Appello del 18 Febbraio Attenzione:

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Esercitazione 11. Liste semplici

Compito di Fondamenti di Informatica

Lezione 8 Struct e qsort

Linguaggio C: Espressioni

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Hash Table. Hash Table

Esercizi Programmazione I

Fondamenti di Informatica II

Istruzioni di trasferimento dati

Algoritmi e Strutture di Dati

Linguaggi e Ambienti di Programmazione

Linguaggio C: PUNTATORI

liste ogni nodo ha un successore, tranne l ultimo della lista che ne ha zero; alberi binari ogni nodo ha zero, uno oppure due figli

1 Esercizio. 2 Esercizio

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

Linguaggio C Struct e union

Esempio di Prova Scritta

Strutture dati e loro organizzazione. Gabriella Trucco

Il linguaggio C. Puntatori e dintorni

Gestione dinamica della memoria

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

La struttura dati CODA

Informatica 3. LEZIONE 12: Liste. Modulo 1: ADT lista e implementazione basata su array Modulo 2: Lista concatenata

Utilizza i tipi di dati comuni a tutto il framework.net Accesso nativo ai tipi.net (C# è nato con.net) Concetti fondamentali:

Ricerca binaria ricorsiva!

4 Le liste collegate 4.0. Le liste collegate. 4 Le liste collegate Rappresentazione di liste 4.1 Rappresentazione di liste

Esercizio 1 Liste: calcolo perimetro di un poligono

dott. Sabrina Senatore

Fondamenti di Programmazione

INFORMATICA 1 L. Mezzalira

ESERCIZIO 1. AZ111 milano 12:34 23 AZ222 buenos-aires 12: BA333 toronto 4:15 20 KM444 madrid 10:12 100

I numeri razionali. Specifica: la sintassi. Specifica: la semantica

Introduzione al C++ (continua)

Uso avanzato dei puntatori Allocazione dinamica della memoria

I puntatori e l allocazione dinamica di memoria. Esercizi risolti

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Linguaggio C: puntatori

POINTERS. Una variabile pointer è una variabile che ha come valore un indirizzo di memoria.

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

Una breve introduzione all implementazione in C di algoritmi su grafo

ALGORITMI E STRUTTURE DATI

Informatica A a.a. 2010/ /02/2011

Fondamenti di Informatica

Consideriamo un vettore allocato dinamicamente

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

Complessità algoritmi su strutture dati (riassunto)

Alberi ed Alberi Binari

Laboratorio di Calcolatori 1 Corso di Laurea in Fisica A.A. 2006/2007

ALGORITMI DI ORDINAMENTO ALGORITMI DI ORDINAMENTO

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

Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME. 13 novembre 2006 RIGA COLONNA MATRICOLA

Fondamenti di Informatica T-1, 2015/2016 Modulo 2. Prova d Esame 3A di Venerdì 12 Febbraio 2016 tempo a disposizione 2h

Fondamenti di informatica, Sez. Ing. Informatica, Ing. Gestionale, Ing. Ambientale II prova in itinere, 29 Gennaio 2009

Algoritmi e Strutture Dati

Alberi e alberi binari I Un albero è un caso particolare di grafo

Esercizi Strutture dati di tipo astratto

Algoritmi di ordinamento. Sequential-sort, Bubble-sort, Quicksort

FONDAMENTI DI INFORMATICA

I puntatori sono tipi di variabili il cui valore rappresenta un indirizzo della memoria.

Algoritmi e Strutture Dati

Definizione Allocazione e deallocazione di variabili Allocazione e deallocazione di vettori

Cognome e Nome : Corso e Anno di Immatricolazione: Modalità di Laboratorio (Progetto/Prova) :

Algoritmi di Ricerca. Esempi di programmi Java

Linguaggio C. Esercizio 1

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

Transcript:

Esercizio 1. (3 punti) Fondamenti di Informatica PROVA SCRITTA 25 gennaio 2016 Data l istruzione assembler MIPS add $1,$2,$3, memorizzata all interno della memoria istruzioni della CPU, descrive la sua esecuzione sul processore RISC 4000. (NOTA: organizzare la descrizione per punti fondamentali; non è ncessario fare riferimento in modo dettagliato a connessioni circuitali della CPU). Esercizio 2. (6 punti) Sia ptr il puntatore ad una lista collegata con array ed indici. Scrivere l albero sintattico dell istruzione: position = &(ptr->buffer[*position].next); nell ambito delle dichiarazioni seguenti: struct list * ptr; int * position; Riportare anche le produzioni della grammatica C utilizzate nella verifica sintattica. Indicare infine gli eventuali side effects associati all esecuzione dell istruzione. Esercizio 3. (6 punti) Scrivere la funzione C che realizza l algoritmo di ricerca binaria in forma ricorsiva su un array di valori float. Esercizio 4. (7 punti) Scrivere la funzione C che realizza l algoritmo di fusione (merge) su una lista sequenziale. La funzione riceve in ingresso la lista e la dimensione del semivettore sinistro N1. (NOTA: per la copia del semivettore sinistro utilizzare un array). Esercizio 5. (8 punti) di questo esercizio preparare programma completo per prova orale Scrivere la funzione C che riceve in ingresso una lista L collegata con puntatori di valori float, un valore target (anch esso di tipo float), ed un intero N ed opera nel modo seguente: Cerca gli elementi uguali al target e rimuove dalla lista (liberando la memoria) il primo elemento successivo diverso dal target. Al massimo possono essere rimossi N elementi; Prima di liberare la memoria di un elemento rimosso copia il suo valore in un array V che deve essere restituito tra i parametri formali della funzione, insieme al numero di elementi count copiati in V. Scrivere anche la funzione di costo e la complessità della funzione. (Esempio: L=4.5, 1.3, 1.3, 3.2, 6.7, 1.3, 2.9, 5.8, 1.3, 7.1, 1.3, target=1.3, N=2 Lista finale L=4.5, 1.3, 1.3, 6.7, 1.3, 5.8, 1.3, 7.1, 1.3, vettore V=3.2,2.9, count=2).

Soluzione Esercizio 1. L esecuzione dell istruzione add $1,$2,$3 avviene come segue: Il registro PC della CPU contiene l indirizzo della memoria istruzioni dove è memorizzata l istruzione l istruzione in uscita dalla memoria è in ingresso alla CPU è suddivisa in 6 campi: o il campo codice operativo di 6 bit è inviato alla CU per essere decodificato. La CU genera è segnali di controllo per le altre component della CPU o I successivi 5 bit codificano il primo registro operando ($2) e sono in ingresso al banco dei registri o I successivi 5 bit codificano il secondo registro operando ($3) e sono in ingresso al banco dei registri o I successivi 5 bit codificano il registro destinazione ($1) e sono in ingresso al banco dei registry o 5 bit non sono utilizzati o I 6 bit finali codificano la funzione di somma richieta alla ALU I registri 2 e 3 del banco sono mandati in ingress alla ALU, sommati ed il risultato è scritto nel reistro 1 del banco. Esercizio 2. La lista è definita come segue: struct list int free; int first; int size; struct record * buffer; ; struct record float value; int next; ; Albero sintattico in forma compatta: position = &(ptr->buffer[*position].next); <id> = &(<id>-><id>[*<id>].<id>); <var> = &(<var>-><id>[*<var>].<id>); <var> = &(<expr>-><id>[*<expr>].<id>); <var> = &(<var>[<var>].<id>); <var> = &(<expr>[<expr>].<id>); <var> = &(<var>.<id>); <var> = &(<var>); <var> = &<var>; <var> = <expr>; <expr>; <statement> Produzioni della grammatica usate nella riduzione: <statement> ::= <expr>; <expr> ::= <var> <var>=<expr> &<var> <var> ::= <id> (<var>) *<expr>! <expr[<expr>]> <expr>-><id> <var>.<id>

Nell istruzione è presente un side effect dato dall operatore di assegnamento =. L effetto è quello di assegnare la variabile puntatore position con l indirzzo del campo next dell elemento di indice *position dell array buffer della variabile strutturata puntata da ptr. Esercizio 3. #include <float.h> typedef unsigned short int boolean; #define TRUE 1 #define FALSE 0 boolean binary_search_r(float * V, int N, float target) if ( N > 0 ) if ( isequal(v[n/2],target) ) if ( isgreater(v[n/2],target) ) return binary_search_r(v,n/2,target); return binary_search_r(&v[n/2+1],n-n/2-1,target); // confronto == tra float a meno della precisone di macchina boolean isequal( float a, float b ) float diff, max; diff = fabs(a-b); a = fabs(a); b = fabs(b); max = (a>b)? a : b; if ( diff <= FLT_EPSILON*max ) // confronto > tra float a meno della precisone di macchina boolean isgreater( float a, float b ) float diff, max; diff = fabs(a-b); a = fabs(a); b = fabs(b); max = (a>b)? a : b; if ( diff > FLT_EPSILON*max ) Esercizio 4.

struct list int head; int tail; int size; int * buffer; ; void merge_slist(struct list * ptr, int N1, int * tmp) int N, l, r; for(l=0; l<n1; l++) tmp[l] = ptr->buffer[(ptr->head+l)%ptr->size]; N = (ptr->tail-ptr->head+ptr->size)%ptr->size; l = 0; r = 0; while( l<n1 && r<n-n1 ) if( tmp[l] > ptr->buffer[(ptr->head+n1+r)%ptr->size] ) ptr->buffer[(ptr->head+l+r)%ptr->size] = tmp[l]; l++; ptr->buffer[(ptr->head+l+r)%ptr->size] = ptr->buffer[(ptr->head N1+r)%ptr->size]; r++; while( l<n1 ) ptr->buffer[(ptr->head+l+r)%ptr->size] = tmp[l]; l++; Esercizio 5. #include <stdlib.h> typedef unsigned short int boolean; #define TRUE 1 #define FALSE 0 struct list int value; struct list * next_ptr; ; boolean list_to_array(struct list ** ptrptr, float target, int N, float ** V, int * count) boolean delete_found; struct list * tmp_ptr; *V = (float *)malloc(sizeof(float)*n); if( *V==NULL ) *count = 0; while( *ptrptr!=null && *count<n ) delete_found = FALSE;

if ( isequal((*ptrptr)->value,target) ) ptrptr = &((*ptrptr)->next_ptr); while( (*ptrptr)->next_ptr!= NULL && delete_found == FALSE ) if(!isequal((*ptrptr)->value,target) ) delete_found = TRUE; ptrptr = &((*ptrptr)->next_ptr); if ( delete_found ) // remove the subsequent element which is not equal to target tmp_ptr = *ptrptr; *ptrptr = (*ptrptr)->next_ptr; (*V)[*count] = (*ptrptr)->value; (*count)++; free(tmp_ptr); Il caso peggiore si può esemplificare con il caso in cui N coincide con il numero di elementi della lista (è sufficiente N/2 perché è il numero massimo di elementi che è possibile cancellare) e gli elementi della lista sono alternativamante uno uguale ed uno diverso da target. In tal caso: list_to_array(n) = c 1 list_to_array(n-2) se N > 0 c 2 se N == 0 dove c 1 è il costo (costante) per eseguire un ciclo confrontando e cancellando un element, e list_to_array(n-2) è il costo per iterare su una list che ha dimensione ridotta di 2 (si avanza dell elemento corrente ed un element viene cancellato). La soluzione è nella forma list_to_array(n) = c 1*N + c 2 per cui C list_to_array = O(N).