Προγραμματισμός ΙΙ Εαρινό εξάμηνο Εργασία 3 Βιβλιοθήκη για λειτουργίες σε γράφους

Σχετικά έγγραφα
ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 22/12/2016, 21:00

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

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

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

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

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

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός Ι. Προχωρημένα Θέματα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΑΦAΙΡΕΤΙΚΟΣ (ή ΑΦΗΡΗΜΕΝΟΣ) ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT) - σύνολο δεδομένων (data, objects) - σύνολο πράξεων στα δεδομένα

ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ (ΑΤΔ) (Abstract Data Type-ADT)

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

2η Προγραµµατιστική Εργασία

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

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

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

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

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

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

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

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

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

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

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

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

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

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

Ενότητες στην C Τεχνική Υλοποίησης Αφαιρετικών Τύπων Δεδομένων στην C

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

Εργαστήριο 9: Αρχεία

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Διαδικασιακός Προγραμματισμός

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

Δημιουργία μιας εφαρμογής Java με το NetBeans

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 6: Συναρτήσεις και Αναδρομή

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

ιαφάνειες παρουσίασης #5 (β)

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

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

Διάλεξη 2: Επανάληψη Προγραμματισμού Συμβολοσειρές (strings) Διδάσκων: Παναγιώτης Ανδρέου

ΕΡΓΑΣΤΗΡΙΟ 9: Συμβολοσειρές και Ορίσματα Γραμμής Εντολής

Η βασική συνάρτηση προγράμματος main()

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 27/11/11, 22:00

Άσκηση 3 (ανακοινώθηκε στις 14 Μαΐου 2018, προθεσμία παράδοσης: 8 Ιουνίου 2018, 12 τα μεσάνυχτα).

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

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

Δυναμική δέσμευση και αποδέσμευση μνήμης. Προγραμματισμός II 1

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

ΣΕΤ ΑΣΚΗΣΕΩΝ 2. Προθεσµία: 15/11/09, 23:59

Επεξεργασία Αρχείων Κειµένου

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

Αλγόριθμοι Ταξινόμησης Μέρος 1

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

Γράφοι. Ορολογία. Ορισµός: G = (V, E) όπου. Ορολογία (συνέχεια) γράφος ή γράφηµα (graph) V:ένα σύνολο E:µια διµελής σχέση στο V

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

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

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

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

(programming interfaceή/και application programming interface API).

(Κεφάλαιο 2.7 και 12) Αρχεία στην C. (Διάλεξη 15)

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

Ηλεκτρονικοί Υπολογιστές

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

ΑΣΚΗΣΗ 5: ΠΙΝΑΚΕΣ. Σχήµα 1: H έννοια των πινάκων

ΚΕΦΑΛΑΙΟ 2: Τύποι δεδομένων και εμφάνιση στοιχείων...33

Λειτουργικά Συστήματα Κεφάλαιο 2 Οργάνωση Συστήματος Αρχείων 2.1 Διαχείριση Αρχείων και Σύστημα Αρχείων(File System)

lab7 PASS -Δεν έχεις καθόλου σχόλια! Διάβασε το φυλλάδιο. PASS -Πολύ καλή εργασία µε σωστά και επεξηγηµατικά σχόλια. -Πρόσεξε την στοίχισή σου!

- Το πρόγραµµα σας δίνει τα αναµενόµενα αποτελέσµατα.

Κεφάλαιο 6: Συναρτήσεις IΙΙ Αρθρωτός Προγραμματισμός. (Διάλεξη 14) Παράδειγμα: Αλλαγή τιμής μεταβλητής μόνο τοπικά

CE121 Προγραµµατισµός 2. Εισαγωγή σε Makefiles. CE121 -

Ανάπτυξη και Σχεδίαση Λογισμικού

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

