Naxos Solver Εγχειρίδιο Χρήσης Νίκος Ποθητός 1 Ιουνίου 2009

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "Naxos Solver Εγχειρίδιο Χρήσης Νίκος Ποθητός 1 Ιουνίου 2009"

Transcript

1 Naxos Solver Εγχειρίδιο Χρήσης Νίκος Ποθητός 1 Ιουνίου 2009

2 Περιεχόµενα 1 Εισαγωγή 3 2 ιαχείριση Σφαλµάτων 4 3 Περιορισµένες Μεταβλητές 5 4 Πίνακες Περιορισµένων Μεταβλητών Πίνακες Γενικής Χρήσης ιαχειριστής Προβλήµατος 10 6 Εκφράσεις Εκφράσεις Περιορισµών Γενικές Εκφράσεις Ο Περιορισµός Element Εκφράσεις Πινάκων Ο Περιορισµός Inverse Παραδείγµατα Το Πρόβληµα των N Βασιλισσών Ορισµός Κώδικας SEND + MORE = MONEY Αναζήτηση Λύσης µέσω Στόχων Εισαγωγή Αντικειµενοστρεφής Μοντελοποίηση Ευρετήριο 27 2

3 1 Εισαγωγή Ο Naxos Solver είναι ένας επιλυτής (solver) προβληµάτων ικανοποίησης πε- ϱιορισµών. Πήρε το όνοµα «Naxos» από το νησί 1 στο οποίο άρχισε να χτίζεται και στο οποίο έφθασε σε ένα τελικό, ώριµο στάδιο. Υλοποιήθηκε στα πλαίσια πτυχιακής εργασίας του συγγραφέα µε επιβλέποντα καθηγητή τον Παναγιώτη Σταµατόπουλο στο Τµήµα Πληροφορικής και Τηλεπικοινωνιών του Πανεπιστηµίου Αθηνών. Ο σκοπός αυτού του εγχειριδίου είναι να δώσει τις πληροφορίες που χρειάζεται ένας προγραµµατιστής εφαρµογών (application developer) της ϐιβλιοθήκης. Ενα πρόβληµα ικανοποίησης περιορισµών (constraint satisfaction problem CSP) περιέχει ένα σύνολο από περιορισµένες µεταβλητές (constrained variables) µπορούµε να τις αναφέρουµε απλά και σαν µεταβλητές κάθε µεταβλητή αντιστοιχεί σε ένα πεδίο τιµών (domain). Οι περιορισµένες µεταβλητές συνδέονται µεταξύ τους µέσα από ένα σύνολο περιορισµών (constraints). Γενικά, ένας περιορισµός που αφορά συγκεκριµένες περιορισµένες µετα- ϐλητές είναι ένα σύνολο µε όλους τους έγκυρους συνδυασµούς τιµών που µπορούν να ανατεθούν. Για παράδειγµα, για τις µεταβλητές x 1 και x 2 µε πεδία τιµών {0, 1, 2, 3}, ο περιορισµός της ισότητας µπορεί να δηλωθεί σαν C({x 1, x 2 }, {(0, 0), (1, 1), (2, 2), (3, 3)}). Παρότι αυτός ο συµβολισµός είναι όσο πιο γενικός γίνεται, στην πράξη (δηλαδή στον Προγραµµατισµό µε Πε- ϱιορισµούς) χρησιµοποιούµε απλές σχέσεις για να περιγράψουµε τα δίκτυα περιορισµών. Στο παραπάνω παράδειγµα, ο περιορισµός µπορεί να γραφεί απλά σαν x 1 = x 2. Μία λύση σε ένα πρόβληµα ικανοποίησης περιορισµών είναι µία έγκυρη ανάθεση µίας τιµής σε κάθε µεταβλητή, η οποία ικανοποιεί όλους τους περιορισµούς. Τέλος, αξίζει να σηµειωθεί ότι το πλεονέκτηµα του Προγραµµατισµού µε Περιορισµούς (Constraint Programming) είναι ότι ε- πιτρέπει τον διαχωρισµό της διαδικασίας διατύπωσης ενός προβλήµατος από τον µηχανισµό ο οποίος το επιλύει. Ο Naxos Solver είναι µια ϐιβλιοθήκη που επιτρέπει τη λύση προβληµάτων µέσω προγραµµατισµού µε περιορισµούς, η οποία σχεδιάστηκε για το αντικειµενοστρεφές περιβάλλον της γλώσσας C++. Ο επιλυτής είναι ασφαλής για χρήση σε πολυνηµατικό περιβάλλον (threadsafe). εν ϑα πρέπει να χρησιµοποιούνται «εσωτερικές» κλάσεις, µέθοδοι, συναρτήσεις του κ.λπ. οι οποίες δεν περιγράφονται στο εγχειρίδιο χρήσης, καθώς µπορεί να αλλάξουν στο µέλλον. Ακόµα, για αποφυγή παρεξηγήσεων, καλό είναι να µην ονοµά- 1 Πιο συγκεκριµένα, αναφερόµαστε στο χωριό Κορωνίδα της Νάξου. 3

4 Ϲουµε τις δικές µας µεταβλητές, κλάσεις κ.λπ. µε ονόµατα που ξεκινούν από «Ns», καθώς αυτό είναι το πρόθεµα για τις ενσωµατωµένες κλάσεις και σταθε- ϱές του επιλυτή. Τέλος, σηµειώνεται ότι ο επιλυτής δεν κάνει κανένα έλεγχο για τυχόν υπερχειλίσεις (π.χ. κατά την πρόσθεση δύο µεγάλων ακεραίων), για λόγους απόδοσης. Μέρος του σχεδιασµού και της «ονοµατολογίας» του επιλυτή είναι επη- ϱεασµένο από τη µοντελοποίηση της Standard Template Library (STL) για τη C++. 2 Π.χ. χρησιµοποιήθηκαν και υλοποιήθηκαν αρκετοί επαναλήπτες (iterators). εν έχουµε διάκριση των κλάσεων του Naxos Solver σε κλάσεις-χειϱιστήϱια (handle classes) και κλάσεις-υλοποίησης (implementation classes), όπως γίνεται στον Ilog Solver. Ο λόγος αυτής της διαφοροποίησης στον Ilog Solver, έχει να κάνει µε την προσπάθεια να διαχειριστεί αυτόµατα τη µνήµη αλά Java. Σε κάθε κλάση-χειριστήριο, υπάρχει µία αναφορά σε µία κλάσηυλοποίησης. Είναι δυνατόν πολλές κλάσεις-χειριστήρια να δείχνουν στην ίδια κλάση-υλοποίησης. Η κλάση-υλοποίησης διαγράφεται από τη µνήµη, µόνο όταν πάψει να υφίσταται και η τελευταία κλάση-χειριστήριο που δείχνει σε αυτήν. (Κάτι αντίστοιχο γίνεται και στην Java µε τις αναφορές.) Εποµένως, στον Ilog Solver είναι δυνατόν π.χ. σε µία συνάρτηση να δηµιουργούµε αυτόµατες µεταβλητές για να περιγράψουµε έναν περιορισµό και αυτός, καθώς και οι µεταβλητές που αφορά, να υπάρχουν και µετά το τέλος της συνάρτησης σε αντίστοιχη περίπτωση στον Naxos Solver ϑα έχουµε σφάλµα κατάτµησης (segmentation fault). 2 ιαχείριση Σφαλµάτων Ξεκινάµε από τη διαχείριση σφαλµάτων, για την οποία είναι σηµαντικό να ϕροντίζουµε, όποιο πρόγραµµα και να γράφουµε. Στον Naxos Solver πρέπει να συλλαµβάνονται οι εξαιρέσεις τύπου NsException. Η κλάση αυτή είναι υποκλάση της logic_error, η οποία µε τη σειρά της παράγεται από την exception. Αρκεί λοιπόν να συλλαµβάνουµε τον τύπο exception µε τη µέθοδο what() αυτής της ϐασικής κλάσης, ϑα πάρουµε σε µία συµβολοσειρά ένα µήνυµα για το σφάλµα που συνέβη. #include <naxos.h> 2 B. Eckel and C. Allison. Thinking In C++ Vol. 2: Practical Programming. Prentice Hall, 2 nd edition,

5 using namespace naxos; using namespace std; int { main (void) try { //... CODE OF THE PROGRAM... // } catch (exception& exc) { cerr << exc.what() << "\n"; } } catch (...) { cerr << "Unknown exception" << "\n"; } εν είναι σωστή προγραµµατιστική τακτική να εντάσσουµε τις εξαιρέσεις στο σώµα των αλγορίθµων µας. Συνήθως, οι εξαιρέσεις αποτελούν το «περιτύλιγµα» των προγραµµάτων µας. 3 Περιορισµένες Μεταβλητές Ο επιλυτής υποστηρίζει ακέραιες περιορισµένες µεταβλητές πεπερασµένων πεδίων (finite domain integer constrained variables). Η κλάση µε τις οποίες αναπαρίστανται είναι η NsIntVar, η οποία περιέχει τις παρακάτω µεθόδους. NsIntVar(NsProblemManager& pm, NsInt min, NsInt max) Είναι µία µέϑοδος-κατασκευής (constructor). Το pm είναι ο διαχειριστής προ- ϐλήµατος στον οποίον ανήκει η µεταβλητή (ϐλ. 5) και τα min και max, το ελάχιστο και το µέγιστο του πεδίου τιµών της, που συµβολίζεται και µε [min..max]. Ο τύπος NsInt µπορεί να ϑεωρηθεί ότι είναι σε ϑέση να αναπαραστήσει τουλάχιστον τους ακέραιους αριθµούς εκείνους που είναι δυνατόν να α- ναπαρασταθούν µε έναν long. Η ελάχιστη τιµή του τύπου NsInt, ισούται µε τη σταθερά NsMINUS_INF και η µέγιστη µε NsPLUS_INF. (Για τον µη προσηµασµένο τύπο NsUInt, η µέγιστη τιµή είναι NsUPLUS_INF.) 5

6 Η ελάχιστη τιµή ενός πεδίου πρέπει να είναι γνήσια µεγαλύτερη από NsMINUS_INF, όπως και η µέγιστη τιµή πρέπει να είναι γνήσια µικρότε- ϱη από NsPLUS_INF, καθώς αυτές οι σταθερές αποτελούν ειδικές τιµές που αντιπροσωπεύουν το άπειρο, όπως ϑα δούµε και παρακάτω. NsIntVar() Στο στιγµιότυπο της κλάσης που δηµιουργείται µε αυτήν τη µέϑοδο-κατασκευής, είναι δυνατόν στη συνέχεια να ανατεθεί κάποια έκφραση (µέσω και του υπερφορτωµένου τελεστή «=»), όπως στην τρίτη γραµµή του παρακάτω παραδείγµατος. NsIntVar X(pm,0,3), Y(pm,-1,15), Z; NsIntVar W = X + 3*Y; Z = W * W; Στη δεύτερη γραµµή του παραδείγµατος, χρησιµοποιήθηκε µία άλλη µέϑοδος-κατασκευής, που παίρνει σαν όρισµα µία Expression (εδώ, η έκφραση ήταν η «X + 3*Y»). void remove(nsint val) Αφαιρεί την τιµή val από το πεδίο της µετα- ϐλητής. void remove(nsint min, NsInt max) Αφαιρεί από το πεδίο της µετα- ϐλητής τις τιµές που ϐρίσκονται στο διάστηµα [min, max]. Αντί να τις αφαιρούµε µία-µία µε τη remove(val), είναι πιο αποδοτικό να καλούµε αυτή τη µέθοδο. void removeall() «Αδειάζει» το πεδίο τιµών της µεταβλητής. Πρακτικά, αυτό που γίνεται είναι η ενηµέρωση του διαχειριστή προβλήµατος, ότι υπήρξε ασυνέπεια λόγω του κενού πεδίου τιµών. Αυτή η µέθοδος είναι χρήσιµη όταν ϑέλουµε να προκαλέσουµε αποτυχία στην αναζήτηση. Π.χ. όταν ϑέλουµε να αποτύχει ένας στόχος, κατά την εκτέλεσή του, καλούµε αυτή τη µέθοδο για µία οποιαδήποτε µεταβλητή. 3 void set(nsint val) Αναθέτει την τιµή val στη µεταβλητή συνεπώς, η µεταβλητή γίνεται δεσµευµένη. Ακολουθούν οι µέθοδοι που δεν προκαλούν καµία αλλαγή στη µεταβλητή για την οποία καλούνται. 3 Ενώ για να δείξουµε ότι ένας στόχος πετυχαίνει, κάνουµε την GOAL() να επιστρέψει 0, για να δείξουµε ότι απέτυχε, υπάρχει αυτός ο λιγότερο κοµψός τρόπος. (Περισσότερα για τον µηχανισµό στόχων υπάρχουν στην 8.) 6

7 bool contains(nsint val) Επιστρέφει true αν η τιµή val ανήκει στο πεδίο της µεταβλητής. NsInt min() Η ελάχιστη τιµή του πεδίου τιµών. NsInt max() Η µέγιστη τιµή του πεδίου τιµών. NsUInt size() Αριθµός των τιµών που περιέχονται στο πεδίο τιµών. bool isbound() Επιστρέφει true αν η µεταβλητή είναι δεσµευµένη. NsInt value() Χρησιµοποιείται όταν η µεταβλητή είναι δεσµευµένη και επιστρέφει τη (µοναδική) τιµή της. Αν κληθεί για µία µη δεσµευµένη µεταβλητή, προκαλείται σφάλµα. Αντί αυτής, ϑα µπορούσε να χρησιµοποιηθεί µία µέθοδος, από τις min() και max(). Ο λόγος ύπαρξης αυτής της µεθόδου, αφορά την αναγνωσιµότητα του κώδικα. NsInt next(nsint val) Επιστρέφει τη µικρότερη τιµή στο πεδίο τιµών, που είναι γνήσια µεγαλύτερη από την val. Αν δεν υπάρχει κάποια τέτοια τιµή, επιστρέφεται NsPLUS_INF. Η val µπορεί να πάρει και τις ειδικές τιµές NsMINUS_INF και NsPLUS_INF. NsInt previous(nsint val) Ορίζεται ανάλογα µε τη next(). Επιστρέ- ϕει τη µεγαλύτερη τιµή στο πεδίο τιµών, που είναι γνήσια µικρότε- ϱη από την val. Αν δεν υπάρχει κάποια τέτοια τιµή, επιστρέφεται NsMINUS_INF. Η val µπορεί να πάρει και τις ειδικές τιµές NsMINUS_- INF και NsPLUS_INF. Στη συνέχεια παρουσιάζονται δύο επαναλήπτες για την κλάση και παραδείγ- µατα χρήσης τους. NsIntVar::const_iterator ιατρέχει τις τιµές του πεδίου της µεταβλητής. Π.χ. µε τον παρακάτω κώδικα, τυπώνονται οι τιµές της µεταβλητής, σε αύξουσα σειρά. for (NsIntVar::const_iterator v = Var.begin(); v!= Var.end(); ++v) cout << *v << "\n"; 7

8 NsIntVar::const_reverse_iterator ιατρέχει τις τιµές του πεδίου της µεταβλητής µε αντίστροφη σειρά. Π.χ. µε τον παρακάτω κώδικα, τυπώνονται οι τιµές της µεταβλητής, σε ϕθίνουσα σειρά. for (NsIntVar::const_reverse_iterator v=var.rbegin(); v!= Var.rend(); ++v) cout << *v << "\n"; NsIntVar::const_gap_iterator ιατρέχει τα κενά που υπάρχουν εντός του πεδίου της µεταβλητής. Αν χρησιµοποιούσαµε τη γλώσσα των µα- ϑηµατικών, ϑα λέγαµε ότι παίρνουµε όλες τις τιµές του συµπληρώµατος του πεδίου τιµών της µεταβλητής, ως προς το [min, max] (όπου min το ελάχιστο και max το µέγιστο του πεδίου τιµών της µεταβλητής). Π.χ. for (NsIntVar::const_gap_iterator g = Var.gap_begin(); g!= Var.gap_end(); ++g) cout << *g << "\n"; Τέλος, σηµειώνεται ότι ο τελεστής «<<» έχει υπερφορτωθεί, για να είναι δυνατόν να τυπώνεται µία µεταβλητή σε ένα ϱεύµα εξόδου, γράφοντας π.χ. «cout << Var;». 4 Πίνακες Περιορισµένων Μεταβλητών Ο προκαθορισµένος τύπος (ευέλικτου) πίνακα του επιλυτή, µε στοιχεία περιο- ϱισµένες µεταβλητές, είναι ο NsIntVarArray. Μπορούµε να αναφερόµαστε στο i-οστό στοιχείο ενός τέτοιου πίνακα VarArr, µέσω της γνωστής παράστασης VarArr[i]. Ο προκαθορισµένος τύπος για το i, είναι ο NsIndex. Μετά τη δηµιουργία ενός NsIntVarArray, αυτός δεν περιέχει κανένα στοιχείο. Οι µεταβλητές που τον συνθέτουν, εισάγονται είτε στην αρχή, είτε στο τέλος του, όπως µπορεί να γίνει σε µία συνδεδεµένη λίστα. Η µέθοδοςκατασκευής του δεν παίρνει ορίσµατα. Ακολουθούν οι υπόλοιπες µέθοδοι αυτής της κλάσης. NsIndex size() Επιστρέφει το µέγεθος του πίνακα. bool empty() Επιστρέφει true αν ο πίνακας είναι άδειος. NsIntVar& back() Η τελευταία περιορισµένη µεταβλητή του πίνακα. 8

9 NsIntVar& front() Η πρώτη περιορισµένη µεταβλητή του πίνακα. void push_back(expression) Εισαγωγή στο τέλος του πίνακα, της µετα- ϐλητής που ϑα ισούται µε την έκφραση Expression. Οπως ϑα αναλυ- ϑεί σε επόµενη παράγραφο, µία Expression µπορεί απλά να είναι µία περιορισµένη µεταβλητή, ή κάποιος συνδυασµός µεταβλητών. Π.χ. VarArr.push_back( NsIntVar(pm, 10, 30) ); VarArr.push_back( 3*VarX + VarY ); VarArr.push_back( VarX > 11 ); Στην πρώτη εντολή παραπάνω, ουσιαστικά εισάγαµε στο τέλος του πίνακα VarArr µία καινούργια µεταβλητή µε πεδίο [10..30]. Με την τελευταία εντολή, εισάγουµε µία περιορισµένη µεταβλητή στο τέλος του πίνακα, που ϑα είναι 1 αν ισχύει VarX > 11, αλλιώς 0. (Μπο- ϱεί ϕυσικά το πεδίο της να είναι και το [0..1], σε περίπτωση που κάποιες τιµές της VarX είναι µικρότερες και κάποιες µεγαλύτερες του 11.) Εχουµε δηλαδή έναν µετα-περιορισµό. void push_front(expression) Οπως η push_back(), αλλά η εισαγωγή γίνεται στην αρχή του πίνακα. Ακολουθούν οι επαναλήπτες για τους πίνακες. Χρησιµοποιώντας τους, µπο- ϱούµε να διατρέχουµε εύκολα όλες τις µεταβλητές του πίνακα. NsIntVarArray::iterator Επαναλήπτης για να παίρνουµε κατά σειρά τις µεταβλητές του πίνακα. Π.χ. παρακάτω αφαιρούµε την τιµή 2 από όλες τις µεταβλητές του VarArr: for (NsIntVarArray::iterator V = VarArr.begin(); V!= VarArr.end(); ++V) V->remove(2); NsIntVarArray::const_iterator Αυτός ο επαναλήπτης υπάρχει για την περίπτωση που δεν ϑέλουµε να τροποποιήσουµε τις µεταβλητές. Μπο- ϱούµε π.χ. χρησιµοποιώντας τον, να τυπώσουµε τις µεταβλητές ενός πίνακα. for (NsIntVarArray::const_iterator V=VarArr.begin(); V!= VarArr.end(); ++V) cout << *V << "\n"; 9

10 Τέλος, σηµειώνεται ότι ο τελεστής «<<» έχει υπερφορτωθεί και για τους πίνακες, οι οποίοι µπορούν να τυπωθούν, γράφοντας π.χ. «cout<<vararr;». 4.1 Πίνακες Γενικής Χρήσης Στην περίπτωση που ϑέλουµε να δηµιουργήσουµε έναν πίνακα µε τις δυνατότητες/µεθόδους του NsIntVarArray, µπορούµε να χρησιµοποιήσουµε την template κλάση NsDeque<τύπος_στοιχείων>. Π.χ. µε το NsDeque<int> arr; δηλώνουµε ότι ο arr είναι ένας ευέλικτος πίνακας ακεραίων, κενός αρχικά, ενώ µε το NsDeque<int> arr(5); δηλώνουµε ότι αρχικά ϑα περιέχει 5 στοιχεία. Ο τύπος_στοιχείων δεν έχει νόηµα να είναι NsIntVar, αφού για αυτήν την περίπτωση αντί για NsDeque µπορούµε να χρησιµοποιήσουµε απευθείας τον NsIntVarArray. 4 5 ιαχειριστής Προβλήµατος Πριν ξεκινήσουµε να διατυπώνουµε ένα πρόβληµα, πρέπει να ορίσουµε ένα διαχειριστή προβλήµατος (κλάση NsProblemManager). Ο διαχειριστής αυτός συγκρατεί όσες πληροφορίες χρειάζονται για τις µεταβλητές, το δίκτυο περιορισµών που κατασκευάζεται και τους στόχους που ϑα εκτελεστούν. Η µέθοδος-κατασκευής του δεν παίρνει ορίσµατα. Ακολουθούν οι υπόλοιπες µέθοδοι. void add(exprconstr) Προσθέτει τον περιορισµό που περιγράφει η έκφραση περιορισµού ExprConstr (ϐλ. 6.1). Σε µία έκφραση περιορισµού χρησιµοποιούνται οι τελεστές των συνθηκών (<, ==,!= κ.λπ.), ή ενσωµατωµένες εκφράσεις όπως η NsAllDiff() που επιβάλλει όλα τα στοιχεία ενός πίνακα να είναι διαφορετικά. Π.χ. 4 Ο NsDeque πρόκειται ουσιαστικά για µια επέκταση του τύπου std::deque της πρότυπης ϐιβλιοθήκης της C++. Η ειδοποιός διαφορά τους είναι ότι στον NsDeque γίνεται πάντα ο έλεγχος για το αν κινούµαστε εντός των ορίων του πίνακα σε περίπτωση που υπερβούµε τα όρια, προκαλείται η αντίστοιχη εξαίρεση. 10

11 pm.add( 3*VarX!= VarY/2 ); pm.add( VarW == -2 VarW >= 5 ); pm.add( NsAllDiff(VarArr) ); void addgoal(nsgoal* goal) Προσθήκη του goal στη λίστα µε τους προς ικανοποίηση στόχους (ϐλ. 8). bool nextsolution() Εύρεση της επόµενης λύσης. Ικανοποίηση των στόχων που έχουν τεθεί. Αν δεν ϐρεθεί λύση, επιστρέφεται false. void minimize(expression) ίνει οδηγία στον επιλυτή να προσπαθήσει να ελαχιστοποιήσει την τιµή της Expression. Κάθε ϕορά που ο επιλυτής ϐρίσκει µία λύση, ϑα πρέπει η τιµή της Expression να είναι µικρότερη από αυτήν της προηγούµενης λύσης (αλγόριθµος branch and bound). Ουσιαστικά, µετά από κάθε λύση που δίνει η nextsolution(), αν η µέγιστη τιµή της Expression είναι a, επιβάλλεται ο περιορισµός Expression < a, για την επόµενη ϕορά που ϑα κληθεί η nextsolution(). ηλαδή σε κάθε λύση, η Expression ϐγαίνει µειωµένη. Αν δεν µπορεί να µειωθεί περαιτέρω, η nextsolution() ϑα επιστρέψει false και ϑα πρέπει να έχουµε αποθηκευµένη κάπου την τελευταία (ϐέλτιστη) λύση. Π.χ. pm.minimize( VarX + VarY ); while (pm.nextsolution()!= false) { /* STORE SOLUTION */ } Αν επιθυµούµε να µεγιστοποιήσουµε µία Expression, απλά ϐάζουµε ένα «-» µπροστά της και καλούµε τη minimize() για αυτήν. void objectiveupperlimit(nsint max) Κατά τη διάρκεια της αναζήτησης η µέθοδος αυτή ϑέτει ένα άνω ϕράγµα ίσο µε max για το κόστος της λύσης ενός προβλήµατος (που εκφράζεται από τη µεταβλητή που παίρνει ως όρισµα η NsProblemManager::minimize()). Με άλλα λόγια ϑέτει τον µοναδιαίο περιορισµό «µεταβλητή_κόστους max». Εξάλλου, όταν έχει ήδη ξεκινήσει η αναζήτηση µε µία κλήση της nextsolution(), ο επιλυτής δεν υποστηρίζει πλέον την επιβολή νέων περιορισµών µέσω της NsProblemManager::add, όπως π.χ. στο «pm.add(x <= 5)». Η objectiveupperlimit έρχεται να καλύψει αυτό το κενό, όσον αφορά τη µεταβλητή κόστους. 11

12 void timelimit(unsigned long secs) Η αναζήτηση ϑα διαρκέσει το πολύ secs δευτερόλεπτα. Μετά το πέρας αυτού του χρονικού διαστή- µατος, η nextsolution() επιστρέφει false. void realtimelimit(unsigned long secs) Κάνει ό,τι και η προηγού- µενη µέθοδος, µε τη διαφορά ότι εδώ τα secs δευτερόλεπτα είναι πραγ- µατικός χρόνος, ενώ στην προηγούµενη µέθοδο ήταν ο καθαρός χρόνος που έχει δοθεί από το σύστηµα, αποκλειστικά στον επιλυτή (CPU time). void backtracklimit(unsigned long x) Για µη µηδενικό x, κάνει τη nextsolution() να επιστρέφει false µετά από x οπισθοδροµήσεις από τη στιγµή που κλήθηκε αυτή η µέθοδος. unsigned long numfailures() Επιστρέφει τον αριθµό των αποτυχιών που έχουν συµβεί κατά την αναζήτηση. unsigned long numbacktracks() Επιστρέφει τον αριθµό των οπισθοδρο- µήσεων που έχουν γίνει κατά στην αναζήτηση. unsigned long numgoals() Επιστρέφει τον αριθµό των στόχων που έχουν εκτελεστεί. unsigned long numvars() Επιστρέφει τον αριθµό των περιορισµένων µεταβλητών που έχουν δηµιουργηθεί. Σηµειώνεται ότι στον αριθµό συµπε- ϱιλαµβάνονται και τυχόν ενδιάµεσες/βοηθητικές µεταβλητές που έχουν δηµιουργηθεί αυτόµατα από τον επιλυτή. unsigned long numconstraints() Επιστρέφει τον αριθµό των περιορισµών που υπάρχουν. Σηµειώνεται ότι στον αριθµό συµπεριλαµβάνονται και τυχόν ενδιάµεσοι περιορισµοί που έχουν δηµιουργηθεί αυτόµατα από τον επιλυτή. unsigned long numsearchtreenodes() Επιστρέφει τον αριθµό των κόµ- ϐων του δένδρου αναζήτησης λύσης που έχει επισκεφθεί έως τώρα ο επιλυτής. void searchtographfile(char *filename) Αποθηκεύει σε ένα αρχείο µε όνοµα filename µία αναπαράσταση του δένδρου αναζήτησης λύσης. Η µορφή του αρχείου ονοµάζεται dot και η εφαρµογή Graphviz υποστηρίζει τη γραφική απεικόνισή του. 12

13 void restart() Επαναφέρει τις περιορισµένες µεταβλητές (δηλαδή τα πεδία τιµών τους) στην κατάσταση ακριβώς που ήταν λίγο µετά την πρώτη κλήση της nextsolution(). Συγκεκριµένα, επαναφέρει την κατάσταση που υπήρχε ακριβώς πριν την κλήση της nextsolution(), συν τις όποιες αλλαγές έγιναν από την πρώτη επιβολή συνέπειας-ακµών (ϐλ. 8 για τον ορισµό της τελευταίας έννοιας). Με άλλα λόγια, αυτή η µέθοδος ϕέρνει το δίκτυο περιορισµών/µεταβλητών στην πρώτη κατάσταση συνέπειας-ακµών που έχει ϐρεθεί ποτέ (πριν εκτελεστεί ο οποιοσδήποτε στόχος). Η µέθοδος ακυρώνει επίσης όλους τους στόχους που επρόκειτο να ε- κτελεστούν. ηλαδή, αν επιθυµούµε να ξαναξεκινήσει η αναζήτηση (κλήση nextsolution()) µετά από µία restart(), πρέπει να δηλώσουµε κάποιον στόχο να εκτελεστεί (µέσω της addgoal()), ειδάλλως δεν υπάρχει στόχος! Η restart() δεν πειράζει την µεταβλητή που έχει περαστεί σαν όρισµα της minimize() λέγεται και αντικειµενική µεταβλητή ή µεταβλητή κόστους. Ητοι δεν την επαναφέρει στην αρχική της κατάσταση. ηλαδή αν αρχικά η µεταβλητή κόστους είχε τιµές [0..100] και πριν κληθεί η restart() έχει τιµές [0..10], τότε µετά την κλήση της restart() ϑα έχει τιµές πάλι [0..10]. Η µέθοδος δεν ϑα πρέπει να καλείται µέσα από στόχους, αλλά έ- ξω από αυτούς. Π.χ. µπορεί να καλείται εκεί που καλείται και η nextsolution(). 6 Εκφράσεις Για να συνδέσουµε τις µεταβλητές, εκµεταλλευόµαστε τους υπερφορτωµένους τελεστές και δηµιουργούµε εκφράσεις και συνδυασµούς από εκφράσεις. Μία απλή έκφραση µπορεί να είναι και µία µεταβλητή ή ένας ακέραιος. Μία έκφραση συµβολίζεται µε Expression. 6.1 Εκφράσεις Περιορισµών Συµβολίζονται µε ExprConstr και είναι υποκατηγορία των εκφράσεων Expression. Χρησιµοποιούνται κυρίως σαν ορίσµατα της NsProblemManager:: 13

14 add() και για τη δηµιουργία µετα-περιορισµών. Οι παρακάτω παραστάσεις είναι ExprConstr: Expression 1 op Expression 2, op {<, <=, >, >=, ==,!=}!( ExprConstr ) ExprConstr 1 op ExprConstr 2, op {&&, } NsIfThen( ExprConstr 1, ExprConstr 2 ) NsEquiv( ExprConstr 1, ExprConstr 2 ) NsAllDiff( V ararr ) Ο ορισµός είναι λοιπόν αναδροµικός. Η τελευταία έκφραση συµβολίζει ό- τι οι περιορισµένες µεταβλητές του V ararr (που είναι πίνακας του τύπου NsIntVarArray) είναι διαφορετικές µεταξύ τους. 5 Ενας περιορισµός NsIfThen(p,q) έχει την έννοια της λογικής πρότασης p q, ενώ ο περιορισµός NsEquiv(p,q) έχει την έννοια του p q. 6 Παρακάτω παρουσιάζονται µερικές εκφράσεις περιορισµών: VarX < VarY!( X==Y X+Y==-3 ) (X==Y)!= Γενικές Εκφράσεις Εκτός από τις ExprConstr, στην κατηγορία των γενικών εκφράσεων Expression, ανήκουν και οι εξής παραστάσεις: Expression 1 op Expression 2, op {+, -, *, /, %} 5 Εφόσον χρησιµοποιηθεί η έκφραση NsAllDiff( V ararr, Capacity ), όπου Capacity ϑετικός ακέραιος, τότε ϑα γίνει µεγαλύτερη διάδοση περιορισµών. Π.χ. αν V ararr = {[1..2], [1..2], [1..5]}, τότε από την έκφραση NsAllDiff( V ararr,1 ) ϑα προκύψει ότι V ararr = {[1..2], [1..2], [3..5]} (ενώ από την απλή έκφραση NsAllDiff( V ararr ) ϑα είχαµε κάποια αφαίρεση τιµής µόνο κατά την ανάθεση τιµής σε µεταβλητή του V ararr). Ωστόσο, αυτή η ισχυρότερη µορφή συνέπειας είναι πιθανόν να «κοστίσει» σε χρόνο. Τέλος, µε τον ακέραιο Capacity δηλώνεται ο αριθµός των εµφανίσεων που µπορεί να έχει το πολύ, µία τιµή εντός του πίνακα V ararr. 6 Οι δύο περιορισµοί µπορούν να εκφραστούν και µε έναν άλλον ισοδύναµο τρόπο στον επιλυτή σαν (!p q ) και ( p == q ) αντίστοιχα. 14

15 NsAbs( Expression ) NsMin( V ararr ) NsMax( V ararr ) NsSum( V ararr ) NsSum( V ararr, start, length ) IntArr[ Expression ] Μία Expression µπορεί εκτός από το να συµµετέχει σε µία έκφραση πεϱιο- ϱισµού να ανατεθεί σε µία µεταβλητή. Π.χ. µπορούµε να γράψουµε NsIntVar X = Y + 3/Z; NsIntVar W = NsSum(VarArrA) - (NsMin(VarArrB) == 10); Σηµειώνεται µάλιστα, ότι από το να γράφουµε VarArr[0] + VarArr[1] + VarArr[2], είναι πιο αποδοτικό να χρησιµοποιούµε την ισοδύναµη έκ- ϕραση NsSum(VarArr,0,3). Το δεύτερο και το τρίτο όρισµα του NsSum είναι προαιρετικά και συµβολίζουν αντίστοιχα τη ϑέση του πρώτου στοιχείου του VarArr το οποίο ϑα µπει στο άθροισµα και τον αριθµό των µετέπειτα στοιχείων (µαζί µε το πρώτο) που ϑα συνυπολογιστούν στο άθροισµα. Αν δεν υπάρχουν αυτά τα δύο ορίσµατα, τότε όλος ο πίνακας µπαίνει στο άθροισµα. Ο λόγος που το NsSum είναι η αποδοτικότερη από τις δύο εκφράσεις, έχει να κάνει µε το γεγονός ότι για την πρώτη παράσταση ϑα δηµιουργηθεί µία ενδιάµεση µεταβλητή που ϑα ισούται µε VarArr[0] + VarArr[1] και σε αυτήν ϑα προστεθεί η VarArr[2]. Αυτό δεν ϑα γίνει για το NsSum. Το NsAbs δίνει την απόλυτη τιµή. Τα NsMin και NsMax, δίνουν το ελάχιστο και το µέγιστο αντίστοιχα του πίνακα τον οποίο δέχονται σαν όρισµα Ο Περιορισµός Element Αφιερώνουµε µία ξεχωριστή παράγραφο για την τελευταία έκφραση «IntArr[ Expression ]», καθώς αφορά έναν ιδιαίτερο περιορισµό τον οποίο ονοµάζου- µε element. 7 Για λόγους απλότητας ϑεωρούµε ότι η έκφραση Expression είναι απλά µία περιορισµένη µεταβλητή V arindex, η οποία χρησιµοποιείται 7 Η ονοµασία «element» προέρχεται από τον χώρο του λογικού προγραµµατισµού. 15

16 σαν «δείκτης» στον πίνακα ακεραίων IntArr. Τονίζεται ότι ο IntArr είναι πίνακας που περιέχει ακέραιες τιµές, αφού είναι τύπου NsDeque<NsInt> δεν περιέχει περιορισµένες µεταβλητές γιατί τότε ϑα ήταν τύπου NsIntVarArray. Για να κατανοήσουµε τη χρησιµότητα του περιορισµού, ϑα δούµε ένα παράδειγµα. Εστω ότι έχουµε έναν πίνακα NsDeque<NsInt> grades µε τους ϐαθµούς οκτώ ϕοιτητών. Και έστω ότι το πεδίο τιµών της V arindex περιέχει όλες τις ϑέσεις του πίνακα, δηλαδή τις [0..7]. Αν επιθυµούµε το πεδίο τιµών µίας µεταβλητής V arv alue να περιέχει όλες τις ϐαθµολογίες, ϑέτουµε τον περιορισµό «V arv alue == grades[v arindex]». (Στην περίπτωση που ϑέσουµε έναν ακόµα περιορισµό, π.χ. «V arv alue >= 9», τότε το πεδίο τιµών της V arindex ϑα περιοριστεί έτσι ώστε να περιέχει µόνο τους αύξοντες αριθµούς των ϕοιτητών που ϐαθµολογήθηκαν µε άριστα, δηλαδή µε 9 ή 10.) Εκφράσεις Πινάκων Τέλος, υπάρχει µια ειδική, ανεξάρτητη κατηγορία εκφράσεων, που αφορά ανάθεση σε πίνακα µεταβλητών τύπου NsIntVarArray. Περιλαµβάνει τις παρακάτω παραστάσεις, για τον περιορισµό Inverse (ϐλ ). NsInverse( V ararr ) NsInverse( V ararr, maxdom ) Με maxdom συµβολίζουµε τον αριθµό των στοιχείων του αντίστροφου πίνακα που ϑέλουµε να ϕτιάξουµε. Αν δεν υπάρχει τιµή για αυτό το όρισµα, ϑεω- ϱούµε ότι maxdom = max V V ararr {V.max}. Σε κάθε περίπτωση, το maxdom πρέπει να είναι µεγαλύτερο ή ίσο από αυτήν την τιµή. Π.χ. NsIntVarArray VarArrB = NsInverse(VarArrA); NsIntVarArray VarArrC; VarArrC = NsInverse(VarArrA, 100); Ο Περιορισµός Inverse Ο περιορισµός Inverse (Αντιστροφή), εφαρµόζεται ανάµεσα σε δύο πίνακες από περιορισµένες µεταβλητές. Εστω ότι έχουµε έναν πίνακα Arr, του οποίου 8 Ο περιορισµός element εκτός από τη µορφή «V arv alue == IntArr[V arindex]» που είδαµε ότι µπορεί να πάρει, είναι δυνατόν να διατυπωθεί όπως και στον λογικό προγραµµατισµό σαν «NsElement(V arindex,intarr,v arv alue)». 16

17 οι τιµές των µεταβλητών είναι ϑετικές και επιθυµούµε ο «αντίστροφός» του να είναι ο ArrInv και ακόµα, έστω ότι το D x συµβολίζει το πεδίο τιµών µιας µεταβλητής x. Τότε ϑα ισχύει: v D ArrInv[i], D Arr[v] i. Αν δεν υπάρχει v, τέτοιο ώστε i D Arr[v], τότε το πεδίο της ArrInv[i] ϑα περιέχει την ειδική τιµή 1 και µόνο. Απλοποιώντας τους συµβολισµούς, µπορούµε να γράψουµε ότι πρέπει να ισχύει: Arr[ArrInv[i]] = i και ArrInv[Arr[i]] = i. Εξ ου και η ονοµασία «Inverse». Βέβαια, αυτές οι σχέσεις ϑα είχαν νόηµα, αν όλες µεταβλητές των δύο πινάκων ήταν δεσµευµένες και αν η µοναδική τιµή που ϑα περιείχε το πεδίο τιµών κάθε µεταβλητής, συµβολιζόταν µε το ίδιο το όνοµα της µεταβλητής. Ακόµα ϑα έπρεπε i, ArrInv[i] 1. Χρησιµότητα του Περιορισµού. Ο περιορισµός µπορεί να χρησιµοποιη- ϑεί σε δυϊκές (dual) µοντελοποιήσεις ένος προβλήµατος. Π.χ. έστω ότι έχουµε ένα πλήθος από εργασίες για να ανατεθούν σε κάποια άτοµα. Μία πιθανή µοντελοποίηση είναι να έχουµε µία µεταβλητή για κάθε εργασία µε πεδίο το σύνολο των ατόµων. Μία άλλη είναι να έχουµε µία µεταβλητή για κάθε άτοµο µε πεδίο το σύνολο των εργασιών. Προφανώς το πρόβληµα έχει νόηµα όταν υπάρχουν και κάποιοι περιορισµοί για το πώς πρέπει να γίνουν οι ανα- ϑέσεις. Πιθανώς, στη διατύπωση κάποιων περιορισµών να ϐολεύει η πρώτη µοντελοποίηση, ενώ για κάποιους άλλους να ϐολεύει η δεύτερη. Σε αυτή την περίπτωση δίνεται η δυνατότητα από τον επιλυτή να χρησι- µοποιούµε και τις δύο µοντελοποιήσεις. Οι µεταβλητές όµως των δύο µοντελοποιήσεων δεν είναι άσχετες. Κάπως ϑα πρέπει να πούµε κάτι σαν X[i] = j Y [j] = i. Αυτό γίνεται µε έναν περιορισµό Inverse. 7 Παραδείγµατα 7.1 Το Πρόβληµα των N Βασιλισσών Σαν παράδειγµα ϑα διατυπώσουµε ένα πραγµατικό πρόβληµα. 17

18 Σχήµα 1: 8 ϐασίλισσες που δεν απειλούνται Ορισµός Το πρόβληµα των N ϐασιλισσών συνίσταται στην τοποθέτηση N ϐασιλισσών σε µία N N σκακιέρα, µε τέτοιο τρόπο ώστε καµία να µην απειλείται. Με άλλα λόγια ϑέλουµε να τοποθετήσουµε N στοιχεία σε ένα πλέγµα N N, έτσι ώστε κανένα από αυτά να µην έχει κοινή γραµµή, στήλη, ή διαγώνιο µε κάποιο άλλο. Στο Σχήµα 1 ϕαίνεται ένα παράδειγµα για N = 8. Συνεπώς σε κάθε στήλη 0, 1,..., N 1 ϑα αντιστοιχεί και µία ϐασίλισσα. Μένει να δούµε σε ποια γραµµή ϑα τοποθετήσουµε την καθεµία. Οπότε οι άγνωστοι του προβλήµατος είναι οι µεταβλητές X i µε 0 X i N 1, όπου X i είναι η γραµµή στην οποία ϐρίσκεται η ϐασίλισσα της στήλης i. Οσον αφορά τους περιορισµούς που ισχύουν, καταρχήν οι ϐασίλισσες πρέπει να µην απειλούνται στις γραµµές, δηλαδή X i X j, i j (1) Επίσης δεν πρέπει να απειλούνται στις δύο διαγώνιους, οπότε X i + i X j + j και X i i X j j, i j (2) Το X i + i αντιστοιχεί στην πρώτη και το X i i στη δεύτερη διαγώνιο της ϐασίλισσας της στήλης i Κώδικας Στον κώδικα για τον επιλυτή, οι µεταβλητές X i αναπαρίστανται µε έναν πίνακα Var για τον οποίο ϑα απαιτήσουµε, σύµφωνα µε την (1), να έχει δια- ϕορετικά µεταξύ τους στοιχεία. Οσον αφορά την (2), ϕτιάχνουµε δύο ακόµα 18

19 πίνακες, τον VarPlus και τον VarMinus, µε στοιχεία τα X i +i και X i i αντίστοιχα. Και για αυτούς τους πίνακες, ϑα δηλώσουµε ότι ισχύει ο περιορισµός ότι τα στοιχεία που περιέχουν διαφέρουν µεταξύ τους. int N = 8; NsProblemManager pm; NsIntVarArray Var, VarPlus, VarMinus; for (int i=0; i<n; ++i) { Var.push_back( NsIntVar(pm, 0, N-1) ); VarPlus.push_back( Var[i] + i ); VarMinus.push_back( Var[i] - i ); } pm.add( NsAllDiff(Var) ); pm.add( NsAllDiff(VarPlus) ); pm.add( NsAllDiff(VarMinus) ); pm.addgoal( new NsgLabeling(Var) ); while (pm.nextsolution()!= false) cout << "Solution: " << Var << "\n"; 7.2 SEND + MORE = MONEY Ενα άλλο παράδειγµα, αφορά ένα γνωστό πρόβληµα κρυπτάριθµου (cryptarithm). Σε αυτά τα προβλήµατα, έχουµε κάποιες αριθµητικές σχέσεις µεταξύ λέξεων, όπως η SEND + MORE = MONEY. Κάθε γράµµα των λέξεων αναπαριστά ένα συγκεκριµένο ψηφίο (0 ως 9) και έτσι κάθε λέξη αντιπροσωπεύει έναν δεκαδικό αριθµό. ύο διαφορετικά γράµµατα δεν πρέπει να παριστάνουν το ίδιο ψηφίο. Π.χ. στη σχέση SEND + MORE = MONEY, όπου υπάρχει το E, ϑα ϐάλουµε ένα ψηφίο. Το ίδιο και για τα υπόλοιπα γράµµατα, στα οποία όµως ϑα ανατεθεί διαφορετικό ψηφίο, από αυτό του E. Το Ϲητούµενο είναι µετά από τις όποιες αναθέσεις, να ισχύει η σχέση. Το πρόβληµα διατυπώνεται στον επιλυτή ως εξής: NsProblemManager pm; NsIntVar S(pm,1,9), E(pm,0,9), N(pm,0,9), D(pm,0,9), M(pm,1,9), O(pm,0,9), R(pm,0,9), Y(pm,0,9); NsIntVar send = 1000*S + 100*E + 10*N + D; 19

20 NsIntVar more = 1000*M + 100*O + 10*R + E; NsIntVar money = 10000*M *O + 100*N + 10*E + Y; pm.add( send + more == money ); NsIntVarArray letters; letters.push_back( S ); letters.push_back( E ); letters.push_back( N ); letters.push_back( D ); letters.push_back( M ); letters.push_back( O ); letters.push_back( R ); letters.push_back( Y ); pm.add( NsAllDiff(letters) ); pm.addgoal( new NsgLabeling(letters) ); if (pm.nextsolution()!= false) { cout << " " << send.value() << "\n" << " + " << more.value() << "\n" << " = " << money.value() << "\n"; } Το αποτέλεσµα που προκύπτει αν τρέξουµε το εκτελέσιµο για το παραπάνω πρόγραµµα, είναι το εξής: = Αναζήτηση Λύσης µέσω Στόχων 8.1 Εισαγωγή Ενα Ϲεύγος µεταβλητών (x, x ) είναι συνεπές, αν για κάθε τιµή v του πεδίου τιµών της x, υπάρχει µία τιµή v στο πεδίο τιµών της x τέτοια ώστε να ικανοποιούνται όλοι οι περιορισµοί που συνδέουν τις δύο µεταβλητές. Οταν κάθε τέτοιο Ϲευγάρι µεταβλητών είναι συνεπές, λέµε ότι το δίκτυο περιορισµών χαρακτηρίζεται από συνέπεια-ακµών (arc consistency). Η συνέπεια-ακµών δεν οδηγεί απαραίτητα σε µία λύση αλλά αν δεν υπάρχει συνέπεια-ακµών, 20

21 V A {1, 2} V A V Γ V B V A V B V Γ {1, 2} V B V Γ {1, 2} (α ) εν υπάρχει λύση V A {1, 2} V A V Γ V B V A V B {1, 2} V B V V Γ Γ {2, 3} (ϐ ) Εχει δύο λύσεις V B {1, 2} V B V A V A {1, 2} V A V Γ V B V Γ ((V B = 2) (V Γ = 3)) (γ ) Εχει µοναδική λύση V Γ {2, 3} Σχήµα 2: Τρεις γράφοι µε συνέπεια ως προς τις ακµές 21

22 είµαστε σίγουροι ότι δεν υπάρχει λύση, εκτός εάν τη συνδυάσουµε µε µία µέθοδο αναζήτησης. Η χρησιµότητά της έχει να κάνει µε τη µείωση του χώρου αναζήτησης τον οποίο µία συνηθισµένη µέθοδος αναζήτησης µε την οποία συνδυάζεται όπως η πρώτα-κατά-ϐάθος αναζήτηση (Depth First Search DFS), η αναζήτηση περιορισµένων ασυµφωνιών (Limited Discrepancy Search LDS) κ.ά. πρέπει να εξερευνήσει. Οπως είναι γνωστό λοιπόν, στα περισσότερα προβλήµατα δεν αρκεί µόνο η επιβολή συνέπειας-ακµών για να ϐρεθεί µία λύση (ϐλ. και Σχήµα 2). Από ένα σηµείο και µετά, πρέπει να αρχίσουµε την αναζήτηση, επαναλαµβάνοντας την ανάθεση τιµών σε µεταβλητές και ελέγχοντας κάθε ϕορά π.χ. µετά από κάθε ανάθεση αν το δίκτυο περιορισµών χαρακτηρίζεται από συνέπεια-ακµών, σύµφωνα και µε την πρακτική της διατήρησης συνέπειας ακµών (maintaining arc consistency MAC). 9 Αν µία ανάθεση τιµής προκαλέσει ασυνέπεια, τότε ϑα πρέπει να ακυρωθεί και να επιλεγεί µία άλλη τιµή. Για να διευκολυνθεί, ή, καλύτερα, για να καθοδηγηθεί η αναζήτηση, έχει υλοποιηθεί στον επιλυτή ένας µηχανισµός στόχων. Ο προγραµµατιστής που χρησιµοποιεί τον επιλυτή µπορεί να ορίσει τους δικούς του στόχους, ή να εκµεταλλευτεί τους ενσωµατωµένους. Συνήθως, ένας στόχος προκαλεί την ανάθεση τιµής σε µία περιορισµένη µεταβλητή, ή την αφαίρεση τιµής από το πεδίο της. Αν στην πορεία της αναζήτησης καταλήξουµε σε αδιέξοδο, οι στόχοι που οδήγησαν σε αυτό ακυρώνονται αυτόµατα από τον επιλυτή και το δίκτυο περιορισµών µε τις µεταβλητές που το συνθέτουν επανέρχεται στην κατάσταση που ϐρισκόταν πριν εκτελεστούν οι στόχοι. Γενικά, ένας στόχος µπορεί να αναθέτει ή να αφαιρεί τιµές σε µία ή πε- ϱισσότερες µεταβλητές, ή να χρησιµοποιείται για την επιλογή µεταβλητής για να της ανατεθεί τιµή και, κατά αυτόν τον τρόπο, να καθορίζει τη µέθοδο α- ναζήτησης. Ενας στόχος, κατά τον τερµατισµό της εκτέλεσής του, µπορεί προαιρετικά να «γεννήσει» έναν άλλον στόχο αυτή η δυνατότητα µπορεί να προσδώσει χαρακτηριστικά αναδροµής στη διατύπωση των στόχων. Τέλος, δεν ϑα πρέπει να παραλείψουµε τους µετα-στόχους AND και OR. Τους χα- ϱακτηρίσαµε σαν «µετα-στόχους», γιατί είναι στόχοι που απλά υπάρχουν για να εξυπηρετούν, ο καθένας τους, δύο άλλους στόχους, τους οποίους λέµε υπο-στόχους. Για να πετύχει ο στόχος-and, ϑα πρέπει να ικανοποιηθούν και οι δύο υπο-στόχοι του, ενώ για να πετύχει ο OR, αρκεί να ικανοποιηθεί ένας 9 D. Sabin and E. C. Freuder. Contradicting conventional wisdom in constraint satisfaction. In Proc. 2 nd Int. Workshop on Principles and Practice of Constraint Programming (PPCP 94), pages ,

23 από τους υπο-στόχους του. Αξίζει να σηµειωθεί ότι οι στόχοι-or, είναι γνωστοί και σαν σηµεία επιλογής (choice points). Πράγµατι, είναι σηµεία στα οποία έχουµε δύο εναλλακτικές επιλογές, δηλαδή σηµεία στα οποία διακλαδώνεται το δένδρο αναζήτησης. Ο στόχος-or υπαγορεύει να επιλέξουµε ένα υπο-στόχο του και αν τελικά δεν πετύχει αυτός, να αναιρεθούν οι όποιες (αλυσιδωτές) αλλαγές που αυτός ε- πέφερε στα πεδία των µεταβλητών και να δοκιµάσουµε τον άλλον υπο-στόχο. Αν ϕυσικά και αυτός αποτύχει, τότε και ο στόχος-or αποτυγχάνει. 8.2 Αντικειµενοστρεφής Μοντελοποίηση Η αφηρηµένη ϐασική κλάση για έναν στόχο στον Naxos Solver, ορίζεται ως εξής: class NsGoal { public: virtual bool isgoaland (void) const; virtual bool isgoalor (void) const; virtual NsGoal* getfirstsubgoal (void) const; virtual NsGoal* getsecondsubgoal (void) const; }; virtual NsGoal* GOAL (void) = 0; Από την κλάση αυτή, παράγονται οι κλάσεις των µετα-στόχων NsgAND και NsgOR, των οποίων η µέθοδος-κατασκευής παίρνει δύο ορίσµατα (τύπου «NsGoal*»), που δεν είναι τίποτα άλλο παρά οι δύο υπο-στόχοι τους. Ολες οι µέθοδοι της NsGoal, εκτός από την GOAL(), αφορούν τους µετα-στόχους. Ο προγραµµατιστής που ϑα ορίσει δικούς του στόχους, χρειάζεται να ασχοληθεί µόνο µε την GOAL(). Κάθε στόχος που ορίζεται από έναν προγραµµατιστή που χρησιµοποιεί τον επιλυτή, ϑα είναι µία κλάση η οποία ϑα παράγεται, έστω και έµµεσα, από τη ϐασική κλάση NsGoal. Συνεπώς ϑα πρέπει να ορίζεται στον κάθε στόχο, η µέθοδος GOAL(). Η κλάση του στόχου µπορεί ασφαλώς να περιέχει και οποιεσδήποτε άλλες µεθόδους πλην αυτών της ϐασική κλάσης, προς αποφυγή συγχύσεων µε τους µετα-στόχους. Η GOAL() είναι µία κρίσιµη µέθοδος, καθώς εκτελείται κάθε ϕορά που ο επιλυτής προσπαθεί να ικανοποιήσει έναν στόχο. Η µέθοδος αυτή επιστρέφει 23

24 έναν δείκτη σε NsGoal, δηλαδή επιστρέφει τον επόµενο στόχο προς ικανοποίηση. Αν ο δείκτης είναι το 0, αυτό σηµαίνει ότι ο τρέχων στόχος πέτυχε και έτσι δεν απαιτείται η δηµιουργία κάποιου άλλου στόχου. Ας δούµε ένα παράδειγµα στόχων, οι οποίοι είναι µάλιστα ενσωµατωµένοι στον επιλυτή, καθώς χρησιµοποιούνται ευρέως. Πρόκειται για τους στόχους της πρώτα-κατά-ϐάθος αναζήτησης (depth first search DFS). class NsgInDomain : public NsGoal { private: NsIntVar& Var; public: NsgInDomain (NsIntVar& Var_init) : Var(Var_init) { } }; NsGoal* GOAL (void) { if (Var.isBound()) return 0; NsInt value = Var.min(); return ( new NsgOR( new NsgSetValue(Var,value), new NsgAND( new NsgRemoveValue(Var,value), new NsgInDomain(*this) ) ) ); } class NsgLabeling : public NsGoal { private: NsIntVarArray& VarArr; public: NsgLabeling (NsIntVarArray& VarArr_init) : VarArr(VarArr_init) { } NsGoal* GOAL (void) { int index = -1; NsUInt mindom = NsUPLUS_INF; for (NsIndex i = 0; i < VarArr.size(); ++i) { if (!VarArr[i].isBound() && VarArr[i].size() < mindom ) { mindom = VarArr[i].size(); index = i; 24

25 }; } } } if (index == -1) return 0; return ( new NsgAND( new NsgInDomain(VarArr[index]), new NsgLabeling(*this) ) ); Παρατηρούµε ότι στην επιστρεφόµενη τιµή της GOAL() (όταν αυτή δεν είναι 0) και στις µεθόδους κατασκευής των µετα-στόχων NsgAND και NsgOR, χρησιµοποιούµε τον τελεστή new. Αυτό είναι απαραίτητο να γίνεται κάθε ϕορά, για να ϕτιάξουµε έναν δείκτη σε στόχο. Ο επιλυτής αναλαµβάνει στην πρώτη ευκαιρία να σβήσει έναν άχρηστο στόχο µε τον τελεστή delete για αυτό, όλοι οι στόχοι που ϕτιάχνουµε, ϑα πρέπει να έχουν δηµιουργηθεί µε new και να µην γίνονται delete από εµάς. NsgLabeling AND NsgInDomain this OR NsgSetValue NsgRemoveValue AND this Σχήµα 3: Συνδυασµός στόχων που αποτελούν τον NsgLabeling Οσον αφορά την πρακτική σηµασία του παραδείγµατος, όταν Ϲητήσουµε από τον επιλυτή να ικανοποιηθεί ο στόχος NsgLabeling(VarArr), τότε α- ναµένουµε να ανατεθούν τιµές σε όλες τις µεταβλητές του πίνακα VarArr. Ετσι, ο στόχος NsgLabeling, στη µέθοδο GOAL() πάντα, διαλέγει µία µετα- ϐλητή (συγκεκριµένα εκείνη µε το µικρότερο πεδίο, σύµφωνα µε το ευριστικό first fail). Επειτα προστάζει να δοθεί τιµή στη µεταβλητή (µέσω του στόχου 25

26 NsgInDomain ο οποίος αναθέτει σε µία µεταβλητή την ελάχιστη τιµή του πεδίου της) και να ικανοποιηθεί ο στόχος this. Αυτός ο στόχος που πα- ϱαπέµπει και σε ένα είδος «αναδροµής» δηµιουργεί ένα άλλο στιγµιότυπο της NsgLabeling, πανοµοιότυπο µε το τρέχον στιγµιότυπο. Με το this, κατ ουσίαν προτρέπουµε τον επιλυτή να αναθέσει τιµή και στις υπόλοιπες µεταβλητές του πίνακα VarArr. Οταν η GOAL() επιστρέψει 0, ϑα έχουµε τελειώσει επιτυχώς (Σχήµα 3). Ενώ ο NsgLabeling επιλέγει µία µεταβλητή για να της ανατεθεί τιµή, ο NsgInDomain επιλέγει την τιµή που ϑα ανατεθεί. Πιο συγκεκριµένα, επιλέγει πάντα την ελάχιστη τιµή του πεδίου της µεταβλητής. Επειτα καλεί τον ενσωµατωµένο στόχο NsgSetValue που απλά αναθέτει την τιµή στη µεταβλητή. Αν στη συνέχεια ϐρεθεί ότι η τιµή αυτή δεν ανήκει σε κάποια λύση, τότε αφαιρείται από το πεδίο της µεταβλητής µε τον στόχο NsgRemoveValue και στη συνέχεια ϑα ανατεθεί µία άλλη τιµή (στόχος «NsgInDomain(*this)»). Συνήθως, για την αντιµετώπιση δύσκολων και µεγάλων προβληµάτων, ε- πιβάλλεται να ορίσουµε τους δικούς µας στόχους, σαν τους NsgLabeling και NsgInDomain. Ο σκοπός είναι να γίνει η αναζήτηση πιο αποδοτική, µέσω πιο εύστοχων επιλογών, που προκύπτουν από ευριστικές συναρτήσεις. 26

27 Ευρετήριο element, 15 GOAL(), 23 Graphviz, 12 NsAbs, 15 NsAllDiff, 14 NsDeque, 10 NsElement, 16 NsEquiv, 14 NsException, 4 NsGoal, 23 NsIfThen, 14 NsIndex, 8 NsInt, 5 NsIntVar, 5 NsIntVarArray, 8 NsInverse, 16 NsMINUS_INF, 5 NsMax, 15 NsMin, 15 NsPLUS_INF, 5 NsProblemManager, 10 NsSum, 15 NsUInt, 5 NsUPLUS_INF, 5 NsgAND, 23 NsgInDomain, 26 NsgLabeling, 25 NsgOR, 23 NsgRemoveValue, 26 NsgSetValue, 26 solver, 3 επιλυτής, 3 δένδρο αναζήτησης, 12 εκφράσεις, 13 27

Κλάσεις και Αντικείµενα

Κλάσεις και Αντικείµενα Κλάσεις και Αντικείµενα Γρηγόρης Τσουµάκας Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης Κλάσεις και Αντικείµενα 2 Τα αντικείµενα σε µια αντικειµενοστρεφή γλώσσα προγραµµατισµού, µοντελοποιούν

Διαβάστε περισσότερα

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι Εισαγωγή Στον Προγραµµατισµό «C» Πίνακες Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Πίνακες στη C Ένας πίνακας στη C είναι

Διαβάστε περισσότερα

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C Εισαγωγή στην C Μορφή Προγράµµατος σε γλώσσα C Τµήµα Α Με την εντολή include συµπεριλαµβάνω στο πρόγραµµα τα πρότυπα των συναρτήσεων εισόδου/εξόδου της C.Το αρχείο κεφαλίδας stdio.h είναι ένας κατάλογος

Διαβάστε περισσότερα

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες

υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 2 είκτες υναµική διαχείριση µνήµης στη C++ Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: είκτες στη C++ Οι τελεστές new και delete Destructors Ορισµός τελεστών κλάσεων Ο δείκτης this ΕΠΛ 132 Αρχές Προγραµµατισµού

Διαβάστε περισσότερα

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου) ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου) 1. Εισαγωγή Χαρακτηριστικά της γλώσσας Τύποι δεδοµένων Γλώσσα προγραµµατισµού

