uniroma1
.*_main.c
.cognome.nome
. Sulle postazioni del laboratorio sarà /home/studente/Desktop/cognome.nome/
.cognome.nome.zip
(zip -r cognome.nome.zip cognome.nome/
).cognome.nome.zip
.rm -rf cognome.nome
).Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Si vuole scrivere nel file E1-find-person/e1.c
due funzioni che lavorano su array di strutture che rappresentano persone come definito di seguito:
typedef struct person_t person_t;
struct person_t {
char *name;
int age;
};
La prima funzione ha il seguente prototipo:
void sort_people(person_t p[], size_t n);
e deve ordinare per nome le persone nell’array p
di dimensione n
. La seconda funzione ha il seguente prototipo:
person_t *find_person(char *key, person_t sorted[], size_t n);
e, assumendo che sorted
sia un array di n
persone ordinate per nome e key
è un nome da cercare, restituisce il puntatore a una persona nell’array che ha quel nome, oppure NULL
se nessuna persona ha quel nome. Se vi sono più persone con il nome cercato, restituisce una qualunque.
NOTA: Si ricorda che per operazioni di ordinamento e ricerca è possibile utilizzare le funzioni qsort
e bsearch
.
Si consideri un software per la gestione delle prenotazioni in un ristorante. L’elenco dei prenotati è salvato in un buffer, composto dalla concatenazione di record di 37 byte ciascuno. Ogni record è suddiviso nei seguenti campi:
Tutti questi campi sono rappresentati da stringhe senza terminatore. Non esiste separatore tra i campi e tra i record. I bytes in eccesso sono costituiti da padding rappresentato con il carattere _
. Il campo dell’orario ha il formato hh:mm
.
Ad esempio, il record:
Rossi_________________________0419:50
descrive una prenotazione a nome Rossi, per 4 posti, alle ore 19:50.
Si scriva in e2.c
una funzione getBookingsAfterTime
con il seguente prototipo:
void getBookingsAfterTime(struct booking ** list, const char * data, int size, const char * time);
che, dato in ingresso un buffer data
(di dimensione size
byte) con tutti i record dei tavoli prenotati e un orario time
espresso in formato hh:mm
, restituisce in list
la lista di tutti i tavoli prenotati
per un orario uguale o successivo a time
. Si noti che list
deve essere una lista collegata costituita da elementi rappresentati dalla struct booking
(definita nel file e2.h
):
struct booking {
char * surname;
int places;
char * time;
struct booking * next;
};
L’ordine delle prenotazioni in list
deve essere coerente con l’ordine che le stesse hanno nel buffer data
.
Usare il main di prova nella directory di lavoro E2
compilando con gcc e2_main.c e2.c -o e2
.
NOTA: Si ricorda che per convertire una stringa in un numero intero è possibile utilizzare la funzione atoi
.
Tradurre in IA32 in un file e3.s
la seguente funzione, tenendo presente che i codici ASCII dei caratteri ‘0’ e ‘9’ sono 48 e 57, rispettivamente.
e3.c
int count_digits(const char *s) {
int cnt = 0;
while (*s) {
if (*s >= '0' && *s <= '9') cnt++;
s++;
}
return cnt;
}
Usare il main di prova nella directory di lavoro E3 compilando con gcc -m32 e3_main.c e3.s -o e3
.
Rispondi alle seguenti domande, tenendo conto che una risposta corretta vale 1 punti, mentre una risposta errata vale 0 punti.
Domanda 1. Siano %eax=20 (decimale), %edx=0 (decimale) e %ecx=8 (decimale). Con riguardo alle due istruzioni “idivl %ecx” e “sarl $3, %eax”, quale delle seguenti affermazioni risulta vera:
Domanda 2. Assumendo %eax=0xFF000000, %ecx=1 (decimale) e %edx=10 (decimale), dopo aver eseguito l’istruzione “testl %eax, %eax” quale delle seguenti affermazioni risulta vera:
Domanda 3. Assumendo %eax=10 (decimale), %ecx=7 (decimale) e %edx=2 (decimale), quale delle seguenti affermazioni risulta vera:
Domanda 4. Quale delle seguenti è un’istruzione valida: