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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Δυαδικά Δέντρα Αναζήτησης (Binary Search Trees) Ορισμός : Ένα δυαδικό δέντρο αναζήτησης t είναι ένα δυαδικό δέντρο, το οποίο είτε είναι κενό είτε:

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

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

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

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

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

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

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

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

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

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

Οι βασικές πράξεις που ορίζουν τον ΑΤ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

ΠΙ Ν Α Κ Ε Σ (arrays)

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

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

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

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

ΟιβασικέςπράξειςπουορίζουντονΑΤΔ δυαδικό δέντρο αναζήτησης είναι οι ακόλουθες:

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

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

scanf() scanf() stdin scanf() printf() int float double %lf float

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΕΡΓΑΣΤΗΡΙΟ 5 ΣΗΜΕΙΩΣΕΙΣ

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

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

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

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

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

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

Εργαστήριο 3 Εντολή for while, do while

3. Προσομοίωση ενός Συστήματος Αναμονής.

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

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

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

Βασικές Δομές Δεδομένων

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

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

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

Διάλεξη 9: Αφηρημένοι Τύποι Δεδομένων. Διδάσκων: Παναγιώτης Ανδρέου

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

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

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

ΕΝΟΤΗΤΑ 7 ΟΥΡΕΣ ΠΡΟΤΕΡΑΙΟΤΗΤΑΣ ΣΩΡΟΙ

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

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

Εισαγωγή στον Προγραμματισμό (με. τη C)

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

Ασκηή σεις 12ο Μαά θημα - Λυύ σεις

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

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

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

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

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

Δέντρα (Trees) - Ιεραρχική Δομή

Βασικές οµές εδοµένων

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

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

2ο σετ σημειώσεων. 1 Εντολές εκτέλεσης υπό συνθήκη. 19 Μαρτίου 2012

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

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 3 η : Επίλυση Προβληµάτων Χειµερινό Εξάµηνο 2011

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

Transcript:

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

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

Υλοποίηση µε πίνακα piso=3 70 80 50 embros = 0 Αν υποτεθεί ότι διαγράφονται δύο στοιχεία, τότε έχουµε : piso=3 50 embros = 2

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

Η µετακίνηση των στοιχείων της ουράς µπορεί να αποφευχθεί αν φανταστούµε ότι ο πίνακας που φιλοξενεί την ουρά είναι κυκλικός (circular), µε το πρώτο στοιχείο του να έπεται του τελευταίου. Διαγραφή των 70 και 80 embros = 0 0 70 4 piso = 3 0 4 piso = 3 1 80 3 1 3 50 2 50 2 embros = 2

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

Κενή Ουρά 2 1 0..... τότε µετά τη διαγραφή του µοναδικού στοιχείου : embros == piso embros piso Πλήρης Ουρά 2 1..... Συνθήκη για την πλήρη ουρά : (piso == plithos-1) AND (embros == 0) OR (embros == piso+1) Εναλλακτικά: piso embros (piso+1) % plithos == embros

Υλοποίηση #define plithos... typedef... typos_stoixeiou; typedef typos_stoixeiou typos_pinaka[plithos]; typedef struct int embros, piso; typos_pinaka pinakas; typos_ouras; typos_ouras oura ; Η υλοποίηση της δηµιουργίας µιας κενής ουράς έχει σαν αποτέλεσµα οι δείκτες embros και piso να λάβουν την αρχική τιµή 0.

void dimiourgia(typos_ouras *oura) /* Προ: Καµµία Mετά: Δηµιουργία κενής ουράς. */ oura->embros=0; oura->piso=0;

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

Η πρόσθεση ενός στοιχείου στην ουρά γίνεται στη θέση που δείχνει ο δείκτης piso, ο οποίος µετά την πρόσθεση προχωρά µια θέση προς την αντίθετη κατεύθυνση των δεικτών του ρολογιού. void prosthesi(typos_ouras *oura, typos_stoixeiou stoixeio) /* Προ : Δηµιουργία ουράς. H ουρά δεν είναι γεµάτη. Mετά: το stoixeio προστίθεται στο πίσω µέρος της ουράς */ if (gemati(*oura)) printf ( Η ουρά είναι γεµάτη ); else oura->pinakas[oura->piso]= stoixeio; oura->piso= (oura->piso+1) % plithos;

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

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

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

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

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

void prosthesi(typos_ouras *oura, typos_stoixeiou stoixeio) /* Προ : Δηµιουργία ουράς. Mετά: Εισάγεται στο πίσω µέρος της ουράς η τιµή του stoixeio. */ if (gemati(*oura)) printf( Η ουρά είναι γεµάτη ); else oura->pinakas[oura->piso]=stoixeio; oura->piso=(oura->piso+1) % plithos; oura->adeia=0;

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

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

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

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

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

void prosthesi(typos_ouras *oura, typos_stoixeiou stoixeio) /*Προ : H oura έχει δηµιουργηθεί. Μετά : Το stoixeio έχει τοποθετηθεί στο πίσω µέρος της oura*/ if (gemati(*oura)) printf( Η ουρά είναι γεµάτη ); else oura->metritis++; oura->pinakas[oura->piso]=stoixeio; oura->piso=(oura->piso+1) % plithos;

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

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

Παράσταση των αντικειµένων (δεδοµένων). Ο ταµίας παριστάνεται µε µια απλή µεταβλητή τύπου int, της οποίας η τιµή θα είναι ίση µε το χρόνο εξυπηρέτησης όταν ένας πελάτης µετακινείται στο ταµείο και ελαττώνεται κατά 1 κάθε λεπτό που ο πελάτης παραµένει στο ταµείο. Όταν ο µετρητής αυτός λάβει την τιµή 0, ο ταµίας είναι ελεύθερος και θα πρέπει να έλθει στο ταµείο ο επόµενος πελάτης. Αυτό που ενδιαφέρει να γνωρίζουµε για κάθε πελάτη είναι ο χρόνος αναµονής του στην ουρά.. Έτσι κάθε πελάτης µπορεί επίσης να παρασταθεί µε µια απλή µεταβλητή τύπου int. Με την εισαγωγή του πελάτη στην ουρά ο µετρητής αυτός τίθεται ίσος µε 0 και αυξάνεται κατά 1 για κάθε λεπτό παραµονής. Τέλος, για τον υπολογισµό της µέσης τιµής του χρόνου αναµονής, θα πρέπει να είναι γνωστό το πλήθος των πελατών και ο συνολικός χρόνος αναµονής όλων των πελατών. Το ακόλουθο πρόγραµµα εκτελεί την προσοµοίωση της ουράς µε ένα ταµείο

#include <stdio.h> #include <stdlib.h> #include <time.h> /* Σε αυτό το σηµείο ο χρήστης εισάγει τον ορισµό τoυ τύπου δεδοµένων typos_ouras και τις αντίστοιχες συναρτήσεις */ main() typos_ouras oura; /* ουρά πελατών */ float pithanotita_aphiksis; /* πιθανότητα άφιξης ενός πελάτη σε ένα λεπτό */ int xronos_eksipiretisis; /* χρόνος για την εξυπηρέτηση ενός πελάτη */ int xronos_prosomoiosis; /* συνολικός χρόνος προσοµοίωσης */ συνέχεια

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

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

dimiourgia (&oura); xronos = 0; enapomenon_xronos = 0; arithmos_pelaton = 0; xronos_anamonis = 0; srand(time(null)); 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); xronos_anamonis += (xronos - xronos_eisodou); arithmos_pelaton++; enapomenon_xronos =xronos_eksipiretisis; xronos++; if (enapomenon_xronos > 0) enapomenon_xronos--; /* while */ συνέχεια

if (arithmos_pelaton == 0) mesos_xronos = 0.0; else mesos_xronos =((float)xronos_anamonis) / ((float)arithmos_pelaton); printf("eξυπηρετήθησαν %1d πελάτες,arithmos_pelaton); printf( O µέσος χρόνος αναµονής ήταν %4.2f λεπτά.\n", mesos_xronos);