Διαβάστε περισσότερα

3 Αναδροµή και Επαγωγή

3 Αναδροµή και Επαγωγή 3 Αναδροµή και Επαγωγή Η ιδέα της µαθηµατικής επαγωγής µπορεί να επεκταθεί και σε άλλες δοµές εκτός από το σύνολο των ϕυσικών N. Η ορθότητα της µαθηµατικής επαγωγής ϐασίζεται όπως ϑα δούµε λίγο αργότερα

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 4 ΤΟ ΕΡΓΑΛΕΙΟ SOLVER

ΚΕΦΑΛΑΙΟ 4 ΤΟ ΕΡΓΑΛΕΙΟ SOLVER ΚΕΦΑΛΑΙΟ 4 ΤΟ ΕΡΓΑΛΕΙΟ SOLVER 4.1. ΕΙΣΑΓΩΓΗ Με την "Επίλυση", µπορείτε να βρείτε τη βέλτιστη τιµή για τον τύπο ενός κελιού το οποίο ονοµάζεται κελί προορισµού σε ένα φύλλο εργασίας. Η "Επίλυση" λειτουργεί

Διαβάστε περισσότερα

for for for for( . */

for for for for( . */ Εισαγωγή Στον Προγραµµατισµό «C» Βρόχοι Επανάληψης Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Ο βρόχος for Η εντολή for χρησιµοποιείται

Διαβάστε περισσότερα

Κεφάλαιο 5ο: Εντολές Επανάληψης

Κεφάλαιο 5ο: Εντολές Επανάληψης Χρήστος Τσαγγάρης ΕΕ ΙΠ Τµήµατος Μαθηµατικών, Πανεπιστηµίου Αιγαίου Κεφάλαιο 5ο: Εντολές Επανάληψης Η διαδικασία της επανάληψης είναι ιδιαίτερη συχνή, αφού πλήθος προβληµάτων µπορούν να επιλυθούν µε κατάλληλες

Διαβάστε περισσότερα

Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή

Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή Τεχνητή Νοημοσύνη (ΥΠ23) 6 ο εξάμηνο Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ουρανία Χατζή raniah@hua.gr 1 Ικανοποίηση Περιορισμών Κατηγορία προβλημάτων στα οποία είναι γνωστές μερικές

Διαβάστε περισσότερα

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο) Προγραμματισμός Η/Υ 1 (Εργαστήριο) Ενότητα 2: Δομή ενός προγράμματος C Καθηγήτρια Εφαρμογών: Τσαγκαλίδου Ροδή Τμήμα: Ηλεκτρολόγων Μηχανικών Τ.Ε. Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες

Διαβάστε περισσότερα

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης H ΓΛΩΣΣΑ C Μάθηµα 7: Πίνακες ηµήτρης Ψούνης 2 Περιεχόµενα Μαθήµατος Α. Πίνακες 1. Μονοδιάστατοι Πίνακες 1. ήλωση Πίνακα 2. Παράδειγµα Χρήσης Πίνακα 3. Αρχικοποίηση πίνακα κατά τη δήλωση 4. Στατική έσµευση

Διαβάστε περισσότερα

Γραµµική Αλγεβρα Ι. Ενότητα: Εισαγωγικές Εννοιες. Ευάγγελος Ράπτης. Τµήµα Μαθηµατικών

Γραµµική Αλγεβρα Ι. Ενότητα: Εισαγωγικές Εννοιες. Ευάγγελος Ράπτης. Τµήµα Μαθηµατικών Ενότητα: Εισαγωγικές Εννοιες Ευάγγελος Ράπτης Τµήµα Μαθηµατικών Αδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται

Διαβάστε περισσότερα

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη

Επιλογή και επανάληψη. Λογική έκφραση ή συνθήκη Επιλογή και επανάληψη Η ύλη που αναπτύσσεται σε αυτό το κεφάλαιο είναι συναφής µε την ύλη που αναπτύσσεται στο 2 ο κεφάλαιο. Όπου υπάρχουν διαφορές αναφέρονται ρητά. Προσέξτε ιδιαίτερα, πάντως, ότι στο

Διαβάστε περισσότερα

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004) 8 ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004) ιάλεξη 2 2.1 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ Β) Στην προηγούµενη διάλεξη µάθαµε ότι µπορούµε να χρησιµοποιούµε τη ρητή ή την αυτονόητη δήλωση µεταβλητών

