Indice
Esercizi strutture e stringhe
Esercizio 1: Archivio studenti
Scrivere un programma C che legge una sequenza di studenti dal file anagrafe_studenti.txt
.
Ogni studente e' memorizzato su file in una singola linea contenente tre stringhe di caratteri separate da ':' e terminata da '\n' secondo il formato
cognome:nome:numero_di_matricola
quindi ad esempio
... Rossi:Mario:234445 Bixio:Nino:435678 Garibaldi:Giuseppe:787899 ...
Il programma legge da file gli studenti e memorizza i dati relativi a ciascun studente in un array di strutture di tipo:
#define N 50 typedef struct { char nome[N+1]; char cognome[N+1]; unsigned matricola; } studente_t;
L'array viene poi ordinato per il campo cognome
e nel caso di cognomi uguali per il campo nome
e poi stampato sullo standard output.
Suggerimento: Per la lettura da file usare fscanf()
con una opportuna stringa di formattazione oppure fgets()
per leggere fino al primo \n
e strchr()
per localizzare i caratteri separatori :
Esercizio 2: La linea di comando: ''argc'' e ''argv''
In C e' possibile accedere agli argomenti passati sulla linea di comando tramite la i parametri della funzione main che puo' essere dichiarata di tipo :
int main (int argc, char* argv[]) { ... }
in questo modo all'attivazione argc
contiene il numero di argomenti passati sulla linea di comando, e l'array di stringhe argv
contiene tutte le parole trovate sulla linea di comando usando come separatori lo spazio bianco (' ') e il tab ('\t').
Ad esempio, se ho compilato il mio programma in un eseguibile prova
e l'ho attivato con il comando
bash$ ./prova pippo pluto paperone
argc
varra' 4, argv[0]
conterra' ./prova, argv[1]
conterra' pippo, argv[2]
pluto ed argv[3]
paperone.
Scrivere un programma C che stampa sullo standard output il numero di argomenti e tutte le parole sulla linea di comando separate da un newline ('\n'), ad esempio
bash$ ./prova pippo pluto paperone ./prova ha 3 argomenti pippo pluto paperone
Esercizio 3: Leggere il file anagrafe da linea di comando
Modificare la soluzione dell'esercizio 1 in modo da leggere il nome del file di anagrafe da linea di comando e da poter specificare opzionalmente il nome del file in cui scrivere la sequenza ordinata di studenti. Cioe'
bash$ ./leggistud nome_file [-o out_file]
legge gli studenti dal file nome_file
passato come primo parametro. Se specificato un file per l'output (opzione -o
) l'elenco degli studenti viene stampato su file invece che su standard output.
Fare in modo di stampare un opportuno messaggio di uso se leggistud
e' attivato con un numero di parametri diverso da 2 o in modo sbagliato.
Approfondimenti: provare ad utilizzare la funzione di libreria getopt
(man 3 getopt
) per eseguire l'analisi (parsing) della linea di comando. Questa funzione e' realmente utilizzata per analizzare la linea di comando dei comandi di shell che utilizziamo normalmente.
Esercizio 4: Mazzo di carte
Scrivete una funzione C nuovo_mazzo()
che crea un mazzo (mischiato!) di 40 carte utilizzando i seguenti tipi:
/** i valori delle carte */ typedef enum valori{ASSO,DUE,TRE,QUATTRO,CINQUE,SEI,SETTE,FANTE,DONNA,RE} valori_t; /** i semi delle carte */ typedef enum semi{CUORI,QUADRI,FIORI,PICCHE } semi_t; /** una carta e' data da un valore ed un seme */ typedef struct carta { /** valore */ valori_t val; /** seme */ semi_t seme; } carta_t;
ed una funzione stampa_mazzo()
che stampa le carte del mazzo sullo standard output in modo gradevole. Definite i parametri ed i valori restituiti dale funzioni opportunamente.
Esercizio 5: (avanzato) Il gioco della briscola
Utilizzando le funzioni dell'esercizio precedente realizzate un programma C che gioca a briscola con un utente. Il programma crea il mazzo di carte, stampa sullo standard output il nome della briscola e le carte in mano all'utente ed attende sullo standard input la giocata. Il programma puo' giocare con una strategia semplice a piacere (ad esempio la prima carta della mano). Ad esempio:
$./briscola Nuova partita, briscola CUORI Mano #1: Hai in mano 4Fiori 5Picche QCuori Cosa giochi ?
se digitiamo
4Fiori io gioco 2Cuori, preso Mano #2: Hai in mano KFiori 5Picche QCuori io gioco 7Picche Cosa giochi ?
Il gioco continua fino all'esaurimento delle carte. Alla fine il programma stampa il vincitore ed i punti totalizzati. Ad esempio:
Hai vinto con 87 punti!