Mostrare le funzionalità di base dei puntatori (e l'aritmetica dei puntatori)
Soluzione C
Esercizi
Si scriva una funzione in grado di ritornare (il puntatore a) un duplicato di una struct ricevuta come parametro. La struttura da copiare viene ricevuta 'by value'.
Soluzione
La soluzione proposta alloca una struttura, vi copia il contenuto della stringa src, e duplica la stringa nome.
Si ripeta l'esercizio precedente, supponendo che la struttura da copiare venga ricevuta 'by reference'.
Esercizi
Scrivere un programma in cui il vettore v[3]=(1,2,3) venga modificato tramite l'utilizzo di puntatori in modo tale da diventare v[3]=(1,20,3) [almeno due modi diversi].
Soluzione
Scrivere un programma che richiede in input due interi decimali e li scambia. Per questo definire una funzione "scambia" (usare il passaggio di parametri per indirizzo).
Soluzione
Scrivere un programma che prenda interi da tastiera e ne calcoli il massimo, utilizzando i puntatori (in particolare: il passaggio di puntatori a funzione).
Soluzione
Scrivere un programma che ordina n numeri casuali con il metodo bubblesort, in modo che due elementi del vettore vengano scambiati con l'utilizzo dei puntatori.
Soluzione
Scrivere un programma che chieda in input due numeri interi. Definire due puntatori, uno per ogni numero intero, e visualizzare in output il valore dei puntatori prima e dopo averli invertiti.
Soluzione
Scrivere un programma che chieda in input N numeri interi (con N definito dall'utente) e li memorizzi in un vettore. Calcolare la somma dei numeri interi inseriti usando unicamente l'aritmetica dei puntatori (non si quindi mai accedere al vettore con v[i]). Stampare in output il valore della somma degli elementi del vettore.
Soluzione
Realizzare una funzione che restituisce vero se la stringa in input è palindroma. Una stringa si dice palindroma se leggendola da destra verso sinistra è uguale a se stessa.
Soluzione
Realizzare una funzione che restituisce vero se la stringa in input è palindroma. Una stringa si dice palindroma se leggendola da destra verso sinistra ignorando gli spazi bianchi è uguale a se stessa.
Soluzione
Una stringa contiene nome e cognome di una persona separati tra loro da uno o più spazi. Una seconda stringa contiene il soprannome di una persona, e può eventualmente contenere degli spazi.
Si scriva una funzione C che prende in ingresso due stringhe del tipo suddetto e restituisce una nuova stringa in cui tra il nome ed il cognome è inserito il soprannome tra parentesi tonde. Nella nuova stringa, sia tra il nome e la parentesi aperta che tra la parentesi chiusa ed il cognome deve essere presente uno (ed un solo) spazio.
Ad esempio, se le due stringhe sono "Bruce Springsteen" e "The Boss", la stringa restituita deve essere: "Bruce (The Boss) Springsteen".
Soluzione
Sia dato un vettore di interi presente in memoria. Si scriva una funzione C (utilizzando solamente i puntatori) che ricevendo il vettore e la sua dimensione restituisca la media degli interi presenti nel vettore non considerando gli eventuali duplicati. Ad esempio, se il vettore contiene gli interi 7 6 4 6 la funzione deve restituire il valore 5.6, ovvero la media di 7, 6 e 4.
Soluzione
Scrivere una procedura che ricevuto un array di caratteri modifichi il vettore in modo che ogni vocale venga sostituita dal simbolo '$'.
void dollarize(char arr[], int dim);
Soluzione
Scrivere una funzione che prende in input due stringhe s1(sorgente), s2(destinazione). Al termine della funzione s2 deve essere la copia invertita di s1.
Soluzione
Scrivere una funzione che prenda in input una stringa s1(sorgente) e la modifichi restituendo la copia invertita di s1 (inversione sul posto).
Soluzione
Si scriva una funzione in grado di confrontare due stringhe, ritornando un risultato compatibile con la funzione strcmp, salvo il fatto che si devono ignorare le differenze tra caratteri maiuscoli e minuscoli. Si utilizzi una scansione delle stringhe basata su puntatori.
Si noti che non è ammesso convertire le stringhe in maiuscolo (o minuscolo), né utilizzare altre stringhe (in cui copiare le stringhe (convertendolo in maiuscolo/minuscolo).
Soluzione
Esercizi con malloc() e free().
Si scriva una funzione in grado di creare (e ritornare) una stringa data dalla concatenazione di due stringhe, ricevute come parametri. La stringa generata va allocata dinamicamente.
Soluzione
Realizzare un insieme di funzioni [isEmpty(), print(), append(key, value), insertByKey(key, value), deleteByKey(key), searchByKey(key)] in grado di gestire una lista semplicemente concatenata.
Soluzione
Realizzare un insieme di funzioni [isEmpty(), print(), append(key, value), insertByKey(key, value), deleteByKey(key), searchByKey(key)] in grado di gestire una lista doppiamente concatenata.
Soluzione
Scrivere una funzione che prenda in input una stringa s1(sorgente) e la modifichi restituendo la copia invertita di s1 (usare una area temporanea per effettuare lo scambio).
Soluzione
Dichiarare due variabili intere, e due puntatori coerenti. Puntare a tali variabili, quindi verificare che i due indirizzi sono differenti fra loro,mediante un semplice confronto fra i puntatori.
Soluzione
Dichiarare due stringhe di uguale dimensione. Acquisire in una stringa una sequenza di caratteri, quindi copiare, usando i puntatori, tutti i caratteri dalla stringa acquisita all'altra, accedendo in modo indiretto (cioè attraverso un puntatore) a ciascuna delle locazioni delle due stringhe.
Soluzione
Scrivi un programma basato sulla tecnica dell'accesso indiretto (cioè attraverso un puntatore) ad un vettore per realizzare una lista di interi inseriti da tastiera, l'inserimento deve proseguire fin tanto che non viene inserito il numero 0, poi la lista viene stampata. Realizza un secondo programma che affidi ad una funzione, l'operazione di stampa .
Soluzione
Scrivi un programma basato sulla tecnica dell'accesso indiretto (cioè attraverso un puntatore) ad un vettore per realizzare una lista di interi inseriti da tastiera, l'inserimento deve proseguire fin tanto che non viene inserito il numero 0 come nel caso precedente, ma deve essere effettuato da una funzione esterna chiamata dal main() , la lista deve poi essere ritornata al main() che la deve stampare.
Soluzione
Scrivi un programma per realizzare una lista di interi inseriti da tastiera, l'inserimento deve essere effettuato da una funzione (push) che inserisce un elemento in fondo alla lista. Il programma deve prevedere la presenza di una funzione (pop) che toglie l'ultimo elemento inserito dall'utente nella lista, implementando così una struttura a pila.
Soluzione
Scrivi un programma per realizzare una lista di interi inseriti da tastiera, l'inserimento deve essere effettuato da una funzione (push) che inserisce un elemento in fondo alla lista. Il programma deve prevedere la presenza di una funzione (pop) che toglie un elemento scelto dall'utente, presente nella lista, la stessa funzione si occuperà di riorganizzare la struttura dopo tale operazione.
Soluzione
Basandosi sull'algoritmo della lista a puntatori, realizzare una pila di interi che preveda una funzione di push per inserire un nuovo elemento, una funzione pop per estrarre l'ultimo elemento inserito e una funzione print per stampare la pila.
Soluzione
Basandosi sull'algoritmo della lista a puntatori, realizzare una coda di interi che preveda una funzione di push per inserire un nuovo elemento, una funzione pop per estrarre il primo elemento inserito e una funzione print per stampare la coda.
Soluzione
Scrivi un programma che memorizzi una lista a puntatori di interi, dotata delle tre funzioni push, pop e print (per stampare) che permetta di togliere un elemento basandosi su un indice e assumendo che il primo elemento abbia indice 0.
Soluzione
Letta in input una sequenza di numeri interi positivi memorizzarla in una lista. Costruire una seconda lista contenente soltanto gli elementi della prima lista che non siano numeri primi. Stampare la seconda lista.
Letta in input una lista, costruire una seconda lista con gli elementi disposti al contrario rispetto alla lista originale (es.: se la lista letta in input è 1→8→4 viene costruita la lista 4→8→1). Stampare la seconda lista.
Lette in input due liste di numeri interi ognuna delle quali ordinata, costruire una terza lista di numeri interi ordinata, ottenuta mediante la “fusione” delle prime due. Stampare la lista.
Letta in input una lista di numeri interi stamparla e poi ordinarla utilizzando l’algoritmo SELECTION SORT. Stampare la lista ordinata.
Leggere in input una sequenza di n numeri floating point e rappresentarla con una lista L; stampare la lista. Costruire una seconda lista L′ composta dai soli elementi di L maggiori della media; stampare L′.
Leggere in input una sequenza di numeri interi ordinati in ordine crescente. Dopo aver memorizzato la sequenza in una lista, inserire nella posizione corretta all’interno della lista, tutti i numeri mancanti. Stampare in output la lista. Non devono essere usate altre liste o array di appoggio.
Esempio: Supponiamo che sia fornita in input la sequenza 4, 7, 8, 9, 15, 17, 21. Dopo aver memorizzato gli elementi nella lista 4→7→8→...→21, vengono inseriti i numeri mancanti, ottenendo la lista composta dagli elementi 4→5→6→7→8→...→19→20→21.