Διαβάστε περισσότερα

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( ) ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Μορφές μεταβίβασης ορισμάτων σε συναρτήσεις (και μεθόδους) και οι επιπτώσεις τους Επιστροφή τιμών από κλήση συναρτήσεων Υπερφόρτωση

Διαβάστε περισσότερα

1 Οι πραγµατικοί αριθµοί

1 Οι πραγµατικοί αριθµοί 1 Οι πραγµατικοί αριθµοί 1.1 Σύνολα αριθµών Το σύνολο των ϕυσικών αριθµών N = {1, 2, 3,...} Το σύνολο των ακεραίων Z = {... 3, 2, 1, 0, 1, 2, 3,...}. Οι ακέραιοι διαµερίζονται σε άρτιους και περιττούς

Διαβάστε περισσότερα

Εισαγωγή στην πληροφορική

Εισαγωγή στην πληροφορική Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόµων Τοπογράφων Μηχανικών Εισαγωγή στην πληροφορική Βασίλειος Βεσκούκης ρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Ρωµύλος Κορακίτης

Διαβάστε περισσότερα

Αντικειµενοστρεφής Προγραµµατισµός

Αντικειµενοστρεφής Προγραµµατισµός 16 η διάλεξη Π. Σταθοπούλου pstath@ece.upatras.gr ή pstath@upatras.gr Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7 Φροντιστήριο : ευτέρα 11πµ-12πµ ΗΛ4 Προηγούµενη ιάλεξη

Διαβάστε περισσότερα

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 2 ο Τύποι Δεδοµένων Δήλωση Μεταβλητών Έξοδος Δεδοµένων Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Μνήµη και Μεταβλητές Σχέση Μνήµης Υπολογιστή και Μεταβλητών Η µνήµη (RAM) ενός

Διαβάστε περισσότερα

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ

ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ ΚΑΤΑΣΚΕΥΑΣΤΕΣ ΑΝΤΙΓΡΑΦΗΣ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Deep/Shallow copies H αναγκαιότητα των κατασκευαστών αντιγραφής Ορισμός και χρήση κατασκευαστών αντιγραφής Τελευταία ενημέρωση:

Διαβάστε περισσότερα

2.1 Αντικειµενοστρεφής προγραµµατισµός

2.1 Αντικειµενοστρεφής προγραµµατισµός 2.1 Αντικειµενοστρεφής προγραµµατισµός Στον αντικειµενοστρεφή προγραµµατισµό (object oriented programming, OOP) ένα πρόγραµµα υπολογιστή είναι ένα σύνολο αλληλεπιδρώντων αντικειµένων. Μπορεί να ειπωθεί

Διαβάστε περισσότερα

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Οργάνωση Προγράµµατος Header Files Μετάφραση και σύνδεση αρχείων προγράµµατος ΕΠΛ 132 Αρχές Προγραµµατισµού

