ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2016 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

Σχετικά έγγραφα
ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

ΗΥ240: Δοµές Δεδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2016 Διδάσκουσα: Παναγιώτα Φατούρου. Προγραμματιστική Εργασία 2 ο Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2017 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος Προγραμματιστική Εργασία - 2o Μέρος

ΗΥ240: Δοµές Δεδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 2 ο Μέρος


ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2 ο Μέρος

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2 ο Μέρος

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2 ο Μέρος

HY-486 Αρχές Κατανεμημένου Υπολογισμού

Προγραµµατιστική Εργασία 1 ο Μέρος

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος

Προγραµµατιστική Εργασία - 2 ο Μέρος

Προγραµµατιστική Εργασία 1 ο Μέρος

Προγραμματιστική Εργασία Μέρος Β. Δρακωνάκης Κώστας Παπαϊωάννου Αντώνης

My Instagram Παρουσίαση Α Μέρους Προγραμματιστικής Εργασίας


ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 2o Μέρος

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 1 ο Μέρος

Προγραµµατιστική Εργασία 2 ο Μέρος

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου. Προγραμματιστική Εργασία 1 ο Μέρος

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου. Προγραμματιστική Εργασία 2 ο Μέρος

Santa Claus Παρουσίαση Α Μέρους Προγραμματιστικής Εργασίας

HY240 : Δομές Δεδομένων. Φροντιστήριο Προγραμματιστικής Εργασίας 2 ο και 3 ο Μέρος

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Παναγιώτα Φατούρου. Προγραμματιστική Εργασία 2 ο και 3 ο Μέρος

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου. Προγραμματιστική Εργασία 1 ο Μέρος

Διασυνδεδεμένες Δομές. Λίστες. Προγραμματισμός II 1

Θεωρητικό Μέρος. int rec(int n) { int n1, n2; if (n <= 5) then return n; else { n1 = rec(n-5); n2 = rec(n-3); return (n1+n2); } }

HY-486 Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο

ΗΥ240: Δομές Δεδομένων Χειμερινό Εξάμηνο Ακαδημαϊκό Έτος Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος

ΗΥ486 - Αρχές Κατανεμημένου Υπολογισμού Εαρινό Εξάμηνο Δεύτερη Προγραμματιστική Εργασία

Προγραμματισμός Ι (ΗΥ120)

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δυναμική Δέσμευση Μνήμης και Δομές Δεδομένων (Φροντιστήριο)

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

διεύθυνση πρώτου στοιχείου διεύθυνση i-οστού στοιχείου T t[n]; &t[0] είναι t &t[i] είναι t + i*sizeof(t)

Προγραµµατισµός Ι (ΗΥ120)

Φροντιστήριο 4 Σκελετοί Λύσεων

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ

Τομέας Υλικού και Αρχιτεκτονικής Υπολογιστών ΗΥ134 - Εισαγωγή στην Οργάνωση και Σχεδίαση Η/Υ 1. Εργαστήριο 6. Εαρινό Εξάμηνο

Πληροφορική 2. Δομές δεδομένων και αρχείων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ : ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΕΞΑΜΗΝΟ

$./jms console -w <jms in> -r <jms out> -o <operations file> namedpipe. (standard input).

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Alternative to Balanced Trees, Comms of the ACM, 33(6), June 1990,

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Προγραμματιστική Εργασία

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

Εισαγωγή στην επιστήμη των υπολογιστών. Οργάνωση εδομένων Κεφάλαιο 11ο ομές εδομένων

Διάλεξη 21η: Απλά Συνδεδεμένες Λίστες

Εργαστήριο 5. Εαρινό Εξάμηνο

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/10, 23:59

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

ΠΛΗ111. Ανοιξη Μάθηµα 3 ο. Συνδεδεµένες Λίστες. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Δομές Δεδομένων & Αλγόριθμοι

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

