Επισκόπηση Μαθήματος. Γραμμικές Δομές Δεδομένων. ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.

Σχετικά έγγραφα
Γραμμικές Δομές Δεδομένων

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

Ουρές (Queues) FIFO A B C. Διαγραφή. Εισαγωγή. εµπρός. πίσω. πίσω. πίσω

ΛΙΣΤΕΣ. Ορισμός ΑΤΔ Λίστα ΑΤΔ Ακολουθιακή Λίστα Διαχείριση Δεικτών και Λιστών στη C ΑΤΔ Συνδεδεμένη Λίστα. Εφαρμογές και Χρήση Λιστών

Δομές Δεδομένων. Ενότητα 3: Ουρές Εισαγωγή-Υλοποίηση ΑΤΔ Ουρά με πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

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

ΣΤΟΙΒΕΣ (stacks) Σχήµα: Λειτουργία Στοίβας

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

ΣΤΟΙΒΑ ΧΑΡΑΚΤΗΡΙΣΤΙΚΗ ΙΔΙΟΤΗΤΑ ΤΗΣ ΣΤΟΙΒΑΣ. Το τελευταίο στοιχείο που εισήχθη θα εξαχθεί πρώτο. Άλλο όνομα L I F O (Last In First Out)

ΕΠΛ232: Εργαστήριο 2

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ. for (παράσταση_1; παράσταση_2; παράσταση_3) εντολή επόμενη εντολή

Tύπος δεδοµένων (data type) µιας µεταβλητής (σε µια γλώσσα προγραµµατισµού) είναι το σύνολο των τιµών που µπορεί να πάρει η µεταβλητή.

Υλοποιήσεις,Δοκιμές και Εφαρμογές Βασικών Αφηρημένων Τύπων Δεδομένων στη C για εκπαιδευτική χρήση 1. O AΤΔ ΟΥΡΑ

Χρήσεις Στοίβας ΣΤΟΙΒΑ. Ορισμός Στοίβας (stack) Βασική Λειτουργικότητα

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ IOYNIOY 2018 ΘΕΜΑΤΑ Α ΟΝΟΜΑΤΕΠΩΝΥΜΟ:... ΑΕΜ: ΕΞΑΜΗΝΟ:

Δομές Δεδομένων και Τεχνικές Προγραμματισμού Ενότητα 2: ΑΤΔ Στοίβα. Ιωάννης Κοτρώνης Σχολή Θετικών Επιστημών Τμήμα Πληροφορικής και Τηλεπικοινωνιών

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

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Ενδεικτικές Απαντήσεις Εξετάσεων Α' Περιόδου Θέµα 1. (α') 2 - ii 3 - iii 4 - iv

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

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

ΣΥΜΒΟΛΟΣΕΙΡΕΣ (Strings) Ο ΑΤΔ Συµβολοσειρά Μία συµβολοσειρά είναι µία ακολουθία χαρακτήρων. Bασικές πράξεις : 1. Δηµιουργία. 2. Μήκος. 3.

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

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

ΠΙ Ν Α Κ Ε Σ (arrays)

Εισαγωγή στον Προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδηµαϊκό έτος ΑΣΚΗΣΗ #5 Προτεινόµενη λύση

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

Δομές Δεδομένων. Ενότητα 10: Πλήρη Δυαδικά Δέντρα, Μέγιστα/Ελάχιστα Δέντρα & Εισαγωγή στο Σωρό- Ο ΑΤΔ Μέγιστος Σωρός. Καθηγήτρια Μαρία Σατρατζέμη

Τμ. Τεχνολογίας Πληροφορικής & Τηλεπικοινωνιών Α Εξεταστική Περίοδος, 25 Ιουνίου 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας

Δρ. Πέτρος Παναγή B123

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

Εισαγωγή στον Προγραμματισμό

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

Α Β Γ static; printf("%c\n", putchar( A +1)+2); B DB BD. int i = 0; while (++i); printf("*");

1. ΕΙΣΑΓΩΓΗ-ΓΕΝΙΚΑ ΠΕΡΙ ΑΦΗΡΗΜΕΝΩΝ ΤΥΠΩΝ ΔΕΔΟΜΕΝΩΝ

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

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

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

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

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

ΑΡ Χ Ε Ι Α Κ Ε Ι Μ Ε Ν Ο Υ (text files)

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

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

Επιλογές και Κριτήρια Σχεδιασμού ΑΤΔ Ανεξαρτήτως από Γλώσσα Υλοποίησης 24/4/2012

Δομές Δεδομένων. Ενότητα 1: Εισαγωγή-Υλοποίηση του ΑΤΔ Σύνολο με Πίνακα. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής.

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

Προγραμματισμός Η/Υ (ΤΛ2007 )

Δομές Δεδομένων. Ενότητα 6: Εφαρμογή Συνδεδεμένων Λιστών: Αλφαβητικό ευρετήριο κειμένου- Υλοποίηση ΑΤΔ Στοίβα και Ουρά με δείκτες

Δομημένος Προγραμματισμός

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

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

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

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

ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Η/Υ 8/9/2008

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

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

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

ΘΕΜΑΤΑ ΕΞΕΤΑΣΗΣ ΚΑΙ ΑΠΑΝΤΗΣΕΙΣ ΤΟΥΣ

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

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

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

Εισαγωγή στους Αλγόριθμους και τον Προγραμματισμό. 4η Διάλεξη Πίνακες Συναρτήσεις

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ. Ασκήσεις Επανάληψης

Υπολογισμός - Εντολές Επανάληψης

ΕΠΛ232 Προγραμματιστικές Τεχνικές και Εργαλεία Δείκτες και Συναρτήσεις (Κεφάλαιο 11, KNK-2ED)

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

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

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ Κεφάλαιο 3 ο

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

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

Πίνακες. 1 Πίνακες. 30 Μαρτίου 2014

6. ΠΙΝΑΚΕΣ & ΑΛΦΑΡΙΘΜΗΤΙΚΑ

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

Εισαγωγή στον δομημένο προγραμματισμό

Ενώσεις δεδομένων Απαριθμητές Ψηφιακοί τελεστές Αναδρομικές συναρτήσεις

ΕΡΓΑΣΤΗΡΙΟ 4: Μεταβλητές, Δομές Ελέγχου και Επανάληψης

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

Συναρτήσεις. Εισαγωγή

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 7 Ο. Αριθμητικές πράξεις Τυχαίοι αριθμοί Εφαρμογές σε προβλήματα ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 )

2 η Υλοποίηση του ΑΤΔ συνδεδεμένη λίστα με πίνακα Κόμβοι από δεδομένα και θέσεις πίνακα ????

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

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

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Μεθόδων Επίλυσης Προβλημάτων

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

ΤΕΙ Θεσσαλίας, Τμήμα Μηχανικών Πληροφορικής ΤΕ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΗΥ ΕΡΓΑΣΤΗΡΙΟ 9. ΑΣΚΗΣΕΙΣ (με ενδεικτική λύση)

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

Συλλογές, Στοίβες και Ουρές

Η γλώσσα προγραμματισμού C Οι συναρτήσεις στη C (2)

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Μεθόδων Επίλυσης Προβλημάτων

Transcript:

Γραμμικές Δομές Δεδομένων Επισκόπηση Μαθήματος Συλλογή δεδομένων στη σειρά (ολική διάταξη). Προσθέτουμε δεδομένα στη Δομή (μεγαλώνει) ή αφαιρούμε δεδομένα (μικραίνει) Αν περιορίσουμε τις πράξεις Στην Αρχή μόνο Στοίβα (stack) Είσοδος αρχή & έξοδος τέλος - Ουρά (queue) ΑΤΔ Ουρά Εναλλακτικοί Σχεδιασμοί Προγραμματισμός με Ενότητες Interface.h Implementation.c Με τους δύο τρόπους οργάνωσης.h και.c, μερική και πλήρη απόκρυψη Ουρές (Queues) εμπρός A B C εμπρός πίσω Απομάκρυνση B C εμπρός πίσω Πρόσθεση B C D E πίσω FIFO Σύμβαση: Εμπρός: η πρώτη (κατειλημμένη) θέση για απομάκρυνση Πίσω:η πρώτη (ελεύθερη) θέση για πρόσθεση Ορισμός Η ουρά είναι μια πεπερασμένη συλλογή δεδομένων τύπου Τ σε μια γραμμική ακολουθία. Βασικές πράξεις Κενή Πρόσθεση Απομάκρυνση Πλήρης (ως βοηθητική συνάρτηση) Αρχικοποίηση (Δημιουργία) (Καταστροφή, όταν έχουμε Ολική Απόκρυψη)

Σχεδιασμός Υλοποίησης με πίνακα 70 80 piso=3 Αρχικά κενή embros==0 piso ==0 Η πρόσθεση των 90 και 60 θα τροποποιήσει το σχήμα στο παρακάτω : piso = 5 (εκτός ορίων πίνακα) 90 60 embros = 0 Αν απομακρύνουμε δύο στοιχεία, τότε έχουμε : piso=3 embros = Είσοδος 3 Στοιχείων embros==0 Piso==3 Απομάκρυνση Στοιχείων embros== piso==3 embros = Χώρος υπάρχει. Πώς θα γίνει η πρόσθεση ενός επιπλέον στοιχείου; embros = 0 90 60 piso = 3 Με Μετατόπιση. Κάθε στοιχείο μετατοπίζεται κατά n θέσεις O(n) Μπορούμε καλύτερα! Η μετακίνηση των στοιχείων της ουράς μπορεί να αποφευχθεί αν φανταστούμε ότι ο πίνακας που φιλοξενεί την ουρά είναι κυκλικός (circular), με το πρώτο στοιχείο του να «έπεται» του τελευταίου. Πρόσθεση 70, 80, embros = 0 0 80 70 O piso προσδιορίζει την πρώτη διαθέσιμη θέση Ο embros την πρώτη κατειλημμένη 4 3 piso = 3 Απομάκρυνση των 70 και 80 0 4 embros = 3 piso = 3 piso = 0 Πρόσθεση των 90 και 60 : 0 4 3 embros = Μετακίνηση του piso : Μετακίνηση του embros : Αν piso == (plithos-) τότε embros = (embros+) % plithos piso = 0 διαφορετικά piso = piso+ ή piso = (piso+) % plithos 60 90

Κενή Ουρά Πλήρης Ουρά 0..... embros...... piso Κριτήριο κενής ουράς ;;; embros = = piso Το ίδιο για κριτήριο γεμάτης!!! Α ΛΥΣΗ με μια κενή θέση Συνθήκη για την γεμάτη ουρά (piso+) % plithos == embros Προγραμματισμός Σχεδιασμού #define plithos typedef... typos_stoixeiou; typedef struct { int embros, piso; typos_stoixeiou pinakas [plithos]; typos_ouras; typos_ouras oura ; piso embros Για κενή embros == piso Η κλήση της δημιουργίας μιας κενής ουράς θέτει στους embros και piso την αρχική τιμή 0. void dimiourgia(typos_ouras *ouraptr) /* Προ: Καμία Mετά: Δημιουργία κενής ουράς. */ { ouraptr->embros=0; ouraptr->piso=0; int keni (typos_ouras oura){ /* Προ: Δημιουργία Mετά: H συνάρτηση επιστρέφει αν η oura είναι κενή αλλιώς επιστρέφει 0. */ return ((oura.embros)==(oura.piso)); int gemati(typos_ouras oura){ // μία κενή θέση /* Προ: Δημιουργία Mετά: Aν η ουρά είναι γεμάτη τότε η συνάρτηση επιστρέφει αλλιώς επιστρέφει 0 */ return((oura.piso+)%plithos== oura.embros) 3