Διαβάστε περισσότερα

1 Οι πραγµατικοί αριθµοί

1 Οι πραγµατικοί αριθµοί 1 Οι πραγµατικοί αριθµοί 1.1 Σύνολα αριθµών Το σύνολο των ϕυσικών αριθµών N = {1, 2, 3,...} Το σύνολο των ακεραίων Z = {... 3, 2, 1, 0, 1, 2, 3,...}. Οι ακέραιοι διαµερίζονται σε άρτιους και περιττούς

Διαβάστε περισσότερα

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language)

Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) 1 Η Γλώσσα Προγραµµατισµού C++ (The C++ Programming Language) ηµήτριος Κατσαρός, Ph.D. Χειµώνας 2005 ιάλεξη 4η 2 Ιστοσελίδα του µαθήµατος http://skyblue.csd.auth.gr/~dimitris/courses/cpp_fall05.htm Θα

Διαβάστε περισσότερα

a = 10; a = k; int a,b,c; a = b = c = 10;

a = 10; a = k; int a,b,c; a = b = c = 10; C: Από τη Θεωρία στην Εφαρµογή Κεφάλαιο 4 ο Τελεστές Γ. Σ. Τσελίκης Ν. Δ. Τσελίκας Ο τελεστής εκχώρησης = Ο τελεστής = χρησιµοποιείται για την απόδοση τιµής (ή αλλιώς ανάθεση τιµής) σε µία µεταβλητή Π.χ.

Διαβάστε περισσότερα

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting) Εργαστήριο 3: 3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting) Η C++, όπως όλες οι γλώσσες προγραμματισμού, χρησιμοποιεί τελεστές για να εκτελέσει τις αριθμητικές και λογικές λειτουργίες.

Διαβάστε περισσότερα

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008 Παράδειγμα: Μηχανή για Εισιτήρια 2 Ορισμός Κλάσεων Σύνταξη κλάσης: πεδία, κατασκευαστές, μέθοδοι Ένας αυτόματος εκδότης εισιτηρίων είναι μια μηχανή που δέχεται χρήματα και εκδίδει ένα εισιτήριο. Εκδίδει

Διαβάστε περισσότερα

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων

2.1. Εντολές. 2.2. Σχόλια. 2.3. Τύποι Δεδομένων 2 Βασικές Εντολές 2.1. Εντολές Οι στην Java ακολουθούν το πρότυπο της γλώσσας C. Έτσι, κάθε εντολή που γράφουμε στη Java θα πρέπει να τελειώνει με το ερωτηματικό (;). Όπως και η C έτσι και η Java επιτρέπει

Διαβάστε περισσότερα

Πληροφορική 2. Αλγόριθμοι

Πληροφορική 2. Αλγόριθμοι Πληροφορική 2 Αλγόριθμοι 1 2 Τι είναι αλγόριθμος; Αλγόριθμος είναι ένα διατεταγμένο σύνολο από σαφή βήματα το οποίο παράγει κάποιο αποτέλεσμα και τερματίζεται σε πεπερασμένο χρόνο. Ο αλγόριθμος δέχεται

Διαβάστε περισσότερα

Γραµµικός Προγραµµατισµός - Μέθοδος Simplex

Γραµµικός Προγραµµατισµός - Μέθοδος Simplex Γραµµικός Προγραµµατισµός - Μέθοδος Simplex Η πλέον γνωστή και περισσότερο χρησιµοποιηµένη µέθοδος για την επίλυση ενός γενικού προβλήµατος γραµµικού προγραµµατισµού, είναι η µέθοδος Simplex η οποία αναπτύχθηκε

Διαβάστε περισσότερα

o AND o IF o SUMPRODUCT

o AND o IF o SUMPRODUCT Πληροφοριακά Εργαστήριο Management 1 Information Συστήματα Systems Διοίκησης ΤΕΙ Τμήμα Ελεγκτικής Ηπείρου Χρηματοοικονομικής (Παράρτημα Πρέβεζας) και Αντικείµενο: Μοντελοποίηση προβλήµατος Θέµατα που καλύπτονται:

Διαβάστε περισσότερα

Εισαγωγή στη γλώσσα προγραμματισμού C++

Εισαγωγή στη γλώσσα προγραμματισμού C++ Εισαγωγή στη γλώσσα προγραμματισμού C++ Περιβάλλον Εργασίας 2 Περιβάλλον Εργασίας 1. Χρήση απλού κειμενογράφου και Μεταγλωττιστή 2. Ολοκληρωμένα Περιβάλλοντα Εργασίας (Integrated Development Environments)

Διαβάστε περισσότερα

Ενότητα: Πράξεις επί Συνόλων και Σώµατα Αριθµών

Ενότητα: Πράξεις επί Συνόλων και Σώµατα Αριθµών Τίτλος Μαθήματος: Γραμμική Άλγεβρα Ι Ενότητα: Πράξεις επί Συνόλων και Σώµατα Αριθµών Διδάσκων: Καθηγητής Νικόλαος Μαρμαρίδης Τμήμα: Μαθηματικών Κεφάλαιο 1 Εισαγωγη : Πραξεις επι Συνολων και Σωµατα Αριθµων

Διαβάστε περισσότερα

Επίλυση Προβλημάτων 1

Επίλυση Προβλημάτων 1 Επίλυση Προβλημάτων 1 Επίλυση Προβλημάτων Περιγραφή Προβλημάτων Αλγόριθμοι αναζήτησης Αλγόριθμοι τυφλής αναζήτησης Αναζήτηση πρώτα σε βάθος Αναζήτηση πρώτα σε πλάτος (ΒFS) Αλγόριθμοι ευρετικής αναζήτησης

Διαβάστε περισσότερα

ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ

ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΘΕΜΑ 1 ο (2.5 µονάδες) ΠΑΝΕΠΙΣΤΗΜΙΟ ΜΑΚΕ ΟΝΙΑΣ ΟΙΚΟΝΟΜΙΚΩΝ ΚΑΙ ΚΟΙΝΩΝΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΕΦΑΡΜΟΣΜΕΝΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕΧΝΗΤΗ ΝΟΗΜΟΣΥΝΗ Τελικές εξετάσεις Παρασκευή 28 Σεπτεµβρίου 2007 ιάρκεια: 13:00-16:00

Διαβάστε περισσότερα

Εισαγωγή στην πληροφορική

Εισαγωγή στην πληροφορική Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόµων Τοπογράφων Μηχανικών Εισαγωγή στην πληροφορική Βασίλειος Βεσκούκης ρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Ρωµύλος Κορακίτης

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Πίνακες Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Πίνακες Πολλές φορές θέλουμε να κρατήσουμε στην μνήμη πολλά αντικείμενα

Διαβάστε περισσότερα

Προγραµµατιστικές Τεχνικές

Προγραµµατιστικές Τεχνικές Εθνικό Μετσόβιο Πολυτεχνείο Σχολή Αγρονόµων Τοπογράφων Μηχανικών Προγραµµατιστικές Τεχνικές Βασίλειος Βεσκούκης ρ. Ηλεκτρολόγος Μηχανικός & Μηχανικός Υπολογιστών ΕΜΠ v.vescoukis@cs.ntua.gr Ρωµύλος Κορακίτης

Διαβάστε περισσότερα

ΙΚΑΝΟΠΟΙΗΣΗ ΠΕΡΙΟΡΙΣΜΩΝ

ΙΚΑΝΟΠΟΙΗΣΗ ΠΕΡΙΟΡΙΣΜΩΝ ΙΚΑΝΟΠΟΙΗΣΗ ΠΕΡΙΟΡΙΣΜΩΝ (ΜΕ ΒΑΣΗ ΤΟ ΚΕΦ. 6 ΤΟΥ ΒΙΒΛΙΟΥ «ΤΕΧΝΗΤΗ ΝΟΗΜΟΣΥΝΗ» ΤΩΝ ΒΛΑΧΑΒΑ, ΚΕΦΑΛΑ, ΒΑΣΙΛΕΙΑ Η, ΚΟΚΚΟΡΑ & ΣΑΚΕΛΛΑΡΙΟΥ) Ι. ΧΑΤΖΗΛΥΓΕΡΟΥ ΗΣ ΠΡΟΒΛΗΜΑΤΑ ΙΚΑΝΟΠΟΙΗΣΗΣ ΠΕΡΙΟΡΙΣΜΩΝ Είναι γνωστές µερικές

Διαβάστε περισσότερα

Υπερφόρτωση τελεστών

Υπερφόρτωση τελεστών Υπερφόρτωση τελεστών 19 Νοεμβρίου 2012 1 Γενικά Στα προηγούμενα είδαμε ότι ορίζοντας μία κλάση, ορίζουμε ένα νέο τύπο τον οποίο μπορούμε να χρησιμοποιήσουμε για να δηλώσουμε αντικείμενα αυτής της νέας

Διαβάστε περισσότερα

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες Σκοπός της Άσκησης ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ Ο σκοπός αυτής της εργαστηριακής άσκησης είναι η εξοικείωση με τη χρήση των δεικτών (pointers). Οι δείκτες δίνουν την δυνατότητα σε προγράμματα να προσομοιώνουν τη

Διαβάστε περισσότερα

Σύνοψη Προηγούµενου. Κανονικές Γλώσσες (1) Προβλήµατα και Γλώσσες. Σε αυτό το µάθηµα. ιαδικαστικά του Μαθήµατος.

Σύνοψη Προηγούµενου. Κανονικές Γλώσσες (1) Προβλήµατα και Γλώσσες. Σε αυτό το µάθηµα. ιαδικαστικά του Μαθήµατος. Σύνοψη Προηγούµενου Κανονικές Γλώσσες () ιαδικαστικά του Μαθήµατος. Ορέστης Τελέλης telelis@unipi.gr Τµήµα Ψηφιακών Συστηµάτων, Πανεπιστήµιο Πειραιώς Εισαγωγή: Υπολογισιµότητα και Πολυπλοκότητα. Βασικές