Άσκηση 3 (ανακοινώθηκε στις 24 Απριλίου 2017, προθεσμία παράδοσης: 2 Ιουνίου 2017, 12 τα μεσάνυχτα).

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 4η: Σύνολα - Λεξικά Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Φροντιστήριο 4 Σκελετοί Λύσεων

Προγραμματισμός Ι (ΗΥ120)

Οι λίστες, χάνοντας τα πλεονεκτήματα των πινάκων, λύνουν προβλήματα που παρουσιάζουν οι πίνακες

ΗΜΟΚΡΙΤΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΡΑΚΗΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΟΡΓΑΝΩΣΗΣ. Ο ΗΓΙΕΣ ΧΡΗΣΗΣ ΕΦΑΡΜΟΓΗΣ e-university/ classweb

Insert(K,I,S) Delete(K,S)

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Χειμερινό Εξάμηνο M. Χατζόπουλος. Προθεσμία: 19/01/2015

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

CloudBox!: Ένα εργαλείο cloud αποθήκευσης αρχείων με κατανεμημένο τρόπο

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΕΣ ΤΕΧΝΙΚΕΣ

ΕΝΟΤΗΤΑ 4 ΣΥΝΟΛΑ - ΛΕΞΙΚΑ

Προγραμματισμός Δομές Δεδομένων

ΕΦΑΡΜΟΓΗ ΔΙΑΧΕΙΡΙΣΗΣ ΙΣΤΟΣΕΛΙΔΩΝ ΜΕΛΩΝ ΔΕΠ, ΤΜΗΜΑΤΟΣ ΜΑΘΗΜΑΤΙΚΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟΥ ΠΑΤΡΩΝ ΕΓΧΕΙΡΙΔΙΟ ΟΔΗΓΙΩΝ ΠΛΟΗΓΗΣΗΣ ΚΑΙ ΧΡΗΣΗΣ

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

ΗΥ-150 Programming. Assignment 3. HY150 Programming, University of Crete

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Πληροφορική & Τηλεπικοινωνίες Υλοποίηση Συστημάτων Βάσεων Δεδομένων - Χειμερινό Εξάμηνο Καθηγητής Δ. Γουνόπουλος

Προγραμματισμός Υπολογιστών με C++ Φύλλο Διαγωνίσματος Ακαδημαϊκό εξάμηνο: Χειμερινό

ΕΡΓΑΣΙΑ 2. Κατασκευάζοντας Ημερολόγια. Ημερομηνία Ανάρτησης: 23/02/2018 Ημερομηνία Παράδοσης: 13/03/2018, 09:00

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 08: ΛίστεςΙΙ Κυκλικές Λίστες. Διδάσκων: Παναγιώτης Ανδρέου

ΕΣΔ 232: ΟΡΓΑΝΩΣΗ ΔΕΔΟΜΕΝΩΝ ΣΤΗΝ ΚΟΙΝΩΝΙΑ ΤΗΣ ΠΛΗΡΟΦΟΡΙΑΣ. Ακαδημαϊκό Έτος , Εαρινό Εξάμηνο Διδάσκων Καθ.: Νίκος Τσαπατσούλης

Transcript:

ΗΥ240: Δοµές Δεδοµένων Εαρινό Εξάµηνο Ακαδηµαϊκό Έτος 2016 Διδάσκουσα: Παναγιώτα Φατούρου Προγραµµατιστική Εργασία - 1 ο Μέρος Ηµεροµηνία Παράδοσης: Κυριακή, 3 Απριλίου 2016, ώρα 23:59. Τρόπος Παράδοσης: Χρησιµοποιώντας το πρόγραµµα turnin. Πληροφορίες για το πώς λειτουργεί το turnin παρέχονται στην ιστοσελίδα του µαθήµατος. Γενική Περιγραφή Στην εργασία αυτή καλείστε να υλοποιήσετε ένα πρόγραµµα που προσοµοιώνει µια υπηρεσία πληροφοριών σχετικά µε ταινίες. Η υπηρεσία διαθέτει ένα σύνολο ταινιών ταξινοµηµένες σε θεµατικές κατηγορίες. Οι χρήστες µπορούν να εγγράφονται στην υπηρεσία ώστε να βαθµολογούν ταινίες που έχουν ήδη δεί, να εντοπίζουν τις αγαπηµένες τους ταινίες, καθώς επίσης να βρίσκουν προτεινόµενες ταινίες µε βάση τις αγαπηµένες τους. Αναλυτική Περιγραφή Ζητούµενης Υλοποίησης Η υπηρεσία διαθέτει µια συλλογή ταινιών ταξινοµηµένες σε κατηγορίες. Πιο συγκεκριµένα, στα πλαίσια αυτής της προγραµµατιστικής εργασίας, οι διαθέσιµες κατηγορίες ταινιών είναι οι παρακάτω: δραµατικές, oscar, cinephile, ντοκιµαντέρ και κινούµενα σχέδια. Επιπρόσθετα, υπάρχει µια επιπλέον ξεχωριστή κατηγορία, «νέες κυκλοφορίες», η οποία περιλαµβάνει πρόσφατες ταινίες απ όλες τις παραπάνω κατηγορίες. 1

Για τη διαχείριση αυτών των κατηγοριών, θα δηµιουργήσετε έναν πίνακα σταθερού µεγέθους 6 θέσεων, ο οποίος θα ονοµάζεται πίνακας κατηγοριών. Κάθε θέση του πίνακα θα περιέχει έναν δείκτη (τύπου movie) στον πρώτο κόµβο µιας απλά συνδεδεµένης λίστας, η οποία θα ονοµάζεται λίστα ταινιών της κατηγορίας αυτής. Ο κάθε κόµβος αυτής της λίστας περιέχει πληροφορίες για κάποια ταινία που ανήκει σε αυτήν την κατηγορία και θα αποτελεί µια εγγραφή (struct) τύπου movie µε τα ακόλουθα πεδία: mid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά την ταινία. category: Αναγνωριστικό (τύπου int) που αντιστοιχεί στη θεµατική κατηγορία της ταινίας. Η µεταβλητή αυτή λαµβάνει τιµές από 0 µέχρι 4, µε κάθε τιµή να αντιστοιχεί σε κάθε θεµατική κατηγορία (0: drama, 1: Oscar, 2: cinephile, 3: documentary, 4: cartoon) year: Αριθµός (τύπου int) που αντιστοιχεί στο έτος κυκλοφορίας της ταινίας. next: Δείκτης (τύπου movie) στον επόµενο κόµβο της λίστας ταινιών της κατηγορίας. Η λίστα ταινιών κάθε κατηγορίας είναι ταξινοµηµένη, σε αύξουσα διάταξη, βάσει των αναγνωριστικών των ταινιών. Στο Σχήµα 1 παρουσιάζεται ο πίνακας κατηγοριών, σταθερού µεγέθους 6 θέσεων, και η λίστα των ταινιών που δεικτοδοτείται από κάθε στοιχείο του. Η υπηρεσία εξυπηρετεί ένα σύνολο εγγεγραµµένων χρηστών. Για το σκοπό αυτό θα δηµιουργήσετε µια µηταξινοµηµένη, απλά συνδεδεµένη λίστα µε κόµβο φρουρό, η οποία θα ονοµάζεται λίστα χρηστών. Κάθε κόµβος της λίστας χρηστών θα περιέχει µια εγγραφή (struct) τύπου user µε τα ακόλουθα πεδία: uid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά το χρήστη. history: Δείκτης (τύπου user_movie, βλέπε παρακάτω) στο πρώτο στοιχείο µιας διπλά συνδεδεµένης λίστας, η οποία ονοµάζεται λίστα ιστορικού ταινιών του χρήστη. Η λίστα αυτή περιέχει ταινίες που έχει ήδη παρακολουθήσει και βαθµολογήσει ο χρήστης και είναι ταξινοµηµένη, σε φθίνουσα διάταξη, βάσει του score των ταινιών που περιέχει. favorites: Δείκτης (τύπου user_movie) στο πρώτο στοιχείο µιας διπλά συνδεδεµένης λίστας, η οποία ονοµάζεται λίστα αγαπηµένων ταινιών του χρήστη. Η λίστα αυτή περιέχει τις ταινίες που έχει ήδη παρακολουθήσει ο χρήστης και τις έχει βαθµολογήσει µε score µεγαλύτερο ή ίσο από 7. Η λίστα αυτή είναι ταξινοµηµένη, σε φθίνουσα διάταξη, βάσει του score των ταινιών που περιέχει. next: Δείκτης (τύπου user) στον επόµενο κόµβο της λίστας. O κόµβος φρουρός της λίστας είναι ένας διαχειριστικός κόµβος για τον οποίο ισχύουν τα εξής: είναι και αυτός τύπου user µε την ιδιαιτερότητα ότι το αναγνωριστικό του (mid) έχει τιµή -1 και τα πεδία δεικτών (history, favorites, next) έχουν τιµή NULL. Το Σχήµα 2 απεικονίζει τη λίστα χρηστών. Ο κάθε κόµβος της λίστας ιστορικού και της λίστας αγαπηµένων ταινιών του κάθε χρήστη αντιστοιχεί σε µια εγγραφή τύπου user_movie µε τα ακόλουθα πεδία: mid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει µοναδικά την ταινία. category: Αναγνωριστικό (τύπου int) που αντιστοιχεί στη θεµατική κατηγορία της ταινίας. Η µεταβλητή αυτή λαµβάνει τιµές από 0 µέχρι 4, µε κάθε τιµή να αντιστοιχεί σε κάθε θεµατική κατηγορία (0: drama, 1: Oscar, 2: cinephile, 3: documentary, 4: cartoon) score: Αριθµός (τύπου int) που αντιπροσωπεύει τη βαθµολογία που δίνει ο χρήσης στην ταινία. Η µεταβλητή αυτή θα λαµβάνει τιµές απο 1 µέχρι 10, µε 1 να αντιστοιχεί στον ελάχιστο βαθµό ικανοποίησης του χρήστη και 10 στο µέγιστο βαθµό ικανοποίησης. prev: Δείκτης (τύπου user_movie) στον προηγούµενο κόµβο της λίστας. next: Δείκτης (τύπου user_movie) στον επόµενο κόµβο της λίστας. 2

Σχήµα 1: Πίνακας κατηγοριών και αντίστοιχες λίστες ταινιών της κάθε κατηγορίας (κάθε µια από τις λίστες ταινιών είναι απλά συνδεδεµένη και ταξινοµηµένη βάσει του mid). 3

Σχήµα 2: Λίστα χρηστών 4

