INDICE
Parte 1: Introduzione.
Parte 2: Fasi, variabili, operatori e software.
Parte 3: Tipi di dato, direttive e primo programma.
Parte 4: Tipi di formato, prinft e scanf.
Parte 5: Istruzioni condizionali e di iterazione.
Parte 6: Funzioni e progetti su più file.
Parte 7: Puntatori e passaggio dei parametri.
Parte 8: Array, stringhe e strutture.
Parte 9: Gestione file: file di testo.
Parte 10: Gestione file: file binari.
Parte 11: Allocazione dinamica della memoria.
Parte 12: Creare ed utilizzare le liste nel C.
Parte 13: Algoritmi di ordinamento di Array.
Parte 14: Esercizi sul linguaggio C.
funzioni_utili.zip |
- Progettare e Codificare in C un programma che permetta di stabilire la stagionecorrispondente al mese inserito come intero dall’utente. Esempio: se l’utente digita 1 (Gennaio) il programma deve stampare Inverno.
- Qualora il mese sia Marzo, Giugno, Settembre e Dicembre, tutti mesi a cavallo di due stagioni, si richieda all’utente di specificare anche il giorno. Se il giorno e’ compreso tra 1 e 20 si considera la stagione precedente altrimenti quella successiva.
Soluzione_Switch.c |
Progettare e Codificare in C un programma che permetta di:
- Chiedere all’utente quanti numeri vuole inserire;
- Leggere i numeri inseriti dall’utente e calcolare la somma dei fattoriali.
Esempio:
L’utente vuole inserire 3 numeri: 4, 3, 6;
Il programma deve quindi calcolare 4! + 3! + 6! = 750
SoluzioneEs1_Cicli.c |
Esercizio 2 (cicli)
- Progettare un algoritmo che legga da terminale una sequenza di interi positivi e negativi, terminati dal valore 0 (un intero su ogni linea), e stampi la mediasolamente però degli interi positivi.
- Codificare il programma in C e scriverlo in voto.c
SoluzioneEs2_Cicli.c |
Si progettino e si realizzino due funzioni così definite:
float euro_to_dollari(float money);
float euro_to_lire(float money);
A tal fine si supponga che:
- 1 € = 0.98 $
- 1 € = 1936.27 £
Si progetti poi un programma che legga da input un valore intero, inteso come quantità di euro, e stampi la conversione in dollari ed in lire.
SoluzioneEs1_Funzioni.c |
Codificare in C la funzione:
int primo(int x);
- 1 se x è un numero primo;
- 0 altrimenti.
Si utilizzi a tal proposito l’operatore modulo (%). Si progetti quindi un programma che legga da tastiera un numero N, e stampi a video tutti i numeri primi compresi tra 0 e N.
SoluzioneEs2_Funzioni.c |
Si scriva una programma che inverta le cifre di un numero intero N usando una funzione apposita. A tal fine, si realizzi sia una versione ricorsiva, sia una versione iterativa della funzione; per esempio dato N=4325, il programma stampa: 5234.
SoluzioneEs3_Funzioni.c |
Esercizio 1 (passaggio per riferimento)
- Un sistema di cronometraggio per la Formula 1 registra i tempi in millisecondi. Tuttavia tali tempi devono essere presentati in termini di minuti, secondi e millisec.
- Creare una procedura che, ricevuti in ingresso un tempo dato in millisecondi, restituisca l’equivalente in termini di minuti, secondi, millisec. (tramite eventuali parametri passati per riferimento)
- Si realizzi un main che invochi la funzione e che, dopo aver chiesto all’utente un valore indicante una durata in millisecondi, stampi a video il tempo nel formato min:sec.millisec
SoluzioneEs_Puntatori.c |
- Creare un programma che legga da input due sequenze di interi, di lunghezza non nota a priori (al più 10), e terminate da 0. A tal scopo, si realizzi una apposita funzione.
- Si realizzi un main che invoca le funzioni, e che stampi a video tutti gli elementi del primo vettore che compaiono nel secondo vettore nella stessa posizione (cioè con lo stesso indice). Si supponga che le due sequenze abbiano la stessa lunghezza.
SoluzioneEs1_Array.c |
- Creare un programma che legga da input un numero non noto a priori di interi (al più 10) terminati da 0. Tale sequenza può eventualmente contenere numeri ripetuti. A tal fine, si realizzi una funzione apposita che riceva in ingresso un vettore (vuoto) e la sua dimensione fisica, e restituisca la dimensione logica.
- Si chieda poi l’inserimento di un valore k da cercare nell’array.
- Si realizzi una procedura che stampi a video tutti gli indici relativi alle posizioni in cui il numero k è presente nell’array. La procedura riceverà quindi come parametri l’array, la sua dimensione logica e il valore k.
SoluzioneEs2_Array.c |
- Creare un programma che legga da input due sequenze di interi, di lunghezza non nota a priori (al più 10), e terminate da 0. A tal scopo, si realizzi una apposita funzione.
- Si realizzi una funzione che, ricevuti un array e la sua dimensione, ed un elemento da cercare, restituisca il valore -1 se l’elemento non è presente nell’array; altrimenti restituisca il primo indice in cui è presente l’elemento cercato.
- Si realizzi un main che invoca le funzioni, e che stampi a video tutti gli elementi del primo vettore che NON compaiono nel secondo.
SoluzioneEs3_Array.c |
Scrivere una funzione che date tre stringhe A, B e C concateni in C il contenuto di A e B e restituisca il numero di caratteri copiati in C:
int conc(char A[],char B[],char C[]);
SoluzioneEs1_Stringhe.c |
Codice segreto nella pagina di un libro
- Sono date due stringhe, una denominata msg e una denominata secret (non più lunga di msg) di caratteri tutti minuscoli;
- Si vuole sapere se tutti i caratteri di secret sono contenuti nello stesso ordine (ma eventualmente intervallati da altri caratteri) nella stringa msg;
- In caso positivo, il programma deve restituire una copia del msg originale, dove però ad ogni lettera riconosciuta come facente parte di secret viene sostituita la lettera maiuscola.
Esempio: msg = “ma che bel castello”; secret = “cestello”
Risultato: SI e stringa “ma ChE bel caSTELLO”
SoluzioneEs2_Stringhe.c |
Si realizzi un programma C che legga da utente i dati relativi ad alcuni corsi; in particolare, per ogni corso vengono dati:
- Denominazione del corso: una stringa di 20 caratteri che riporta il nome del corso;
- Cognome del docente: una stringa di 15 caratteri che rappresenta il cognome del docente del corso;
- Iscritti: un intero che indica il numero di studenti che frequentano il corso.
Il programma deve stampare la denominazione del corso e il cognome del docente, relativi a tutti i corsi che hanno il numero di iscritti maggiore o uguale alla mediaaritmetica degli iscritti (calcolata su tutti i corsi).
SE AD ESEMPIO L’UTENTE INSERISCE:
analisi obrecht 55
informatica milano 40
geometria ferri 37
La media e’ di 44 quindi il programma stampa:
analisi obrecht
SoluzioneEs1_Strutture.c |
Una compagnia di autobus che effettua servizio su lunghe distanze vuole realizzare un programma di controllo delle prenotazioni dei posti. A tal scopo rappresenta ogni prenotazione tramite una struttura booking contenente nome del cliente (al massimo 1023 caratteri, senza spazi) e numero del posto prenotato (un intero).
a) Le prenotazioni effettuate vengono registrate tramite un array (di dimensione prefissata DIM) di strutture booking, di dimensione logica iniziale pari a 0. Si realizzi il modulo C gestione.h/gestione.c, con la struttura dati booking e le seguenti funzioni:
- int leggi(booking * dest);
La funzione legge da input una struttura di tipo booking, e provvede a memorizzarla in dest. La funzione deve restituire 1 se è stata letta una nuova prenotazione, 0 altrimenti (cioè nel caso in cui il nome del passeggero è “fine”).
- int assegna( booking list[], int dim, int * lengthList,char * name,int pref);
La funzione riceve in ingresso l’array di prenotazioni e la sua dimensione fisica e logica, e poi il nome del cliente ed il posto da lui indicato. La funzione deve controllare che il posto indicato non sia già stato assegnato, ed in caso contrario deve restituire il valore 1.
Qualora invece il posto sia ancora libero, la funzione deve assegnare tale posto al cliente copiando i dati della prenotazione nell’ultima posizione libera nell’array, e deve provvedere ad aggiornare correttamente la dimensione logica dell’array. In questo secondo caso la funzione deve invece restituire come valore uno 0, indicante il successo nella prenotazione. Al fine di copiare il nome del cliente, si utilizzi la funzione di libreria:
char * strcpy(char * s, char * ct);
b) Si realizzi un programma main (file main.c) che chieda all’operatore il nome di un utente, e di seguito il posto prescelto (a tal fine si usi la funzione di cui al punto a). Il programma deve cercare di registrare la prenotazione tramite la funzione assegna; qualora l’operazione di prenotazione fallisca (perché il posto risulta essere già assegnato), il programma provveda a chiedere all’operatore un nuovo posto, finché non si riesca ad effettuare la prenotazione.
Qualora l’operatore inserisca il nome “fine”, il programma deve terminare; qualora invece venga inserita la stringa “stampa”, il programma deve stampare a video le prenotazioni già effettuate. A tal scopo si usi la funzione di libreria:
int strcmp(char * ct, char * cs);
SoluzioneEs2_Strutture.zip |
Sia dato il file di testo “dati.txt” contenente i dati relativi agli studenti immatricolati al primo anno della Facoltà di Ingegneria In particolare, le informazioni sono memorizzate nel file “dati.txt” come segue: ognuna delle linee del file contiene i dati relativi ad un nuovo studente; in particolare:
- Matricola: un intero che indica il numero di matricola dello studente;
- CdL: un intero che indica il corso di laurea (CdL) dello studente (es. 2145).
Sia dato un secondo file di testo, “indirizzi.txt” che contiene, invece, l’indirizzo di ogni studente, e in particolare, in ogni linea, separati da uno spazio:
- Matricola: il numero di matricola dello studente (un intero);
- Nome: il nome dello studente, al più 20 caratteri senza spazi;
- Cognome: il cognome dello studente, al più 30 caratteri senza spazi;
- Via: una stringa di al più 30 caratteri senza spazi, che riporta la via dello studente;
- Città: una stringa che riporta la città dello studente, al più 30 caratteri senza spazi;
- CAP: un intero che rappresenta il codice di avviamento postale dello studente.
Si scriva un programma in linguaggio C che:
- A partire dai file “dati.txt” e “indirizzi.txt” costruisca una tabella T contenente, per ogni studente, Matricola, Nome, Cognome, Via, Città, CAP e CdL;
- A partire dalla tabella T, e dato da input un intero C che rappresenta un CdL, stampi la percentuale di studenti (rispetto al numero totale delle matricole) iscritti al corso C [Ad esempio, se il numero totale delle matricole è 1000, e quello degli studenti iscritti a C è 200, il programma stamperà “20%”];
- Scriva su un terzo file di testo “bologna.txt”, nome, cognome e numero di matricola di tutti gli studenti che abitano a Bologna.
SoluzioneEs1_File.zip |
Sono dati due file di testo anagrafe.txt e fatture.txt che contengono, rispettivamente, i dati anagrafici di alcuni clienti e l’elenco delle fatture.
Più precisamente, ogni riga di anagrafe.txt contiene, nell’ordine:
- Codice Cliente (numero intero), uno e un solo spazio di separazione;
- Nome del cliente (30 caratteri senza spazi), uno e un solo spazio di separazione;
- Città (non più di 20 caratteri senza spazi), uno e un solo spazio di separazione.
Ogni riga di fatture.txt contiene, nell’ordine:
- Codice Cliente (numero intero), uno e un solo spazio di separazione;
- Numero della fattura (numero intero), uno e un solo spazio di separazione;
- Importo della fattura (numero reale), uno e un solo spazio di separazione;
- Un carattere (‘p’ se la fattura è stata pagata, ‘n’ altrimenti), terminatore di riga.
Questi ad esempio sono i due file:
anagrafe.txt:
1 Chesani Bologna 2 Bellavista Bologna 3 Mello Bologna |
fatture.txt:
1 23 54.00 p 1 24 102.00 n 3 25 27.00 p 1 26 88.00 n |
Il programma si suddivide così:
- Si scriva una procedura load() che riceva come parametri di ingresso due puntatori a file di testo e restituisca come parametri di uscita un vettore y contenentestrutture debito (nome cliente, importo) e il numero degli elementi N inseriti in y: questo vettore deve contenere solo i dati relativi a fatture non pagate;
- Si scriva un programma C che, utilizzando la procedura load() precedentemente definita, inserisca in un vettore debitori (supposto di dimensione massima DIM=100) le strutture debito di cui sopra, derivanti dai file anagrafe.txt e fatture.txt;
- Il programma chieda poi all’utente il nome di un cliente e stampi il numero difatture (non pagate) intestate a tale cliente e la somma totale degli importi dovuti.
SoluzioneEs2_File.c |
È dato un file di testo PEOPLE.TXT che contiene i dati di una serie di persone (non più di 20), una persona per riga. Si vuole realizzare un programma che, una volta letti da file i dati di queste persone, ne estragga l’insieme di persone compatibili con una nuova persona data, salvando il risultato sul file binario PARTNERS.DAT. Tenere conto che due persone sono compatibili se sono di sesso diverso e la differenza di età, riferita solo all’anno, non supera i 5 anni.
Ogni riga del file people.txt contiene, nell’ordine:
- cognome (non più di 20 caratteri);
- un separatore ‘;’ ;
- nome (non più di 20 caratteri);
- un separatore ‘;’ ;
- data di nascita nel formato gg/mm/aaaa;
- uno e un solo spazio;
- un carattere (‘M’ o ‘F’) che indica il sesso.
Si definisca opportunamente una struttura dati persona di tipo struct.
Realizzare le seguenti funzioni:
- una funzione lettura(…) che, dato il nome del file (e se servono altri parametri), legga i dati delle persone dal file e li metta in un array di persona di nome elenco;
- una funzione compatibili(…) che, date due persone, restituisca vero solo se le due persone sono compatibili;
- main() che invochi lettura per acquisire le persone, poi chieda all’utente i dati di una nuova persona per scrivere infine su file binario l’insieme delle persone compatibili con la persona data.
esercizio3_file.zip |
Un negozio di noleggio CD registra, tramite un PC collegato al registratore di cassa, i dati relativi al noleggio dei Compact Disc. Per ogni utente che restituisce un disco, su un file di testo di nome “RentedLog.txt” viene scritto su ogni riga, in ordine:
- un intero cd_code, identificativo univoco di un cd;
- una stringa, contenente il nome del cliente (al più 64 caratteri, senza spazi);
- un intero days, che indica la durata in giorni del noleggio.
Dopo aver definito opportunamente una struttura rent per contenere tali informazioni, il candidato realizzi un programma che chieda all’utente il nome di un cliente e il numero massimo di record che si vogliono ottenere, e stampi a video la lista dei CD noleggiatidal cliente, subito seguito dalla durata media di un noleggio per tale cliente:
- Il candidato scriva una funzione readRented(…) che riceve in ingresso il nome di un file di testo, il nome di un utente, un puntatore a strutture rent (che punta ad un’area di memoria opportunamente allocata in precedenza) e la dimensionemassima di tale area di memoria (in termini di numero di strutture di tipo rent). La funzione apra il file e salvi in memoria (tramite il puntatore ricevuto come parametro) i record relativi all’utente specificato (per controllare se un record è relativo al cliente specificato, si utilizzi la funzione strcmp(…)). La funzione restituisca il numero di record effettivamente letti, che deve risultare minore o uguale alla dimensione massima specificata. Qualora si raggiunga la dimensione massima di record letti prima di aver terminato il file, si ignorino i record rimanenti;
- Il candidato realizzi poi un programma C che chieda inizialmente all’utente il nomedi un cliente e il numero massimo di elementi su cui si vuole effettuare la statistica. Dopo aver allocato dinamicamente memoria sufficiente secondo le istruzioni ricevute dall’utente, il programma utilizzi la funzione readRented(…) per ottenere i dati relativi al determinato cliente. Si stampi a video poi, in ordine, per ogni CD noleggiato, il nome del cliente, il codice del CD e la durata del noleggio;
- Si stampi infine la durata media del noleggio.
SoluzioneEs1_AllocazioneDinamica.c |
Si scriva una funzione ricorsiva crossSelection() che, ricevute in ingresso due liste di interi positivi l1 e l2, restituisca una terza lista (eventualmente non ordinata) contenente gli interi di l2 che sono nelle posizioni indicate dai valori di l1 (si assuma per convenzione che il primo elemento di una lista sia in posizione 1).
Ad esempio, date due liste: l1=[1,3,4] e l2=[2,4,6,8,10,12], la lista risultante deve contenere gli elementi di l2 che sono in prima, terza e quarta posizione, cioè: [2,6,8].A tal scopo si realizzi una funzione ricorsiva di supporto select() che, ricevuti in ingresso una lista e un intero positivo rappresentante una posizione, restituisca l’intero della lista posto alla posizione specificata. La funzione deve restituire -1 qualora l’intero passato non corrisponda a nessuna posizione valida (si assuma comunque positivo l’intero passato). Le funzioni crossSelection() e select() devono essere realizzate in modoricorsivo, utilizzando il tipo di dato astratto list.
SoluzioneEs1_Liste.zip |
Un file di testo ARCHIVIO.TXT contiene i dati (primo autore, titolo, numero di copie possedute, numero di copie in prestito) relativi ai differenti volumi conservati presso una biblioteca. Ogni riga del file contiene nell’ordine, separati da uno spazio bianco:
- autore (al più di 20 caratteri senza spazi);
- titolo (al più di 50 caratteri senza spazi);
- numero_possedute (intero);
- numero_prestito (intero).
Si realizzi un programma C che:
- Legga il contenuto di ARCHIVIO.TXT e costruisca in memoria centrale un vettore V di strutture corrispondenti (si supponga che il file ARCHIVIO.TXT non possa contenere più di 30 righe). Si stampi a video il contenuto del vettore;
- A partire da V, costruisca una lista L di interi contenente per ciascun volume ilnumero di copie disponibili nella biblioteca, ovvero la differenza fra il numero di copie possedute e il numero di copie in prestito. Si stampi a video la lista L;
- Utilizzando L per ottenere la somma delle copie disponibili e V per la somma delle copie possedute, calcoli il rapporto fra volumi disponibili e volumi posseduti;
- Utilizzando la lista di interi L, stampi il numero di riga di ARCHIVIO.TXT relativo al volume con più copie disponibili. In caso di più volumi con pari numero di copie disponibili, qualunque riga relativa a questi ultimi è una risposta corretta.
Ad esempio:
contenuto di ARCHIVIO.TXT
Salinger IlGiovaneHolden 10 8
Wallace InfiniteJest 12 3
Carver Cattedrale 12 12
Baricco Seta 6 0
Hornby ComeDiventare 9 9
Sartre LaNausea 3 1
Robbins NaturaMorta 7 7
Stampa di L:
[2, 9, 0, 6, 0, 2, 0]
SoluzioneEs2_Liste.zip |
Un negozio di videogame vuole automatizzare parte della propria gestione. Il negozio salva mensilmente lo stato dei propri articoli su un file di testo e traccia su un secondo file di testo tutte le vendite effettuate. Lo scopo del programma è:
- Costruire una lista per i videogiochi aggiornandone il numero di copie disponibili in seguito alle vendite;
- Generare una lista di videogiochi acquistabili da bambini;
- Salvare in un file di testo gli ordini da effettuare per riportare il magazzino ad avere un certo numero di copie per ogni gioco.
Ogni riga del file memorizza lo stato mensile e contiene i dati di un videogioco:
- codice intero;
- titolo, possibilmente contenente spazi, di esattamente 30 caratteri;
- carattere di identificazione del tipo di gioco (‘P’ = picchiaduro, ‘A’ = avventura, ‘R’ = rompicapo, ‘O’ = altro);
- numero di copie disponibili;
- voto medio dato dagli utenti.
In un secondo file di testo il negozio tiene traccia dei videogiochi venduti nell’arco del mese. Ogni riga del file contiene il codice identificativo di un gioco venduto (una singola copia); potrebbero esserci delle righe del file con codici errati (vanno saltate).
Implementare le seguenti funzioni:
- void printGames(list games);
Deve stampare il contenuto di una lista di videogiochi (si realizzi la funzione ricorsivamente usando le primitive).
- boolean loadFromFile(char *fileName, list *games);
Realizza la lista di videogiochi di partenza prendendo i dati dal file di nome fileName.
- boolean updateAvailability(char *fileName, list games);
Aggiorna il numero di copie dei videogiochi, leggendo le vendite dal file di nome fileName. Se trova un codice non “riconosciuto”, stampa un messaggio di warning.
- list gamesForKids(list games, float threshold);
Restituisce la lista di videogiochi acquistabili da un bambino nel mese corrente. Si adotti la seguente politica per scegliere se un videogioco è acquistabile da un bambino:
- Sono acquistabili unicamente i giochi disponibili (il numero di copie è positivo);
- I picchiaduro non sono acquistabili da un bambino;
- Tutti i giochi di avventura sono acquistabili da un bambino;
- Per gli altri giochi, si indichino solo quelli per cui il voto medio dagli utenti è superiore alla soglia data.
- Boolean saveOrdersToFile (char *fileName, list games, int qty);
Salva i codici, i titoli e il numero di copie da ordinare per ogni videogioco (si realizzi la funzione iterativamente usando le primitive). Si adotti la seguente politica:
- I quantitativi da ordinare devono riportare tutti i giochi alla quantità decisa qty;
- Ovviamente, quindi, un videogioco è presente nella lista solo se per esso è effettivamente necessario ordinare copie aggiuntive.
SoluzioneEs3_Liste.zip |
Dottore in Ingegneria Informatica.
Contattatemi sui miei Social Network e sul mio Sito personale per collaborazioni, proposte di lavoro e altre informazioni!