Πολυμορφισμός και Υπερφόρτωση

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

Download "Πολυμορφισμός και Υπερφόρτωση"

Transcript

1 Πολυμορφισμός και Υπερφόρτωση Γιάννης Κασσιός Σε αυτές τις σημειώσεις, θα ασχοληθούμε με πιο προχωρημένα θέματα του συστήματος τύπων της Haskell και πιο συγκεκριμένα με τις έννοιες του πολυμορφισμού (polymorphism) και της υπερφόρτωσης (overloading). Αυτές οι έννοιες γενικεύουν το σύστημα τύπων της Haskell κάνοντάς το πολύ πιο εύχρηστο. Στην Ενότ. 1 εξετάζουμε την ιδέα του πολυμορφισμού, δηλ. τη χρήση ενός ορισμού για πολλούς διαφορετικούς τύπους. Εξηγούμε γιατί ο πολυμορφισμός είναι απαραίτητος και εισάγουμε τις μεταβλητές τύπων και τους πολυμορφικούς τύπους της Haskell. Επίσης, δίνουμε τους πολυμορφικούς τύπους τιμών της Haskell που έχουμε ήδη χρησιμοποιήσει και που έχουν να κάνουν κατά κύριο λόγο με λίστες. Τέλος, εισάγουμε την έννοια της γενικότητας τύπων, καθώς και της εξαγωγής τύπων από το διερμηνέα της Haskell. Στην Ενότ. 2 συζητάμε για την υπερφόρτωση, τη χρήση ενός κοινού ονόματος σε διαφορετικούς τύπους και με διαφορετικό ορισμό. Εξηγούμε γιατί αυτό είναι σημαντικό και γιατί δεν καλύπτεται πλήρως από τον πολυμορφισμό. Εισάγουμε τις κλάσεις και εξηγούμε τους μηχανισμούς δήλωσης, χρήσης, προκαθορισμένων τιμών και κληρονομικότητας που υποστηρίζουν. Τέλος, αφού παρουσιάσουμε μερικές κλάσεις που υποστηρίζονται από τη Haskell, συγκρίνουμε το μηχανισμό υπερφόρτωσης με το ε- πικρατέστερο μοντέλο αντικειμενοστρεφούς προγραμματισμού που συμπεριλαμβάνει γλώσσες όπως η C++ και η Java. 1 Πολυμορφισμός 1.1 Τι είναι Πολυμορφισμός Μία τιμή είναι πολυμορφική (polymorphic) όταν ανήκει σε πολλούς τύπους. Έχουμε ήδη δει πολυμορφικές τιμές. Η κενή λίστα [] είναι μία τιμή που ανήκει σε όλους τους τύπους λιστών. Μπορούμε πχ. να τη χρησιμοποιήσουμε είτε σαν κενή συμβολοσειρά Hi ++ είτε σαν κενή λίστα ακεραίων [1,2,3] ++ [] κ.ο.κ. Οι συναρτήσεις για λίστες της Haskell εφαρμόζουν σε κάθε τύπο λίστας και ε- πομένως είναι επίσης πολυμορφικές. Για παράδειγμα η length εφαρμόζει σε κάθε τύπο 1

2 λίστας και επιστρέφει έναν ακέραιο, ανήκει σε κάθε έναν από τους τύπους [Int]->Int, String->Int και [(Char,[Int])]->Int κλπ. Μετά από την ενασχόλησή μας με τις λίστες, ο λόγος για τον οποίο έχουμε πολυμορφισμό θα πρέπει να είναι λίγο-πολύ προφανής. Χωρίς πολυμορφισμό, για να έχουμε τη λειτουργικότητα τιμών όπως η [] και η length, θα έπρεπε να ορίσουμε άπειρο α- ριθμό αντικειμένων. Κάθε ένα από αυτά τα αντικείμενα θα έπρεπε να έχει διαφορετικό όνομα και τύπο, αλλά οι ορισμοί τους θα ήταν εντελώς ίδιοι: lengthbool :: [Bool]->Int lengthbool emptybool = 0 lengthbool (_:xs) = 1+lengthBool xs lengthstring :: [String]->Int lengthstring emptystring = 0 lengthstring (_:xs) = 1+lengthString xs lengthfunlisttuplecharlistintint :: [(Char,[Int])]->Int lengthfunlisttuplecharlistintint emptyfunlisttuplecharlistintint = 0 lengthfunlisttuplecharlistintint (_:xs) = 1+lengthFunListTupleCharListIntInt xs... Η δυνατότητα πολυμορφισμού της Haskell επιτρέπει την ύπαρξη μίας ενιαίας λίστας [] και μίας ενιαίας τιμής length με ένα μόνο ορισμό για όλους τους τύπους: length [] = 0 length (_:xs) = 1+length xs 1.2 Μεταβλητές Τύπων Το γεγονός ότι μία τιμή είναι πολυμορφική δε σημαίνει ότι ανήκει σε όλους τους υ- πάρχοντες τύπους. Για παράδειγμα, η length δε μπορεί να είναι ακέραιος αριθμός. Η length είναι πάντα μία συνάρτηση, που εφαρμόζεται πάντα σε κάποια λίστα και επιστρέφει πάντα έναν ακέραιο αριθμό. Δηλαδή, όλοι οι τύποι της length είναι της μορφής [a]->int, όπου a είναι μια μεταβλητή τύπων (type variable), δηλαδή μια μεταβλητή που αντικαθίσταται από οποιονδήποτε τύπο. Ομοίως, η [] έχει τύπους της μορφής [a], καθώς είναι πάντα μία λίστα. Στη Haskell, ο τρόπος απόδοσης τύπου σε πολυμορφικές τιμές είναι η χρήση μεταβλητών τύπου. Οι μεταβλητές τύπου είναι ονόματα που ξεκινάνε με πεζό γράμμα για να ξεχωρίζουν από τους σταθερούς τύπους όπως ο Int. Έτσι οι ορισμοί τύπων της length και της [] είναι: 2

3 [] :: [a] length :: [a]->int Μία έκφραση με μεταβλητές τύπου ονομάζεται πολυμορφικός τύπος. Οι μεταβλητές τύπων που χρησιμοποιούμε σε πολυμορφικούς τύπους είναι κατά σύμβαση οι a,b,c,... Μία μεταβλητή τύπων a αποτελεί από μόνη της πολυμορφικό τύπο. Μάλιστα, αποτελεί ένα πολύ γενικό πολυμορφικό τύπο, αφού μπορεί να αντικατασταθεί από οποιονδήποτε άλλο τύπο. Ο πολυμορφικός τύπος a είναι ο τύπος της undef που είδαμε στις προηγούμενες σήμειώσεις. Ένας πολυμορφικός τύπος, μπορεί να περιέχει μία μεταβλητή τύπου που να εμφανίζεται περισσότερες από μία φορές. Όπως θα ήταν αναμενόμενο, αυτό σημαίνει ότι η μεταβλητή αυτή θα πρέπει να αντικατασταθεί από τον ίδιο τύπο σε κάθε μία από τις εμφανίσεις της. Για παράδειγμα, ο τύπος της (++) είναι: (++) :: [a]->[a]->[a] Η μεταβλητή a θα πρέπει να αντικατασταθεί με τον ίδιο τύπο σε κάθε μία από της τρεις εμφανίσεις της. Έτσι, ο τύπος αυτός περιγράφει τύπους όπως [Int]->[Int]->[Int] αλλά όχι [Int]->[Char]->[Bool]. Αυτό σημαίνει ότι η (++) εφαρμόζει μεν σε λίστες κάθε τύπου, αλλά θα πρέπει τα δύο της ορίσματα να είναι του ιδίου τύπου. Αντίθετα, σε περίπτωση που έχουμε διαφορετικές μεταβλητές τύπων, αυτές μπορεί να αντικατασταθούν ανεξάρτητα. Για παράδειγμα, η συνάρτηση zip εφαρμόζεται σε δύο λίστες, όχι απαραίτητα του ιδίου τύπου. Επομένως οι τύποι των παραμέτρων της θα πρέπει να χρησιμοποιούν δύο διαφορετικές μεταβλητές τύπων: zip :: [a]->[b]->... Το αποτέλεσμα της zip είναι μία λίστα ζευγών, των οποίων το πρώτο στοιχείο προέρχεται από την πρώτη παράμετρο και το δεύτερο στοιχείο από τη δεύτερη παράμετρο. Επομένως, ο τύπος του αποτελέσματος θα πρέπει να είναι [(a,b)]: zip :: [a]->[b]->[(a,b)] Καθώς χρησιμοποιούνται δύο διαφορετικές μεταβλητές τύπου, η zip μπορεί να πάρει τον τύπο [Int] -> [Char] -> [(Int,Char)]. Φυσικά, κανείς δε μας εμποδίζει να αντικαταστήσουμε τις a και b με τον ίδιο τύπο, π.χ. η zip έχει και τον τύπο [Int] -> [Int] -> [(Int,Int)]. Για να βρούμε έναν κατάλληλο πολυμορφικό τύπο για μία τιμή που ορίζουμε, θα πρέπει να σκεφτούμε τη μορφή της τιμής αυτής, καθώς και το ποιοι περιορισμοί υ- πάρχουν σχετικά με τους τύπους των επιμέρους στοιχείων που αυτή περιέχει. Για παράδειγμα, έστω η συνάρτηση dovetail3 των προηγούμενων σημειώσεων: dovetail3 = dovetail3aux 0 where dovetail3aux n l1 l2 l3 = 3

4 [ ((l1!!i1), (l2!!i2), (l3!!i3)) i1<-[0..n], i2<-[0..n], i3<-[0..n], i1+i2+i3 == n ] ++ dovetail3aux (n+1) l1 l2 l3 Παρατηρούμε κατ' αρχήν ότι η dovetail3 παίρνει τιμές l1,l2,l3, οι οποίες πρέπει να είναι λίστες (εφαρμόζονται στον τελεστή (!!) που είναι τύπου [a]->int->a). Τα περιεγχόμενα αυτών των λιστών δε συσχετίζονται μεταξύ τους με τρόπο που να δημιουργεί περιορισμό στους τύπους τους. Πράγματι, μπορούμε να έχουμε τρεις λίστες τριών ανεξάρτητων μεταξύ τους τύπων. Όσον αφορά το αποτέλεσμα, από την έκφραση μετασχηματισμού παρατηρούμε ότι έχουμε μία λίστα με τριάδες στοιχείων, ένα από την πρώτη λίστα, ένα από τη δεύτερη και ένα από την τρίτη. Επομένως, αν οι τύποι των τριών παραμέτρων της dovetail3 είναι [a],[b],[c], τότε ο τύπος του αποτελέσματος είναι [(a,b,c)]. Τελικά, ο πολυμορφικός τύπος της dovetail3 είναι: a->b->c->[(a,b,c)] 1.3 Πολυμορφικοί Τύποι Ορισμένων Τιμών της Haskell Ας δούμε τώρα ένα κατάλογο πολυμορφικών τύπων τιμών της Haskell που έχουμε ήδη χρησιμοποιήσει. Οι περισσότερες περιπτώσεις είναι συναρτήσεις που έχουν να κάνουν με λίστες: id :: a->a fst :: (a,b)->a snd :: (a,b)->b [] :: [a] (:) :: a->[a]->[a] (++) :: [a]->[a]->[a] concat :: [[a]]->[a] length :: [a]->int head :: [a]->a tail :: [a]->[a] last :: [a]->a init :: [a]->[a] replicate :: Int->a->[a] 4

5 take :: Int->[a]->[a] drop :: Int->[a]->[a] splitat :: Int->[a]->([a],[a]) reverse :: [a]->[a] zip :: [a]->[b]->[(a,b)] unzip :: [(a,b)]->([a],[b]) map :: (a->b)->[a]->[b] filter :: (a->bool)->[a]->[a] zipwith :: (a -> b -> c) -> [a] -> [b] -> [c] foldl :: (a -> b -> a) -> a -> [b] -> a foldr :: (a -> b -> b) -> b -> [a] -> b takewhile :: (a -> Bool) -> [a] -> [a] dropwhile :: (a -> Bool) -> [a] -> [a] Οι παραπάνω τύποι δεν προκαλούν έκπληξη, εκτός από τις συναρτήσεις foldl και foldr στις οποίες οι τύποι είναι πιο γενικοί από αυτούς που ίσως θα περιμέναμε με δεδομένο το πώς χρησιμοποιούσαμε αυτές τις συναρτήσεις μέχρι τώρα. Συγκεκριμένα, εμείς χρησιμοποιούσαμε τις συναρτήσεις στην ειδική τους περίπτωση που οι τύποι a και b είναι ίσοι π.χ. η sum :: [Int]->Int sum = foldl (+) 1 χρησιμοποιεί τη συνάρτηση (+) :: Int->Int. Στη γενική περίπτωση, αυτό δεν είναι απαραίτητο. Η foldl μπορεί να συσσωρεύει αποτέλεσμα τύπου a πάνω σε λίστα τύπου [b], χρησιμοποιώντας μία συνάρτηση a->b->a (παίρνει το ήδη συσσωρευμένο αποτέλεσμα και το εκάστοτε στοιχείο της λίστας και επιστρέφει το νέο συσσωρευμένο αποτέλεσμα). Για παράδειγμα, ένας τρόπος εύρεσης ενός ακεραίου σε μία λίστα χωρίς τη χρήση της map είναι η αντικατάσταση του b με Int και του a με Bool. Η συνάρτηση συσσώρευσης είναι: \found-> \current-> found current == x 5

6 (όπου x είναι το στοιχείο που ψάχνουμε). Η συνάρτηση αυτή ελέγχει για κάθε στοιχείο της λίστας αν το x έχει ήδη βρεθεί (η τιμή της found έχει ήδη γίνει True) ή αν το τρέχον στοιχείο current είναι ίσο με το x. Η νέα συνάρτηση γραμμικής αναζήτησης newlsearch είναι: newlsearch :: Int->[Int]->Bool newlsearch x l = foldl (\found-> \current-> found current == x) False l Ομοίως, η foldr μπορεί να συσσωρεύει διαφορετικού τύπου στοιχεία από αυτά που βρίσκονται στη λίστα. 1.4 Γενικότητα των Πολυμορφικών Τύπων Μία αντικατάσταση (substitution) είναι μία συνάρτηση που συσχετίζει πεπερασμένο αριθμό μεταβλητών τύπων με (πιθανώς πολυμορφικούς) τύπους. Αν σ είναι μία αντικατάσταση και T ένας πολυμορφικός τύπος, τότε θα γράφουμε σt τον πολυμορφικό τύπο που προκύπτει αν αντικαταστήσουμε κάθε μεταβλητή τύπων στον T με τη συσχέτισή της από την σ. Για παράδειγμα, αν σ = a 7! (c->bool) j b 7! Int τότε σ([(a,b,c)]) = [(c->bool, Int, c)] Υπάρχει μία σημαντική σχέση διάταξης μεταξύ των πολυμορφικών τύπων, η σχέση της γενικότητας. Θα λέμε ότι ένας πολυμορφικός τύπος Α είναι πιο γενικός από έναν άλλο Β και ότι ο B είναι πιο ειδικός από τον A, αν υπάρχει αντικατάσταση σ ώστε σa =σb. Ο πιο γενικός τύπος είναι η απλή μεταβλητή τύπων a, η οποία μπορεί να μετατραπεί σε οποιονδήποτε άλλο τύπο T από την αντικατάσταση a 7! T. Ένας πιο γενικός τύπος δίνει περισσότερη ελευθερία επιλογής συγκεκριμένου μονομορφικού τύπου για μία τιμή. Για παράδειγμα, ο τύπος (a,b) είναι πιο γενικός από τον (a,a). Μαθηματικά, αυτό δείχνεται χρησιμοποιώντας την αντικατάσταση b 7!a. Πρακτικά, αυτό σημαίνει ότι ο τύπος (a,b) επιτρέπει περισσότερους μονομορφικούς τύπους από τον (a,a). Πράγματι, ο (a,b) περιγράφει όλους τους τύπους ζεύγους, όπως (Int,Char) και (Int,Int), ενώ ο (a,a) περιγράφει μόνο τους τύπους ζεύγους ομοειδών στοιχείων, όπως (Int,Int). Όσο πιο γενικό τύπο δώσουμε σε μία τιμή, τόσο λιγότερους περιορισμούς δίνουμε για τη χρήση αυτής της τιμής. Για παράδειγμα, αν η [] είχε λιγότερο γενικό τύπο, π.χ. [a->b], τότε θα μπορούσε να χρησιμοποιηθεί μόνο για λίστες συναρτήσεων και όχι για όλες τις λίστες. Επομένως μας ενδιαφέρει να δίνουμε όσο το δυνατό πιο γενικό πολυμορφικό τύπο στις τιμές που ορίζουμε. Σε περίπτωση που δε δίνουμε τύπο σε μία τιμή που ορίζουμε, η Haskell κάνει ε- ξαγωγή τύπου (type inference) φροντίζοντας να βρει το γενικότερο πολυμορφικό τύπο 6

7 που τη χαρακτηρίζει. Το ίδιο συμβαίνει και με τις λ-εκφράσεις. Για να δούμε τον τύπο που έχει αποδώσει η Haskell σε κάποια τιμή, μπορούμε να δώσουμε την εντολή :type στον Hugs. Για παράδειγμα, η εντολή :type dovetail3 θα δώσει dovetail3 :: a -> b -> c -> [(a,b,c)] Η εντολή :type \x->[x] θα δώσει \x -> [x] :: a -> [a] 2 Υπερφόρτωση και Κλάσεις Τύπων 2.1 Τι είναι η Υπερφόρτωση Ένα όνομα λέμε ότι είναι υπερφορτωμένο (overloaded) όταν (α) έχει περισσότερους από έναν τύπους και (β) για κάθε έναν από τους τύπους του έχει διαφορετικό ορισμό. Η υπερφόρτωση λοιπόν διαφέρει από τον πολυμορφισμό, στον οποίο ο ίδιος ορισμός εφαρμόζεται σε όλους τους τύπους της πολυμορφικής τιμής. Έχουμε ήδη χρησιμοποιήσει υπερφορτωμένα ονόματα της Haskell. Ο τελεστής (+) εφαρμόζεται και σε ακεραίους και σε πραγματικούς αριθμούς, αλλά έχει διαφορετική υλοποίηση σε κάθε μία από τις περιπτώσεις αυτές. Ομοίως τελεστές όπως οι (==) και (<) κ.α. είναι υπερφορτωμένοι. Για παράδειγμα, ο τελεστής (==) για ακεραίους είναι υλοποιημένος από το διερμηνέα της Haskell (built-in), ενώ ο τελεστής για ζεύγη δίνεται από τον τύπο (x,y) == (z,w) = x==z && y==w Εδώ προϋποτείθεται ότι ο (==) είναι ορισμένος για τον τύπο των x,z καθώς και για τον τύπο των y,w. Η εφαρμογή του σε αυτά τα στοιχεία αναφέρεται στον τελεστή (==) των αντίστοιχών τύπων. Ο λόγος που η Haskell υποστηρίζει υπερφόρτωση, ξεκινάει από τις βασικές τιμές: είναι άβολο να έχουμε διαφορετικά σύμβολα για την ισότητα, την πρόσθεση κτλ. για κάθε βασικό τύπο που θέλουμε να υποστηρίζει αυτές τις πράξεις. Αλλά η σημασία της υπερφόρτωσης των τελεστών της Haskell επεκτείνεται και πέρα από τις βασικές τιμές. Για παράδειγμα, ας πάρουμε πάλι την αγαπημένη μας γραμμική αναζήτηση, αυτή τη φορά γραμμένη πιο απλά: lsearch x [] = False lsearch x (y:ys) = x==y lsearch x ys 7

8 Οι λίστες που ψάχνει αυτή η συνάρτηση είναι λίστες στοιχείων τύπων για τους οποίους ο τελεστής ισότητας (==) υποστηρίζεται. Έτσι είναι δυνατόν να αναζητήσουμε στοιχεία σε λίστες ακεραίων, χαρακτήρων ή και πλειάδων από τέτοια στοιχεία, αλλά δεν είναι δυνατό να αναζητήσουμε στοιχεία σε λίστες συναρτήσεων, καθώς ο τελεστής ισότητας δεν υποστηρίζεται για συναρτήσεις. Χωρίς την υπερφόρτωση του τελεστή (==) θα έπρεπε να γράψουμε μία συνάρτηση γραμμικής αναζήτησης για κάθε τύπο που υποστηρίζει κάποια ισότητα και επιπλέον ο ορισμός αυτών των συναρτήσεων θα ήταν πάντα ο ίδιος. Αυτή η κατάσταση, όπως είδαμε και στην περίπτωση του πολυμορφισμού είναι απαράδεκτη. Ένα θέμα που προκύπτει τώρα είναι τι τύπο θα δώσουμε στην lsearch. Η lsearch έχει βέβαια τον πολυμορφικό τύπο a -> [a] -> Bool, αλλά χρειάζεται να εκφράσουμε έναν επιπλέον περιορισμό: για τον τύπο a πρέπει να υποστηρίζεται τελεστής ισότητας. Αυτός ο περιορισμός θα εξασφαλίσει ότι η lsearch έχει μεν τύπο Int -> [Int] -> Bool, αλλά όχι και (Int->Int) -> [Int->Int] -> Bool. Με το μηχανισμό των πολυμορφικών τύπων που εξηγήσαμε στην προηγούμενη ενότητα, αυτός ο περιορισμός δε μπορεί να εκφραστεί. Φυσικά θα μπορούσαμε να παρέχουμε στη συνάρτηση lsearch τη συνάρτηση ι- σότητας ως μια έξτρα παράμετρο: lsearch :: (a->a->bool)->a->[a]->bool lsearch eq x [] = False lsearch eq x (y:ys) = eq x y lsearch eq x ys αλλά αυτό θα έδινε μια πολύ γενικότερη συνάρτηση από αυτή που θέλουμε να φτιάξουμε (μπορούμε τώρα να περάσουμε οποιαδήποτε συνάρτηση και όχι απλά ισότητα) και θα περιέπλεκε χωρίς ουσιαστικό αντίκρυσμα όχι μόνο τον ορισμό, αλλά και τη χρήση της lsearch. Στο υπόλοιπο αυτής της ενότητας, θα δούμε πώς ο μηχανισμός των κλάσεων της Haskell αντιμετωπίζει το θέμα έκφρασης αυτών των περιορισμών και κάνει δυνατή τη συμβίωση της υπερφόρτωσης με το πολυμορφικό σύστημα. 2.2 Κλάσεις τύπων Μία κλάση (class) είναι ένα σύνολο τύπων για τους οποίους υποστηρίζονται υπερφορτωμένες εκδόσεις κάποιων ονομάτων. Για παράδειγμα "οι τύποι για τους οποίους υποστηρίζεται ένας τελεστής ισότητας" είναι μία κλάση που στη Haskell ονομάζεται Eq. Αν ένας τύπος a ανήκει στην κλάση Eq, τότε γράφουμε Eq a και εννοούμε ότι υπάρχει έκδοση της συνάρτησης (==) με τύπο a->a->bool. Πιο πάνω είδαμε ότι θέλουμε στον ορισμό τύπου της lsearch να εκφράσουμε την προϋπόθεση "για τον τύπο a υποστηρίζεται τελεστής ισότητας". Αυτή η προϋπόθεση μπορεί να διατυπωθεί με λόγια "ο τύπος a ανήκει στην κλάση Eq". Στη Haskell μπορεί να γραφεί Eq a και να μπει μπροστά από τον τύπο της lsearch ως εξής: 8

9 lsearch :: Eq a => a->[a]->bool Το παραπάνω λέει ότι η lsearch παίρνει όλους τους τύπους a->[a]->bool για τους οποίους το a είναι στην κλάση Eq. Βλέπουμε ότι μεταξύ της δήλωσης Eq a και του πολυμορφικού τύπου εισάγεται ο καινούριος για εμάς τελεστής =>. Η δήλωση Eq a ονομάζεται περιορισμός (constraint). Ένας καθορισμός τύπου μπορεί να έχει περισσότερους από έναν περιορισμούς. Σε αυτήν την περίπτωση οι περιορισμοί μπαίνουν σε παρένθεση και χωρίζονται με κόμμα, π.χ. somevalue :: (Eq a, Eq b) =>... Το σύνολο όλων των περιορισμών ενός καθορισμού τύπου (που μπαίνει αριστερά από τον τελεστή =>) ονομάζεται συμφραζόμενα (context) του καθορισμού τύπου. Ας δούμε τώρα τι μπορούμε να κάνουμε με την lsearch, της οποίας ο πλήρης ορισμός είναι: lsearch :: Eq a => a->[a]->bool lsearch x [] = False lsearch x (y:ys) = x==y lsearch x ys Οι ερωτήσεις lsearch True [False,True] lsearch 20 [1..10] lsearch ( a,50) [(c,i) c<-[ a, z ], i<-[0..100]] δίνουν αντίστοιχα τις αναμενόμενες απαντήσεις True,False,True. Ο έλεγχος τύπου δηλαδή επιτυγχάνει και ο διερμηνέας προχωράει στον υπολογισμό. Αν όμως προσπαθήσουμε την εξής ερώτηση: lsearch (+1) [\x->x+1] παίρνουμε την απάντηση: ERROR - Cannot infer instance *** Instance : Eq (a -> a) *** Expression : lsearch (flip (+) 1) [\x -> x + 1] Εδώ βλέπουμε ότι ο έλεγχος τύπου αποτυγχάνει. Ο διερμηνέας αναφέρει ότι ο τύπος a->a δεν είναι στην κλάση Eq όπως ζητάει ο περιορισμός που θέσαμε στον καθορισμό τύπου της lsearch. Σε περίπτωση που δεν υπάρχει καθορισμός τύπου για ένα οριζόμενο όνομα, η διαδικασία εξαγωγής τύπου ανακαλύπτει και τα συμφραζόμενα που χρειάζεται ένα όνομα για να λειτουργήσει. Για παράδειγμα, αν στον παραπάνω ορισμό της lsearch βγάλουμε τον καθορισμό τύπου, και έπειτα δώσουμε 9

10 :type lsearch στο διερμηνέα, η απάντηση που θα πάρουμε είναι lsearch :: Eq a => a -> [a] -> Bool Εδώ βλέπουμε πως η εξαγωγή τύπου παρατήρησε τη χρήση του τελεστή ισότητας πάνω σε στοιχεία τύπου a και άρα την ανάγκη για τον περιορισμό Eq a. 2.3 Δήλωση και Χρήση Κλάσεων Για να δημιουργήσουμε μία δική μας κλάση, χρησιμοποιούμε τη λέξη-κλειδί class με την εξής σύνταξη: class όνομα_κλάσης μεταβλητή_τύπου where καθορισμοί_τύπων Στους καθορισμούς τύπων συμμετέχει η μεταβλητή τύπου της δήλωσης κλάσης. Οι καθορισμοί αυτοί εισάγουν ονόματα τα οποία πρέπει να υποστηρίζονται για κάποιο τύπο που ανήκει στην κλάση την οποία δημιουργούμε. Οι καθορισμοί αυτοί ονομάζονται υπογραφή (signature) της κλάσης. Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να φτιάξουμε μία υπερφορτωμένη συνάρτηση cond η οποία να λειτουργεί σαν την if then else της Haskell, όμως να παίρνει σα συνθήκη όχι μόνο μία τιμή Bool, αλλά και ακέραιους αριθμούς (όπως στις C/C++) ή ακόμα και λίστες (όπως σε script γλώσσες). Όταν η συνθήκη c είναι ένας αριθμός, τότε, όπως στις C/C++, το αποτέλεσμα της cond c t e θα είναι t αν ο αριθμός είναι διάφορος του μηδενός και e αν είναι ίσος με το 0. Όταν η c είναι λίστα, το αποτέλεσμα θα είναι e αν η λίστα είναι κενή, διαφορετικά θα είναι t. Θα ορίσουμε μία κλάση Condition που θα περιέχει τους τύπους που μπορούν να χρησιμοποιηθούν ως συνθήκες στην cond. Η υπογραφή της Condition θα περιέχει την cond, που είναι μία πολυμορφική συνάρτηση, καθώς τα δύο τελευταία της ορίσματα μπορεί να ανήκουν σε οποιονδήποτε τύπο: class Condition a where cond :: a->b->b->b Αυτή η δήλωση λέει: Ορίζω μία κλάση Condition. Ένας τύπος a ανήκει σε αυτήν την κλάση αν και μόνον αν υποστηρίζεται η εξής υπερφορτωμένη συνάρτηση cond :: a->b->b->b. Ο τύπος της συνάρτησης αυτής μας λέει ότι η cond παίρνει μία παράμετρο του τύπου a (που ανήκει στην τάξη Condition) καθώς και δύο ακόμα παραμέτρους του ιδίου τύπου b και επιστρέφει μία τιμή τύπου b. Ένας τύπος που ανήκει σε μια κλάση C ονομάζεται στιγμιότυπο (instance) της C. Για να δημιουργήσουμε στιγμιότυπα μία κλάσης, χρησιμοποιούμε τη λέξη-κλειδί instance στην εξής σύνταξη: instance όνομα_κλάσης τύπος where δηλώσεις_συναρτήσεων Στις δηλώσεις συναρτήσεων, δηλώνονται ακριβώς οι συναρτήσεις που προβλέπει η κλάση. 10

11 Για παράδειγμα, η Bool δηλώνεται ως στιγμιότυπο της Condition με προφανή ορισμό: instance Condition Bool where cond c t e = if c then t else e Για την περίπτωση των ακεραίων αριθμών, πρέπει να δηλώσουμε την Int ως στιγμιότυπο της Condition ως εξής: instance Condition Int where cond c t e = if c/=0 then t else e Τώρα μπορούμε να δοκιμάσουμε την ερώτηση cond (length a ) It worked! Nope και, φυσικά, το αποτέλεσμα είναι It worked. Όμως μη δοκιμάσετε (ακόμα) την ερώτηση cond Στην πραγματικότητα, η σταθερά 1 είναι πολυμορφική, και ο διερμηνέας θα μπερδευτεί. Για τις λίστες γράφουμε: instance Condition [a] where cond [] t e = e cond (_:_) t e = t Και τώρα η παραπάνω ερώτηση μπορεί να γίνει: cond a It worked! Nope Στις δηλώσεις στιγμιοτύπων, υπάρχουν συγκεκριμένοι περιορισμοί σχετικά με τους τύπους που μπορούμε να δηλώσουμε. Μπορούμε να δηλώσουμε είτε βασικούς τύπους (Bool, Int κτλ.) είτε τύπους λιστών ή πλειάδων που όμως περιέχουν μόνο μεταβλητές τύπων, πχ. [a]. Στην τελευταία περίπτωση, επιτρέπεται να υπάρχουν ακόμα και συμφραζόμενα που περιορίζουν τους τύπους στους οποίους γίνεται η υπερφόρτωση. Θα μπορούσαμε για παράδειγμα να υπερφορτώσουμε την cond για ζεύγη τιμών, οι τύποι των οποίων ανήκουν στην κλάση Condition, και να ελέγχουμε τη σύζευξη αυτών των τύπων: instance (Condition a,condition b) => Condition (a,b) where cond (x,y) t e = cond x (cond y t e) e Αυτό σημαίνει ότι ένα ζεύγος (x,y) συμπεριφέρεται σαν True αν και μόνον αν και το x και το y συμπεριφέρονται σαν True. Στην ερώτηση cond (True, ) 1 2 η Haskell θα απαντήσει 2, ενώ στην cond ( a,2==2) 1 2 θα απαντήσει 1. 11

12 2.4 Προκαθορισμένες Δηλώσεις και Κληρονομικότητα Στη δήλωση μίας κλάσης, γίνεται να δίνεται μια προκαθορισμένη (default) τιμή για κάποια από τα υπερφορτωμένα ονόματα. Αν η δήλωση ενός στιγμιοτύπου παραλείψει τον ορισμό μιας τιμής που έχει προκαθορισμένη τιμή στην κλάση, τότε η προκαθορισμένη τιμή χρησιμοποιείται. Σε περίπτωση όμως που το στιγμιότυπο ορίζει το όνομα, τότε η προκαθορισμένη τιμή ακυρώνεται (γίνεται override) και ισχύει η δήλωση του στιγμιοτύπου. Για παράδειγμα, στην παρακάτω δήλωση κλάσης έχουμε μία προκαθορισμένη τιμή για τη συνάρτηση notbool. Στις δηλώσεις στιγμιοτύπων που ακολουθούν, η προκαθορισμένη τιμή ακυρώνεται μόνο για τον τύπο Bool. O τύπος Int κρατάει την προκαθορισμένη τιμή: class CheckIfBool a where notbool :: a->bool notbool _ = True instance CheckIfBool Bool where notbool _ = False instance CheckIfBool Int Τώρα οι αποτιμήσεις των notbool True notbool (length ) δίνουν αντίστοιχα False και True. Το παράδειγμα αυτό δεν έχει ιδιαίτερη πρακτική αξία, αλλά γίνεται για λόγους επίδειξης. Μία δυνατότητα που μας δίνεται με τις προκαθορισμένες τιμές και την ακύρωση είναι κάτι που μοιάζει με το Template Design Pattern [GHJV95] που συναντάμε κυρίως στον αντικειμενοστρεφή προγραμματισμό. Αν ο προκαθορισμένος ορισμός ενός ονόματος περιλαμβάνει άλλα υπερφορτωμένα ονόματα, τότε η συμπεριφορά του ο- ρισμού αυτού αλλάζει, ανάλογα με τον ορισμό που δίνουν στα ονόματα τα εκάστοτε στιγμιότυπα. Στην περίπτωση της κλάσης Condition, θα μπορούσαμε να χρησιμοποιήσουμε μία συνάρτηση tobool η οποία θα μετατρέπει το όρισμά της σε τιμή Bool, και να δώσουμε ένα προκαθορισμένο ορισμό στην cond που να χρησιμοποιεί αυτή τη συνάρτηση: class Condition a where tobool :: a->bool cond :: a->b->b->b cond c t e = if tobool c then t else e 12

13 Τώρα, τα στιγμιότυπά μας χρειάζεται να ορίσουν μόνο τη συνάρτηση tobool. Η συνάρτηση cond θα κρατήσει την προκαθορισμένη τιμή της και θα συμπεριφέρεται σε κάθε περίπτωση ανάλογα: instance Condition Bool where tobool = id instance Condition Int where tobool i = i/=0 instance Condition [a] where tobool [] = False tobool (_:_) = True instance (Condition a,condition b) => Condition (a,b) where tobool (x,y) = tobool x && tobool y Οι δηλώσεις αυτές είναι πιο εύκολες και κατανοητές και όλα τα παραδείγματα χρήσης της cond που δείξαμε στην προηγούμενη ενότητα δουλεύουν. Μία κλάση μπορεί να κληρονομήσει (inherit) μία ή περισσότερες κλάσεις, υιοθετώντας όλους τους ορισμούς των δηλώσεων των κλάσεων αυτών. Σε αυτήν την περίπτωση, οι κλάσεις που κληρονομούνται μπαίνουν σε συμφραζόμενα μπροστά από την κλάση που δηλώνεται ως εξής: class συμφραζόμενα => όνομα_κλάσης μεταβλητή_τύπου where καθορισμοί_τύπων Στο παράδειγμά μας, θα μπορούσαμε να είχαμε δηλώσει δύο κλάσεις ConvBool και Condition με την Condition να κληρονομεί την ConvBool: class ConvBool a where tobool :: a->bool class ConvBool a => Condition a where cond :: a->b->b->b cond c t e = if tobool c then t else e Στις δηλώσεις στιγμιοτύπων θα έπρεπε να δηλώσουμε και τις δύο κλάσεις: instance ConvBool Bool where tobool = id instance Condition Bool instance ConvBool Int where tobool i = i/=0 instance Condition Int 13

14 instance ConvBool [a] where tobool [] = False tobool (_:_) = True instance Condition [a] instance (ConvBool a,convbool b) => ConvBool (a,b) where tobool (x,y) = tobool x && tobool y instance (Condition a, Condition b) => Condition (a,b) κάτι που δε βολεύει στο συγκεκριμένο παράδειγμα, καθώς όλα τα στιγμιότυπα της ConvBool είναι και στιγμιότυπα της Condition. 2.5 Οι Kλάσεις της Haskell Σε αυτήν την ενότητα παρουσιάζουμε μερικές από τις κλάσεις που υποστηρίζονται από τη Haskell Eq Έχουμε δει την κλάση Eq που ορίζεται ως εξής: class Eq a where (==) :: a->a->bool (/=) :: a->a->bool x /= y = not (x==y) x == y = not (x/=y) Οι προκαθορισμένοι ορισμοί είναι τέτοιοι ώστε να χρειάζεται ο ορισμός μόνο μίας εκ των (==) και (/=) για να λειτουργήσουν και οι δύο Ord Η κλάση Ord κληρονομεί την Eq και προσθέτει τελεστές σύγκρισης > >= < <= και συναρτήσεις min και max για εύρεση ελαχίστου και μεγίστου. Ένα κομμάτι της δήλωσής της έχει ως εξής: class Eq a => Ord a where (<) :: a->a->bool (<=) :: a->a->bool... min :: a->a->a max :: a->a->a 14

15 2.5.3 Show και Read Η κλάση Show συμπεριλαμβάνει τη συνάρτηση show που μετατρέπει ένα όρισμα σε String: class Show a where show :: a->string... Ο διερμηνέας της Haskell χρησιμοποιεί τη show οποιασδήποτε τιμής θέλει να παρουσιάσει στο χρήστη. Έτσι, οι βασικές τιμές, οι λίστες και οι πλειάδες, που ανήκουν στην τάξη Show μπορούν να εμφανιστούν. Αν όμως ζητήσουμε την τιμή μιας συνάρτησης, πχ. \x->x, ο διερμηνέας θα διαμαρτυρηθεί ότι δεν ξέρει πως να εμφανίσει αυτή τη συνάρτηση, καθώς οι συναρτήσεις δεν ανήκουν στην κλάση Show: ERROR - Cannot find show function for: *** Expression : \x -> x *** Of type : a -> a Η κλάση Read υποστηρίζει, αντίστροφα, μία συνάρτηση read που μετατρέπει μία συμβολοσειρά στον αντίστοιχο τύπο: class Read a where read :: String->a Αριθμητικές κλάσεις H Haskell υποστηρίζει ένα πολύ σύνθετο σύνολο κλάσεων για αριθμητικούς τύπους και πολλούς βασικούς αριθμητικούς τύπους (εμείς μέχρι στιγμής χρησιμοποιούσαμε μόνο το Int και το Float). Η γενικότερη αριθμητική κλάση είναι η Num, η οποία υπόστηρίζει συναρτήσεις όπως (+),(-),(*) κτλ. Η κλάση Integral περιέχει τους τύπους ακεραίων αριθμών Int (ακρίβεια 4 bytes) και Integer (όλοι οι ακέραιοι). Η κλάση Fractional περιέχει τον τύπο Rational (ρητοί) και κληρονομείται από την κλάση Floating που περιέχει τους τύπους Float και Double (αριθμοί κινητής υποδιαστολής διπλής ακρίβειας). Αριθμητικές σταθερές όπως η 2 είναι υπερφορτωμένες, όπως ακριβώς και οι συναρτήσεις (+),(-) κτλ. Για παράδειγμα, ο τύπος της 2 είναι Num a => a που σημαίνει ότι το 2 έχει όλους τους τύπους της Num (όπως Int,Rational,Float κτλ.). Ο τύπος της (+) είναι Num a => a->a->a. Το αποτέλεσμα είναι να μπορούμε να γράψουμε εκφράσεις όπως

16 Αν θέλουμε να περιορίσουμε τεχνητά τον τύπο μίας πολυμορφικής έκφρασης όπως η σταθερά 2, τότε μπορούμε να χρησιμοποιήσουμε τον τελεστή :: ακολουθούμενο από τον τύπο στον οποίο θέλουμε να τη χρησιμοποιήσουμε. Για παράδειγμα, για να κάνουμε την έκφραση που είδαμε πιο πάνω cond να δουλέψει, πρέπει να ενημερώσουμε τη Haskell ότι εννοούμε την Int έκδοση της σταθεράς 1: cond (1::Int) 2 3 που αποτιμάται σε Κλάσεις και Αντικειμενοστρεφής Προγραμματισμός Σε αυτές τις σημειώσεις είδαμε πολλούς όρους όπως κλάση, ακύρωση, πολυμορφισμός, κληρονομικότητα κτλ. που παραπέμπουν στο στυλ του αντικειμενοστρεφούς προγραμματισμού. Όντως, οι μηχανισμοί που είδαμε είναι πολύ κοντά στους αντίστοιχους μηχανισμούς αντικειμενοστρεφών γλωσσών. Σε σύγκριση με τις μακράν πιο διαδεδομένες αντικειμενοστρεφείς γλώσσες προγραμματισμού, δηλαδή τις single-dispatch class-based γλώσσες όπως η C++ και η Java, το μοντέλο της Haskell διαφέρει στο ότι διαχωρίζει τους τύπους από τις κλάσεις, έννοιες που συμπίπτουν σε αυτές τις γλώσσες. Ένα μειονέκτημα της φιλοσοφίας του συστήματος της Haskell είναι ότι δε μπορεί να κατασκευάσει δομές που να περιέχουν αντικείμενα πολλών τύπων. Για παράδειγμα, η λίστα [True,2] είναι δυνατό να παρασταθεί στη Java. Στη Java, και τα δύο αντικείμενα (true και 2) είναι αντικείμενα της ίδιας κλάσης (Object) και άρα ανήκουν στον ίδιο τύπο. Στη Haskell, και τα δύο αντικείμενα ανήκουν σε τύπους που ανήκουν στην κλάση Eq, αλλά δεν υπάρχει τύπος στον οποίο ανήκουν και τα δύο αντικείμενα. Ένα πλεονέκτημα της Haskell και άλλων γλωσσών που διαχωρίζουν κλάσεις από τύπους είναι ότι μπορούν να επιβάλλουν περιορισμούς στη χρήση των υπερφορτωμένων συναρτήσεων που οι single-dispach class-based γλώσσες δε μπορούν. Για παράδειγμα, η κλάση Eq υποστηρίζει μία συνάρτηση (==) που μπορεί να κληθεί μόνο με παραμέτρους αντικείμενα του ιδίου τύπου. Έτσι ένας ακέραιος δε μπορεί να συγκριθεί με μία αληθοτιμή κτλ. Στις Java/C++ δεν υπάρχει κάποια τέτοια δυνατότητα. Η συμπερίληψη της μεθόδου equals στην ανώτατη τάξη Object δεν εμποδίζει τέτοιες συγκρίσεις, καθώς όλα τα αντικείμενα ανήκουν σε αυτήν την τάξη. Το πρόβλημα αυτό των αντικειμενοστρεφών γλωσσών είναι μέρος ενός μεγαλύτερου προβλήματος που αντιμετωπίζουν αυτές οι γλώσσες, γνωστό και ως πρόβλημα των δυαδικών μεθόδων (binary methods) [BCC + 95]. 3 Επισκόπηση Σε αυτές τις σημειώσεις είδαμε τους μηχανισμούς πολυμορφισμού και υπερφόρτωσης που χρησιμοποιεί το σύστημα τύπων της Haskell: Η Haskell υποστηρίζει πολυμορφισμό. Αυτό σημαίνει ότι υπάρχουν τιμές που έχουν παραπάνω από έναν τύπο. Οι τιμές αυτές λέγονται πολυμορφικές. 16

17 Ο πολυμορφισμός είναι απαραίτητος για περιπτώσεις που μία τιμή χρειάζεται να λειτουργήσει με τον ίδιο ορισμό σε πολλούς διαφορετικούς τύπους, όπως είναι οι περιπτώσεις των συναρτήσεων για λίστες της Haskell. Ένας πολυμορφικός τύπος στη Haskell περιλαμβάνει μεταβλητές τύπων. Αυτές ξεκινούν με πεζό γράμμα για να ξεχωρίζουν από τους σταθερούς τύπους. Οι μεταβλητές τύπων έχουν τους ίδιους κανόνες αντικατάστασης με τις μεταβλητές τιμών. Αυτό σημαίνει ότι μία μεταβλητή τύπων αντικαθίσταται από τον ίδιο τύπο σε κάθε της εμφάνιση, ενώ τέτοιος περιορισμός δεν υπάρχει για δύο διαφορετικές μεταβλητές τύπων. Οι πολυμορφικοί τύποι διαθέτουν διάταξη γενικότητας βασισμένη στις αντικαταστάσεις. Όσο πιο γενικός είναι ένας τύπος, σε τόσο περισσότερες περιστάσεις μπορούν να χρησιμοποιηθούν οι τιμές του. Η Haskell εξάγει το γενικότερο τύπο μίας τιμής, αν δε δώσουμε εμείς τύπο. Η εντολή :type του διερμηνέα επιστρέφει τον τύπο του ορίσματός της. Ένα όνομα είναι υπερφορτωμένο αν ανήκει σε πολλούς τύπους και έχει διαφορετικό ορισμό για κάθε έναν από αυτούς. Η υπερφόρτωση είναι σημαντική σε βασικές τιμές της Haskell όπως (+),(-) κτλ. αλλά η σημασία της επεκτείνεται και σε όσες τιμές ορίζονται χρησιμοποιώντας υπερφορτωμένες τιμές. Οι κλάσεις είναι ο μηχανισμός υπερφόρτωσης της Haskell. Μία κλάση είναι ένα σύνολο τύπων για τους οποίους υποστηρίζονται κάποιες υπερφορτωμένες τιμές. Οι υπερφορτωμένες τιμές που επιβάλλει μία κλάση λέγονται υπογραφή της κλάσης. Με τη χρήση κλάσεων μπορούμε να εισάγουμε περιορισμούς στις μεταβλητές τύπων ενός πολυμορφικού τύπου. Η εξαγωγή τύπων της Haskell ανακαλύπτει αυτούς τους περιορισμούς. Οι κλάσεις υποστηρίζουν προκαθορισμένες τιμές και ακύρωση, επιτρέποντας τη χρήση μοτίβων προγραμματισμού όπως το Template Design Pattern. Οι κλάσεις υποστηρίζουν κληρονομικότητα. Η Haskell υποστηρίζει πολλές προκαθορισμένες τάξεις. Υπάρχει πολύπλοκη δομή αριθμητικών κλάσεων. Ακόμα και οι σταθεροί αριθμοί είναι πολυμορφικοί. Μπορούμε να χρησιμοποιήσουμε τον τελεστή (::) για να περιορίσουμε τον τύπο μίας πολυμορφικής έκφρασης. Ο μηχανισμός των κλάσεων έχει μία σημαντική διαφορά σε σχέση με τον αντίστοιχο σε single-dispatch class-based αντικειμενοστρεφείς γλώσσες όπως η C++ και η Java: στη Haskell οι κλάσεις είναι συλλογές τύπων, ενώ στις C++/Java είναι τύποι (και άρα συλλογές αντικειμένων). 17

18 Η διαφορά αυτή έχει ως συνέπεια η Haskell να μην υποστηρίζει ετερογενείς δομές με την ευκολία των C++/Java. Η Haskell είναι όμως καλύτερη στη διαχείριση των "δυαδικών μεθόδων" από αυτές τις γλώσσες. Αυτό σημαίνει για παράδειγμα ότι μπορεί να επιβάλλει τον περιορισμό ότι ένας τελεστής μπορεί να εφαρμοστεί μόνο σε δύο (ή περισσότερα) δεδομένα ιδίου τύπου, κάτι που δε γίνεται στις C++/Java. Αναφορές [BCC + 95] K. Bruce, L. Cardelli, G. Castagna, The Hopkins Object Group, G. T. Leavens, and B. C. Pierce. On binary methods. Theory and Practice of Object Systems, 1(3): , [GHJV95] E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Professional Computing Series. Addison-Wesley,

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων 1. Στις Σημ. 4, είδαμε τη δημιουργία της κλάσης Condition που μας επιτρέπει να χρησιμοποιούμε αριθμούς, λίστες και ζεύγη ως αληθοτιμές

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

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

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

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

Haskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων

Haskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων Haskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων Γιάννης Κασσιός Σε αυτές τις σημειώσεις, θα εισάγουμε τις δύο βασικές δομές δεδομένων που υποστηρίζει η Haskell, τις πλειάδες (tuples) και τις λίστες

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

Αφαίρεση στον FP. Πολυμορφισμός Συναρτήσεις υψηλότερης τάξης Οκνηρός και Άπληστος Υπολογισμός

Αφαίρεση στον FP. Πολυμορφισμός Συναρτήσεις υψηλότερης τάξης Οκνηρός και Άπληστος Υπολογισμός Αφαίρεση στον FP Πολυμορφισμός Συναρτήσεις υψηλότερης τάξης Οκνηρός και Άπληστος Υπολογισμός Πολυμορφισμός Θα χρησιμοποιήσουμε σαν παράδειγμα τη συνάρτηση ταυτότητας Ι, που ορίζεται ως: fun I x = x Ο ορισμός

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

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

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 2 η Τύποι Δεδομένων Δήλωση Μεταβλητών Έξοδος Δεδομένων Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα

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

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Πρώτο Φύλλο Ασκήσεων

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Πρώτο Φύλλο Ασκήσεων Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Πρώτο Φύλλο Ασκήσεων 1. Χρησιμοποιείστε λ-εκφράσεις και τη συνάρτηση sumf στις Σημ.1, Ενότ.3.5, για να εκφράσετε το P 10 i=1p i j=1 (i + j)2, χωρίς να ορίσετε

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι ΣΙΝΑΤΚΑΣ Ι. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 2010-11 1 Μεταβλητές-Σταθερές-Παράμετροι Τα στοιχεία

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

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

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

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

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή Στόχοι και αντικείμενο ενότητας Η έννοια του Τελεστή #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Εκφράσεις Προτεραιότητα Προσεταιριστικότητα Χρήση παρενθέσεων Μετατροπές Τύπων Υπονοούμενες και ρητές μετατροπές

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

ΚΕΦΑΛΑΙΟ 2. Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές. 2.1 Εισαγωγή

ΚΕΦΑΛΑΙΟ 2. Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές. 2.1 Εισαγωγή ΚΕΦΑΛΑΙΟ 2 Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές Σύνοψη Το κεφάλαιο αυτό εισάγει τον αναγνώστη σε βασικές έννοιες που είναι χρήσιμες για την απόκτηση μιας πρώτης εμπειρίας με την Python. Προαπαιτούμενη

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

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

Δομημένος Προγραμματισμός (ΤΛ1006) Τεχνολογικό Εκπαιδευτικό Ίδρυμα Κρήτης Σχολή Εφαρμοσμένων Επιστημών Τμήμα Ηλεκτρονικών Μηχανικών Τομέας Αυτοματισμού και Πληροφορικής Δομημένος Προγραμματισμός (ΤΛ1006) Δρ. Μηχ. Νικόλαος Πετράκης, Καθηγητής

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

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python Εισαγωγή στην Επιστήμη Υπολογιστών Εισαγωγή στην Python Python scripts Ένα πρόγραμμα στην Python (συχνά αποκαλείται script) αποτελείται από μία ακολουθία ορισμών και εντολών. H ακολουθία των ορισμών και

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

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

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

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

Οκνηρή Αποτίμηση και Αποδείξεις Ορθότητας

Οκνηρή Αποτίμηση και Αποδείξεις Ορθότητας Οκνηρή Αποτίμηση και Αποδείξεις Ορθότητας Γιάννης Κασσιός Στις σημειώσεις αυτές, έχουμε δύο διαφορετικά θέματα, την οκνηρή αποτίμηση και τις αποδείξεις ορθότητας. Στην Ενότ. 1 ασχολούμαστε με την οκνηρή

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

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

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

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ Η ΓΛΩΣΣΑ PASCAL ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ Απλοί ή στοιχειώδης Τ.Δ. Ακέραιος τύπος Πραγματικός τύπος Λογικός τύπος Χαρακτήρας Σύνθετοι Τ.Δ. Αλφαριθμητικός 1. Ακέραιος (integer) Εύρος: -32768 έως 32767 Δήλωση

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

Κεφάλαιο 11 Εκφραστικές δυνατότητες της Haskell

Κεφάλαιο 11 Εκφραστικές δυνατότητες της Haskell Κεφάλαιο 11 Εκφραστικές δυνατότητες της Haskell Σύνοψη Στο κεφάλαιο αυτό παρουσιάζονται οι περιφραστικές λίστες, μια δυνατότητα που παρέχει η Haskell και με την οποία μπορούμε πολύ εύκολα να ορίσουμε διάφορες

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

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

Προγραμματισμός Η/Υ (ΤΛ2007 ) Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε.Ι. Κρήτης Προγραμματισμός Η/Υ (ΤΛ2007 ) Δρ. Μηχ. Νικόλαος Πετράκης (npet@chania.teicrete.gr) Ιστοσελίδα Μαθήματος: https://eclass.chania.teicrete.gr/ Εξάμηνο: Εαρινό 2015-16

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

Ορισμός Συναρτήσεων στην ΜL

Ορισμός Συναρτήσεων στην ΜL Ορισμός Συναρτήσεων στην ΜL Ονόματα και δεσμεύσεις: ησυνάρτησηval Τα ονόματα σταθερών δεσμεύονται με τιμές σταθερών μέσω ορισμών της συνάρτησης val. val codeof0 = ord 0 val codeof9 = codeof0 + 9 Τα ονόματα

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

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

ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 27 Κύρια προγραμματιστικά μοντέλα (1) Προστακτικός προγραμματισμός (imperative programming) FORTRAN, Algol, COBOL, BASIC, C, Pascal, Modula-2, Ada Συναρτησιακός προγραμματισμός

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

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις

3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις 3ο σετ σημειώσεων - Πίνακες, συμβολοσειρές, συναρτήσεις 5 Απριλίου 01 1 Πίνακες Είδαμε ότι δηλώνοντας μία μεταβλητή κάποιου συγκεκριμένου τύπου δεσμεύουμε μνήμη κατάλληλη για να αποθηκευτεί μία οντότητα

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

Στοιχειώδης προγραμματισμός σε C++

Στοιχειώδης προγραμματισμός σε C++ Στοιχειώδης προγραμματισμός σε C++ Σύντομο Ιστορικό. Το πρόγραμμα Hello World. Ο τελεστής εξόδου. Μεταβλητές και δηλώσεις τους. Αντικείμενα, μεταβλητές, σταθερές. Ο τελεστής εισόδου. Θεμελιώδεις τύποι.

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

Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) f : A B σημαίνει:

Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) f : A B σημαίνει: Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για κάθε x A, f(x) = για κάποιο στοιχείο y = f(x) B ατέρμονη εκτέλεση η εκτέλεση τερματίζει εγείροντας κάποια εξαίρεση Με λόγια: εάν η αποτίμηση

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

3 ο Εργαστήριο Μεταβλητές, Τελεστές

3 ο Εργαστήριο Μεταβλητές, Τελεστές 3 ο Εργαστήριο Μεταβλητές, Τελεστές Μια μεταβλητή έχει ένα όνομα και ουσιαστικά είναι ένας δείκτης σε μια συγκεκριμένη θέση στη μνήμη του υπολογιστή. Στη θέση μνήμης στην οποία δείχνει μια μεταβλητή αποθηκεύονται

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

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ ΠΛΗΡΟΦΟΡΙΚΗ ΤΕΧΝΟΛΟΓΙΑ ΚΑΙ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Εισαγωγή στη Python Νικόλαος Ζ. Ζάχαρης Αναπληρωτής

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

Η γλώσσα ML σε βάθος. Γλώσσες Προγραμματισμού Ι. Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας

Η γλώσσα ML σε βάθος. Γλώσσες Προγραμματισμού Ι. Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Γλώσσες Προγραμματισμού Ι Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας

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

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

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

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

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor ΕισαγωγήστουςΗ/Υ PHP Hypertext Preprocessor ΤιείναιηPHP; PHP είναιµία server-based scripting language σχεδιασµένη ειδικά για το web. Σε µία html σελίδα µπορούµε να ενσωµατώσουµε php κώδικα που εκτελείται

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 4: Τελεστές Τελεστές: Τελεστής Ανάθεσης 2 Το σύμβολο της ανάθεσης είναι το = Προσοχή: το σύμβολο ελέγχου ισότητας είναι το ==. Η μορφή των προτάσεων ανάθεσης είναι:

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι 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

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

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ Κων. Κόκκινος Μεταβλητές-1 Οι μεταβλητές αποτελούν θέσεις μνήμης στις οποίες αποθηκεύονται τιμές αντίστοιχες

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

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++

ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++ Πέρασμα μεταβλητών, Templates, Συσχετίσεις μεταξύ κλάσεων ΟΝΤΟΚΕΝΤΡΙΚΟΣ ΠΡΟΓΡ/ΣΜΟΣ C++ Μ. Ρήγκου (rigou@ceid.upatras.gr) Τι θα συζητήσουμε σήμερα Πέρασμα με τιμή και με αναφορά Template functions και classes

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

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

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 4 η Τελεστές Οι διαλέξεις βασίζονται στο βιβλίο των Τσελίκη και Τσελίκα C: Από τη Θεωρία στην Εφαρμογή Σωτήρης

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

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων 1 Είσοδος/Έξοδος Είσοδος/Έξοδος ανάλογα με τον τύπο του προγράμματος Πρόγραμμα

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

3 Αλληλεπίδραση Αντικειμένων

3 Αλληλεπίδραση Αντικειμένων Αφαίρεση και Αρθρωσιμότητα 3 Αλληλεπίδραση Αντικειμένων Πώς συνεργάζονται τα αντικείμενα που δημιουργούμε Αφαίρεση (abstraction) είναι η δυνατότητα να αγνοούμε τις λεπτομέρειες και να εστιάζουμε την προσοχή

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

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος 2012-13 Κων/νος Φλώρος Απλοί τύποι δεδομένων Οι τύποι δεδομένων προσδιορίζουν τον τρόπο παράστασης των

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

Κεφάλαιο 10 H γλώσσα συναρτησιακού προγραμματισμού Haskell Τα βασικά

Κεφάλαιο 10 H γλώσσα συναρτησιακού προγραμματισμού Haskell Τα βασικά Κεφάλαιο 10 H γλώσσα συναρτησιακού προγραμματισμού Haskell Τα βασικά Σύνοψη Στο κεφάλαιο αυτό παρουσιάζεται ο τρόπος με τον οποίο μπορούμε να γράφουμε προγράμματα Haskell, διατυπώνοντας ορισμούς συναρτήσεων,

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

Η γλώσσα ML σε βάθος. Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations)

Η γλώσσα ML σε βάθος. Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) Η γλώσσα ML σε βάθος Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για κάθε x A, f(x) = για κάποιο στοιχείο y=f(x) B ατέρμονη εκτέλεση η εκτέλεση τερματίζει εγείροντας κάποια εξαίρεση Με

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις Στατικές μέθοδοι Τι σημαίνει το keyword static στον ορισμό της main μεθόδου? Τι είναι μια στατική μέθοδος?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Η γλώσσα ML σε βάθος. Joan Miró, El Carnaval del Arlequín, Κωστής Σαγώνας Νίκος Παπασπύρου

Η γλώσσα ML σε βάθος. Joan Miró, El Carnaval del Arlequín, Κωστής Σαγώνας Νίκος Παπασπύρου Η γλώσσα ML σε βάθος Joan Miró, El Carnaval del Arlequín, 1925 Κωστής Σαγώνας Νίκος Παπασπύρου Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για

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

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

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

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

Δεδομένα, τελεστές, είσοδος/έξοδος

Δεδομένα, τελεστές, είσοδος/έξοδος 2 Δεδομένα, τελεστές, είσοδος/έξοδος Τι θα δούμε σε αυτό το μάθημα 1. βασικοί τύποι δεδομένων 2. ακέραιοι 3. κινητής υποδιαστολής 4. ο τύπος decimal 5. χαρακτήρες 6. bool 7. string 8. χρήση μεταβλητών

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

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής Προγραμματισμός Η/Υ Ενότητα 4: Νίκος Καρακαπιλίδης, Καθηγητής Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών Σκοποί ενότητας Έλεγχος της ροής ενός προγράμματος

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

Βασικές Αρχές Προγραμματισμού

Βασικές Αρχές Προγραμματισμού Βασικές Αρχές Προγραμματισμού Κεφάλαιο 2 ΗγλώσσαC Ιστορική Αναδρομή ΗανάπτυξητηςC ξεκίνησε το 1972 στα εργαστήρια Bell από τον Dennis Ritchie με σκοπό την ανάπτυξη ενός λειτουργικού συστήματος για τον

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

Σημειωματάαριο Δευτέρας 16 Οκτ. 2017

Σημειωματάαριο Δευτέρας 16 Οκτ. 2017 Σημειωματάαριο Δευτέρας 16 Οκτ. 2017 Λίστες και ανακύκλωση for Είδαμε στην αρχή (ξανά) μερικά βασικά πράγματα για λίστες. Λίστα είναι μια πεπερασμένη ακολουθία από αντικείμενα (αριθμούς, strings, άλλες

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

5 &6. Τύποι δεδομένων, τελεστές και

5 &6. Τύποι δεδομένων, τελεστές και Προγραμματισμός Μεθόδων Επίλυσης Προβλημάτων 5 &6. Τύποι δεδομένων, τελεστές και αριθμητικές εκφράσεις Ιωάννης Κατάκης Σήμερα o Τύποι δεδομένων int, char, float, double o Τελεστές = + - * / % o Αριθμητικές

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 4: Τελεστές Τελεστές: Τελεστής Ανάθεσης 2 Το σύμβολο της ανάθεσης είναι το = Προσοχή: το σύμβολο ελέγχου ισότητας είναι το ==. Η μορφή των προτάσεων ανάθεσης είναι:

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

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ

Διάλεξη 2. Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις. Διοργάνωση : ΚΕΛ ΣΑΤΜ Διάλεξη 2 Μεταβλητές - Δομές Δεδομένων - Eίσοδος δεδομένων - Έξοδος: Μορφοποίηση - Συναρτήσεις Διοργάνωση : ΚΕΛ ΣΑΤΜ Διαφάνειες: Skaros, MadAGu Παρουσίαση: MadAGu Άδεια: Creative Commons 3.0 2 Internal

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

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL 8.1. Εισαγωγή ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PACAL Πως προέκυψε η γλώσσα προγραμματισμού Pascal και ποια είναι τα γενικά της χαρακτηριστικά; Σχεδιάστηκε από τον Ελβετό επιστήμονα της Πληροφορικής Nicklaus Wirth to

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

Εισαγωγή στον Προγ/μό Υπολογιστών

Εισαγωγή στον Προγ/μό Υπολογιστών Εισαγωγή στον Προγ/μό Υπολογιστών Διάλεξη 1 Εκφράσεις, κλητικές εκφράσεις, ονόματα Περιεχόμενα Εκφράσεις (expressions) Τελεστές (operators) της Python Κλητικές εκφράσεις (call expressions) Ονόματα (names)

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

Τι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος

Τι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος Τι σηµαίνουν οι τύποι συναρτήσεων στην ML f : A B σηµαίνει: Για κάθε x A f(x) = για κάποιο στοιχείο y = f(x) B ατέρµονη εκτέλεση η εκτέλεση τερµατίζει εγείροντας κάποια εξαίρεση Με λόγια: εάν η αποτίμηση

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java III Το if-else statement Το if-else statement δουλεύει καλά όταν στο condition θέλουμε να περιγράψουμε μια επιλογή με δύο πιθανά ενδεχόμενα.

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

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

Προγραμματισμός Ι (HY120) Προγραμματισμός Ι (HY120) #3 τελεστές 1 Σπύρος Λάλης Τελεστής ανάθεσης Το σύμβολο της ανάθεσης είναι το = προσοχή: το σύμβολο ελέγχου ισότητας είναι το == Η μορφή των προτάσεων = 1. Αποτιμάται

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

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Εισαγωγή στον Προγραµµατισµό Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011 Hello World /* Αρχείο hello.c * Εµφανίζει στην οθόνη το * µήνυµα hello world */ #include

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Κεφάλαιο 10 : Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ 1. Ποιες από τις παρακάτω εντολές είναι σωστές; α) if A + B

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

Κεφάλαιο 8. Συναρτησιακός Προγραμματισμός: Η Γλώσσα Haskell. Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης

Κεφάλαιο 8. Συναρτησιακός Προγραμματισμός: Η Γλώσσα Haskell. Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης Κεφάλαιο 8 Συναρτησιακός Προγραμματισμός: Η Γλώσσα Haskell Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης 1 Συναρτησιακές Γλώσσες Προγραμματισμού Γλώσσες στις οποίες ο προγραμματιστής

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

Βασικά στοιχεία της Java

Βασικά στοιχεία της Java Βασικά στοιχεία της Java προτάσεις, εκφράσεις, µεταβλητές, σταθερές, τελεστές Ορισµοί Πρόταση (statement) είναι µία απλή εντολή σε µία γλώσσα προγραµµατισµού. Γιαπαράδειγµα: int x=12; Έκφραση (expression)

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08 Constructors (Κατασκευαστές) Ειδικός τύπος μεθόδων που δημιουργούν αντικείμενα μιας κλάσης και: Εκτελούνται κατά την αρχικοποίηση των αντικειμένων

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

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης Προγραμματισμός Υπολογιστών & Κ.Π. Γιαλούρης Στόχοι του σημερινού μαθήματος Εξοικείωση με τα περιβάλλοντα της Python Κατανόηση βασικών εννοιών & τεχνικών Τύπος δεδομένων Μεταβλητή Εντολή ανάθεση τιμής

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

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

Ανάπτυξη και Σχεδίαση Λογισμικού Ανάπτυξη και Σχεδίαση Λογισμικού Η γλώσσα προγραμματισμού C Γεώργιος Δημητρίου Βασικά Στοιχεία Το αλφάβητο της C Οι βασικοί τύποι της C Δηλώσεις μεταβλητών Είσοδος/Έξοδος Βασικές εντολές της C Αλφάβητο

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

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα

Φύλλο Εργασίας 3. Μια γρήγορη επανάληψη από τα προηγούμενα 3 Φύλλο Εργασίας 3 Στο φύλλο εργασιών 3 θα ασχοληθούμε με τις λίστες μια δομή της γλώσσας python που έχει την δομή ενός πίνακα. Θα χρησιμοποιήσουμε τις βασικές εντολές από τις λίστες και θα κατασκευάσουμε

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος http://www.teiser.gr/icd/staff/lantzos lantzos@teiser.gr 1 Πώς δημιουργούμε πρόγραμμα Η/Υ; 1. Ανάλυση του προβλήματος 2. Επινόηση & Σχεδιασμός

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

Σύντομες εισαγωγικές σημειώσεις για την. Matlab

Σύντομες εισαγωγικές σημειώσεις για την. Matlab Σύντομες εισαγωγικές σημειώσεις για την Matlab Δήλωση Μεταβλητών Για να εισάγει κανείς δεδομένα στη Matlab υπάρχουν πολλοί τρόποι. Ο πιο απλός είναι στη γραμμή εντολών να εισάγουμε αυτό που θέλουμε και

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

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο) Προγραμματισμός Η/Υ Ενότητα 2β: Νίκος Καρακαπιλίδης, Καθηγητής Δημήτρης Σαραβάνος, Καθηγητής Πολυτεχνική Σχολή Τμήμα Μηχανολόγων & Αεροναυπηγών Μηχανικών Σκοποί ενότητας Κατανόηση της έννοιας του Τελεστή

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

Αριθμήσιμα σύνολα. Μαθηματικά Πληροφορικής 5ο Μάθημα. Παραδείγματα αριθμήσιμων συνόλων. Οι ρητοί αριθμοί

Αριθμήσιμα σύνολα. Μαθηματικά Πληροφορικής 5ο Μάθημα. Παραδείγματα αριθμήσιμων συνόλων. Οι ρητοί αριθμοί Αριθμήσιμα σύνολα Μαθηματικά Πληροφορικής 5ο Μάθημα Τμήμα Πληροφορικής και Τηλεπικοινωνιών Πανεπιστήμιο Αθηνών Ορισμός Πόσα στοιχεία έχει το σύνολο {a, b, r, q, x}; Οσα και το σύνολο {,,, 4, 5} που είναι

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές Αντικείμενα ως ορίσματα Μπορούμε να περνάμε αντικείμενα ως ορίσματα σε μία μέθοδο όπως οποιαδήποτε άλλη μεταβλητή

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

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΧΗΜΙΚΩΝ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΙΚΟ ΚΕΝΤΡΟ Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού Μάθημα 2ο Μεταβλητές Μεταβλητή ονομάζεται ένα μέγεθος

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

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Προβλήματα, αλγόριθμοι, ψευδοκώδικας Προβλήματα, αλγόριθμοι, ψευδοκώδικας October 11, 2011 Στο μάθημα Αλγοριθμική και Δομές Δεδομένων θα ασχοληθούμε με ένα μέρος της διαδικασίας επίλυσης υπολογιστικών προβλημάτων. Συγκεκριμένα θα δούμε τι

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

Βασικά Στοιχεία της Java

Βασικά Στοιχεία της Java Βασικά Στοιχεία της Java Παύλος Εφραιμίδης Java Βασικά Στοιχεία της γλώσσας Java 1 Τύποι Δεδομένων Η Java έχει δύο κατηγορίες τύπων δεδομένων: πρωτογενείς (primitive) τύπους δεδομένων αναφορές Java Βασικά

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

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

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

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

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 3: Προγραμματισμός σε JAVA I Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή στις έννοιες: - Στοιχειώδης Προγραμματισμός - Προγραμματισμός με Συνθήκες - Προγραμματισμός με Βρόγχους

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

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client ΕΣΔ 516 Τεχνολογίες Διαδικτύου Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client Περιεχόμενα Περιεχόμενα Javascript και HTML Βασική σύνταξη Μεταβλητές Τελεστές Συναρτήσεις

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

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης Κ.Π. Γιαλούρης Στόχοι του σημερινού μαθήματος Εξοικείωση με τα περιβάλλοντα της Python Κατανόηση βασικών εννοιών & τεχνικών Τύπος δεδομένων Μεταβλητή Εντολή ανάθεση τιμής / εντολή αντικατάστασης Εισαγωγή

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

Εισαγωγή στο Συναρτησιακό Προγραμματισμό

Εισαγωγή στο Συναρτησιακό Προγραμματισμό Εισαγωγή στο Συναρτησιακό Προγραμματισμό Γιάννης Κασσιός Σε αυτό το μάθημα θα εξερευνήσουμε ένα σπουδαίο μοντέλο προγραμματισμού, το συναρτησιακό προγραμματισμό. Θα δούμε το συναρτησιακό προγραμματισμό

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Κλάσεις και Αντικείμενα Αναφορές Μαθήματα από το lab Υπενθύμιση: Η άσκηση ζητούσε να υλοποιήσετε μία κλάση vector που να διαχειρίζεται διανύσματα οποιουδήποτε

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

K15 Ψηφιακή Λογική Σχεδίαση 7-8: Ανάλυση και σύνθεση συνδυαστικών λογικών κυκλωμάτων

K15 Ψηφιακή Λογική Σχεδίαση 7-8: Ανάλυση και σύνθεση συνδυαστικών λογικών κυκλωμάτων K15 Ψηφιακή Λογική Σχεδίαση 7-8: Ανάλυση και σύνθεση συνδυαστικών λογικών κυκλωμάτων Γιάννης Λιαπέρδος TEI Πελοποννήσου Σχολή Τεχνολογικών Εφαρμογών Τμήμα Μηχανικών Πληροφορικής ΤΕ Η έννοια του συνδυαστικού

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

Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις. ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις. ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ Κεφάλαιο 2.5: Τύποι εδοµένων, Τελεστές και Αριθµητικές Εκφράσεις ( ιαλέξεις 5-6) ιδάσκων: ηµήτρης Ζεϊναλιπούρ 1 Περιεχόµενα Τύποι εδοµένων int, char, float, double Τελεστές =,+,-,*,/,% Αριθµητικές εκφράσεις

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

Εισαγωγή στη Γλώσσα ML. Juan Miró

Εισαγωγή στη Γλώσσα ML. Juan Miró Εισαγωγή στη Γλώσσα ML Juan Miró Κωστής Σαγώνας Συναρτησιακός και Προστακτικός Προγραμματισμός Ένας τρόπος διαχωρισμού Ο προστακτικός προγραμματισμός επικεντρώνει στο πώς θα υλοποιήσουμε

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

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό

Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό Ενότητα: Δυαδική Αναζήτηση Σχέδιο Δραστηριότητας: Παιχνίδι: Βρες τον αριθμό 1 Εισαγωγή Σκεφτείτε έναν αριθμό από το 1 έως το 1000 και απαντήστε στην ερώτηση: Ο αριθμός που σκεφτήκατε είναι μεγαλύτερος

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

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής:

Περιληπτικά, τα βήματα που ακολουθούμε γενικά είναι τα εξής: Αυτό που πρέπει να θυμόμαστε, για να μη στεναχωριόμαστε, είναι πως τόσο στις εξισώσεις, όσο και στις ανισώσεις 1ου βαθμού, που θέλουμε να λύσουμε, ακολουθούμε ακριβώς τα ίδια βήματα! Εκεί που πρεπει να

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

Ανάλυση της Ορθότητας Προγραμμάτων (HR Κεφάλαιο 4)

Ανάλυση της Ορθότητας Προγραμμάτων (HR Κεφάλαιο 4) Ανάλυση της Ορθότητας Προγραμμάτων (HR Κεφάλαιο 4) Στην ενότητα αυτή θα μελετηθούν τα εξής θέματα: Η διαδικαστική γλώσσα προγραμματισμού WHILE Τριάδες Hoare Μερική και Ολική Ορθότητα Προγραμμάτων Κανόνες

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

5ο σετ σημειώσεων - Δείκτες

5ο σετ σημειώσεων - Δείκτες 5ο σετ σημειώσεων - Δείκτες 11 Ιουνίου 01 1 Γενικά Σύμφωνα με το γενικό μοντέλο υπολογιστή, ένας υπολογιστής είναι μία μηχανή που διαθέτει μία κεντρική μονάδα επεξεργασίας η οποία μπορεί μεταξύ άλλων να

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

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΚΑΙ ΠΙΝΑΚΕΣ Γεώργιος Παπαϊωάννου (2013-16) gepap@aueb.gr Περιγραφή: Βασικοί Τύποι Πίνακες (μέρος 1) Συμβολοσειρές Ο Προεπεξεργαστής Τελευταία ενημέρωση: Σεπτέμβριος 2016 Εισαγωγή - 2 short:

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

n true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty

n true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty Συναρτησιακός Προγραµµατισµός 2008 Τρίτο Φύλλο Ασκήσεων - Project Το project αυτό µπορεί να γίνει από οµάδες 1-3 ατόµων και αντιστοιχεί στο 15% του ϐαθµού στο µάθηµα. Συνολικό Αθροισµα Βαθµών: 150 Προθεσµία

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ Εισαγωγή στη Java III Ισότητα Strings class StringTest public static void main(string args[]) String x1 = "java"; String y1 = "java"; System.out.println("1.

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

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ

ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ ΚΕΦΑΛΑΙΟ 9 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ 9.1 Εντολές Εισόδου/εξόδου Στην Pascal, 1. Tα δεδομένα των προγραμμάτων λαμβάνονται: είτε από το πληκτρολόγιο είτε από ένα αρχείο με τη χρήση των διαδικασιών read και readln,

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

Γλώσσα Προγραμματισμού C

Γλώσσα Προγραμματισμού C Προγραμματισμός HY: Γλώσσα Προγραμματισμού C Δρ. Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας Email: savvas@teilar.gr URL: http://teilar.academia.edu/iliassavvas

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

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

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης Η συνάρτηση printf() Η συνάρτηση printf() χρησιμοποιείται για την εμφάνιση δεδομένων στο αρχείο εξόδου stdout (standard output stream), το οποίο εξ ορισμού συνδέεται με την οθόνη Η συνάρτηση printf() δέχεται

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

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Μεταβλητές,

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

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

Εισαγωγή στον Προγ/μό Η/Υ Εισαγωγή στον Προγ/μό Η/Υ Ενότητα 7 2ο μέρος: Επιπλέον έννοιες σχετικά με αντικείμενα Διδάσκων: Μιχάλης Τίτσιας Περιεχόμενα Τι μπορεί να περιέχει μια τάξη Μέθοδοι τάξης και σταθερές τάξης Πολυμορφισμός

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

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

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07 Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με ΑΜ σε 3, 7, 8 & 9 22/11/07 Παράδειγμα με if/else if και user input: import javautil*; public class Grades public

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

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

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εντολές ελέγχου ροής προγράμματος (if-else & switch) Η εντολή if-else Η εντολή if-else υπάρχει σχεδόν σε όλες τις γλώσσες προγραμματισμού. Χρησιμοποιείται για τον έλεγχο της

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

Σημειωματάριο Δευτέρας 9 Οκτ. 2017

Σημειωματάριο Δευτέρας 9 Οκτ. 2017 Σημειωματάριο Δευτέρας 9 Οκτ. 2017 Η δομή ελέγχου if... else... elif Βλέπουμε τώρα πώς μπορούμε να γράψουμε προγράμματα που η εκτέλεσή τους ακολουθεί διαφορετική πορεία ανάλογα με τα δεδομένα. Χωρίς τέτοιες

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

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών Λειτουργικά Αριστείδης Ηλίας Συστήματα Ι Φ ρ ο ν τ ι σ τ ή ρ ι ο Shell Scripting Εισαγωγή Ένα shell script είναι μια λίστα εντολών που εκτελούνται ακολουθιακά Εκτελούνται ανάλογα με το κέλυφος και για

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