Τρόπος Λειτουργίας Προγράµµατος Το πρόγραµµα που θα δηµιουργηθεί θα πρέπει να εκτελείται καλώντας την ακόλουθη εντολή: <executable> <input-file> όπου <executable> είναι το όνοµα του εκτελέσιµου αρχείου του προγράµµατος (π.χ. a.out) και <input-file> είναι το όνοµα ενός αρχείου εισόδου (π.χ. testfile) το οποίο περιέχει γεγονότα των ακόλουθων µορφών: R <uid> Γεγονός τύπου register user το οποίο σηµατοδοτεί την εγγραφή ενός νέου χρήστη (user) µε αναγνωριστικό <uid>. Το γεγονός αυτό προσθέτει το νέο χρήστη στη λίστα χρηστών της υπηρεσίας. Τα πεδία history και favorities του κόµβου που αντιστοιχεί στο χρήστη στη λίστα χρηστών πρέπει να έχουν την αρχική τιµή NULL. Η εισαγωγή θα πρέπει να πραγµατοποιείται σε χρόνο Ο(1). Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη R <uid> Users = <uid 1 >, <uid 2 >,..., <uid n > όπου n είναι ο αριθµός των κόµβων στη λίστα χρηστών και για κάθε i {1,, n}, <pid i > είναι το αναγνωριστικό του χρήστη που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής. U <uid> Γεγονός τύπου unregister user το οποίο σηµατοδοτεί τη διαγραφή ενός χρήστη (user) µε αναγνωριστικό <uid> από τη λίστα χρηστών. Πριν την οριστική διαγραφή του χρήστη από τη λίστα χρηστών θα πρέπει να διαγράψετε όλα τα στοιχεία της λίστα ιστορικού και της λίστας αγαπηµένων ταινιών του χρήστη αν αυτές περιέχουν στοιχεία. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη U <uid> Users = <uid 1 >, <uid 2 >,..., <uid n > όπου n είναι ο αριθµός των κόµβων στη λίστα χρηστών και για κάθε i {1,, n}, <pid i > είναι το αναγνωριστικό του χρήστη που αντιστοιχεί στον i-οστό κόµβο της λίστας αυτής. A <mid> <category> <year> Γεγονός τύπου add new movie ο οποίο σηµατοδοτεί την άφιξη µιας νέας ταινίας που είναι διαθέσιµη στους χρήστες. Κατά το γεγονός αυτό θα δηµιουργείτε µια νέα ταινία µε αναγνωριστικό <mid> και έτος κυκλοφορίας <year>, η οποία θα ανήκει στη θεµατική κατηγορία <category>. Ανεξάρτητα από την κατηγορία στην οποία ανήκει, η νέα ταινία θα εισάγεται στη λίστα κατηγορίας «νέες κυκλοφορίες». Η λίστα αυτή θα πρέπει να παραµένει ταξινοµηµένη µετά την κάθε εισαγωγή. 5

Α MOVIES: <category 1 >: <mid 1,1 >... <mid 1,n1 > <category 2 >: <mid 2,1 >... <mid 2,n2 >... <category 6 >: <mid 6,1 >... <mid 6,n6 > όπου για κάθε i, 1 i 6, n i είναι το µέγεθος της λίστας ταινιών της i-οστής κατηγορίας του πίνακα κατηγοριών, και για κάθε j, 1 j n i, και <mid i,j > είναι το αναγνωριστικό της ταινίας του j-οστού κόµβου στη λίστα ταινιών της i-οστής κατηγορίας. C Γεγονός τύπου categorize movies το οποίο σηµατοδοτεί την ταξινόµηση των ταινιών που περιέχει η λίστα «νέες κυκλοφορίες» στις υπόλοιπες θεµατικές κατηγορίες. Η διαδικασία αυτή θα πρέπει να εκτελείται σε χρόνο Ο(n), όπου n είναι ο αριθµός των ταινιών που περιέχονται στη λίστα «νέες κυκλοφορίες». Συγκεκριµένα, το γεγονός αυτό θα πρέπει να εκτελείτε µε µια διάσχιση της λίστας ταινιών της κατηγορίας νέες κυκλοφορίες. Στο τέλος αυτής της διαδικασίας, όλες οι ταινίες από τη λίστα «νέες κυκλοφορίες» πρέπει να έχουν διαµοιραστεί στις υπόλοιπες κατηγορίες αδειάζοντας τη λίστα «νέες κυκλοφορίες». Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη C MOVIES: <category 1 >: <mid 1,1 >... <mid 1,n1 > <category 2 >: <mid 2,1 >... <mid 2,n2 >... <category 6 >: <mid 6,1 >... <mid 6,n6 > όπου για κάθε i, 1 i 6, n i είναι το µέγεθος της λίστας ταινιών της i-οστής κατηγορίας του πίνακα κατηγοριών, και για κάθε j, 1 j n i, και <mid i,j > είναι το αναγνωριστικό της ταινίας του j-οστού κόµβου στη λίστα ταινιών της i-οστής κατηγορίας. G <uid> <mid> <score> Γεγονός τύπου rate movie το οποίο σηµατοδοτεί ότι ο χρήστης µε αναγνωριστικό <uid> έχει παρακολουθήσει την ταινία µε αναγνωριστικό <mid> και την αξιολογεί µε βαθµό <score>. Κατά το γεγονός αυτό αρχικά θα γίνεται αναζήτηση της ταινίας µε αναγνωριστικό <mid> σε όλες τις λίστες 6

