Data: 2023/03/26

Tags: C, esercizi, lezione 3, funzioni libreria string.h, nuovi tipi (struct, union, enum, typedef), allocazione dinamica della memoria

Riassunto

Soluzioni degli esercizi assegnati durante la lezione 3, tenuta il 21 Marzo 2023.

Soluzioni

Esercizio 1

Scrivere una funzione che, sfruttando funzioni della libreria string.h, rimuova tutte le occorrenze di una sottostringa fornita dall’utente. Si assume che tutte le stringhe siano terminate da ‘\0’.
Hint: La funzione non dovrebbe avere valore di ritorno e dovrebbe accettare i seguenti parametri: (a) la stringa originale su cui operare, (b) la sottostringa di cui si desidera la rimozione, (c) un puntatore ad una stringa da fornire in output.
Esempio: (a) “ciao ciao ciao”, (b) “o” → (c) “cia cia cia”

Esercizio 2

Scrivere due funzioni che verifichino che gli indirizzi di memoria di puntatori a membri di una struct siano diversi, mentre gli indirizzi di memoria di puntatori a membri di una union siano uguali.
Hint: la format string per puntatori è “%p”; entrambe le funzioni accettano due argomenti: (a) un puntatore a struct oppure un puntatore a union, rispettivamente, e (b) un puntatore a funzione che implementi l’operazione di confronto (per struct testa ugualianza tra indirizzi, per union testa disuguaglianza); gli indirizzi di memoria devono essere confrontati tramite le funzioni della libreria string.h.

Esercizio 3

Assumendo una single linked list composta da Element (dichiarato come negli esempi), scrivere le funzioni insertAt e removeAt tali che: (1) insertAt → inserisce un elemento in una qualsiasi posizione, fornita dall’utente come indice (analogo ad array); (2) removeAt → rimuove un elemento in una qualsiasi posizione, fornita dall’utente come indice (analogo ad array).
Hint: 1 (head) -> 2 -> 3 -> 4; insertAt(head, 5, 1) → 1 (head) -> 5 -> 2 -> 3 -> 4; removeAt(head, 0) → 5 (head) -> 2 -> 3 -> 4; prestare attenzione ai valori di ritorno delle funzioni e come usarli

Esercizio 4

Implementare una doubly linked list ed annesse funzioni tali che: (1) Supporti elementi int, float, e char[10] – una lista comunque conterrà elementi di tipi omogenei; (2) Supporti le funzioni insertAt e removeAt definite come all’Esercizio 3 ed opportunamente modificate per l’uso in una doubly linked list; (3) Implementi una funzione apply tale che accetti un puntatore a funzione fnPtr ed una direzione (enum Dir{ FRONT, BACK}; ): se FRONT, fnPtr viene applicato a tutti gli elementi scorrendo la lista dall’inizio alla fine, e in ordine inverso se la direzione è invece BACK.

Hint: è necessario effettuare controlli specifici per evitare elementi di tipi diversi all’interno di una lista; il puntatore a funzione fornito ad apply deve aver accesso solo ad un singolo elemento, potenzialmente con la possibilità di modificarlo; può essere utile definire una nuova struct che rappresenti la lista stessa, evitando la gestione diretta di elementi