Αλγόριθμοι και Δομές Δεδομένων (IΙ) (γράφοι και δένδρα)

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

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Στοίβες με Δυναμική Δέσμευση Μνήμης

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) Ιστοσελίδα του µαθήµατος. Περιεχόµενα. ηµήτριος Κατσαρός, Ph.D. Κλάσεις.

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

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

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

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός Υπολογιστών με C++

Κεφάλαιο Αλφαριθμητικές Σειρές Χαρακτήρων (Strings) (Διάλεξη 20) 1) Strings στη C

ΗY335: Δίκτυα Υπολογιστών Χειμερινό Εξάμηνο Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης Διδάσκουσα: Μαρία Παπαδοπούλη

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

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

Θέµατα εξετάσεων µε απαντήσεις

Ινστιτούτο Επαγγελµατική Κατάρτιση Κορυδαλλού "ΤΕΧΝΙΚΟΣ ΣΥΣΤΗΜΑΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ" (Ερωτήσεις Πιστοποίησης στην γλώσσα προγραµµατισµού C)

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

Η γλώσσα προγραμματισμού C

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

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

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

Transcript:

Εργασία 3 Βιβλιοθήκη για λειτουργίες σε γράφους Αναπτύξτε μια βιβλιοθήκη για την δημιουργία / διαχείριση γράφων και την υποστήριξη βασικών λειτουργιών αναζήτησης σε αυτούς. Η βιβλιοθήκη πρέπει να υποστηρίζει μια κατάλληλη διεπαφή προγραμματισμού (application programming interface -- API) μέσω της οποίας η παρεχόμενη λειτουργικότητα μπορεί να χρησιμοποιηθεί από άλλα προγράμματα/εφαρμογές. Τα βασικά βήματα της εργασίας είναι: 1. Ορίστε την διεπαφή της βιβλιοθήκης μέσω ενός header file ( graph.h ) που περιέχει τους ορισμούς για τους τύπους δεδομένων (data types) και τα πρωτότυπα των συναρτήσεων (function prototypes) που προσφέρει η βιβλιοθήκη. 2. Σε ξεχωριστό αρχείο ( graph.c ), υλοποιήστε τις λειτουργίες που ορίζονται στο header file. 3. Αναπτύξτε ένα πρόγραμμα δοκιμής ( project3.c ), που επιτρέπει στον χρήστη να ορίζει γράφους και να πραγματοποιεί λειτουργίες αναζήτησης σε αυτούς, δίνοντας κατάλληλες εντολές. 4. Γράψτε κατάλληλο Makefile στο οποίο δημιουργείται μια στατική βιβλιοθήκη libgraph.a που υλοποιεί τις λειτουργίες γράφων και συνδέεται (link) με το κυρίως πρόγραμμα ώστε να παράγει εκτελέσιμο με όνομα project3. O στόχος που παράγει το εκτελέσιμο πρέπει να είναι ο πρώτος στόχος στο Makefile. Ορισμός τύπων Η βιβλιοθήκη πρέπει να ορίζει τον τύπο graph_t για έναν γράφο. Ο τύπος graph_t πρέπει να υλοποιηθεί ως αφηρημένος τύπος δεδομένων (abstract data type) χωρίς να φανερώνεται η υλοποίηση του (π.χ., δομές δεδομένων και αλγόριθμοι που χρησιμοποιεί εσωτερικά η βιβλιοθήκη για να υποστηρίζει τις λειτουργίες που σχετίζονται με αυτόν τον τύπο). Ενδεικτικά, η υλοποίηση θα μπορούσε να χρησιμοποιεί έναν πίνακα ή μια λίστα γειτνίασης (adjacency matrix/list), περισσότερα για αυτό στο φροντιστήριο. Παρομοίως, η βιβλιοθήκη πρέπει να ορίζει τον τύπο path_t για μονοπάτια/διαδρομές μέσα στον γράφο, πάλι ως αφηρημένο τύπο δεδομένων, χωρίς να φανερώνεται η εσωτερική υλοποίηση. Για μεγαλύτερη ευελιξία, οι κόμβοι του γράφου πρέπει να ορίζονται με γενικό/αφηρημένο τρόπο, ως void*. Αυτό επιτρέπει στα προγράμματα που χρησιμοποιούν την βιβλιοθήκη να φτιάχνουν γράφους έχοντας ως κόμβους αντικείμενα οποιουδήποτε τύπου (με κατάλληλο type casting). Ο έλεγχος για το αν δύο κόμβοι είναι ίδιοι/ταυτόσημοι πρέπει να πραγματοποιείται με γενικό/αφηρημένο τρόπο, μέσω μιας συνάρτησης η οποία παίρνει ως παραμέτρους δύο κόμβους (void *) και επιστρέφει την ακέραια τιμή 1 εάν αυτοί θεωρούνται ίσοι/ταυτόσημοι, διαφορετικά 0. Η υλοποίησή της είναι ευθύνη του εκάστοτε προγράμματος που χρησιμοποιεί την βιβλιοθήκη, ενώ η εγκατάσταση αυτής της συνάρτησης μέσα στην βιβλιοθήκη γίνεται κατά την δημιουργία/αρχικοποίηση του γράφου. Αντίστοιχα, η καταστροφή ενός κόμβου πραγματοποιείται μέσω μιας συνάρτησης η οποία παίρνει ως παράμετρο τον κόμβο (void *) και ελευθερώνει τη μνήμη που έχει δεσμευτεί 1

