Sistemi di Calcolo

Corso di Laurea in Ingegneria Informatica e Automatica

Home | Avvisi | Diario Lezioni | Esercitazioni | Esami | Materiale Didattico | Valutazioni Studenti | Lezioni di Camil Demetrescu |

[T08] Esercitazione 8

Istruzioni per l’esercitazione:

Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.

Esercizio 1 (Ordinamento e ricerca su array di strutture)

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.

Esercizio 2 (Parsing)

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.

Esercizio 3 (Palestra IA32)

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.

Domande

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: