Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente |
fisica:informatica:201819:esercitazioni:esercitazione12sel [01/04/2019 alle 12:05 (6 anni fa)] – [Esercizio 3: Leggere il file anagrafe da linea di comando] Alessio Conte | fisica:informatica:201819:esercitazioni:esercitazione12sel [01/04/2019 alle 13:58 (6 anni fa)] (versione attuale) – [Esercizio 4: Problema della corrispondenza di Post] Alessio Conte |
---|
| |
| |
===== Esercizio 1: Problema della corrispondenza di Post ===== | |
| |
Sia P un array di 'tessere di domino' P[1] .... P[N-1]. Ogni tessera a = P[i] e' una struct che contiene due campi di tipo stringa (char *), top e bottom: | |
| |
<code c> | ===== Esercizio 1: Archivio studenti ===== |
typedef struct tessera { | |
char * top; | |
char * bottom; | |
} tessera_t; | |
</code> | |
| |
Un 'match' e' una sequenza di tessere a_1, a_2, ... a_k tale che la sequenza "a_1.top a_2.top ... a_k.top" ottenuta concatenando tutti i campi top sia uguale alla sequenza "a_1.bottom a_2.bottom ... a_k.bottom" ottenuta concatenando tutti i bottom. | |
| |
Esempio: | |
| |
<code c> | |
P[0] = { "c" , "ci" }; | |
P[1] = { "i" , "a" }; | |
P[2] = { "ao" , "o" }; | |
</code> | |
| |
P[0],P[1],P[2] e' un match: concatenando tutti i campi top otteniamo "c","i","ao" = "ciao", e ugualmente ottenamo "ci","a","o" = "ciao" concatenando tutti i campi bottom. | |
| |
Si scriva una funione ''int post(tessera_t * P, int n)'' che prenda in input un array di n ''tessera_t'', e ritorni 1 se e' possibile trovare un 'match' in P, o 0 altrimenti. | |
| |
Suggerimento: prima di cominciare a scrivere codice, ragionare su come stabilire se esiste o meno un match. | |
| |
===== Esercizio 2: Archivio studenti ===== | |
| |
Scrivere un programma C che legge una sequenza di studenti dal file ''anagrafe_studenti.txt''. | Scrivere un programma C che legge una sequenza di studenti dal file ''anagrafe_studenti.txt''. |
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 '':'' | 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 3: La linea di comando: ''argc'' e ''argv'' ===== | ===== 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 : | 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 : |
</code> | </code> |
| |
===== Esercizio 4: Leggere il file anagrafe da linea di comando ===== | ===== 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' | 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' |
<code> | <code> |
//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. | //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: Problema della corrispondenza di Post ===== |
| |
| Sia P un array di 'tessere di domino' P[1] .... P[N-1]. Ogni tessera a = P[i] e' una struct che contiene due campi di tipo stringa (char *), top e bottom: |
| |
| <code c> |
| typedef struct tessera { |
| char * top; |
| char * bottom; |
| } tessera_t; |
| </code> |
| |
| Un 'match' e' una sequenza di tessere a_1, a_2, ... a_k (possibilmente con ripetizioni di tessere) tale che la sequenza "a_1.top a_2.top ... a_k.top" ottenuta concatenando tutti i campi top sia uguale alla sequenza "a_1.bottom a_2.bottom ... a_k.bottom" ottenuta concatenando tutti i bottom. |
| |
| Esempio: |
| |
| <code c> |
| P[0] = { "c" , "ci" }; |
| P[1] = { "i" , "a" }; |
| P[2] = { "ao" , "o" }; |
| P[3] = { "a" , "a" }; |
| </code> |
| |
| P[0],P[1],P[2] e' un match: concatenando tutti i campi top otteniamo "c","i","ao" = "ciao", e ugualmente ottenamo "ci","a","o" = "ciao" concatenando tutti i campi bottom. |
| |
| Anche P[0],P[1],P[3],P[3],P[3],P[3],P[2] e' un match! otteniamo "c","i","a","a","a","a","ao" (top) e "ci","a","a","a","a","a","o" (bottom). |
| |
| Invece, se l'array e': |
| <code c> |
| P[0] = { "a" , "1" }; |
| P[1] = { "b" , "2" }; |
| </code> |
| |
| Chiaramente non esiste alcun match. |
| |
| Si scriva una funzione ''int post(tessera_t * P, int n)'' che prenda in input un array di n ''tessera_t'', e ritorni 1 se e' possibile trovare un qualsiasi 'match' in P, o 0 altrimenti. |
| |
| Suggerimento: prima di cominciare a scrivere codice, ragionare su come si puo' fare per stabilire se esiste o meno un match. |
| |