Esercizi in C con soluzione ( Informatica )

Tali verifiche sono state trovate si GitHub e appartengono alla

 Fondamenti di Informatica - Ingegneria delle Telecomunicazioni – Prof. Maristella Matera



Esercizio 1 – Liste dinamiche (8 punti)

Scrivere una funzione in C che data una lista dinamica la modifichi eliminando tutti gli elementi di posizione pari nella sequenza.

Soluzione Esercizio 1




Esercizio 2 – File e liste dinamiche (14 punti)

Una compagnia di assicurazioni memorizza i dati sulle polizze RC-auto e sugli incidenti dei propri clienti in due file distinti.

Il file con le informazioni sulle polizze memorizza:

- nome del cliente

- la targa del veicolo (stringa di 7 caratteri)

- la classe di merito: un intero tra 0 e 10


Il file con le informazioni sugli incidenti memorizza:

- la targa del veicolo coinvolto nell’incidente

- la data dell’incidente (in un formato a scelta)

- un carattere (“S” o “N”) che indica se il veicolo è stato responsabile dell’incidente (“S”) o lo ha subito (“N”).


La compagnia di assicurazione periodicamente aggiorna le classi di merito dei clienti in base alle informazioni pervenute sugli incidenti: se il veicolo è stato responsabile di un incidente, la classe di merito viene incrementata di 1 fino a un massimo di 10.


1. (7 punti) Si scriva una funzione in C che riceve come parametro il nome di un file che memorizza le informazioni sugli incidenti e, in base ai dati letti dal file, costruisce e restituisce all’ambiente chiamante una lista dinamica che per ogni veicolo (rappresentato dalla sola targa) memorizza il numero degli incidenti in cui il veicolo è stato responsabile.


2. (7 punti) Si scriva una funzione in C che riceve come parametri la lista creata al punto precedente e un file che memorizza le informazioni sulle polizze e crea un nuovo file in cui si riversano le informazioni sulle varie polizze con la classe di merito aggiornata.

Soluzione esercizio 2




Esercizio 3 – Funzioni ricorsive (8 punti)

1. (4 punti) Si scriva una funzione ricorsiva che, data una lista dinamica che memorizza valori interi, stampi i soli valori di posizione pari nella lista. Il primo elemento della lista è in posizione 1.

2. (4 punti) Si scriva una funzione ricorsiva in C che, dato un array di interi, calcoli e restituisca come valore di ritorno il valore massimo dell’array.

Soluzione esercizio 3





Esercizio 4 – Liste dinamiche (10 punti)

Sia data una lista dinamica che memorizza una sequenza di abbreviazioni (per esempio, “SI”, “MI”, “PC”) e per ognuna di esse le corrispondenti parole estese (per esempio, “Sistema Informativo”, “Milano”, “Per Conoscenza”). Ogni nodo della lista è quindi una struttura definita nel seguente modo:

struct nodo {

 char sigla[2];

 char parola[20];

 struct nodo *next;

}

Si scriva una funzione in C che riceve come parametri il puntatore alla testa della lista (la lista non deve essere creata, si suppone che esista già in memoria), una abbreviazione e la parola corrispondente e ricerca l’abbreviazione nella lista; quindi:

1. Se la sigla non è presente nella lista, inserisce in coda alla lista un nuovo elemento per memorizzare la sigla e la parola estesa ricevute come parametro e restituisce 0; per esempio, se la lista contiene le coppie sopra citate (<“SI”, “Sistema Informativo” >, <“MI”, “Milano” >, <“PC”, Per Conoscenza>) e la sigla da cercare è “CC”, allora la funzione restituirà il valore 0.

2. Se la coppia <sigla, parola> è presente nella lista, la funzione restituisce 1; per esempio se la funzione riceve come parametri “SI” e “Sistema Informativo” allora restituisce il valore 1;

3. Se la sigla è contenuta nella lista ma è associata a una parola differente, la funzione restituisce 2; per esempio, data la lista precedente, se la funzione riceve come parametri “SI” e “Sicurezza Informatica”, allora restituisce il valore 2.

Soluzione Esercizio 4




Esercizio 5 – Funzioni in C e lettura da file (10 punti)

Si supponga di avere a disposizione un file che memorizza una sequenza (di lunghezza ignota) di valori interi.

Nel file i diversi valori sono separati da uno spazio.

Si scriva una funzione in C che riceve come parametri il nome del file (una stringa) e due valori interi, v1 e v2 (con v1 minori v2), e modifichi il file nel modo seguente:

- i valori minori di v1 devono essere memorizzati tutti all’inizio del file.

- i valori maggiori o uguali a v1 e minori di v2 devono essere memorizzati tutti al centro del file.

- i valori maggiori o uguali a v2 devono essere memorizzati alla fine del file.

L’ordine all’interno di ciascuna partizione del file deve rimanere lo stesso che nel file iniziale; cioè le partizioni non devono essere ordinate.

Per esempio, se il file iniziale contiene la sequenza:

2 5 21 8 10 1 4 16 3

e i valori di v1 e v2 sono rispettivamente 3 e 9, il file diventa 2 1 5 8 4 3 21 10 16

N.B.: è possibile far uso di strutture dati di appoggio per creare le tre partizioni prima di memorizzarle nel file.

Soluzione Esercizio 5




Esercizio 6 – Funzioni ricorsive (8 punti)

1. (4 punti). Scrivere una funzione ricorsiva in C che, ricevuto come parametro un valore intero n, calcoli i numeri interi T(n) definiti dalle seguenti relazioni:

T(0) = 0, T(1) = 1

T(n) = 2T(n − 2) + 5 per n ≥ 2

2. (4 punti). Scrivere una funzione ricorsiva in C che, ricevendo come parametri un array a di interi positivi, la sua dimensione n, e un valore val, restituisca 1 se tutti gli elementi dell’array sono maggiori di val, 0 altrimenti.

Soluzione Esercizio 6





Esercizio 7 – Matrici (10 punti).

Si scriva un programma in C, completo di opportune dichiarazioni, che:

 1. Acquisisca in input i valori di una matrice quadrata di interi, m1, di dimensione NxN (N costante predefinita).

 2. Costruisca una nuova matrice della stessa dimensione, m2, in cui ogni elemento m2[i][j] è dato dalla media degli 2N-1 valori disposti sulla i-esima riga e j-esima colonna di m1.

     m2

 Ʃ

 3. Stampi la nuova matrice, m2, per righe.

 Suggerimento: attenzione a non includere due volte il valore m1[i][j] nel calcolo del valore di m2[i][j].

Soluzione Esercizio 7





Esercizio 8 - Struct (7 punti).

1. Si definisca in C un tipo di dati in grado di rappresentare i dati della carriera di uno studente universitario:

 - Dati anagrafici: matricola (un valore intero), nome, cognome, indirizzo.

 - Dati sugli esami: lista degli esami nella carriera dello studente (si supponga che gli esami siano 30). Per ogni esame è necessario memorizzare il codice (un intero), il nome dell’esame e la votazione conseguita (un intero). Per gli esami non sostenuti si riporta il valore -1, per quelli non superati il valore -2.


2. Si scriva una funzione in C che riceve come parametri una struttura dati del tipo definito al punto 1 (che rappresenta i dati di un singolo studente) il codice di un esame e il voto conseguito dallo studente in questo esame. Quindi, modifica la struttura dati aggiungendo il nuovo voto conseguito dallo studente. Infine, restituisce all’ambiente chiamante la struttura dati aggiornata.

Soluzione esercizio 8




Esercizio 9 – Funzioni in C e lettura da file (12 punti)

Il quadrato di Polibio è una tecnica di cifratura del testo inventata dal celebre storico greco. La chiave per cifrare il testo è data da una matrice, char key[5][5], che memorizza in un ordine casuale le 25 lettere dell'alfabeto (I e J usano la stessa codifica). Per ottenere la cifratura di una parola, si sostituisce ogni lettera con le relative coordinate nella matrice, giustapposte in modo da formare un numero intero di due cifre.

Sia per esempio data la matrice key sotto riportata, in cui per semplicità le lettere sono memorizzate in ordine alfabetico. In base a tale matrice, la cifratura della parola mare è: <32, 11, 42, 15>.

 1  2   3   4   5

 1  A   B   C   D   E

 2  F   G   H   I,J K

 3  L   M   N   O   P

 4  Q   R   S   T   U

 5  V   W   X   Y   Z

Infatti: M = key[3,2]; A = key[1,1]; R = key [4,2], E = key[1,5].

N.B.: Le coordinate usate nella cifratura partono da 1, mentre gli indici per scandire la matrice devono partire da 0!

Supponendo di dover cifrare un testo contenuto in un file, definire una funzione avente il seguente prototipo:

void polybius(FILE *fp, char key[][5], int *cifratura)  che, a partire da:

- il file puntato da fp, che contiene un testo lungo massimo N caratteri (spazi inclusi), con N costante nota a priori e definita nella parte dichiarativa del programma;

- la matrice quadrata key di dimensione 5 x 5 che contiene la chiave di cifratura, costruisca l’array di interi, cifratura, in modo che questo memorizzi, secondo lo schema sopra descritto, la cifratura del testo letto dal file. Gli eventuali spazi presenti nel testo sono codificati nell’array con il valore 0. Si assuma inoltre che nel testo non siano inclusi segni di punteggiatura e caratteri diversi da quelli presenti nella matrice.




Esercizio 10 – Funzioni ricorsive (8 punti)

Sia data una matrice quadrata di dimensione NxN, con N costante dichiarata nella parte dichiarativa globale del programma. 

Scrivere una funzione ricorsiva in C che restituisca il valore 1 se la matrice possiede almeno due righe consecutive uguali, 0 altrimenti.

Soluzione esercizio 10




Esercizio 11 – Funzioni ricorsive (8 punti)

Dato un array A di n interi, si scriva una funzione che ricorsivamente calcoli il minimo tra le differenza di ogni elemento con il precedente. Nel calcolo delle differenze si esclude il primo elemento (che non ha elementi precedenti). 

Se l’array ha un solo elemento, la funzione restituisce il valore di quell’ elemento. A ed n devono essere i due soli parametri della funzione.

Soluzione esercizio 11




Esercizio 12 – Liste dinamiche in C (10 punti)

Si vuole gestire in C una lista dinamica in cui ogni elemento memorizza un valore intero, il puntatore all’elemento successivo, il puntatore all’elemento della lista con valore minimo.

L’inserimento di nuovi elementi avviene in testa. A ogni inserimento, è necessario ricalcolare il minimo della lista e, in caso di nuovo valore, aggiornare i puntatori corrispondenti negli elementi della lista.

1. Definire in C le strutture dati per rappresentare ogni singolo nodo e la lista.

2. Codificare la funzione di inserimento, definendo opportuni parametri e valori di ritorno. Si consiglia distrutturare il codice della funzione in modo che faccia uso di altre funzioni ausiliarie.

Soluzione esercizio 12




Esercizio 13– Gestione dei File in C (8 punti)

Sia dato un file che memorizza dati sulle operazioni effettuate su un conto corrente bancario. Ciascuna operazione è memorizzata su una singola riga del file. I dati memorizzati in ogni riga sono:

 • La data nel formato gg/mm/aa;

 • L’importo dell’operazione(un numero reale positivo);

 • Il simbolo “+” o “–“ per indicare che l’operazione costituisce una entrata o una uscita. Un esempio di file secondo tale formato è il seguente:

 10/01 1500.00 +

 20/01 200.00 -

 05/02 120.10 -

 10/02 3000.00 +

 ......

Si scriva una funzione in C che, ricevuto come parametro il nome di un file, nomefile, e una soglia di credito, s, produca in output dei messaggi con le date in cui il saldo è sceso sotto la soglia s e con il valore del saldo in quelle date. Nel caso in cui, in base ai movimenti memorizzati nel file, il saldo non scenda mai sotto tale valore, la funzione deve mostrare a video semplicemente il saldo.

Soluzione esercizio 13



Esercizio 14. Gestione dei File e Matrici (14 punti)

 La soluzione di un cruciverba può essere memorizzata in un file organizzato nel seguente modo:

 - La prima riga contiene due numeri interi: il numero di righe e il numero di colonne del cruciverba;

 - Le righe successive corrispondono alle righe del cruciverba; le caselle nere sono codificate come asterischi.

 Di seguito si riporta un esempio di schema di cruciverba memorizzato nel file:

 SUGLI*

 ODIATI

 TIRI*N

 TRI*CD

 OE*POI

 Definire un programma in C in grado di leggere dal file lo schema del cruciverba e scrivere in un secondo file, chiamato parole.txt, l’elenco delle parole, sia orizzontali, sia verticali, che hanno bisogno di una definizione (cioè le sole parole di lunghezza >=2). Il file parole.txt dovrà memorizzare prima tutte le parole orizzontali (una per riga), quindi una riga vuota, e infine tutte le parole verticali (una per riga). Per esempio, dato lo schema del cruciverba riportato sopra, il file parole.txt dovrà memorizzare:

 SUGLI

 ODIATI

 TIRI

 TRI

 CD

 OE

 POI

 SOTTO

 UDIRE

 GIRI

 LAI

 IT

 CO

 INDI

 Si scriva un programma in C che riceve come argomento sulla linea di comando il nome del file che memorizza lo schema del cruciverba; quindi scrive nel file parole.txt l’elenco delle parole di lunghezza >= 2, così come illustrato nell’esempio precedente. Si assuma che la dimensione massima di un cruciverba sia 20 × 20.

 Il programma deve essere realizzato in modo modulare, scomponendolo almeno nelle seguenti funzioni:

 1. La funzione main con passaggio come argomento della linea di comando del nome del file con lo schema del cruciverba (3 punti);

 2. Una funzione che legge il cruciverba dal file trasferendone il contenuto in un’opportuna struttura dati (4 punti);

 3. Una o più funzioni per la ricerca delle parole nella struttura dati costruita al punto precedente e scrittura nel file parole.txt (7 punti).