δυναμικά γι αυτόν. Η υλοποίησή της είναι ευθύνη του προγράμματος που χρησιμοποιεί τη βιβλιοθήκη και η εγκατάστασή της γίνεται κατά τη δημιουργία/αρχικοποίηση του γράφου. Λειτουργίες διαχείρισης γράφου Πρέπει να παρέχονται οι εξής λειτουργίες διαχείρισης γράφου: graph_t graph_new (int (*cmp)(void*, void*), void (*destroy_vertex(void*) )): Δημιουργία και επιστροφή ενός νέου (κενού) γράφου, με εγκατάσταση της συνάρτησης ελέγχου ταυτότητας κόμβων και της συνάρτησης καταστροφής κόμβου (βλέπε παραπάνω). int graph_add_vertex (graph_t g, void *vertex): Προσθήκη κόμβου στον γράφο. Αν ο κόμβος (ένας ταυτόσημος κόμβος) υπάρχει ήδη στον γράφο, επιστρέφεται κωδικός λάθους -1. Σε επιτυχία επιστρέφεται 0. int graph_rmv_vertex (graph_t g, void *vertex): Αφαίρεση κόμβου από τον γράφο, με αυτόματη αφαίρεση όλων των ακμών που συμπεριλαμβάνουν τον κόμβο. Αν ο κόμβος δεν υπάρχει στον γράφο, επιστρέφεται κωδικός λάθους -1. Σε επιτυχία επιστρέφεται 0. int graph_add_edge (graph_t g, void *vertex1, void *vertex2, int weight): Προσθήκη ακμής ανάμεσα στον κόμβο vertex1 και vertex2. Η παράμετρος weight προσδιορίζει το βάρος της ακμής. Σε επιτυχία επιστρέφεται 0. Αν έστω κι ένας κόμβος δεν υπάρχει στο γράφο επιστρέφεται κωδικός λάθους -1. Αν η συγκεκριμένη ακμή υπάρχει ήδη, επιστρέφεται κωδικός λάθους -2. int graph_rmv_edge (graph_t g, void *vertex1, void *vertex2): Αφαίρεση ακμής ανάμεσα σε δύο κόμβους του γράφου. Σε επιτυχία επιστρέφεται 0. Αν έστω κι ένας κόμβος δεν υπάρχει στο γράφο επιστρέφεται κωδικός λάθους -1. Αν η συγκεκριμένη ακμή δεν υπάρχει, επιστρέφεται κωδικός λάθους -2. void graph_destroy (graph_t g): Καταστροφή γράφου, με απελευθέρωση της μνήμης που χρησιμοποιείται για όλες τις εσωτερικές δομές. Λειτουργίες διαχείρισης μονοπατιού Πρέπει να παρέχονται οι εξής λειτουργίες διαχείρισης μονοπατιού: int path_len (path_t p): Επιστροφή του αριθμού των ακμών του μονοπατιού. void path_traverse_init (path_t p): Αρχικοποίηση διάσχισης μονοπατιού. void *path_traverse_nxt (path_t p): Επιστροφή του επόμενου κόμβου στο μονοπάτι. Αν δεν υπάρχει επόμενος κόμβος, επιστρέφεται NULL. void path_destroy (path_t p): Καταστροφή μονοπατιού, με απελευθέρωση της μνήμης που χρησιμοποιείται για όλες τις εσωτερικές δομές. Λειτουργίες αναζήτησης στον γράφο Πρέπει να παρέχονται οι εξής λειτουργίες αναζήτησης στον γράφο: 2