Η πρόσθεση ενός στοιχείου στην ουρά γίνεται στη θέση που δείχνει ο δείκτης piso, ο οποίος μετάτην πρόσθεση προχωρά μια θέση. void prosthesi(typos_ouras *ouraptr, typos_stoixeiou stoixeio, int * full){ /* Προ : Δημιουργία ουράς και η ουρά δεν είναι γεμάτη. Mετά: το stoixeio προστίθεται στην ουρά */ if (gemati(*ouraptr)) *full = ; *full = 0; ouraptr->pinakas[ouraptr->piso] = stoixeio; ouraptr->piso = (ouraptr->piso+)%plithos; Η απομάκρυνση ενός στοιχείου γίνεται από εμπρός, δηλαδή το στοιχείο που δείχνει ο δείκτης embros και αυξάνεται κατά ένα (%). void apomakrynsi(typos_ouras *ouraptr, typos_stoixeiou *stoixeioptr, int *empty) /* Προ :Δημιουργία και η ουρά δεν είναι κενή. Mετά:Ανάκτηση και απομάκρυνση του πρώτου στοιχείου της ουράς. H τιμή του καταχωρείται στο stoixeio. */ if (keni(*ouraptr)) *empty = ; *empty = 0; *stoixeioptr=ouraptr->pinakas[ouraptr->embros]; ouraptr->embros=(ouraptr->embros+) % plithos; Β Υλοποίηση ουράς με λογική μεταβλητή για Κενή Στην υλοποίηση αυτή χρησιμοποιείται μια λογική μεταβλητή προκειμένου να ελεγχθεί αν μια ουρά είναι κενή ή γεμάτη, ώστε να μην αφήνουμε κενή θέση. empros==piso και στις δυο περιπτώσεις, αλλά χρησιμοποιούμε την adeiaγια διαφοροποίηση. Οι δηλώσεις είναι τώρα οι εξής: #define plithos typedef... typos_stoixeiou; typedef struct { int embros, piso, adeia; typos_stoixeiou pinakas[plithos]; typos_ouras; Λαμβάνοντας υπόψη τις παραπάνω δηλώσεις, οι υλοποιήσεις των βασικών πράξεων για τον ΑΤΔ ουρά τροποποιούνται ως εξής: void dimiourgia(typos_ouras *ouraptr){ /* Προ : Καμμία. Mετά: H oura είναι μια κενή ουρά. */ ouraptr->embros=0; ouraptr->piso=0; ouraptr->adeia=; 4

int keni(typos_ouras oura){ /* Προ : Δημιουργία ουράς Mετά: H συνάρτηση επιστρέφει αν η oura είναι κενή αλλιώς επιστρέφει 0. */ return (oura.adeia); int gemati(typos_ouras oura){ /* Προ : Δημιουργία ουράς. Mετά: Aν η ουρά είναι γεμάτη τότε επιστρέφει διαφορετικά επιστρέφει 0 */ return ( (oura.embros==oura.piso) &&!keni(oura)); void prosthesi(typos_ouras *ouraptr, typos_stoixeiou stoixeio, int *full){ /* Προ : Δημιουργία ουράς. Mετά: Εισάγεται η τιμή του stoixeio. */ void apomakrynsi( typos_ouras *ouraptr, typos_stoixeiou *stoixeio, int *empty){ /* Προ : Δημιουργία ουράς. Mετά: Απομάκρυνση του πρώτου στοιχείου. */ if (gemati(*ouraptr)) *full=; *full =0; ouraptr->pinakas[ouraptr->piso]=stoixeio; ouraptr->piso=(ouraptr->piso+) % plithos; ouraptr->adeia=0; if (keni(*ouraptr)) *empty=; *empty=0; *stoixeio=ouraptr->pinakas[ouraptr->embros]; ouraptr->embros=((ouraptr->embros+)% plithos); ouraptr->adeia=(ouraptr->embros==ouraptr->piso); 5

Γ Υλοποίηση ουράς με μετρητή Στην περίπτωση αυτή χρησιμοποιείται ένας μετρητής για τον υπολογισμό των θέσεων στην ουρά. Καλύτερη χρήση του επιπλέον int. Μπορούμε να προσθέσουμε την πράξη megethos. Οι δηλώσεις για μια ουρά έχουν τη μορφή : #define plithos... typedef... typos_stoixeiou; typedef typedef struct { int embros, piso, metritis; typos_stoixeiou pinakas[plithos]; typos_ouras; typos_ouras oura; Στη παρουσιάζονται οι υλοποιήσεις των βασικών πράξεων για μια ουρά: void dimiourgia(typos_ouras *ouraptr){ ouraptr->metritis=0; ouraptr->embros=0; ouraptr->piso=0; int keni(typos_ouras oura){ /*Προ : Η ουρά έχει δημιουργηθεί. Μετά : Eπιστρέφει αν η ουρά είναι κενή και 0 αν όχι*/ return (oura.metritis == 0); int gemati(typos_ouras oura){ /*Προ : Η oura έχει δημιουργηθεί. Μετά: Η συνάρτηση επιστρέφει αν η oura είναι γεμάτη και 0 όχι*/ return (oura.metritis == plithos); 6

void prosthesi(typos_ouras *ouraptr, typos_stoixeiou stoixeio, int *full){ /* Προ: H oura έχει δημιουργηθεί. Μετά: Το stoixeio έχει εισαχθεί στην ουρά */ if (gemati(*ouraptr)) *full = ; *full=0; ouraptr->metritis++; ouraptr->pinakas[ouraptr->piso]=stoixeio; ouraptr->piso=(ouraptr->piso+) % plithos; void apomakrynsi(typos_ouras *ouraptr, typos_stoixeiou *stoixeioptr, int *empty){ /* Προ : Η oura δεν είναι κενή. Μετά : Το πρώτο στοιχείο της ουράς απομακρύνθηκε και η τιμή του καταχωρήθηκε στο stoixeio */ if (keni(*ouraptr)) *empty=; *empty = 0; ouraptr->metritis--; *stoixeioptr=ouraptr->pinakas[ouraptr->embros]; ouraptr->embros=(ouraptr->embros+)%plithos; Απεικόνιση των αντικειμένων (δεδομένων). Εφαρμογή : Προσομοίωση ουράς αναμονής Μελέτη συμπεριφοράς μιας ουράς σε ένα ταμείο Δεδομένα προσομοίωσης Πιθανότητα άφιξης ενός πελάτη εντός ενός λεπτού (0,) Χρόνος (σταθερός ) εξυπηρέτησης ενός πελάτη Συνολικός χρόνος προσομοίωσης Η προσομοίωση εκτελεί Ν επαναλήψεις, όπου Ν είναι η διάρκεια (σε λεπτά) της προσομοίωσης. Ο ΧΡΟΝΟΣ απεικονίζεται με ακέραιο (int) με αρχική τιμή 0 και αυξάνει κατά σε κάθε επανάληψη. Στόχος της προσομοίωσης είναι ο υπολογισμός της μέσης τιμής του χρόνου αναμονής. Μετράμε το πλήθος των πελατών που εξυπηρετήθηκαν και τον συνολικό χρόνο αναμονής τους. Για κάθε ΠΕΛΑΤΗ προσθέτουμε στην ουρά τον χρόνο που εισήλθε (int). Ο χρόνος αναμονής είναι η διαφορά χρόνου εξόδου και χρόνου εισόδου. Ο ΤΑΜΙΑΣ απεικονίζεται με τον χρόνο εξυπηρέτησης που απαιτείται για κάθε πελάτη (int). Ίδιος (xronos_eksipiretisis) για όλους τους πελάτες. Όταν ένας ΠΕΛΑΤΗΣ απομακρύνεται από την ουρά ο ταμίας είναι απασχολημένος για xronos_eksipiretisis λεπτά. Μια μεταβλητή που απεικονίζει τον enapomenon_xronos=xronos_eksipiretisis, ελαττώνεται κατά σε κάθε επανάληψη. Όταν ο μετρητής αυτός λαμβάνει την τιμή 0, ο ταμίας είναι ελεύθερος και απομακρύνεται από την ουρά ο επόμενος πελάτης (αν υπάρχει, αλλιώς αδρανής). Σεκάθεεπανάληψηεξετάζουμεα)ανέχουμενέαείσοδοπελάτηκαιβ)ανοταμίας είναι ελεύθερος για να απομακρυνθεί ο επόμενος πελάτης από την ουρά. 7

#include <stdio.h> #include <stdlib.h> #include oura.h int main(void) { typos_ouras oura; /* ουρά πελατών */ float pithanotita_aphiksis; /* πιθανότητα άφιξης πελάτη σε ένα λεπτό */ unsigned int xronos_eksipiretisis; /* χρόνος για την εξυπηρέτηση ενός πελάτη */ unsigned int xronos_prosomoiosis; /* συνολικός χρόνος προσομοίωσης */ unsigned int xronos; /* το ρολόϊ της προσομοίωσης */ unsigned int enapomenon_xronos; /* χρόνος που απομένει για το τέλος της εξυπηρέτησης ενός πελάτη */ unsigned int arithmos_pelaton; /* πλήθος των πελατών που εξυπηρετήθηκαν */ unsigned int xronos_anamonis; /*συνολικός χρόνος αναμονής */ unsigned int xronos_eisodou; /* η ώρα που εισήλθε ο πελάτης στην ουρά */ float mesos_xronos; /* μέσος χρόνος αναμονής */ float random; scanf("%d %f %d", &xronos_prosomoiosis, &pithanotita_aphiksis, &xronos_eksipiretisis); printf("h προσομοίωση θα διαρκέσει: ); printf("%d λεπτά.\n",xronos_prosomoiosis); printf("h πιθανότητα άφιξης πελάτη"); printf("%4.f.\n",pithanotita_aphiksis); printf("h διάρκεια εξυπηρέτησης πελάτη:"); printf("%d λεπτά\n",xronos_eksipiretisis); dimiourgia (&oura); xronos = 0; enapomenon_xronos = 0; /* χρόνος ταμία */ arithmos_pelaton = 0; xronos_anamonis = 0; srand(time(null)); 8

while (xronos < xronos_prosomoiosis) { random=((float) rand())/(float) RAND_MAX ; if (random < pithanotita_aphiksis ) prosthesi(&oura, xronos); if (enapomenon_xronos == 0){ /* ελεύθερος ταμίας*/ if (!keni(oura)){ /* υπάρχει πελάτης */ apomakrynsi(&oura, &xronos_eisodou); enapomenon_xronos =xronos_eksipiretisis; xronos_anamonis += (xronos - xronos_eisodou); arithmos_pelaton++; else if (enapomenon_xronos > 0) enapomenon_xronos--; if (arithmos_pelaton == 0) mesos_xronos = 0.0; else mesos_xronos =(float)xronos_anamonis / (float)arithmos_pelaton; printf("eξυπηρετήθησαν %5d πελάτες, arithmos_pelaton); printf( O μέσος χρόνος αναμονής ήταν %4.f λεπτά.\n", mesos_xronos); xronos++; /* while */ 9