ταινιών του πίνακα κατηγοριών. Στη συνέχεια θα δηµιουργηθεί µια νέα εγγραφή τύπου «user_movie» χρησιµοποιώντας τις πληροφορίες τις ταινίας (movie) που έχει ήδη εντοπιστεί προηγουµένως και να αξιολογείται µε βαθµό «score». Τέλος γίνεται η εισαγωγή της νέας «user_movie» στο ιστορικό του χρήστη µε αναγνωριστικό <uid>. Σηµειώνεται ότι η λίστα ιστορικού του χρήστη πρέπει να παραµένει ταξινοµηµένη µε βάση το πεδίο score. G <uid> <mid> <score> HISTORY: <mid 1, score 1 >,..., <mid n, score n > όπου n είναι το µέγεθος της λίστας αγαπηµένων ταινιών του χρήστη <uid> και για κάθε i {1,, n}, <mid i > είναι το αναγνωριστικό της ταινίας και <score i > η βαθµολογία της ταινίας που αντιστοιχεί στο i-οστό κόµβο στη αγαπηµένων του χρήστη <uid>. F Γεγονός τύπου identify favorites το οποίο σηµατοδοτεί την ενηµέρωση της λίστας αγαπηµένων ταινιών του κάθε εγγεγραµµένου χρήστη της υπηρεσίας. Κατά το γεγονός αυτό, όλες οι ταινίες του ιστορικού κάθε χρήστη, οι οποίες έχουν βαθµολογία µεγαλύτερη από ή ίση µε 7 αντιγράφονται στη λίστα αγαπηµένων του χρήστη. F FAVORITES: <mid 1, score 1 >,..., <mid n, score n > όπου n είναι το µέγεθος της λίστας αγαπηµένων ταινιών του χρήστη <uid>, για κάθε i {1,, n}, <mid i > είναι το αναγνωριστικό της ταινίας και <score i > η βαθµολογία της ταινίας που αντιστοιχεί στο i-οστό κόµβο στη αγαπηµένων του χρήστη <uid>. S <uid> <mid> Γεγονός τύπου suggest movie το οποίο αναζητά µια ταινία απ τη λίστα των αγαπηµένων κάποιου χρήστη (η οποία θα αποτελέσει την προτεινόµενη ταινία). Πιο συγκεκριµένα, κατά το γεγονός αυτό, γίνεται πρώτα αναζήτηση της ταινίας µε αναγνωριστικό <mid> στη λίστα αγαπηµένων του χρήστη µε αναγνωριστικό <uid>. Στη συνέχεια, θα πρέπει να αναζητηθεί στη λίστα αγαπηµένων ταινιών του ίδιου χρήστη µια ταινία (αν υπάρχει) που να ανήκει στην ίδια θεµατική κατηγορία µε την ταινία µε αναγνωριστικό <mid> αλλά να έχει βαθµολογηθεί µε µεγαλύτερο score από την ταινία µε αναγνωριστικό <mid>. 7