Διαβάστε περισσότερα

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΕΡΓΑΣΤΗΡΙΟ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ ΜΕΡΟΣ ΠΕΜΠΤΟ Triggers, Stored procedures Γιώργος Μαρκοµανώλης Περιεχόµενα Triggers-Ενηµέρωση δεδοµένων άλλων πινάκων... 1 Ασφάλεια...

Διαβάστε περισσότερα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα ΝΗΜΑΤΑ ΣΤΗ JAVA (1) Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα πρόγραµµα. Αιτία Η δυνατότητα αποµόνωσης (ή αυτονόµησης) κάποιων

Διαβάστε περισσότερα

Σχήµα 3.1: Εισαγωγή shift register σε βρόγχο for-loop.

Σχήµα 3.1: Εισαγωγή shift register σε βρόγχο for-loop. Η δοµή «Shift register» 1. Η δοµή «Shift register» εισάγεται στο βρόγχο for-loop αλλά και σε άλλους βρόγχους που θα δούµε στη συνέχεια, όπως ο βρόγχος «While loop». Ο τρόπος εισαγωγής και λειτουργίας της

Διαβάστε περισσότερα

Σχήµα 6.1: Εισαγωγή της εντολής Read From Spreadsheet File στο Block Diagram.

Σχήµα 6.1: Εισαγωγή της εντολής Read From Spreadsheet File στο Block Diagram. Εισαγωγή αρχείων δεδοµένων 1. Η εισαγωγή αρχείων δεδοµένων στο LaVIEW γίνεται στο Block Diagram µε την εντολή Read From Spreadsheet File. 2. Εισάγουµε την εντολή Read From Spreadsheet File στο Block Diagram

Διαβάστε περισσότερα

Ορισµός. Εστω συναρτήσεις: f : N R και g : N R. η f(n) είναι fi( g(n) ) αν υπάρχουν σταθερές C 1, C 2 και n 0, τέτοιες ώστε:

Ορισµός. Εστω συναρτήσεις: f : N R και g : N R. η f(n) είναι fi( g(n) ) αν υπάρχουν σταθερές C 1, C 2 και n 0, τέτοιες ώστε: Συµβολισµός Ω( ) Τάξη των Συναρτήσεων () Εκτίµηση Πολυπλοκότητας Αλγορίθµων Ορέστης Τελέλης telelis@unipi.gr Ορισµός. Εστω συναρτήσεις: f : N R και g : N R η f(n) είναι Ω( g(n) ) αν υπάρχουν σταθερές C

Διαβάστε περισσότερα

Πληροφορική 2. Γλώσσες Προγραμματισμού

Πληροφορική 2. Γλώσσες Προγραμματισμού Πληροφορική 2 Γλώσσες Προγραμματισμού 1 2 Γλώσσες προγραμματσιμού Επιτρέπουν την κωδικοποίηση των αλγορίθμων Η εκτέλεση ενός προγράμματος θα πρέπει να δίνει τα ίδια αποτελέσματα με την νοητική εκτέλεση

Διαβάστε περισσότερα

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη 9.1 Γενικά Οι εφαρµογές που δηµιουργούνται από ένα προγραµµατιστή µπορούν ανά πασά στιγµή να καταρρεύσουν από κάποιο λάθος κατά την λειτουργία τους. Αυτές οι καταστάσεις συµβαίνουν από αµέλεια του προγραµµατιστή

Διαβάστε περισσότερα

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

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

Διαβάστε περισσότερα

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 12 : ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ 1. Συναρτήσεις ΣΥΝΑΡΤΗΣΕΙΣ 1.1. Ο λόγος ύπαρξης των συναρτήσεων Όπως είδαµε µία διαδικασία µπορεί να υπολογίζει περισσότερα από ένα αποτελέσµατα τα

Διαβάστε περισσότερα

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής ΗΥ-150 Εντολές Ελέγχου Ροής Σειριακή εκτέλεση εντολών Όλα τα προγράµµατα «γράφονται» χρησιµοποιώντας 3 είδη εντολών: Σειριακές εντολές (sequential built in C) Εντολές απόφασης (if, if/else, switch) Περιλαµβάνει

Διαβάστε περισσότερα

KΕΦΑΛΑΙΟ 1 ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ. { 1,2,3,..., n,...

KΕΦΑΛΑΙΟ 1 ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ. { 1,2,3,..., n,... KΕΦΑΛΑΙΟ ΧΡΗΣΙΜΕΣ ΜΑΘΗΜΑΤΙΚΕΣ ΕΝΝΟΙΕΣ Βασικές έννοιες διαιρετότητας Θα συµβολίζουµε µε, τα σύνολα των φυσικών αριθµών και των ακεραίων αντιστοίχως: {,,3,,, } { 0,,,,, } = = ± ± ± Ορισµός Ένας φυσικός αριθµός

Διαβάστε περισσότερα

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT

Αντικειμενοστραφείς Γλώσσες Προγραμματισμού C++ / ROOT = Αντικειμενοστραφείς Γλώσσες Προγραμματισμού Ιωάννης Παπαδόπουλος Τμήμα Φυσικής, Πανεπιστήμιο Ιωαννίνων Δεκέμβριος 2018 1/18 = 2/18 = 1 αντικειμένων Μέθοδοι αντιγράφου (copy constructor) Κατασκευή μέσω

Διαβάστε περισσότερα

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal Δοµή προγράµµατος 1. Δοµή προγράµµατος program όνοµα_προγράµµατος(αρχείο_1, αρχείο_2,...αρχείο_ν); ΕΠΙΚΕΦΑΛΙΔΑ ΒΙΒΛΙΟΘΗΚΕΣ uses όνοµα_βιβλιοθήκης,όνοµα_βιβλιοθήκης;

Διαβάστε περισσότερα

ΑΛΓΕΒΡΙΚΕΣ ΟΜΕΣ Ι. Ασκησεις - Φυλλαδιο 2

ΑΛΓΕΒΡΙΚΕΣ ΟΜΕΣ Ι. Ασκησεις - Φυλλαδιο 2 ΑΛΓΕΒΡΙΚΕΣ ΟΜΕΣ Ι Τµηµα Β Ασκησεις - Φυλλαδιο 2 ιδασκων: Α. Μπεληγιάννης Ιστοσελιδα Μαθηµατος : http://users.uoi.gr/abeligia/algebraicstructuresi/asi2016/asi2016.html Πέµπτη 3 Μαρτίου 2016 Αν (G, ) είναι

Διαβάστε περισσότερα

Τύποι δεδομένων, τελεστές, μεταβλητές

Τύποι δεδομένων, τελεστές, μεταβλητές Τύποι δεδομένων, τελεστές, μεταβλητές Βασικά στοιχεία της γλώσσας Η Java χαρακτηρίζεται από ένα αρκετά καλά οργανωμένο σύνολο εντολών κι ένα μέρος της επιτυχίας της οφείλεται στα διάφορα APIs (βιβλιοθήκες)

Διαβάστε περισσότερα

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

ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 2016-2017 ΕΡΓΑΣΙΑ 1 (JAVA) Παράδοση 26/4/2017 Στα πλαίσια της εργασίας θα υλοποιηθεί ένα απλοϊκό πρόγραμμα κρατήσεων Ξενοδοχείων. Για απλοποίηση θα περιοριστούμε

Διαβάστε περισσότερα

Κεφάλαιο 10 ο Υποπρογράµµατα

Κεφάλαιο 10 ο Υποπρογράµµατα Κεφάλαιο 10 ο Υποπρογράµµατα Ανάπτυξη Εφαρµογών σε Προγραµµατιστικό Περιβάλλον Η αντιµετώπιση των σύνθετων προβληµάτων και η ανάπτυξη των αντίστοιχων προγραµµάτων µπορεί να γίνει µε την ιεραρχική σχεδίαση,

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό «C»

Εισαγωγή στον Προγραµµατισµό «C» Εισαγωγή Στον Προγραµµατισµό «C» Δείκτες Πανεπιστήµιο Πελοποννήσου Τµήµα Επιστήµης & Τεχνολογίας Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Μνήµη Υπολογιστή Η µνήµη RAM (Random Access Memory) ενός υπολογιστή

Διαβάστε περισσότερα

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ

ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΠΑΝΕΛΛΑΔΙΚΕΣ ΕΞΕΤΑΣΕΙΣ ΗΜΕΡΗΣΙΩΝ ΕΠΑΛ ΤΡΙΤΗ 11 ΙΟΥΝΙΟΥ 2019 ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ ΘΕΜΑ Α Α1. Να χαρακτηρίσετε τις προτάσεις που ακολουθούν, γράφοντας στο τετράδιό σας, δίπλα στο

Διαβάστε περισσότερα

Προγραμματισμός ΙI (Θ)

Προγραμματισμός ΙI (Θ) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κεντρικής Μακεδονίας - Σέρρες Τμήμα Μηχανικών Πληροφορικής Προγραμματισμός ΙI (Θ) Δρ. Δημήτρης Βαρσάμης Επίκουρος Καθηγητής Μάρτιος 2017 Δρ. Δημήτρης Βαρσάμης Μάρτιος 2017

Διαβάστε περισσότερα

είκτες και Πίνακες (2)

είκτες και Πίνακες (2) είκτες και Πίνακες (2) Στην ενότητα αυτή θα µελετηθούν τα εξής θέµατα: Πολυδιάστατοι πίνακες Πέρασµα παραµέτρων σε προγράµµατα C ΕΠΛ 132 Αρχές Προγραµµατισµού ΙΙ 1-1 Πίνακες εικτών Πίνακας δεικτών είναι

Διαβάστε περισσότερα

Αλγόριθµοι και Πολυπλοκότητα

Αλγόριθµοι και Πολυπλοκότητα Αλγόριθµοι και Πολυπλοκότητα Ν. Μ. Μισυρλής Τµήµα Πληροφορικής και Τηλεπικοινωνιών, Πανεπιστήµιο Αθηνών Καθηγητής: Ν. Μ. Μισυρλής () Αλγόριθµοι και Πολυπλοκότητα 15 Ιουνίου 2009 1 / 26 Εισαγωγή Η ϑεωρία

Διαβάστε περισσότερα

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

Προγραμματισμός Υπολογιστών με C++ Προγραμματισμός Υπολογιστών με C++ ( 2012-13 ) 17η διάλεξη Ίων Ανδρουτσόπουλος http://www.aueb.gr/users/ion/ 1 Τι θα ακούσετε σήμερα Προσθήκη ελέγχου ορίων σε πίνακες χρησιμοποιώντας σχεδιότυπα τάξεων

Διαβάστε περισσότερα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 Αριθμητική στο δυαδικό σύστημα (γενικά) Συμπληρωματικά για δυαδικό σύστημα Η πρόσθεση στηρίζεται στους κανόνες: 0 + 0 = 0, 0 + 1 = 1, 1

Διαβάστε περισσότερα

Μάθηµα Θεωρίας Αριθµών Ε.Μ.Ε

Μάθηµα Θεωρίας Αριθµών Ε.Μ.Ε Μάθηµα Θεωρίας Αριθµών Ε.Μ.Ε 1. Να αποδειχθεί ότι κάθε ϑετικός ακέραιος αριθµός n 6, µπορεί να γραφεί στη µορφή όπου οι a, b, c είναι ϑετικοί ακέραιοι. n = a + b c,. Να αποδειχθεί ότι για κάθε ακέραιο

Διαβάστε περισσότερα

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών.

Sheet2. Σωστή, και µπράβο που µεριµνήσατε για λίστες διαφορετικών µεγεθών. Α.Μ. ΒΑΘΜΟΣ ΣΧΟΛΙΑ Δεν κάνει compile και το λάθος είναι σηµαντικό: Το head1 είναι δείκτης σε struct, εποµένως η προσπέλαση πεδίου γίνεται 321 FAIL µε head1->next και όχι head1.next. Επιπλέον, έχετε λάθος

Διαβάστε περισσότερα

Β Ομάδα Ασκήσεων "Λογικού Προγραμματισμού" Ακαδημαϊκού Έτους

Β Ομάδα Ασκήσεων Λογικού Προγραμματισμού Ακαδημαϊκού Έτους Page 1 of 15 ΕΘΝΙΚΟ ΚΑΙ ΚΑΠΟΔΙΣΤΡΙΑΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΤΗΛΕΠΙΚΟΙΝΩΝΙΩΝ Β Ομάδα Ασκήσεων "Λογικού Προγραμματισμού" Ακαδημαϊκού Έτους 2016-17 Οι ασκήσεις της ομάδας αυτής πρέπει

Διαβάστε περισσότερα

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες:

Η στοίβα (stack) H στοίβα είναι ένας αποθηκευτικός χώρος οργανωµένος κατά τέτοιο τρόπο ώστε να υποστηρίζει δύο βασικές λειτουργίες: Άσκηση 5Α_5 26/3/2003 11.5. Άσκηση 5A - [αναγνώριση αντικειµένων-διάγραµµα κλάσεων] [Σε αντικατάσταση της άσκησης 5 του κεφαλαίου 11] 11.5.1. Περιγραφή Η άσκηση αυτή είναι η πρώτη από µία σειρά ασκήσεων

Διαβάστε περισσότερα

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

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι: ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Μια δομή δεδομένων στην πληροφορική, συχνά αναπαριστά οντότητες του φυσικού κόσμου στον υπολογιστή. Για την αναπαράσταση αυτή, δημιουργούμε πρώτα ένα αφηρημένο μοντέλο στο οποίο προσδιορίζονται

Διαβάστε περισσότερα

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C# Εισαγωγή σε αντικειμενοστραφή concepts Και λίγη C# Κλάσεις Κλάση: τύπος δεδομένων που αποτελεί συλλογή πεδίων, ορισμών συναρτήσεων/μεθόδων και ορισμών άλλων τύπων δεδομένων. Αντίστοιχο σκεπτικό με struct

Διαβάστε περισσότερα

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

ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος Παναγιώτα Φατούρου. Προγραµµατιστική Εργασία 3 ο Μέρος Πανεπιστήµιο Κρήτης, Τµήµα Επιστήµης Υπολογιστών 6 εκεµβρίου 2008 ΗΥ240: οµές εδοµένων Χειµερινό Εξάµηνο Ακαδηµαϊκό Έτος 2008-09 Παναγιώτα Φατούρου Προγραµµατιστική Εργασία 3 ο Μέρος Ηµεροµηνία Παράδοσης:

Διαβάστε περισσότερα

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Pascal, απλοί τύποι, τελεστές και εκφράσεις Pascal, απλοί τύποι, τελεστές και εκφράσεις 15 Νοεμβρίου 2011 1 Γενικά Στην standard Pascal ορίζονται τέσσερις βασικοί τύποι μεταβλητών: integer: Παριστάνει ακέραιους αριθμούς από το -32768 μέχρι και το

Διαβάστε περισσότερα

Εισαγωγή στην Αριθμητική Ανάλυση

Εισαγωγή στην Αριθμητική Ανάλυση Εισαγωγή στην Αριθμητική Ανάλυση Εισαγωγή στη MATLAB ΔΙΔΑΣΚΩΝ: ΓΕΩΡΓΙΟΣ ΑΚΡΙΒΗΣ ΒΟΗΘΟΙ: ΔΗΜΗΤΡΙΑΔΗΣ ΣΩΚΡΑΤΗΣ, ΣΚΟΡΔΑ ΕΛΕΝΗ E-MAIL: SDIMITRIADIS@CS.UOI.GR, ESKORDA@CS.UOI.GR Τι είναι Matlab Είναι ένα περιβάλλον

Διαβάστε περισσότερα

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004) 1 ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004) ιάλεξη 1 1.1 ΕΙΣΑΓΩΓΗ ΣΤΗ FORTRAN 77 Ένα πρόγραµµα σε οποιαδήποτε γλώσσα προγραµµατισµού δεν τίποτα άλλο από µια σειρά εντολών που πρέπει

Διαβάστε περισσότερα

επιµέλεια Θοδωρής Πιερράτος

επιµέλεια Θοδωρής Πιερράτος Ερωτήσεις Σωστό Λάθος 1. Οι διαστάσεις ενός πίνακα δεν µπορούν να µεταβάλλονται κατά την εκτέλση ενός αλγόριθµου. 2. Ο πίνακας είναι στατική δοµή δεδοµένων. 3. Ένας πίνακας δυο στηλών µπορεί να περιέχει

Διαβάστε περισσότερα

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

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128] ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Α Περιόδου 2017 (27/1/2017) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

Διαβάστε περισσότερα

cov(x, Y ) = E[(X E[X]) (Y E[Y ])] cov(x, Y ) = E[X Y ] E[X] E[Y ]

cov(x, Y ) = E[(X E[X]) (Y E[Y ])] cov(x, Y ) = E[X Y ] E[X] E[Y ] Πανεπιστήµιο Κρήτης - Τµήµα Επιστήµης Υπολογιστών ΗΥ-317: Εφαρµοσµένες Στοχαστικές ιαδικασίες-εαρινό Εξάµηνο 2016 ιδάσκων : Π. Τσακαλίδης Συνδιασπορά - Συσχέτιση Τυχαίων Μεταβλητών Επιµέλεια : Κωνσταντίνα

Διαβάστε περισσότερα

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++ Εντολές εισόδου - εξόδου Εισαγωγή στη C++ Το πρώτο πρόγραμμα //my first program #include using namespace std; int main(){ cout

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα. ΚΕΦΑΛΑΙΟ 7 ο 1. Επιλογή της κατάλληλης γλώσσας προγραµµατισµού Εκατοντάδες γλώσσες προγραµµατισµού χρησιµοποιούνται όπως αναφέρθηκε σήµερα για την επίλυση των προβληµάτων µε τον υπολογιστή, τη δηµιουργία

Διαβάστε περισσότερα

Προβλήµατα ικανοποίησης περιορισµών

Προβλήµατα ικανοποίησης περιορισµών Προβλήµατα Ικανοποίησης Περιορισµών Προβλήµατα ικανοποίησης περιορισµών Λογικός προγραµµατισµός µε περιορισµούς Προβλήµατα Ικανοποίησης Περιορισµών Ένα πρόβληµα ικανοποίησης περιορισµών (constraint satisfaction

Διαβάστε περισσότερα

- program p_name(output); - uses crt;

- program p_name(output); - uses crt; ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 9 : Βασικές Εντολές 1. Εισαγωγή Εντολές Εξόδου Κάθε Η/Υ έχει µία προκαθορισµένη συσκευή ή αρχείο (η συσκευή αναπαρίσταται ως αρχείο) όπου γίνεται η έξοδος των αποτελεσµάτων

Διαβάστε περισσότερα

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά

Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά Διακριτά Μαθηματικά ΙΙ Χρήστος Νομικός Τμήμα Μηχανικών Η/Υ και Πληροφορικής Πανεπιστήμιο Ιωαννίνων 2018 Χρήστος Νομικός ( Τμήμα Μηχανικών Η/Υ Διακριτά και Πληροφορικής Μαθηματικά Πανεπιστήμιο ΙΙ Ιωαννίνων

Διαβάστε περισσότερα

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

ΣΕΤ ΑΣΚΗΣΕΩΝ 4. Προθεσµία: 8/1/12, 22:00 ΣΕΤ ΑΣΚΗΣΕΩΝ 4 ΕΡΓΑΣΤΗΡΙΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ I, ΑΚΑΔΗΜΑΪΚΟ ΕΤΟΣ 2011-2012 Προθεσµία: 8/1/12, 22:00 Περιεχόµενα Διαβάστε πριν ξεκινήσετε Εκφώνηση άσκησης Οδηγίες αποστολής άσκησης Πριν ξεκινήσετε (ΔΙΑΒΑΣΤΕ

Διαβάστε περισσότερα

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6 Ανασκόπηση Μια εφαρµογή Java είναι ένα σύνολο από συνεργαζόµενες κλάσεις Εβδοµάδα 2: Αντικείµενα, Κλάσεις και Μέθοδοι Εισαγωγή στον Προγραµµατισµό,,, Slide 1 Εισαγωγή στον Προγραµµατισµό,,, Slide 2 Ανασκόπηση:

Διαβάστε περισσότερα

ΗΥ-150. Προγραμματισμός

ΗΥ-150. Προγραμματισμός ΗΥ-150 Εντολές Ελέγχου Ροής Σειριακή εκτέλεση εντολών Όλα τα προγράμματα «γράφονται» χρησιμοποιώντας 3 είδη εντολών: Σειριακές εντολές (sequential built in C) Εντολές απόφασης (if, if/else, switch) Περιλαμβάνει

Διαβάστε περισσότερα

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα προηγούμενα ακαδημαϊκά έτη: ΚΑΛΗ ΕΠΙΤΥΧΙΑ! Οικονομικό Πανεπιστήμιο Αθηνών, Τμήμα Πληροφορικής Μάθημα: Προγραμματισμός Υπολογιστών με C++ Εξεταστική περίοδος: Φεβρουαρίου 2010. Διδάσκων: Α. Δημάκης Γράψτε όλες τις απαντήσεις σας πάνω σε αυτό το

Διαβάστε περισσότερα

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

scanf() scanf() stdin scanf() printf() int float double %lf float Εισαγωγή Στον Προγραµµατισµό «C» Είσοδος Δεδοµένων Πανεπιστήµιο Πελοποννήσου Τµήµα Πληροφορικής & Τηλεπικοινωνιών Νικόλαος Δ. Τσελίκας Νικόλαος Προγραµµατισµός Δ. Τσελίκας Ι Η συνάρτηση scanf() Η συνάρτηση

Διαβάστε περισσότερα

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5 Περιεχόµενα 1 Εισαγωγή στις οµές εδοµένων 3 2 Στοίβα (Stack) 5 i ΠΕΡΙΕΧΟΜΕΝΑ ΠΕΡΙΕΧΟΜΕΝΑ ii Πληροφορίες Εργαστηρίου Σκοπός του εργαστηρίου Το εργαστήριο οµές εδοµένων αποσκοπεί στην εφαρµογή των τεχνολογιών

Διαβάστε περισσότερα

Επίλυση προβληµάτων. Περιγραφή προβληµάτων Αλγόριθµοι αναζήτησης Αλγόριθµοι τυφλής αναζήτησης Αλγόριθµοι ευρετικής αναζήτησης

Επίλυση προβληµάτων. Περιγραφή προβληµάτων Αλγόριθµοι αναζήτησης Αλγόριθµοι τυφλής αναζήτησης Αλγόριθµοι ευρετικής αναζήτησης Επίλυση προβληµάτων Περιγραφή προβληµάτων Αλγόριθµοι αναζήτησης Αλγόριθµοι τυφλής αναζήτησης Αλγόριθµοι ευρετικής αναζήτησης! Παιχνίδια δύο αντιπάλων Προβλήµατα ικανοποίησης περιορισµών Γενικά " Ντετερµινιστικά

Διαβάστε περισσότερα

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ (Οι ερωτήσεις µε κίτρινη υπογράµµιση είναι εκτός ύλης για φέτος) ΕΙΣΑΓΩΓΗ Q1. Οι Πρωταρχικοί τύποι (primitive types) στη Java 1. Είναι όλοι οι ακέραιοι και όλοι οι πραγµατικοί

Διαβάστε περισσότερα

Ειδικά Θέματα Προγραμματισμού

Ειδικά Θέματα Προγραμματισμού Ειδικά Θέματα Προγραμματισμού Ενότητα 3: Τύποι Δεδομένων - Τελεστές Μιχάλας Άγγελος Τμήμα Μηχανικών Πληροφορικής ΤΕ Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons.

Διαβάστε περισσότερα

ΚΕΦΑΛΑΙΟ 2 Βασικές έννοιες αλγορίθµων

ΚΕΦΑΛΑΙΟ 2 Βασικές έννοιες αλγορίθµων ΚΕΦΑΛΑΙΟ 2 Βασικές έννοιες αλγορίθµων Αλγόριθµος : Είναι ένα σύνολο βηµάτων, αυστηρά καθορισµένων κι εκτελέσιµων σε πεπερασµένο χρόνο, που οδηγούν στην επίλυση ενός προβλήµατος. Χαρακτηριστικά ενός σωστού

Διαβάστε περισσότερα

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Έλεγχος Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Σχεσιακοί Τελεστές και Ισότητας Ένα πρόγραμμα εκτός από αριθμητικές πράξεις

Διαβάστε περισσότερα

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής.

Η δήλωση πού δηµιουργεί αποθήκευση τών δεδοµένων ονοµαζεται ορισµός τής µεταβλητής. Από το βιβλίο C: Βήµα-Πρός-Βήµα, Κεφάλαιο 3ο Συγγραφείς: Οµάδα Waite, Mitchell Waite και Stephen Prata Εκδότης: Μ. Γκιούρδας Ανατύπωση σε ηλεκτρονική µορφή: Αλέξανδρος Στεφανίδης 3.4 Τύποι εδοµένων τής

Διαβάστε περισσότερα

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής Περίληψη Δοµικά στοιχεία Πίνακες Το κόσκινο του Ερατοσθένη Αντιγραφή πινάκων

Διαβάστε περισσότερα

Γλώσσες που περιγράφονται από Κανονικές Εκφράσεις

Γλώσσες που περιγράφονται από Κανονικές Εκφράσεις Κανονικές Εκφράσεις Στοιχειώδεις Κανονικές Εκφράσεις Κανονικές Εκφράσεις Γλώσσες που περιγράφονται από Κανονικές Εκφράσεις ηµιουργία Κανονικών Εκφράσεων Παραδείγµατα Κανονικών Εκφράσεων Τις Κανονικές εκφράσεις

Διαβάστε περισσότερα

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ! Οικονομικό Πανεπιστήμιο Αθηνών, Τμήμα Πληροφορικής Μάθημα: Προγραμματισμός Υπολογιστών με C++ Εξεταστική περίοδος: Σεπτεμβρίου 2011. Διδάσκων: Α. Δημάκης Γράψτε όλες τις απαντήσεις σας πάνω σε αυτό το

Διαβάστε περισσότερα