Γραμμικές Δομές Δεδομένων

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ & ΥΠΟΛΟΓΙΣΤΙΚΗ ΦΥΣΙΚΗ ΕΞΕΤΑΣΗ 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 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΙΙ Ηλίας. Κ. Σάββας

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Transcript:

Γραμμικές Δομές Δεδομένων Συλλογή δεδομένων στη σειρά (ολική διάταξη). Προσθέτουμε δεδομένα στη Δομή (μεγαλώνει) ή αφαιρούμε δεδομένα (μικραίνει) Αν περιορίσουμε τις πράξεις Στην Αρχή μόνο Στοίβα (stack) Είσοδος αρχή & έξοδος τέλος - Ουρά (queue) 1

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

εμπρός Ουρές (Queues) FIFO A B C Σύμβαση: Απομάκρυνση εμπρός B C πίσω Εμπρός: η πρώτη (κατειλημμένη) θέση για απομάκρυνση Πρόσθεση εμπρός B C πίσω D E Πίσω: η πρώτη (ελεύθερη) θέση για πρόσθεση πίσω 3

Ορισμός Η ουρά είναι μια πεπερασμένη συλλογή δεδομένων τύπου Τ σε μια γραμμική ακολουθία. Βασικές πράξεις Κενή Πρόσθεση Απομάκρυνση Πλήρης (ως βοηθητική συνάρτηση) Αρχικοποίηση (Δημιουργία) (Καταστροφή, όταν έχουμε Ολική Απόκρυψη) 4

Σχεδιασμός Υλοποίησης με πίνακα 70 80 50 piso=3 Αρχικά κενή embros==0 piso ==0 embros = 0 Αν απομακρύνουμε δύο στοιχεία, τότε έχουμε : piso=3 50 embros = 2 Είσοδος 3 Στοιχείων embros==0 Piso==3 Απομάκρυνση 2 Στοιχείων embros==2 piso==3 5

Η πρόσθεση των 90 και 60 θα τροποποιήσει το σχήμα στο παρακάτω : piso = 5 (εκτός ορίων πίνακα) 50 90 60 embros = 2 Χώρος υπάρχει. Πώς θα γίνει η πρόσθεση ενός επιπλέον στοιχείου; 50 embros = 0 90 60 piso = 3 Με Μετατόπιση. Κάθε στοιχείο μετατοπίζεται κατά n θέσεις O(n) Μπορούμε καλύτερα! 6

Η μετακίνηση των στοιχείων της ουράς μπορεί να αποφευχθεί αν φανταστούμε ότι ο πίνακας που φιλοξενεί την ουρά είναι κυκλικός (circular), με το πρώτο στοιχείο του να «έπεται» του τελευταίου. Πρόσθεση 70, 80, 50 O piso προσδιορίζει την πρώτη διαθέσιμη θέση Ο embros την πρώτη κατειλημμένη embros = 0 Απομάκρυνση των 70 και 80 0 70 4 piso = 3 0 4 piso = 3 1 80 3 1 3 50 2 50 2 embros = 2 7

piso = 0 Πρόσθεση των 90 και 60 : 0 60 4 1 90 3 50 2 embros = 2 Μετακίνηση του piso : Μετακίνηση του embros : Αν piso == (plithos-1) τότε embros = (embros+1) % plithos piso = 0 διαφορετικά piso = piso+1 ή piso = (piso+1) % plithos 8

Κενή Ουρά 2 1 0..... Κριτήριο κενής ουράς ;;; embros = = piso Το ίδιο για κριτήριο γεμάτης!!! Πλήρης Ουρά 2 1 embros..... piso Α ΛΥΣΗ με μια κενή θέση Συνθήκη για την γεμάτη ουρά (piso+1) % plithos == embros piso embros Για κενή embros == piso 9

Προγραμματισμός Σχεδιασμού #define plithos typedef... typos_stoixeiou; typedef struct { int embros, piso; typos_stoixeiou pinakas [plithos]; typos_ouras; typos_ouras oura ; 10

Η κλήση της δημιουργίας μιας κενής ουράς θέτει στους embros και piso την αρχική τιμή 0. void dimiourgia(typos_ouras *ouraptr) /* Προ: Καμία Mετά: Δημιουργία κενής ουράς. */ { ouraptr->embros=0; ouraptr->piso=0; 11

int keni (typos_ouras oura){ /* Προ: Δημιουργία Mετά: H συνάρτηση επιστρέφει 1 αν η oura είναι κενή αλλιώς επιστρέφει 0. */ return ((oura.embros)==(oura.piso)); int gemati(typos_ouras oura){ // μία κενή θέση /* Προ: Δημιουργία Mετά: Aν η ουρά είναι γεμάτη τότε η συνάρτηση επιστρέφει 1 αλλιώς επιστρέφει 0 */ return((oura.piso+1)%plithos== oura.embros) 12

Η πρόσθεση ενός στοιχείου στην ουρά γίνεται στη θέση που δείχνει ο δείκτης piso, ο οποίος μετά την πρόσθεση προχωρά μια θέση. void prosthesi(typos_ouras *ouraptr, typos_stoixeiou stoixeio, int * full){ /* Προ : Δημιουργία ουράς και η ουρά δεν είναι γεμάτη. Mετά: το stoixeio προστίθεται στην ουρά */ if (gemati(*ouraptr)) *full = 1; else{ *full = 0; ouraptr->pinakas[ouraptr->piso] = stoixeio; ouraptr->piso = (ouraptr->piso+1)%plithos; 13

Η απομάκρυνση ενός στοιχείου γίνεται από εμπρός, δηλαδή το στοιχείο που δείχνει ο δείκτης embros και αυξάνεται κατά ένα (%). void apomakrynsi( typos_ouras *ouraptr, typos_stoixeiou *stoixeioptr, int *empty) /* Προ :Δημιουργία και η ουρά δεν είναι κενή. Mετά:Ανάκτηση και απομάκρυνση του πρώτου στοιχείου της ουράς. H τιμή του καταχωρείται στο stoixeio. */ if (keni(*ouraptr)) *empty = 1; else{ *empty = 0; *stoixeioptr=ouraptr->pinakas[ouraptr->embros]; ouraptr->embros=(ouraptr->embros+1) % plithos; 14

Β Υλοποίηση ουράς με λογική μεταβλητή για Κενή Στην υλοποίηση αυτή χρησιμοποιείται μια λογική μεταβλητή προκειμένου να ελεγχθεί αν μια ουρά είναι κενή ή γεμάτη, ώστε να μην αφήνουμε κενή θέση. empros==piso και στις δυο περιπτώσεις, αλλά χρησιμοποιούμε την adeia για διαφοροποίηση. Οι δηλώσεις είναι τώρα οι εξής: #define plithos typedef... typos_stoixeiou; typedef struct { int embros, piso, adeia; typos_stoixeiou pinakas[plithos]; typos_ouras; 15

Λαμβάνοντας υπόψη τις παραπάνω δηλώσεις, οι υλοποιήσεις των βασικών πράξεων για τον ΑΤΔ ουρά τροποποιούνται ως εξής: void dimiourgia(typos_ouras *ouraptr){ /* Προ : Καμμία. Mετά: H oura είναι μια κενή ουρά. */ ouraptr->embros=0; ouraptr->piso=0; ouraptr->adeia=1; 16

int keni(typos_ouras oura){ /* Προ : Δημιουργία ουράς Mετά: H συνάρτηση επιστρέφει 1 αν η oura είναι κενή αλλιώς επιστρέφει 0. */ return (oura.adeia); 17

int gemati(typos_ouras oura){ /* Προ : Δημιουργία ουράς. Mετά: Aν η ουρά είναι γεμάτη τότε επιστρέφει 1 διαφορετικά επιστρέφει 0 */ return ( && (oura.embros==oura.piso)!keni(oura)); 18

void prosthesi( typos_ouras *ouraptr, typos_stoixeiou stoixeio, int *full){ /* Προ : Δημιουργία ουράς. Mετά: Εισάγεται η τιμή του stoixeio. */ if (gemati(*ouraptr)) *full=1; else{ *full =0; ouraptr->pinakas[ouraptr->piso]=stoixeio; ouraptr->piso=(ouraptr->piso+1) % plithos; ouraptr->adeia=0; 19

void apomakrynsi( typos_ouras *ouraptr, typos_stoixeiou *stoixeio, int *empty){ /* Προ : Δημιουργία ουράς. Mετά: Απομάκρυνση του πρώτου στοιχείου. */ if (keni(*ouraptr)) *empty=1; else{ *empty=0; *stoixeio=ouraptr->pinakas[ouraptr->embros]; ouraptr->embros=((ouraptr->embros+1)% plithos); ouraptr->adeia=(ouraptr->embros==ouraptr->piso); 20

Γ Υλοποίηση ουράς με μετρητή Στην περίπτωση αυτή χρησιμοποιείται ένας μετρητής για τον υπολογισμό των θέσεων στην ουρά. Καλύτερη χρήση του επιπλέον int. Μπορούμε να προσθέσουμε την πράξη megethos. Οι δηλώσεις για μια ουρά έχουν τη μορφή : #define plithos... typedef... typos_stoixeiou; typedef typedef struct { int embros, piso, metritis; typos_stoixeiou pinakas[plithos]; typos_ouras; typos_ouras oura; 21

Στη συνέχεια παρουσιάζονται οι υλοποιήσεις των βασικών πράξεων για μια ουρά: void dimiourgia(typos_ouras *ouraptr){ ouraptr->metritis=0; ouraptr->embros=0; ouraptr->piso=0; 22

int keni(typos_ouras oura){ /*Προ : Η ουρά έχει δημιουργηθεί. Μετά : Eπιστρέφει 1 αν η ουρά είναι κενή και 0 αν όχι*/ return (oura.metritis == 0); 23

int gemati(typos_ouras oura){ /*Προ : Η oura έχει δημιουργηθεί. Μετά: Η συνάρτηση επιστρέφει 1 αν η oura είναι γεμάτη και 0 όχι*/ return (oura.metritis == plithos); 24

void prosthesi( typos_ouras *ouraptr, typos_stoixeiou stoixeio, int *full){ /* Προ: H oura έχει δημιουργηθεί. Μετά: Το stoixeio έχει εισαχθεί στην ουρά */ if (gemati(*ouraptr)) *full = 1; else{ *full=0; ouraptr->metritis++; ouraptr->pinakas[ouraptr->piso]=stoixeio; ouraptr->piso=(ouraptr->piso+1) % plithos; 25

void apomakrynsi(typos_ouras *ouraptr, typos_stoixeiou *stoixeioptr, int *empty){ /* Προ : Η oura δεν είναι κενή. Μετά : Το πρώτο στοιχείο της ουράς απομακρύνθηκε και η τιμή του καταχωρήθηκε στο stoixeio */ if (keni(*ouraptr)) *empty=1; else{ *empty = 0; ouraptr->metritis--; *stoixeioptr=ouraptr->pinakas[ouraptr->embros]; ouraptr->embros=(ouraptr->embros+1)%plithos; 26

Εφαρμογή : Προσομοίωση ουράς αναμονής Μελέτη συμπεριφοράς μιας ουράς σε ένα ταμείο Δεδομένα προσομοίωσης Πιθανότητα άφιξης ενός πελάτη εντός ενός λεπτού (0,1) Χρόνος (σταθερός ) εξυπηρέτησης ενός πελάτη Συνολικός χρόνος προσομοίωσης 27

Απεικόνιση των αντικειμένων (δεδομένων). Η προσομοίωση εκτελεί Ν επαναλήψεις, όπου Ν είναι η διάρκεια (σε λεπτά) της προσομοίωσης. Ο ΧΡΟΝΟΣ απεικονίζεται με ακέραιο (int) με αρχική τιμή 0 και αυξάνει κατά 1 σε κάθε επανάληψη. Στόχος της προσομοίωσης είναι ο υπολογισμός της μέσης τιμής του χρόνου αναμονής. Μετράμε το πλήθος των πελατών που εξυπηρετήθηκαν και τον συνολικό χρόνο αναμονής τους. Για κάθε ΠΕΛΑΤΗ προσθέτουμε στην ουρά τον χρόνο που εισήλθε (int). Ο χρόνος αναμονής είναι η διαφορά χρόνου εξόδου και χρόνου εισόδου. Ο ΤΑΜΙΑΣ απεικονίζεται με τον χρόνο εξυπηρέτησης που απαιτείται για κάθε πελάτη (int). Ίδιος (xronos_eksipiretisis) για όλους τους πελάτες. Όταν ένας ΠΕΛΑΤΗΣ απομακρύνεται από την ουρά ο ταμίας είναι απασχολημένος για xronos_eksipiretisis λεπτά. Μια μεταβλητή που απεικονίζει τον enapomenon_xronos=xronos_eksipiretisis, ελαττώνεται κατά 1 σε κάθε επανάληψη. Όταν ο μετρητής αυτός λαμβάνει την τιμή 0, ο ταμίας είναι ελεύθερος και απομακρύνεται από την ουρά ο επόμενος πελάτης (αν υπάρχει, αλλιώς αδρανής). Σε κάθε επανάληψη εξετάζουμε α) αν έχουμε νέα είσοδο πελάτη και β) αν ο ταμίας 28 είναι ελεύθερος για να απομακρυνθεί ο επόμενος πελάτης από την ουρά.

#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; /* συνολικός χρόνος προσομοίωσης */ συνέχεια 29

unsigned int xronos; /* το ρολόϊ της προσομοίωσης */ unsigned int enapomenon_xronos; /* χρόνος που απομένει για το τέλος της εξυπηρέτησης ενός πελάτη */ unsigned int arithmos_pelaton; /* πλήθος των πελατών που εξυπηρετήθηκαν */ unsigned int xronos_anamonis; /*συνολικός χρόνος αναμονής */ unsigned int xronos_eisodou; /* η ώρα που εισήλθε ο πελάτης στην ουρά */ float mesos_xronos; /* μέσος χρόνος αναμονής */ float random; συνέχεια 30

scanf("%d %f %d", &xronos_prosomoiosis, &pithanotita_aphiksis, &xronos_eksipiretisis); printf("h προσομοίωση θα διαρκέσει: ); printf("%d λεπτά.\n",xronos_prosomoiosis); printf("h πιθανότητα άφιξης πελάτη"); printf("%4.2f.\n",pithanotita_aphiksis); printf("h διάρκεια εξυπηρέτησης πελάτη:"); printf("%d λεπτά\n",xronos_eksipiretisis); συνέχεια 31

dimiourgia (&oura); xronos = 0; enapomenon_xronos = 0; /* χρόνος ταμία */ arithmos_pelaton = 0; xronos_anamonis = 0; srand(time(null)); συνέχεια 32

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--; xronos++; /* while */ συνέχεια 33

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.2f λεπτά.\n", mesos_xronos); 34