S <uid> <mid> Primary movie: <mid p > <score p > <category p > Suggested movie: <mid S > <score S > <category S > όπου <mid p > <score p > <category p > είναι το ανγνωριστικό, η βαθµολογία και η κατηγορία, αντίστοιχα, της αρχικής ταινίας που αναζητήθηκε και <mid S > <score S > <category S > είναι το ανγνωριστικό, η βαθµολογία και η κατηγορία, αντίστοιχα, της προτεινόµενης ταινίας. Ι <mid> Γεγονός τύπου search movie το οποίο σηµατοδοτεί την αναζήτηση της ταινίας µε αναγνωριστικό <mid> σε όλες τις λίστες ταινιών του πίνακα κατηγοριών. I <mid> <category>, <year> όπου <category> είναι η κατηγορία που ανήκει η ταινία µε αναγνωριστικό <mid> και <year> είναι το έτος κυκλοφορίας της. M Γεγονός τύπου print movies το οποίο σηµατοδοτεί την εκτύπωση της λίστας ταινιών όλων των κατηγοριών. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος το πρόγραµµα θα πρέπει να τυπώνει την ακόλουθη M MOVIES: <category 1 >: <mid 1,1 >... <mid 1,n1 > <category 2 >: <mid 2,1 >... <mid 2,n2 >... <category 6 >: <mid 6,1 >... <mid 6,n6 > όπου για κάθε i, 1 i 6, n i είναι το µέγεθος της λίστας ταινιών της i-οστής κατηγορίας του πίνακα κατηγοριών, και για κάθε j, 1 j n i, και <mid i,j > είναι το αναγνωριστικό της ταινίας του j-οστού κόµβου στη λίστα ταινιών της i-οστής κατηγορίας. 8

P Γεγονός τύπου print users το οποίο σηµατοδοτεί την εκτύπωση της λίστας χρηστών. Για τον κάθε χρήστη θα πρέπει να εκτυπώνονται όλα τα στοιχεία του χρήστη, συµπεριλαµβανοµένων της λίστας ιστορικού και της λίστας αγαπηµένων ταινιών του χρήστη. P USERS: <uid 1 > HISTORY: <mid 1,1 > <mid 1,n1 > FAVORITES: <mid 1,1 > <mid 1,m1 > <uid 2 > HISTORY: <mid 2,1 > <mid 2,n2 >... FAVORITES: <mid 2,1 > <mid 2,m2 > <uid k > HISTORY: <mid κ,1 > <mid κ,nk > FAVORITES: <mid κ,1 > <mid κ,mk > όπου k είναι ο αριθµός των χρηστών στη λίστα χρηστών, για κάθε j, 1 j k, n j είναι το µέγεθος της λίστας ιστορικού του χρήστη µε αναγνωριστικό <uid j > και m j είναι το µέγεθος της λίστας αγαπηµένων αυτού του χρήστη. 9

Βαθµολογία R Register user 7 U Unregister user 7 A Add new movie 10 C Categorize movies 20 G Rate movie 12 F Identify favorites 15 S Suggest movie 20 I Search movie 3 M Print movies 3 P Print users 3 Δεν κάνει compile -10 Δεν τρέχει και δεν τρέχουν τα test-files -10 10

Δοµές Δεδοµένων Στην υλοποίησή σας δεν επιτρέπεται να χρησιµοποιήσετε έτοιµες δοµές δεδοµένων (πχ., ArrayList) είτε η υλοποίηση πραγµατοποιηθεί στη C είτε στη Java. Στη συνέχεια παρουσιάζονται οι δοµές σε C που πρέπει να χρησιµοποιηθούν για την υλοποίηση της παρούσας εργασίας. struct movie{ int mid; int category; int year; struct movie *next; }; struct user_movie { int mid; int category; int score; struct user_movie * next; struct user_movie * prev; }; struct user { int uid; struct user_movie * history; struct user_movie * favorites; struct user * next; }; /*The array of the movie categories*/ struct movie * Movie_categories[M]; /* global variable, pointer to the beginning of the users list*/ struct user * users_list; /* global variable, pointer to the sentinel node of the users list */ struct user * users_sentinel; 11