Laboratorio di algoritmi e strutture dati

Documenti analoghi
Laboratorio di algoritmi e strutture dati

Laboratorio di Informatica I

Laboratorio di programmazione

Uso avanzato dei puntatori Allocazione dinamica della memoria

Puntatori in C. Fondamenti di Informatica. Daniele Loiacono

Allocazione dinamica della memoria

C: panoramica. Violetta Lonati

Problemi legati all'uso dei Puntatori

Laboratorio di algoritmi e strutture dati

Stringhe e allocazione dinamica della memoria

Lezione 8: Stringhe ed array multidimensionali

Puntatori e array. Violetta Lonati

Laboratorio di algoritmi e strutture dati

Introduzione al linguaggio C Dati aggregati

Laboratorio di algoritmi e strutture dati

Laboratorio di algoritmi e strutture dati

Passare argomenti al programma

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Strutture dinamiche in heap nel linguaggio C. E.Mumolo DIA

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

Sistemi Operativi (M. Cesati)

Dati aggregati. Violetta Lonati

Introduzione al linguaggio C Puntatori

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Laboratorio di algoritmi e strutture dati

L Allocazione Dinamica della Memoria

Array. Aggragati di variabili omogenee...

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

Tipi strutturati in C. Stringhe

Allocazione dinamica memoria

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

ESEMPIO: Ordinamento di parole in un testo

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Laboratorio di algoritmi e strutture dati

Laboratorio di programmazione

Laboratorio di Algoritmi e Strutture Dati

Laboratorio di Algoritmi e Strutture Dati

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Calcolatori Ele,ronici Lezione 9 5/12/2013

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VI.2014

argomenti (Sezione 9.1 e Capitolo 13 Savitch) puntatori puntatori I PUNTATORI E LE STRUTTURE DATI DINAMICHE 1. dichiarazioni di puntatori

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Liste. Marco Alberti Programmazione e Laboratorio, A.A

Lezione 12: Allocazione Dinamica della Memoria

Puntatori. Grazie ai puntatori:

Sono variabili il cui valore corrisponde ad un indirizzo di memoria. Puntatori

Sistemi Operativi (M. Cesati)

Esercizi di programmazione in linguaggio C English Dictionary

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Fondamenti di Informatica 2

L'Allocazione Dinamica della Memoria nel linguaggio C

La copia di un file. contare di quanti caratteri sia composto il file (e quindi determinare la dimensione del file di origine)

Stringhe. Stringhe costanti. t[0] t[1] t[2] t[3] t[4] s o l e \0. Esempio. char t[5] = { l, u, n, a, \0 }; definisce l array

RELAZIONE DELLA PROVA DI LABORATORIO DI INFORMATICA

Introduzione al linguaggio C Primi programmi

Laboratorio di programmazione

Lezione 6 Selection/Insertion Sort su interi e stringhe

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

I tipi strutturati e i record in C++

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO IX.2014

Fondamenti di Informatica 2

Allocazione dinamica della memoria

LABORATORIO 6 METODI STATICI

Esercitazione di Reti degli elaboratori

Liste concatenate e allocazione dinamica

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

Strutture Dati Dinamiche

ESERCIZIO allochi staticamente un vettore V1 di 10 float e allochi dinamicamente un vettore V2 di 10 double;

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO IV.2019

Nella propria home directory creare una sottodirectory chiamata es08, in cui metteremo tutti i file C di oggi.

Primi programmi in C

Programmazione I (Classe 1)

Lezione 6 programmazione in Java

Esercitazione di Laboratorio - 5

Fondamenti di Informatica 2

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

Strutture dati concatenate

Il linguaggio C. Puntatori e dintorni

Laboratorio di Elementi di Architetture e Sistemi Operativi Esercizi del 18 Aprile 2012

da_costruire = da_costruire ^ 1; /* inserisco un bit nella prima posizione a destra */

Dati due punti sul piano calcolare la loro distanza

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

Lab 08 Stringhe e strutture

Sistemi Operativi (M. Cesati)

Esempio: quanto mi piace questo corso! qufuafantofo mifi pifiafacefe qufuefestofo coforsofo!

Stringhe in C. Alessandra Giordani Lunedì 23 aprile 2012

Laboratorio di Algoritmi e Strutture Dati

Laboratorio 1. 20/21 febbraio 2019

Transcript:

Laboratorio di algoritmi e strutture dati Docente: Violetta Lonati 1 Esercizi su array frastagliati 1.1 Indice della arola iù iccola Scrivete una funzione con rototio int smallest_word_index( char *s[], int n ) che, dato un array s lungo n di stringhe, restituisca l indice della arola iù iccola (secondo l ordine alfabetico) contenuta nell array. Per effettuare confronti tra stringhe, otete usare la funzione strcm dal file di intestazione string.h. Inizializzare un array frastagliato da standard inut uò essere doloroso; consiglio quindi di testare la vostra funzione smallest_word_index usando un main così strutturato: int main( void ) { char *dict [] = { "ciao", "mondo", "come", "funziona", "bene", "questo", " rogramma " }; int lun = 7, os; }... os = smallest_word_index ( dict, lun ); rintf( " La arola minima si trova in osizione %d.\ n", os ); return 0; Modificate le inizializzazioni di dict e lun in modo da testare la funzione con altri argomenti. 1.2 La arola minima e la arola massima Scrivete una funzione con rototio void smallest_largest( char *s[], int n, char **smallest, char **largest ) che, dato un array s lungo n di stringhe, trovi gli elementi minimo e massimo nell array (secondo l ordine alfabetico). Per effettuare confronti tra stringhe, otete usare la funzione strcm dal file di intestazione string.h. 2 Esercizi su argomenti da linea di comando 2.1 Alfabeto farfallino Quando la vostra docente di laboratorio di algoritmi era bambina, usava a volte, er comunicare con le sue amiche, uno seciale alfabeto, detto alfabeto farfallino. L alfabeto farfallino consiste nel sostituire, a ciascuna vocale, una sequenza di tre lettere della forma vocale-f-vocale. Per esemio, alla lettera a viene sostituita la sequenza afa, alla lettera e la sequenza efe e così via. Dovete scrivere un rogramma, di nome farf che, ricevendo come argomento (sulla riga di comando) una arola, ne stami la traduzione in alfabeto farfallino. Potete assumere che la stringa in inut non contenga lettere maiuscole. Provate a modificare il rogramma in modo che accetti iù arole sulla riga di comando. 1

Esemio di funzionamento $./farf mamma mafammafa $./farf aiuola afaifiufuofolafa $./farf farfalla fafarfafallafa 2.2 La arola minima e la arola massima rivisitato Provate a testare la funzione scritta er l esercizio 1.2 scrivendo un rogramma che legga da linea di comando una serie di arole e oi invochi la funzione smallest_largest assando come argomenti argv e argc (o meglio, delle esressioni che coinvolgono argv e argc: ricordate che argv[0] contiene il nome del rogramma, che non va assato alla funzione smallest_largest!). 2.3 La strana sillabazione Il rofessor Precisini, sostenendo che le regole di sillabazione della lingua italiana sono troo comlesse e iene di eccezioni, roone un nuovo e originale metodo di sillabazione. Il metodo consiste in questo: una sillaba è una sequenza massimale di caratteri consecutivi che risettano l ordine alfabetico. Per esemio, la arola ambire viene sillabata come am-bir-e: infatti la lettera a recede la lettera m, e le lettere b, i e r risettano anch esse l ordine. Analogamente, la arola sotterfugio viene sillabata come s-ott-er-fu-gio. Dovete scrivere un rogramma, di nome sillaba che, ricevendo come argomento (sulla riga di comando) una arola, la sillabi. Potete assumere che la stringa in inut sia costituita solo da lettere minuscole. Esemio di funzionamento $./sillaba amore amor-e $./sillaba scafroglia s-c-afr-o-gl-i-a 2.4 Palindrome (con argomenti da linea di comando) Scrivete una funzione che stabilisca se il suo argomento è una arola alindroma oure no, usando due untatori er scorrere la arola artendo dall inizio e dalla fine. Quindi scrivete un rogramma che stabilisca, er ciascun argomento fornito da linea di comando, se si tratta di una arola alindroma oure no. 3 Esercizi su allocazione dinamica della memoria 3.1 La vostra malloc Scrivete una funzione my_malloc che allochi memoria usando la funzione malloc della libreria standard (file di intestazione stdlib.h) e verifichi il buon esito dell allocazione. In caso di esito ositivo, la funzione deve restituire l indirizzo dello sazio allocato; in caso contrario la funzione deve stamare un messaggio di errore e rovocare la terminazione del rogramma attraverso una chiamata della funzione exit). Scrivete un analoga funzione my_realloc. 2

3.2 Rovescia Scrivete tre rogrammi che leggano una sequenza di interi e la stamino al contrario, allocando la memoria necessaria in modo dinamico attraverso l uso della funzione malloc. 1. L inut è dato da un intero n e da una sequenza di n numeri; basta una sola chiamata di malloc er allocare un vettore di dimensione n. 2. L inut è dato da una sequenza di numeri terminata da 0; non otendo revedere quanti numeri verranno inseriti, il vettore andrà ridimensionato man mano: artite da una dimensione fissata iccola (es: 2) e raddoiate la lunghezza del vettore ogni volta che questo si riemie. 3. L inut è dato da una sequenza di numeri terminata da 0, come nel caso recedente; di nuovo, il vettore andrà ridimensionato man mano: artite da una dimensione fissata (es: 15) e allungate il vettore di una lunghezza fissa (es: 10) ogni volta che questo si riemie. 3.3 Lettura di stringhe con allocazione di memoria Scrivete due funzioni che leggano da standard inut una sequenza di caratteri e la memorizzino in una stringa di dimensione oortuna allocata dinamicamente (scegliete la strategia che referite, ad esemio una di quelle rooste nell esercizio recedente): 1. char *read_line( void ) deve leggere una riga terminata da \n; 2. char *read_word( void ) deve leggere una arola di caratteri alfanumerici (nota: se il rimo carattere letto non è alfanumerico, la stringa restituita sarà la stringa vuota). Entrambe le funzioni devono restituire l indirizzo del rimo carattere della stringa memorizzata o il untatore NULL in caso di errore. 3.4 Rettangoli Aggiungete al rogramma dell esercizio 1.6 del 9 novembre una funzione che crei un nuovo rettangolo e lo inizializzi con dati inseriti dall utente, allocando la memoria necessaria attrverso l uso della funzione malloc. 4 Un esercizio un o iù elaborato: Registro di renotazione L obiettivo dell esercizio è scrivere un rogramma er gestire un registro di renotazione di osti numerati da 0 a n 1. Il valore di n (numero dei osti renotabili) è inserito dall utente all atto della creazione del registro. Un cliente è identificato da una stringa. Funzionalità da imlementare Il rogramma deve imlementare varie funzionalità. E oortuno strutturare il rogramma in funzioni e commentare ciascuna funzione indicando chiaramente cosa fa e quali arametri usa. newbook (n) Crea un nuovo registro che ermetta la renotazione di n osti, da 0 a n 1. renotazione, quest ultimo deve essere cancellato. book(k, name) Se esiste già un registro di Se il osto k è libero, renota il osto k er il cliente identificato da name. Altrimenti, stama un messaggio di errore. 3

cancel(k) Se il osto k è occuato, cancella la renotazione di k. Altrimenti, stama un messaggio di errore. move( f rom,to) Sosta il cliente dal osto f rom al osto to se ciò è ossibile (ossia, f rom è occuato e to libero). Altrimenti, stama un messaggio di errore. rintbook() Stama il contenuto del registro (osti renotati). Notate che l imlementazione in C delle recedenti oerazioni di alto livello uò richiedere l uso di arametri in iù risetto a quelli indicati. Riflettete quindi su quali siano i rototii iù oortuni da imlementare! Struttura dati Per raresentare il registro occorre usare un array book allocato dinamicamente in quanto la dimensione è stabilita durante l esecuzione del rogramma. Sia n la dimensione di book. Allora, in ogni istante del rogramma er ogni 0 k < n deve valere la seguente rorietà: - Se il osto k è renotato da w, allora book[k] è l indirizzo a un vettore contenente w. - Altrimenti, book[k] vale NULL (indirizzo 0). Anche se avete la tentazione di definire book come una variabile globale, rovate a definirla nel main e a assarla come argomento alle varie funzioni. Formato di inut e outut Il rogramma deve leggere da standard inut una sequenza di istruzioni secondo il formato nella tabella, dove k, n, f rom e to sono interi e name una arola. Riga di inut b n Oerazione newbook (n) + k name book(k, name) - k cancel(k) m f rom to f move( f rom,to) rintbook() Termina l esecuzione I vari elementi sulla riga sono searati da uno o iù sazi. Quando una riga è letta, viene eseguita l oerazione associata; le oerazioni di stama sono effettuate sullo standard outut, e ogni oerazione deve iniziare su una nuova riga. Si assume che l inut sia inserito correttamente. Conviene scrivere le istruzioni di inut in un file in.txt ed eseguire il rogramma redirigendo lo standard inut. La lettura e l interretazione dei comandi uò essere gestita con un ciclo contenente uno switch: while( ( c = getchar () )!= f ){ switch(c){ case b : // b n --> newbook(n) 4

} case + : // + k name --> book(k, name) //... case - : // - k --> cancel(k) case m : // m from to ---> move from to //.. case : // ---> rintbook() } Esemio di funzionamento INPUT b 10 + 1 Rossi + 3 Bianchi m 1 5 + 9 Verdi - 3 b 20 + 10 Mario m 1 10 m 10 11 f OUTPUT 1 --> Rossi 9 --> Verdi 9 --> Verdi REGISTER[0..19]: 10 --> Mario move(1,10): errore REGISTER[0..19]: 11 --> Mario 5