path_t find_minhops_path (graph_t g, void *vertex1, void *vertex2): Επιστροφή του μονοπατιού με τον μικρότερο αριθμό ακμών ανάμεσα σε δύο κόμβους. Αν δεν βρεθεί μονοπάτι, επιστρέφεται ένα κενό μονοπάτι (μήκους 0). path_t find_shortest_path (graph_t g, void *vertex1, void *vertex2): Επιστροφή του μονοπατιού με το μικρότερο συνολικό βάρος ακμών ανάμεσα σε δύο κόμβους. Αν δεν βρεθεί μονοπάτι, επιστρέφεται ένα κενό μονοπάτι (μήκους 0). Για την υλοποίηση των παραπάνω λειτουργιών, μπορείτε να βασιστείτε στον κλασικό 1 αλγόριθμο του Dijkstra (χρησιμοποιήστε όποιες παραλλαγές θεωρείτε κατάλληλες για κάθε περίπτωση). Πρόγραμμα δοκιμής -- social network model Δοκιμάστε την βιβλιοθήκη σας μέσω ενός προγράμματος που επιτρέπει στον χρήστη να ορίζει έναν γράφο κοινωνικής δικτύωσης και να πραγματοποιεί αναζητήσεις σε αυτόν, χρησιμοποιώντας την παραπάνω βιβλιοθήκη. Οι κόμβοι που δημιουργεί το πρόγραμμα αντιστοιχούν σε ανθρώπους (για απλότητα περιέχουν μόνο το όνομα, το οποίο δεν περιέχει κενά), οι ακμές συμβολίζουν σχέσεις φιλίας, και το βάρος μιας ακμής συμβολίζει την περιοδικότητα της επικοινωνίας ανάμεσα σε δύο φίλους (μεγαλύτερες τιμές αντιστοιχούν σε πιο σπάνια επικοινωνία). Οπότε το μονοπάτι με τον μικρότερο αριθμό ακμών ανάμεσα σε δύο κόμβους του γράφου αντιστοιχεί στην πιο άμεση σύνδεση δύο ατόμων μέσω των γνωριμιών τους, ενώ το μονοπάτι με το μικρότερο συνολικό βάρος ακμών ανάμεσα σε δύο κόμβους του γράφου αντιστοιχεί στην αλυσίδα που θα οδηγήσει με μεγαλύτερη πιθανότητα σε μια συνάντηση δύο ατόμων. Το πρόγραμμα πρέπει να υλοποιεί την συνάρτηση ελέγχου ταυτοποίησης ανάμεσα σε δύο κόμβους (έλεγχος αν το όνομα είναι ίδιο), και να την περνά ως παράμετρο κατά την δημιουργία του γράφου. Συγκεκριμένα πρέπει να υποστηρίζονται οι εξής εντολές, με την μορφή που δίνεται παρακάτω: Εντολή Είσοδος Έξοδος stdout (επιτυχία) Έξοδος stdout (αποτυχία) create c C-OK C-NOK destroy d D-OK - add person ap <name> AP-OK AP-NOK rmv person rp <name> RP-OK RP-NOK 1 https://en.wikipedia.org/wiki/dijkstra%27s_algorithm 3

