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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

Θεωρητικό Μέρος. 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); } }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Γ7.8 Εγγραφές (Structures) Γ Λυκείου Κατεύθυνσης

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

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

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

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

Πανεπιστήμιο Πειραιώς Σχολή Τεχνολογιών Πληροφορικής και Επικοινωνιών Τμήμα Ψηφιακών Συστημάτων ομές εδομένων

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

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

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

ΑΡΧΗ 1ης ΣΕΛΙΔΑΣ. Για i από 1 μέχρι Μ Εμφάνισε A[4,i] Τέλος_επανάληψης. (μονάδες 6) ΤΕΛΟΣ 1ης ΑΠΟ 7 ΣΕΛΙΔΕΣ

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

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

Δομές δεδομένων. Ενότητα 8: Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find) Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

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

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

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

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

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

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

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Σχεδιασμός Πληροφοριακών Συστημάτων. Σημειώσεις

4. Συνδεδεμένες Λίστες

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

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

ΒΑΣΕΙΣ ΔΕΔΟΜΕΝΩΝ. Πεδί α

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

Ενότητα 7 Ουρές Προτεραιότητας

Ενότητα 6: Κατακερματισμός Ασκήσεις και Λύσεις

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

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #5

Σχεδιασμός Πληροφοριακών Συστημάτων. Σημειώσεις. Συμπλήρωμα 1 για τις Εκδόσεις 4 (4.1) και 4.2 των Σημειώσεων

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

Διάλεξη 15: Δομές Δεδομένων IV (Διπλά Συνδεδεμένες Λίστες)

Οδηγίες Χρήσης. Developed by interad

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

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

13/5/2015 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ. Δομές Δεδομένων. Ουρές Προτεραιότητας

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

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

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

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

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

υναµική έσµευση Μνήµης (συν.) ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 Εφαρµογή

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

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

0 The quick brown fox leaped over the lazy lazy dog 1 Quick brown foxes leaped over lazy dogs for fun

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

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Transcript:

ΗΥ240: Δομές Δεδομένων Εαρινό Εξάμηνο Ακαδημαϊκό Έτος 2018-2019 Διδάσκουσα: Παναγιώτα Φατούρου Προγραμματιστική Εργασία - 1o Μέρος Ημερομηνία Παράδοσης: Δευτέρα, 1 Απριλίου 2019, ώρα 23:59 Τρόπος Παράδοσης: Χρησιμοποιώντας το πρόγραμμα turnin. Πληροφορίες για το πώς λειτουργεί το πρόγραμμα turnin παρέχονται στην ιστοσελίδα του μαθήματος. (Source: https://www.freeimages.com) Γενική περιγραφή: Στην εργασία αυτή καλείστε να υλοποιήσετε ένα πρόγραμμα που θα προσομοιώνει καταστήματα αγορών και καταναλωτές. Ο κάθε καταναλωτής έχει τη δική του λίστα με προϊόντα που επιθυμεί να αγοράσει. Το κάθε κατάστημα ανήκει σε μια κατηγορία ανάλογα με τον τύπο του. Στην εργασία αυτή θα θεωρήσετε ότι υπάρχουν πέντε κατηγορίες καταστημάτων συνολικά. Για κάθε κατάστημα υπάρχει μία λίστα με τα προϊόντα που είναι διαθέσιμα στο κατάστημα την τρέχουσα χρονική στιγμή. Ένας καταναλωτής μπορεί να αγοράσει ένα ή περισσότερα προϊόντα από αυτά που συμπεριλαμβάνονται στην προσωπική τους λίστα από τα καταστήματα που τα διαθέτουν.

Αναλυτική Περιγραφή Ζητούμενης Υλοποίησης Τα καταστήματα είναι οργανωμένα σε μία διπλά συνδεδεμένη, μη ταξινομημένη, κυκλική λίστα με όνομα λίστα καταστημάτων. Ο κάθε κόμβος της λίστας αποτελεί μία εγγραφή τύπου struct Shop που περιέχει τα ακόλουθα πεδία: sid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει μοναδικά το κατάστημα. type: Ακέραιος αριθμός που δηλώνει τον τύπο του καταστήματος. next: Δείκτης (τύπου struct Shop) στον επόμενο κόμβο της λίστας καταστημάτων. prev: Δείκτης (τύπου struct Shop) στον προηγούμενο κόμβο της λίστας καταστημάτων. products: Δείκτης (τύπου struct Product) στην αρχή μιας απλά συνδεδεμένης, ταξινομημένης λίστας, που ονομάζεται λίστα προϊόντων καταστήματος. Το κάθε στοιχείο της λίστας προϊόντων καταστήματος αποτελεί μία εγγραφή τύπου struct Product με τα ακόλουθα πεδία: pid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει μοναδικά το προϊόν. quantity: Ακέραιος αριθμός που δηλώνει την ποσότητα του διαθέσιμου προϊόντος στο κατάστημα. price: Ακέραιος αριθμός που δηλώνει την τιμή του προϊόντος. next: Δείκτης (τύπου struct Product) στον επόμενο κόμβο της λίστας προϊόντων καταστήματος. Στο Σχήμα 1 παρουσιάζεται η λίστα καταστημάτων και οι λίστες προϊόντων καταστημάτων. Οι καταναλωτές είναι οργανωμένοι σε μία απλά συνδεδεμένη, μη ταξινομημένη λίστα, με κόμβο φρουρό, που ονομάζεται λίστα καταναλωτών. Ο κάθε κόμβος της λίστας αποτελεί μία εγγραφή τύπου struct Consumer που περιέχει τα ακόλουθα πεδία: cid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει μοναδικά τον καταναλωτή. next: Δείκτης (τύπου struct Consumer) στον επόμενο κόμβο της λίστας καταναλωτών. shopping_list: Δείκτης (τύπου struct C_Product) στην αρχή μίας απλά συνδεδεμένης, ταξινομημένης λίστας με όνομα λίστα προϊόντων καταναλωτή. Ο κάθε κόμβος της λίστας αποτελεί μία εγγραφή τύπου struct C_Product που περιέχει τα ακόλουθα πεδία: pid: Αναγνωριστικό (τύπου int) που χαρακτηρίζει μοναδικά το προϊόν που επιθυμεί να αγοράσει ο καταναλωτής quantity: Ακέραιος αριθμός που δηλώνει την ποσότητα του προϊόντος που επιθυμεί να αγοράσει ο καταναλωτής. next: Δείκτης (τύπου struct C_Product) στον επόμενο κόμβο της λίστας προϊόντων καταναλωτή. Στο Σχήμα 2 παρουσιάζεται η λίστα καταναλωτών και οι λίστες προϊόντων καταναλωτών.

Σχήμα 1: Η διπλά-συνδεδεμένη μη-ταξινομημένη λίστα καταστημάτων κάθε κόμβος της οποίας δεικτοδοτεί μία απλά-συνδεδεμένη, ταξινομημένη λίστα προϊόντων καταστήματος.

Σχήμα 2: Η απλά-συνδεδεμένη, μη-ταξινομημένη λίστα καταναλωτών κάθε κόμβος της οποίας δεικτοδοτεί μία απλά-συνδεδεμένη, ταξινομημένη λίστα προϊόντων καταναλωτών.

Τρόπος Λειτουργίας Προγράμματος Το πρόγραμμα που θα δημιουργηθεί θα πρέπει να εκτελείται καλώντας την ακόλουθη εντολή: <executable> <input-file> όπου <executable> είναι το όνομα του εκτελέσιμου αρχείου του προγράμματος (π.χ. a.out) και <input-file> είναι το όνομα ενός αρχείου εισόδου (π.χ. testfile) το οποίο περιέχει γεγονότα των ακόλουθων μορφών: R <sid> <type> Γεγονός τύπου register shop που υποδηλώνει τη δημιουργία ενός νέου καταστήματος με αναγνωριστικό <sid>. Η παράμετρος <type> υποδηλώνει τον τύπο του καταστήματος. Κατά το γεγονός αυτό, θα γίνεται εισαγωγή ενός νέου κόμβου τύπου struct Shop στη λίστα καταστημάτων. Αρχικά, η λίστα προϊόντων του καταστήματος θα είναι κενή. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: R <sid> <type> Shops = <sid 1,type 1 >, <sid 2,type 2 >, <sid 3,type 3 >,, <sid n,type n > όπου n είναι ο αριθμός των κόμβων στη λίστα καταστημάτων και για κάθε i [1,n ], <sid i > και <type i > είναι το αναγνωριστικό και ο τύπος του καταστήματος, αντίστοιχα, που αντιστοιχεί στον i- οστό κόμβο της λίστας αυτής. S <sid> <pid> <quantity> <price> Γεγονός τύπου supply shop που υποδηλώνει την εισαγωγή ενός νέου προϊόντος με αναγνωριστικό <pid> στη λίστα προϊόντων του καταστήματος με αναγνωριστικό <sid>. Οι παράμετροι <quantity> και <price> δηλώνουν αντίστοιχα την ποσότητα και την τιμή του νέου προϊόντος. Κατά το γεγονός αυτό, θα αναζητάτε στη λίστα καταστημάτων το κατάστημα με αναγνωριστικό <sid> και στη συνέχεια θα εισάγετε στη λίστα προϊόντων καταστήματος ένα νέο κόμβο με αναγνωριστικό <pid>. Μετά από κάθε εισαγωγή, η λίστα προϊόντων καταστήματος θα πρέπει να μένει ταξινομημένη. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: S <sid> <pid> <quantity> <price> Shop 1 = <pid 1,1,quantity 1,1,price 1,1 >, <pid 1,2,quantity 1,2,price 1,2 >,, <pid 1,m1,quantity 1,m1,price 1,m1 > Shop 2 = <pid 2,1,quantity 2,1,price 2,1 >, <pid 2,2,quantity 2,2,price 2,2 >,, <pid 2,m2,quantity 2,m2,price 2,m2 > Shop n = <pid n,1,quantity n,1,price n,1 >, <pid n,2,quantity n,2,price n,2 >,, <pid n,mn,quantity n,mn,price n,mn > όπου n είναι το πλήθος των κόμβων στη λίστα καταστημάτων και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων του i-οστού καταστήματος, και για κάθε j [1,,mi ], pid i,j, quantity i,j και price i,j είναι το αναγνωριστικό, η ποσότητα και η τιμή του προϊόντος, αντίστοιχα, που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταστήματος.

C <cid> Γεγονός τύπου register customer που υποδηλώνει την εισαγωγή ενός νέου καταναλωτή με αναγνωριστικό <cid> στη λίστα καταναλωτών. Κατά το γεγονός αυτό, θα γίνεται εισαγωγή ενός νέου κόμβου τύπου struct Customer στη λίστα καταναλωτών. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: C <cid> Customers = <cid 1 >, <cid 2 >, <sid 3 >,, <sid n > όπου n ο αριθμός των κόμβων στη λίστα καταναλωτών και για κάθε i [1,n], <cid i > είναι το αναγνωριστικό του καταναλωτή που αντιστοιχεί στον i-οστό κόμβο της λίστας αυτής. L <cid> <pid> <quantity> Γεγονός τύπου add to shopping list που υποδηλώνει την εισαγωγή ενός νέου κόμβου με αναγνωριστικό <pid> στη λίστα προϊόντων του καταναλωτή με αναγνωριστικό <cid>. Η παράμετρος <quantity> υποδηλώνει την ποσότητα του νέου προϊόντος. Κατά το γεγονός αυτό, θα αναζητείτε το κόμβο με αναγνωριστικό <cid> στη λίστα καταναλωτών και στη συνέχεια θα εισάγετε στη λίστα προϊόντων καταναλωτών ένα νέο κόμβο με αναγνωριστικό <pid>. Μετά από κάθε εισαγωγή, η λίστα προϊόντων καταναλωτών θα πρέπει να μένει ταξινομημένη. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: L <cid> <pid> <quantity> Customer 1 = <pid 1,1,quantity 1,1 >, <pid 1,2,quantity 1,2 >,, <pid 1,m1,quantity 1,m1 > Customer 2 = <pid 2,1,quantity 2,1 >, <pid 2,2,quantity 2,2 >,, <pid 2,m2,quantity 2,m2 > Customer n = <pid n,1,quantity n,1 >, <pid n,2,quantity n,2 >,, <pid n,mn,quantity n,mn > όπου n είναι το πλήθος των κόμβων στη λίστα καταναλωτών και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων του i-οστού καταναλωτή, και για κάθε j [1,,mi ], pid i,j, και quantity i,j είναι αντίστοιχα το αναγνωριστικό και η ποσότητα του προϊόντος που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταναλωτή. D <cid> <pid> Γεγονός τύπου delete from shopping list που υποδηλώνει την διαγραφή του κόμβου με αναγνωριστικό <pid> από τη λίστα προϊόντων του καταναλωτή με αναγνωριστικό <cid>. Κατά το γεγονός αυτό, θα αναζητείτε το κόμβο με αναγνωριστικό <cid> στη λίστα καταναλωτών και στη συνέχεια θα διαγράφετε από τη λίστα προϊόντων τον κόμβο με αναγνωριστικό <pid>. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία:

D <cid> <pid> Customer 1 = <pid 1,1,quantity 1,1 >, <pid 1,2,quantity 1,2 >,, <pid 1,m1,quantity 1,m1 > Customer 2 = <pid 2,1,quantity 2,1 >, <pid 2,2,quantity 2,2 >,, <pid 2,m2,quantity 2,m2 > Customer n = <pid n,1,quantity n,1 >, <pid n,2,quantity n,2 >,, <pid n,mn,quantity n,mn > όπου n είναι το πλήθος των κόμβων στη λίστα καταναλωτών και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων καταναλωτών του i-οστού καταναλωτή, και για κάθε j [1,,mi ], pid i,j, και quantity i,j είναι αντίστοιχα το αναγνωριστικό και η ποσότητα του προϊόντος που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταναλωτή. G <cid> Γεγονός τύπου go shopping που υποδηλώνει την αναζήτηση των προϊόντων από τη λίστα προϊόντων του καταναλωτή με αναγνωριστικό <cid> και την αγορά τους από τις λίστες προϊόντων καταστημάτων. Κατά το γεγονός αυτό, θα διατρέχετε τη λίστα καταστημάτων και για κάθε κατάστημα θα αναζητάτε εάν τα προϊόντα στη λίστα προϊόντων του ανήκουν και στη λίστα προϊόντων του καταναλωτή με αναγνωριστικό <cid>. Εάν το προϊόν με αναγνωριστικό <pid i > ανήκει και στις δύο λίστες, θα ενημερώνετε κατάλληλα το πεδίο quantity του προϊόντος τόσο του καταναλωτή, όσο και του καταστήματος, υποδηλώνοντας έτσι την αγορά του προϊόντος. Εάν το κατάστημα δε διαθέτει την επιθυμητή ποσότητα του προϊόντος με αναγνωριστικό <pid i >, ο καταναλωτής συνεχίζει να ψάχνει και στα υπόλοιπα καταστήματα, μέχρι, είτε να βρει την υπολοιπόμενη ποσότητα του προϊόντος ή να έχει περάσει από όλα τα καταστήματα. Όταν το πεδίο quantity ενός προϊόντος στη λίστα προϊόντων καταναλωτή, αντίστοιχα καταστήματος, γίνει ίσο με 0, το προϊόν θα αφαιρείται από τη λίστα προϊόντων καταναλωτή, αντίστοιχα καταστήματος. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: G <cid> Customer 1 = <pid 1,1,quantity 1,1 >, <pid 1,2,quantity 1,2 >,, <pid 1,m1,quantity 1,m1 > Customer 2 = <pid 2,1,quantity 2,1 >, <pid 2,2,quantity 2,2 >,, <pid 2,m2,quantity 2,m2 > Customer n = <pid n,1,quantity n,1 >, <pid n,2,quantity n,2 >,, <pid n,mn,quantity n,mn > Shop 1 = <pid 1,1,quantity 1,1,price 1,1 >, <pid 1,2,quantity 1,2,price 1,2 >,, <pid 1,z1,quantity 1,z1,price 1,z1 > Shop 2 = <pid 2,1,quantity 2,1,price 2,1 >, <pid 2,2,quantity 2,2,price 2,2 >,, <pid 2,z2,quantity 2,z2,price 2,z2 > Shop w = <pid w,1,quantity w,1,price w,1 >, <pid w,2,quantity w,2,price w,2 >,, <pid w,zw,quantity w,zw,price w,zw > όπου n είναι το πλήθος των κόμβων στη λίστα των καταναλωτών και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων του i-οστού καταναλωτή, και για κάθε j [1,,mi ], pid i,j, και quantity i,j είναι αντίστοιχα το αναγνωριστικό και η ποσότητα του προϊόντος που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταναλωτή. Επιπρόσθετα, θεωρείστε ότι w είναι το πλήθος των κόμβων στη λίστα των καταστημάτων, για κάθε k, 1 k w, z k είναι το πλήθος των κόμβων της λίστας προϊόντων του k-οστού καταστήματος, και για κάθε l [1,,zk ], pid k,l, quantity k,l και price k,l είναι αντίστοιχα το αναγνωριστικό, η ποσότητα και η τιμή

του προϊόντος που αντιστοιχεί στον i-οστό κόμβο της λίστας προϊόντων του k-οστού καταστήματος. M <sid 1 > <sid 2 > Γεγονός τύπου store close που υποδηλώνει την πτώχευση του καταστήματος με αναγνωριστικό <sid 2 > και την συγχώνευσή του με το κατάστημα με αναγνωριστικό <sid 1 >. Κατά το γεγονός αυτό, θα αναζητάτε τους κόμβους με αναγνωριστικό <sid 1 > και <sid 2 > στη λίστα καταστημάτων και έπειτα θα συνενώνετε τις λίστες προϊόντων τους. Η τελική λίστα θα αποτελεί τη λίστα προϊόντων του καταστήματος με αναγνωριστικό <sid 1 >. Τέλος, θα διαγράφετε από τη λίστα καταστημάτων το κατάστημα με αναγνωριστικό <sid 2 >. Η συνένωση των δύο λιστών θα πρέπει να πραγματοποιηθεί με πολυπλοκότητα O(n + m), όπου n, m είναι το πλήθος των κόμβων της λίστας προϊόντων των καταστημάτων με αναγνωριστικό <sid 1 > και <sid 2 >, αντίστοιχα. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: M <sid 1 > <sid 2 > Shop 1 = <pid 1,1,quantity 1,1,price 1,1 >, <pid 1,2,quantity 1,2,price 1,2 >,, <pid 1,m1,quantity 1,m1,price 1,m1 > Shop 2 = <pid 2,1,quantity 2,1,price 2,1 >, <pid 2,2,quantity 2,2,price 2,2 >,, <pid 2,m2,quantity 2,m2,price 2,m2 > Shop n = <pid n,1,quantity n,1,price n,1 >, <pid n,2,quantity n,2,price n,2 >,, <pid n,mn,quantity n,mn,price n,mn > όπου n είναι το πλήθος των κόμβων στη λίστα καταστημάτων και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων καταστήματος του i-οστού καταστήματος, και για κάθε j [1,,mi ], pid i,j, quantity i,j και price i,j είναι αντίστοιχα το αναγνωριστικό, η ποσότητα και η τιμή του προϊόντος που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταστήματος. F Γεγονός τύπου find cheapest products που υποδηλώνει την εύρεση των 5 προϊόντων με τη χαμηλότερη τιμή. Κατά το γεγονός αυτό, θα προσπελάσετε τη λίστα καταστημάτων και για κάθε κατάστημα, θα διασχίζετε τη λίστα προϊόντων του, με σκοπό την εύρεση των 5 κόμβων που έχουν τη χαμηλότερη τιμή στο πεδίο <price>. Για την εκπλήρωση του γεγονότος αυτού, θα χρησιμοποιήσετε ένα βοηθητικό πίνακα 5 θέσεων, όπου κάθε κελί του θα δεικτοδοτεί σε έναν από τους 5 κόμβους με τη χαμηλότερη τιμή στο πεδίο price. Ο πίνακας θα είναι ταξινομημένος σε αύξουσα διάταξη, ως προς το πεδίο price των κόμβων στους οποίους δεικτοδοτεί. Προϊόντα που ανήκουν σε πολλαπλά καταστήματα, θα εμφανίζονται μόνο μία φορά στον πίνακα αυτόν, κρατώντας την χαμηλότερη τιμή με την οποία είναι διαθέσιμα. Το γεγονός θα πρέπει να πραγματοποιηθεί με πολυπλοκότητα Ο(n+m), όπου n είναι το πλήθος των κόμβων της λίστας καταστημάτων και m είναι το πλήθος των προϊόνων που είναι διαθέσιμα. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία:

F Cheapest Products: <pid 1, quantity 1, price 1 >,, <pid 5, quantity 5, price 5 > όπου για κάθε i, 1 i 5 pid i, quantity i και price i είναι το αναγνωριστικό, η ποσότητα καθώς και η τιμή του i-οστού προϊόντος, αντίστοιχα. T Γεγονός τύπου categorize shops που υποδηλώνει την κατηγοριοποίηση των καταστημάτων με βάση τον τύπο τους. Κατά το γεγονός αυτό, θα διαμοιράσετε τη λίστα καταστημάτων σε 5 μικρότερες, απλά συνδεδεμένες λίστες με βάση το πεδίο type (δηλαδή ανάλογα με το σε ποια από τις πέντε κατηγορίες ανήκει). Ο διαμοιρασμός των λιστών θα πρέπει να πραγματοποιηθεί με πολυπλοκότητα O(n), όπου n είναι το πλήθος των κόμβων της λίστας καταστημάτων. Στο σχήμα 3, παρουσιάζεται το αποτέλεσμα της εκτέλεσης ενός τέτοιου γεγονότος στη λίστα καταστημάτων του σχήματος 1: Σχήμα 3: Πίνακας κάθε στοιχείο του οποίου δεικτοδοτεί μία απλά συνδεδεμένη λίστα από καταστήματα. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία:

T Type 1 Shop 1 = <pid 1,1,quantity 1,1,price 1,1 >,, <pid 1,m11,quantity 1,m11,price 1,m11 > Shop n1 = <pid n1,1,quantity n1,1,price n1,1 >,, <pid n1,mn1,quantity n1,mn1,price n1,mn1 > Type k Shop 1 = <pid 1,1,quantity 1,1,price 1,1 >,, <pid 1,m1k,quantity 1,m1k,price 1,m1k > Shop nk = <pid nk,1,quantity nk,1,price nk,1 >,, <pid nk,mnk,quantity nk,mnk,price nk,mnk > όπου k είναι το πλήθος των ειδών καταστημάτων και για κάθε w, 1 w k n w είναι το πλήθος καταστημάτων του w-οστού τύπου, για κάθε i, 1 i n και j, 1 j k m i,j είναι το πλήθος των κόμβων της i-οστής λίστας καταστημάτων του j-οστού τύπου, και για κάθε l [1,,mij ], pid ij,l, quantity ij,l και price ij,l είναι αντίστοιχα το αναγνωριστικό, η ποσότητα και η τιμή του προϊόντος που αντιστοιχεί στον l-οστό κόμβο της i-οστής λίστας προϊόντων καταστήματος του j-οστού τύπου. Χ Γεγονός τύπου print shops που υποδηλώνει την εκτύπωση όλων των καταστημάτων από τη λίστα καταστημάτων καθώς και την εκτύπωση των λιστών προϊόντων τους. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: Χ Shop 1 = <pid 1,1,quantity 1,1,price 1,1 >, <pid 1,2,quantity 1,2,price 1,2 >,, <pid 1,m1,quantity 1,m1,price 1,m1 > Shop 2 = <pid 2,1,quantity 2,1,price 2,1 >, <pid 2,2,quantity 2,2,price 2,2 >,, <pid 2,m2,quantity 2,m2,price 2,m2 > Shop n = <pid n,1,quantity n,1,price n,1 >, <pid n,2,quantity n,2,price n,2 >,, <pid n,mn,quantity n,mn,price n,mn > όπου n είναι το πλήθος των κόμβων στη λίστα καταστημάτων και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων καταστήματος του i-οστού καταστήματος, και για κάθε j [1,,mi ], pid i,j, quantity i,j και price i,j είναι αντίστοιχα το αναγνωριστικό, η ποσότητα και η τιμή του προϊόντος που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταστήματος.

Υ Γεγονός τύπου print customers που υποδηλώνει την εκτύπωση όλων των καταναλωτών από τη λίστα καταναλωτών καθώς και την εκτύπωση των λιστών προϊόντων τους. Μετά το πέρας της εκτέλεσης ενός τέτοιου γεγονότος, το πρόγραμμα θα πρέπει να τυπώνει την ακόλουθη πληροφορία: Y Customer 1 = <pid 1,1,quantity 1,1 >, <pid 1,2,quantity 1,2 >,, <pid 1,m1,quantity 1,m1 > Customer 2 = <pid 2,1,quantity 2,1 >, <pid 2,2,quantity 2,2 >,, <pid 2,m2,quantity 2,m2 > Customer n = <pid n,1,quantity n,1 >, <pid n,2,quantity n,2 >,, <pid n,mn,quantity n,mn > όπου n είναι το πλήθος των κόμβων στη λίστα καταναλωτών και για κάθε i, 1 i n, m i είναι το πλήθος των κόμβων της λίστας προϊόντων του i-οστού καταναλωτή, και για κάθε j [1,,mi ], pid i,j, και quantity i,j είναι αντίστοιχα το αναγνωριστικό και η ποσότητα του προϊόντος που αντιστοιχεί στον j-οστό κόμβο της λίστας προϊόντων του i-οστού καταναλωτή.

Βαθμολογία Γεγονότων R 6 S 7 C 6 L 7 D 10 G 15 M 15 F 15 T 15 X 2 Y 2

Δομές Δεδομένων Στην υλοποίησή σας δεν επιτρέπεται να χρησιμοποιήσετε έτοιμες δομές δεδομένων (πχ.,arraylist) είτε η υλοποίηση πραγματοποιηθεί στη C είτε στη Java. Στη συνέχεια παρουσιάζονται οι δομές σε C που πρέπει να χρησιμοποιηθούν για την υλοποίηση της παρούσας εργασίας. struct Shop { int sid; int type; struct Product *products; struct Shop *next; struct Shop *prev; }; struct Customer { int cid; struct C_Product *shopping_list; struct Customer *next; }; struct Product { int pid; int quantity; int price; struct Product *next; }; struct C_Product { int pid; int quantity; struct C_Product *next; }; /* global, pointer στον κόμβο Header της κυκλικής, διπλά συνδεδεμένης, λίστας καταστημάτων */ struct Shop *H; /* global, δείκτης στον 1o κόμβο της λίστας καταναλωτών */ struct Customer *Customers; /* global, δείκτης στον κόμβο φρουρό της λίστας καταναλωτών */ struct Customer *Sentinel; /* global, πίνακας για τη χρήση στο γεγονός T */ struct Shop *ShopTypes[5]; /* global, πίνακας για τη χρήση στο γεγονός F */ struct Product *CheapestProducts[5];