Esercizio 15. Liste dinamiche (10 punti)

 Sia data una lista dinamica che memorizza dati riguardanti le quotazioni in borsa di alcune aziende. Gli elementi della lista rispettano la seguente definizione di tipo:

 typedef struct nodo{

 char nomeAzienda[41]; float quotazione; float variazione; struct nodo * next;

 } aziendaQuot;

 **La lista è ordinata in base al nome dell’azienda.**

 Si definisca una funzione in C che riceve come parametri la testa della lista, il nome di un’azienda e un valore per l’ultima quotazione in borsa dell’azienda, e cerchi nella lista il nodo riguardante l’azienda:

 - Se il nodo esiste, la funzione aggiorna il valore della quotazione e memorizza inoltre la variazione (differenza) rispetto al valore precedente nel campo variazione.

 - Se il nodo non esiste, lo crea e lo inserisce nella posizione opportuna della lista, rispettando l’ordinamento alfabetico. La variazione in tal caso sarà uguale a 0.

 La funzione restituisce il puntatore alla testa della lista (che potrebbe essere modificato da un inserimento in testa).

Soluzione esercizio 15




Esercizio 16. Funzioni ricorsive (8 punti)

Sia dato un array di valori interi, tutti maggiori di zero. Definire una funzione ricorsiva che conta le “vette”, cioè gli elementi dell’array che sono maggiori di tutti gli elementi a essi successivi.

Per esempio, l’array {10, 3, 4, 5, 1, 2} contiene due vette, 10 e 5, quindi la funzione per questo array restituirebbe il valore 2. Se l’array è vuoto o contiene un solo elemento, allora la funzione restituisce il valore 0.

Soluzione esercizio 16



Esercizio 17. Funzioni ricorsive (8 punti)
Si definisca una funzione ricorsiva in C che, dato un intero n passato come parametro, costruisce per l’ambiente chiamante una stringa che rappresenta la codifica binaria di n (con i bit significativi allineati a sinistra). 

Si assuma che l’intero che la funzione riceve come parametro sia rappresentabile su un numero N (costante) di bit definito a priori.




Esercizio 18. Uso di File e Liste Dinamiche (19 punti)

 Un numero n si dice Primo Troncabile a Sinistra (PTS) se n e tutti i numeri ottenuti cancellando ripetutamente le sue cifre più a sinistra sono primi. Per esempio, 313 è un PTS; infatti, 313 è primo, 13 è primo (è stata cancellata la prima cifra a sinistra), 3 è primo (sono state cancellate le prime due cifre a sinistra).

 Si definisca un programma in C in grado di leggere dal file una sequenza di interi e memorizzare in una lista dinamica ordinata i soli elementi che sono PTS. Il file è organizzato in modo da contenere un intero per ogni riga. Il nome del file deve essere letto come argomento della linea di comando con cui si esegue il programma.

 Il programma deve essere realizzato in modo modulare, scomponendolo almeno nelle seguenti funzioni:

 1. La funzione main, con passaggio come argomento della linea di comando del nome del file contenente gli interi (3 punti);

 2. Una funzione per verificare se un intero letto dal file è PTS. Tale funzione può anche far uso di altre funzioni, per esempio quella per verificare che un numero sia primo (8 punti).

 3. Una funzione che legga dal file gli interi e memorizzi i soli PTS in una lista dinamica. L’inserimento deve avvenire in ordine, in modo che nella lista risultante gli interi siano elencati in ordine crescente (8 punti);

Soluzione esercizio 18

Commenti