add friendship rmv friendship af <name> <name> <com. period> AF-OK AF-NOK P ή AF-NOK F rf <name> <name> RF-OK RF-ΝΟΚ P ή RF-NOK F find closest connection fc <name> <name> ## FC-ΟΚ < len > <name> <name> FC-NOK find likely connection fl <name> <name> ## FL-ΟΚ < len > <name> <name> FL-NOK print social network p <name> <name> <com. period> <name> <name> <com. period> quit q Αν μια εντολή αποτελείται από περισσότερα τμήματα (συνοδεύεται από μια ή περισσότερες παραμέτρους), αυτά διαχωρίζονται με έναν ή περισσότερους χαρακτήρες (space). Κάθε εντολή τερματίζει με τον χαρακτήρα \n. Πριν και μετά από κάθε μήνυμα εξόδου βρίσκεται χαρακτήρας \n. Αν το μήνυμα αποτελείται από πολλαπλά τμήματα ανά γραμμή, αυτά διαχωρίζονται από έναν μοναδικό χαρακτήρα (space). Στην έξοδο αποτυχίας των add/rmv friendship, P σημαίνει ότι αυτά τα άτομα δεν υπάρχουν κι F ότι είναι/δεν είναι ήδη φίλοι. Σημειώσεις : Αν έχει ήδη δημιουργηθεί ένας γράφος στην εφαρμογή, δε θα επιτρέπεται η δημιουργία άλλου πριν καταστραφεί ο προηγούμενος (εκτυπώνεται C-NOK). Το len στην περίπτωση fc αναφέρεται σε πλήθος ακμών του μονοπατιού ενώ στην περίπτωση fl σε συνολικό άθροισμα βαρών των ακμών του μονοπατιού. Σε περίπτωση αποτυχίας της λειτουργίας af, υπεύθυνος για την απελευθέρωση της μνήμης που δεσμεύτηκε για τα δεδομένα του κόμβου είναι ο χρήστης. Προσοχή: Για όλες τις εντολές, εκτός της p(rint), το πρόγραμμα πρέπει να ακολουθεί ακριβώς τις παραπάνω προδιαγραφές, διαφορετικά θα αποτύχει ο αυτοματοποιημένος έλεγχος της λειτουργίας το προγράμματος, όπου η είσοδος και η έξοδος του προγράμματος ανακατευθύνεται σε αρχεία, όπου τα αρχεία εισόδου περιέχουν τις εντολές ακριβώς με βάση την παραπάνω μορφή, ενώ τα αρχεία εξόδου συγκρίνονται, byte προς byte, με άλλα αρχεία που έχουν ακριβώς την αναμενόμενη έξοδο. H λειτουργία p(rint) δεν θα χρησιμοποιηθεί κατά την 4

διαδικασία του αυτοματοποιημένου ελέγχου, όμως πρέπει να υλοποιηθεί αφενός για να μπορεί να γίνονται πιο εύκολα έλεγχοι κατά την εξέταση/επίδειξη της εργασίας αφετέρου για να διευκολύνει εσάς τους ίδιους στο debugging κατά την ανάπτυξη. Εναλλακτική υλοποίηση της print : Μπορείτε να υλοποιήσετε την print ώστε να παράγει έξοδο σε μορφή που μπορεί να μετατραπεί σε γραφική αναπαράσταση. Συστήνουμε η έξοδος να σταλεί στο stderr ώστε να είναι εύκολο να αποθηκευτεί σε αρχείο με κατάλληλη ανακατεύθυνση. Η μορφή της εξόδου είναι: Η συμβολοσειρά graph G { Για κάθε κόμβο, μια γραμμή με το όνομα του κόμβου Για κάθε ακμή από κόμβο X σε κόμβο Υ με βάρος Z, μια γραμμή με το string X -- Y [label=z] Στην τελευταία γραμμή ο χαρακτήρας } και αλλαγή γραμμής. Παράδειγμα: Εκτελείτε το πρόγραμμά σας και ανακατευθύνετε το stderr στο αρχείο mygraph.dot ως εξής:./project3 2> mygraph.dot Ας υποθέσουμε ότι τα περιεχόμενα του mygraph.dot είναι: graph G { A B C D E A -- B [label=5] A -- C [label=3] B -- C [label=6] C -- D [label=1] C -- E [label=8] } Γράφετε σε τερματικό την εντολή dot -Tpng < mygraph.dot > mygraph.png Αν ανοίξετε το mygraph.png θα δείτε: 5

Εγκατάσταση του προγράμματος dot στον υπολογιστή σας Το πρόγραμμα dot βρίσκεται μέσα στη σουίτα εργαλείων graphviz για εκτύπωση γράφων. Αναζητήστε το πακέτο graphviz στη διανομή Linux του υπολογιστή σας. Για Ubuntu: $> sudo apt-get install graphviz Περιεχόμενα αρχείου graph.h #ifndef _GRAPH_H #define _GRAPH_H typedef struct private_graph * graph_t; typedef struct private_path * path_t; graph_t graph_new(int (*cmp)(void*, void*), void (*destroy_vertex(void*) ); void graph_destroy(graph_t g); int graph_add_vertex(graph_t graph, void *vertex); int graph_rmv_vertex(graph_t graph, void *vertex); int graph_add_edge(graph_t graph, void *vertex1, void *vertex2, int weight) ; int graph_rmv_edge(graph_t graph, void *vertex1, void *vertex2) ; int path_len(path_t path); void path_traverse_init(path_t path); void *path_traverse_nxt(path_t path); void path_destroy(path_t path); 6

path_t find_minhops_path (graph_t graph, void *vertex1, void *vertex2); path_t find_shortest_path (graph_t graph, void *vertex1, void *vertex2); #endif Παρατηρήστε πως οι τύποι graph_t, path_t είναι δείκτες σε struct. Οι εσωτερικές υλοποιήσεις των struct private_graph, private_path θα βρίσκονται στο graph.c ώστε να είναι κρυμμένες από τον χρήστη της βιβλιοθήκης. Ο συγκεκριμένος τρόπος σχεδιασμού αφηρημένων τύπων δεδομένων καλύφθηκε στη διάλεξη "Βιβλιοθήκες". Στάδια ανάπτυξης του κώδικα Στάδιο 0: Αποφασίστε πώς ακριβώς θα υλοποιήσετε το γράφο σας (adjacency list/matrix) και τι πληροφορίες θα αποθηκεύσετε στις εκάστοτε δομές. Στάδιο 1: Υλοποιήστε τις λειτουργίες διαχείρισης γράφου (στα πλαίσια της βιβλιοθήκης). Γράψτε τη main με όλες τις λειτουργίες εκτός των d, fc, fl. Χρησιμοποιήστε τη για να κατασκευάσετε ένα γράφο και ελέγξτε συστηματικά κάθε μία λειτουργία. Στάδιο 2: Υλοποιήστε τις λειτουργίες του μονοπατιού. Γράψτε μια προσωρινή βοηθητική συνάρτηση που απλά κατασκευάζει ένα μονοπάτι και χρησιμοποιεί τις λειτουργίες που υλοποιήσατε για να εκτυπώσει τα περιεχόμενά του, και καλέστε τη από τη main. Στάδιο 3: Υλοποιήστε τον αλγόριθμο του Dijkstra και τις λειτουργίες fc, fl. Ελέγξτε την ορθότητά τους. Στάδιο 4: Υλοποιήστε τη λειτουργία d. 7