Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
1
Esercitazioni su liste
Si vuole tenere in memoria le informazioni riguardanti gli studenti iscritti ad un corso di informatica. Il corso è organizzato in due gruppi, si utilizzi una lista per ogni gruppo. Si astragga il concetto di lista in modo da rendere l’implementazione il più strutturata possibile. *
2
Esercitazioni su liste
Per fare ciò si cominci a implementare: Una libreria (studente.h, studente.c) contenente la definizione della struttura studente e le funzioni principali per la sua manipolazione. #define DIM_STR 20 typedef struct { char nome[DIM_STR]; char cognome[DIM_STR]; float media; } element; *
3
Esercitazioni sulle liste
Creare le funzioni: boolean isLess(element, element); boolean isEqual(element, element); element getElement(void); void printElement(element); Usare queste librerie per astrarre il tipo di elemento delle liste dall’implementazione *
4
Esercitazioni sulle liste
Dove boolean isLess(element, element); Controlla se un elemento è minore dell’altro boolean isEqual(element, element); Uguaglianza fra elementi element getElement(void); Input da tastiera di un elemento void printElement(element); Stampa a video di un elemento *
5
Esercitazioni su liste
Il programma deve prendere in input un numero N di studenti (N definito dall’utente sempre in input) inserendoli nella lista l1 e un numero M di studenti inserendoli nella lista l2. NB: in l1 inserimento in testa in l2 inserimento in coda. Visualizzare un menu nel quale è possibile: Visualizzare tutti gli studenti, Cercare uno studente (per nome e cognome), Ricerca dello studente con la media più alta, Calcolo della media delle medie dei voti, Cancellazione di uno studente da una lista, Append delle due liste, Copia di una delle due liste in una terza, Stampare il numero di studenti nelle due liste. *
6
Esercitazioni su liste
Le funzioni di manipolazione delle liste, da inserire nel file list.c, list.h secondo le modalità solite, richieste sono state già introdotte a lezione, di seguito un rapido ripasso: typedef enum { false, true } boolean; typedef struct node{ element n; node *next; } listNode; typedef listNode* list; element head(list l); list tail(list l); boolean empty(list l); list emptyList(); list cons(element n, list l); *
7
Esercitazioni su liste
Utilizzando questa base andiamo a implementare le seguenti funzioni. list consTail(element n, list l); // inserimento in coda void showlist(list l); // stampa della lista l list copy(list l); // copia di l in un’altra lista (diversa da l) boolean member(element el, list l); // ricerca di el in l int length(list l); // numero di elementi in l list append (list l1, list l2); // append di l2 in coda a l1 list deleteValue(element n, list l); // cancellazione di n da l element maxAVG(list l); // ricerca studente con media più alta float AVGMedia(list l); // calcolo media dei voti. Tutte le funzioni dovranno essere implementate in maniera RICORSIVA. *
8
Esercitazioni su liste
FACOLTATIVO: implementare l’inserimento ordinato, creare le due liste ordinate in base al cognome (e al nome in caso di cognomi uguali) e aggiungere la funzione di merge delle due liste ordinate in una terza, sempre ordinata. list merge (list l1, list l2); /* unione di due liste ordinate in una terza ordinata anch’essa */ Tutte le funzioni dovranno essere implementate in maniera RICORSIVA. *
9
Esercitazioni sulle liste
Ricorsione, cosa gestire? Un esempio: void recFunct(list l){ if (empty(l)) \\ CASO BASE -> FINE DELLA RICORSIONE \\ TODO else { \\ GESTIONE DEGLI ALTRI CASI \\ CHIAMATA RICORSIVA ALLA FUNZIONE recFunct(tail(l)); } *
10
Esercitazioni sulle liste
TIPS: valutare come eseguire la ricorsione è molto importante per evitare di complicare troppo le funzioni. A volte conviene creare delle sotto funzioni che eseguono il calcolo ricorsivo (a volte potrebbe essere necessario, soprattutto se le interfacce date non possono essere modificate). Un esempio: float recFunct(list l){ return recFunctInterna(l) * 5; } Float recFunctInterna(list l) { if (empty(l)) \\ TODO CASO BASE else { \\ GESTIONE DEGLI ALTRI CASI + CHIAMATA RICORSIVA recFunctInterna(tail(l)); *
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.