Συναρτησιακός προγραμματισμός : Η άλλη πλευρά του νομίσματος

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

Download "Συναρτησιακός προγραμματισμός : Η άλλη πλευρά του νομίσματος"

Transcript

1 Συναρτησιακός προγραμματισμός : Η άλλη πλευρά του νομίσματος Απόστολος Συρόπουλος 28ης Οκτωβρίου ΞΑΝΘΗ apostolo@obelix.ee.duth.gr Οκτώβριος 1999 Δημοσιεύτηκε στο τεύχος Οκτωβρίου 1999 του περιοδικού RAM, σελ Εισαγωγή Πριν από μερικά χρόνια συζητούσα με κάποιο καθηγητή μου το ζήτημα της μελλοντικής μου επαγγελματικής αποκατάστασης. Ένα πρόβλημα που με απασχολούσε ιδιαίτερα ήταν αυτό της γνώσης κάποιων γλωσσών προγραμματισμού. Σκεφτόμουν ότι πολύ πιθανά κάποια εταιρεία να μου ζητούσε να γνωρίζω κάποια γλώσσα την οποία όμως εγώ δεν θα γνώριζα, ενώ θα γνώριζα κάποια παραπλήσια. Ο Bror, έτσι λένε τον καθηγητή μου, μου είπε απλά στην περίπτωση που συμβεί αυτό να πω ότι γνωρίζω την γλώσσα και το ίδιο βράδυ να βρω ένα βιβλίο εκμάθησης της γλώσσας και να την μάθω! Μου φάνηκε υπερβολικό, αλλά όμως μετά από λίγο συνειδητοποίησα το πόσο δίκαιο είχε. Σκεφτήκατε ποτέ σε ποίο ουσιαστικό σημείο διαφέρει η C από την Pascal ή η Ada από τη Modula-2, την Java ή την C++? Ο πυρήνας όλων αυτών των γλωσσών προγραμματισμού είναι η εντολή ανάθεσης, δηλαδή η εντολή με την οποία αλλάζουμε ή δίνουμε τιμή (αξία) σε μία μεταβλητή. Σκεφτείτε το! Κάνοντας ένα βήμα παραπέρα: Έχει άραγε νόημα μια γλώσσα προγραμματισμού να μην διαθέτει την εντολή ανάθεσης? Η απάντηση στο προηγούμενο ερώτημα, προς έκπληξη πολλών φαντάζομαι αναγνωστών, είναι : ΝΑΙ! Καταρχήν οι γλώσσες προγραμματισμού χωρίζονται σε δύο μεγάλες κατηγορίες : τις προστακτικές (imperative) και τις δηλωτικές (declarative). Έχοντας κανείς να λύσει ένα πρόβλημα, χρησιμοποιώντας τις πρώτες περιγράφει ακριβώς τι πρέπει να κάνει ο Η/Υ ώστε να λυθεί υπολογιστικά το πρόβλημά του. Αν όμως κανείς χρησιμοποιεί μια δηλωτική γλώσσα, απλά περιγράφει πως πρέπει να λυθεί το πρόβλημα του. Ας δούμε ένα παράδειγμα. Έστω ότι θέλουμε να γράψουμε ένα πρόγραμμα το οποίο θα υπολογίζει το άθροισμα των πρώτων n φυσικών αριθμών. Στην περίπτωση μιας προστακτικής γλώσσας, όπως η C++, το πρόγραμμά μας θα έχει την παρακάτω μορφή: sum=0; cin >> n; for(i=0; i<=n; i++) sum += i; cout << sum << '\n'; Δηλαδή χρησιμοποιώντας έναν αθροιστή και μία εντολή επανάληψης (και όχι εντολή ανακύκλωσης όπως κακώς αναφέρεται σε πολλά κείμενα), βρίσκουμε το τελικό αποτέλεσμα. Στην περίπτωση μιας δηλωτικής γλώσσας θα πρέπει να ανακαλύψουμε τις ιδιότητες του αθροίσματος και με βάση αυτές να γράψουμε το πρόγραμμά μας. Δηλαδή ότι το άθροισμα των n αριθμών είναι ίσο με n συν το άθροισμα των n 1 1

2 αριθμών, ενώ το άθροισμα το των n 1 αριθμών με n 1 συν το άθροισμα των n 2 αριθμών, κ.ο.κ. Ιδού το αντίστοιχο πρόγραμμα σε μορφή ψευδό-κώδικα: sum n = if n==0 then 0 else n + sum(n-1) n = inputstream show sum n Παρατηρήστε ότι στις δηλωτικές γλώσσες «παίζουμε» με αναδρομικές δηλώσεις λειτουργιών (functions όπως αυτές της Pascal ή της C). Μια διαδικασία ή μια λειτουργία ονομάζεται αναδρομική όταν ορίζεται με βάση τον ίδιο της τον εαυτό, π.χ., το παραγοντικό ενός αριθμού n ορίζεται ως εξής: { 1, an n = 1 n! = n (n 1)! αλλιώς Είναι φανερό ότι το παραγοντικό του n ορίζεται με βάση την τιμή του παραγοντικού του n 1, του n 1 με βάση αυτό του n 2, κ.ο.κ. Επιπλέον, υπάρχει μια τερματική συνθήκη με την οποία καθορίζουμε που θα σταματήσει ο υπολογισμός. Έτσι αν θέλουμε να υπολογίσουμε το 3! θα το κάνουμε ως εξής: 3! = 3 (3 1)! = 3 2! = 3 2 (2 1)! = 3 2 1! = = 6. Προσέξτε την σημασία της τερματικής συνθήκης. Οι δηλωτικές γλώσσες χωρίζονται σε δύο κατηγορίες : στις λογικές (logic) και στις συναρτησιακές (functional). Οι λογικές γλώσσες προγραμματισμού έχουν τα μαθηματικά τους θεμέλια στην μαθηματική θεωρία αποδείξεων (proof theory) και ουσιαστικά αποτελούν εργαλεία απόδειξης θεωρημάτων. Με άλλα λόγια, κάθε πρόγραμμα είναι ένα θεώρημα το οποίο ζητάμε να αποδείξει η υλοποίηση της γλώσσας. Η πιο γνωστές λογικές γλώσσες προγραμματισμού είναι η Prolog και οι διάφορες παραλλαγές της, όπως η λ-prolog, κ.ά. Οι συναρτησιακές έχουν τα μαθηματικά τους θεμέλια στον λογισμό λ του Alonzo Church (βλέπε πλαίσιο για μια σύντομη περιγραφή του λογισμού λ). Σε μία συναρτησιακή γλώσσα προγραμματισμού κανείς ορίζει συναρτήσεις των οποίων η σύνθεση (βλέπε επόμενη ενότητα), συνήθως, αποτελεί τη λύση στο πρόβλημα μας. Οι πιο γνωστές συναρτησιακές γλώσσες προγραμματισμού είναι η Lisp1, η SML, η LML, η Miranda, η SISAL, η Haskell, κ.ά. Όλα σχεδόν τα κείμενα που πραγματεύονται γενικά τον συναρτησιακό προγραμματισμό, χρησιμοποιούν μια γλώσσα προγραμματισμού για να δείξουν τα ιδιαίτερα χαρακτηριστικά αυτής της προγραμματιστικής φιλοσοφίας. Εμείς εδώ διαλέξαμε την Haskell2, ως γλώσσα αναφοράς μιας και αποτελεί την καλύτερη κατά τεκμήριο συναρτησιακή γλώσσα προγραμματισμού. 1Να σημειώσουμε ότι η Lisp δεν είναι συναρτησιακή γλώσσα όπως οι υπόλοιπες, αλλά έχει τα ίδια μαθηματικά θεμέλια με τις υπόλοιπες γλώσσες. 2Tο όνομά της είναι το όνομα του μεγάλου λογικολόγου (logician) Haskell B. Curry. 2

3 (Αν δεν είστε εξοικειωμένος με την έννοια της συνάρτησης απλά διαβάστε την αρχή της δεύτερης ενότητας όπου γίνεται μια σύντομή περιγραφή της έννοιας.) Ο λογισμός λ συλλήφθηκε από τον Alonzo Church, ως μέρος μια γενικότερης θεωρίας των συναρτήσεων και της λογικής που προορίζονταν να γίνει θεμέλιο των μαθηματικών. Μολονότι, όπως αποδείχθηκε, το όλο σύστημα είχε αδυναμίες, το υποσύστημα που πραγματεύονταν μόνο τις συναρτήσεις έγινε ένα επιτυχημένο μοντέλο για τις «υπολογίσιμες συναρτήσεις», δηλαδή όλων εκείνων των συναρτήσεων τις οποίες μπορεί να υπολογίσει μια μηχανή Turing. Η αναπαράσταση μιας υπολογίσιμης συνάρτησης με έναν όρο του λογισμού λ, οδηγεί στον συναρτησιακό προγραμματισμό. Ο λογισμός λ έχει δύο βασικές πράξεις. Η πρώτη είναι η εφαρμογή. Έτσι η παράσταση F A υποδηλώνει ότι τα δεδομένα F θεωρούμενα ως αλγόριθμος εφαρμόζονται στο A θεωρούμενο ως είσοδος. Είναι ενδιαφέρον να τονίσουμε ότι μπορούμε να έχουμε ως είσοδο τον ίδιο τον αλγόριθμο, πράγμα που συμβαίνει σε γλώσσες όπως η Lisp. Η άλλη βασική πράξη είναι η αφαίρεση. Αν γενικά το M είναι μια (αλγεβρική) έκφραση που περιέχει (ή εξαρτάται από) το x, τότε η παράσταση λx. δηλώνει μια συνάρτηση από το x στο πεδίο τιμών της παράστασης [x]. Για να γίνουμε πιο συγκεκριμένοι: έστω ότι = 3x + 4, τότε η αφαίρεση λx.3x + 4 δηλώνει την συνάρτηση που αντιστοιχεί κάθε x στην τιμή 3x + 4. Αν έχουμε μια αφαίρεση λάμδα, μπορούμε να την εφαρμόσουμε σε κάποια είσοδο αντικαθιστώντας κάθε εμφάνιση της μεταβλητής με την είσοδο. Για παράδειγμα η εφαρμογή (λx.3x+1/x)6 έχει ως αποτέλεσμα την παράσταση 3 6+1/6. Αν και μιλήσαμε για αφαιρέσεις λάμδα με μια εξαρτώμενη μεταβλητή, δεν υπάρχει κανένα πρόβλημα για αφαιρέσεις με πολλές μεταβλητές, π.χ., λx.λy.λz.x + 3y + 2z, κ.λπ. (Σημειώστε ότι μόνο η τελευταία τελεία είναι υποχρεωτική.) Φυσικά υπάρχουν πάρα πολλά ακόμη να λεχθούν για τον λογισμό λ, όπως για παράδειγμα το γεγονός ότι σε κάθε μαθηματική λογική (κλασική, γραμμική, κ.λπ.) αντιστοιχεί ένας λογισμός λ με ιδιαίτερα χαρακτηριστικά, εντούτοις εμείς δε μπορούμε να επεκταθούμε περισσότερο. Ο αναγνώστης που ενδιαφέρεται να μάθει περισσότερα μπορεί να διαβάσει το κλασικό πλέον βιβλίο του H.P. Barendregt με τίτλο «e lambda calculus: its syntax and semantics», το οποίο εκδίδει ο οίκος North-Holland. 2 Συναρτήσεις και συναρτησιακός προγραμματισμός Στα μαθηματικά μια συνάρτηση είναι ένας μηχανισμός που παρέχει μια αντιστοιχία από αντικείμενα ενός συνόλου, το πεδίο ορισμού, σε αντικείμενα ενός άλλου συνόλου, το πεδίο τιμών. Ένα απλό παράδειγμα συνάρτησης είναι η συνάρτηση που αντιστοιχεί σε κάθε ακέραιο αριθμό μία από τις λέξεις συν, πλην ή μηδέν, ανάλογα του αν ο αριθμός είναι θετικός, αρνητικός ή μηδέν. Ονομάζουμε αυτή την συνάρτηση πρόσημο αντανακλώντας την αντιστοιχία που επιτελεί. Υπάρχουν τρεις τρόποι ορισμού μιας συνάρτησης: 1. μέσω ενός διαγράμματος που δείχνει σε ποιο στοιχείο του πεδίου τιμών αντιστοιχεί το οποιοδήποτε στοιχείο του πεδίου ορισμού, 2. μέσω μιας σειράς εξισώσεων όπου δίνουμε την τιμή της συνάρτησης για κάθε δυνατή τιμή, και 3. μέσω της περιγραφής της αντιστοιχίας που επιτελεί η συνάρτηση. Στο σχήμα 1 φαίνονται οι τρεις αυτές μέθοδοι ορισμού συνάρτησης για την περίπτωση της συνάρτησης πρόσημο. Ειδικά στην τρίτη περίπτωση το x ονομάζεται παράμετρος και αναπαριστά οποιοδήποτε στοιχείο του πεδίου ορισμού. Όταν το x πάρει μια συγκεκριμένη τιμή, αυτή ονομάζεται όρισμα της συνάρτησης, π.χ., στην παράσταση πρόσημο(4) το 4 είναι όρισμα της συνάρτησης. Η τρίτη μέθοδος είναι αυτή που συνήθως χρησιμοποιούμε στον συναρτησιακό προγραμματισμό, ενώ σε αρκετές περιπτώσεις χρησιμοποιούμε και την δεύτερη. Φυσικά μια συνάρτηση μπορεί να έχει παραπάνω από μία παραμέτρους. Μια συνάρτηση λέγεται καλώς ορισμένη όταν κάθε στοιχείο του πεδίου ορισμού αντιστοιχεί σε μόνο ένα στοιχείο του πεδίου τιμών. Όπως αναφέρθηκε παραπάνω ένα βασικό συστατικό του συναρτησιακού προγραμματισμού είναι η δυνατότητα σύνθεσης συναρτήσεων. Τι σημαίνει όμως αυτό? Έστω ότι θέλουμε να υπολογίσουμε το μέγιστο δύο ακεραίων. Η παρακάτω συνάρτηση βρίσκει το μέγιστο δύο αριθμών: 3

4 αʹ μείον μηδέν συν βʹ. πρόσημο( 3) = μείον πρόσημο( 2) = μείον πρόσημο( 1) = μείον πρόσημο(0) = μηδέν πρόσημο(1) = συν πρόσημο(2) = συν πρόσημο(3) = συν. γʹ πρόσημο(x) = μείον, αν x < 0 μηδέν, αν x = 0 συν, αν x > 0 Σχήμα 1: Μέθοδοι ορισμού συνάρτησης. 4

5 max x y = if x>=y then x else y Το πεδίο ορισμού της συνάρτησης είναι εκείνο το σύνολο που αποτελείται από ζεύγη ακεραίων και το πεδίο τιμών το σύνολο των ακεραίων. (Βέβαια για μια πεπερασμένη μηχανή όπως ένας Η/Υ το σύνολο των ακεραίων δεν είναι παρά ένα πολύ μικρό υποσύνολό του.) Αν θέλουμε να υπολογίσουμε το μέγιστο τριών αριθμών, θα πρέπει να ορίσουμε μια νέα συνάρτηση: max3 x y z x>=y && x>z x>=z && x>y = x y>=x && y>z y>=z && y>x = y z>=x && z>y z>=y && z>x = z otherwise = x (Το σύμβολο && σημαίνει και, το σύμβολο ή και το σύμβολο αν, δηλαδή η τρίτη γραμμή της δήλωσης σημαίνει ό,τι το μέγιστο των x, y και z είναι το z αν z>=x && z>y z>=y && z>x. Τα άλλα σύμβολα, τελεστές σύγκρισης, είναι αυτονόητα.) Τώρα, ας προσπαθήσουμε να γράψουμε τον παραπάνω ορισμό με απλούστερο τρόπο. Ασφαλώς θα συμφωνείτε ότι ο παρακάτω ορισμός είναι σαφέστατα πιο κατανοητός και πιο απλός: max3 x y x = max(x,max(y,z)) Με τον τρόπο αυτό κανείς μπορεί δημιουργεί νέες συναρτήσεις βασιζόμενος σε προηγούμενη δουλειά. (Ως άσκηση, προσπαθήστε να δημιουργήσετε μια συνάρτηση η οποία θα υπολογίζει το μέγιστο τεσσάρων ακεραίων αριθμών.) Μάλιστα, αυτός είναι και ο λόγος που κάθε τυπική εγκατάσταση της Haskell συνοδεύεται από ένα μεγάλο αριθμό προκαθορισμένων συναρτήσεων. Ένα ακόμη βασικό χαρακτηριστικό κάθε συναρτησιακής γλώσσας προγραμματισμού είναι η έλλειψη παρενεργειών, η δυνατότητα χρήσης των οποίων αποτελεί βασικό χαρακτηριστικό κάθε προστακτικής γλώσσας προγραμματισμού. Όμως τι είναι οι παρενέργειες? Αν ορίσουμε μια συνάρτηση σε κάποια προστακτική γλώσσα προγραμματισμού, η οποία επιστρέφει κάποια τιμή αλλά και ταυτόχρονα αλλάζει την τιμή κάποιας καθολικής μεταβλητής, τότε λέμε ότι η συνάρτηση έχει παρενέργειες. Όσο αθώες και αν φαίνονται οι παρενέργειες, εντούτοις μπορούν εύκολα και απλά να παραβιάσουν βασικούς κανόνες των μαθηματικών και έτσι να έχουμε αναπάντεχα αποτελέσματα! Το παρακάτω πρόγραμμα σε C++ δείχνει ακριβώς το τι εννοούμε. Το πρόγραμμα απλά τυπώνει στην οθόνη του Η/Υ το άθροισμα f(1) + f(2) και το άθροισμα f(2) + f(1). Η f επιστρέφει είτε το όρισμα της, είτε το διπλάσιο του ορίσματος της, ανάλογα της τιμής της καθολικής μεταβλητής flag, της οποία όμως την τιμή μεταβάλει πριν επιστρέψει τον έλεγχο στο κύριο πρόγραμμα. #include <iostream.h> bool flag; int f(int n) { return (flag=!flag, (flag? n : 2*n)); } int main() { flag=true; cout << f(1)+f(2) << '\n'; cout << f(2)+f(1) << '\n'; } 5

6 Αν «τρέξετε» το πρόγραμμα αυτό θα διαπιστώσετε ότι παίρνουμε ως έξοδο τους αριθμούς 4 και 5, ενώ είναι γνωστό από τα μαθηματικά του γυμνασίου ότι a + b = b + a, πράγμα που εδώ προφανώς δεν ισχύει. Από την άλλη, δεν υπάρχει καμία πιθανότητα μια συναρτησιακή γλώσσα προγραμματισμού να παρουσιάσει μια ανακολουθία αυτής της μορφής. Αυτή η ιδιότητα των συναρτησιακών γλωσσών είναι γνωστή στη βιβλιογραφία ως referential transparency («αναφορική διαφάνεια»). Επίσης εντολές ανάθεσης που δημιουργούν παρενέργειες χαρακτηρίζονται ως καταστροφικές. Συμπερασματικά λέμε ό,τι αυτό που χαρακτηρίζει κάθε συναρτησιακή γλώσσα προγραμματισμού είναι ότι προγραμματίζουμε με συναρτήσεις τις οποίες μπορούμε να συνθέτουμε και οι οποίες δεν παραβιάζουν τα βασικά αξιώματα των μαθηματικών. 3 Σύντομη εισαγωγή στον συναρτησιακό προγραμματισμό με την Haskell Χονδρικά μιλώντας, όταν λέμε «τύπο» σε μια γλώσσα προγραμματισμού εννοούμε ένα σύνολο τιμών και ορισμένες πράξεις που γίνονται με στοιχεία του συνόλου αυτού. (Οι αναγνώστες με κάποιο μαθηματικό υπόβαθρο, μπορούν χονδρικά να ταυτίσουν ένα τύπο με κάποια αλγεβρική δομή, π.χ., ομάδα, δακτύλιο, κ.λπ.) Κάθε συναρτησιακή γλώσσα προγραμματισμού είναι μια γλώσσα με ένα «ισχυρό» σύστημα τύπων. Αυτό σημαίνει ότι η υλοποίηση της γλώσσας ελέγχει πάντα αν κάποια έκφραση είναι σύμφωνη με τους κανόνες που διέπουν το σύστημα τύπων της. Για παράδειγμα δεν επιτρέπεται να προσθέτουμε ένα ακέραιο με ένα χαρακτήρα. Εκείνο όμως που κάνει ξεχωριστό το σύστημα τύπων κάθε συναρτησιακής γλώσσας σε σχέση με το αντίστοιχο κάποιας προστακτικής γλώσσας είναι το γεγονός ότι δεν απαιτείται να δηλώσουμε τον τύπο των συναρτήσεων και των διαφόρων παραστάσεων, καθώς αυτός εξάγεται από την υλοποίηση της γλώσσας με απόλυτα ασφαλή μέθοδο. Οι βασικοί τύποι της Haskell είναι οι εξής: Οι τύποι Int και Integer που αναφέρονται σε ακεραίους με πεπερασμένο και απεριόριστο αριθμό ψηφίων αντίστοιχα. Οι τύποι Float και Double που αναφέρονται σε δεκαδικούς απλής και διπλής ακρίβειας αντίστοιχα. Ο τύπος Bool με τις δύο δυνατές τιμές: True και False. Ο τύπος Char που αναφέρεται σε χαρακτήρες. Σημειώστε ότι όλα τα ονόματα τύπων γράφονται με κεφαλαίο το πρώτο τους γράμμα. Εκτός όμως από τους βασικούς τύπους, υπάρχουν και αρκετές μέθοδοι δημιουργίας νέων τύπων. Αν με το γράμμα a δηλώνουμε ένα τύπο, ο τύπος [a] δηλώνει μια ακολουθία από αντικείμενα τύπου a. Οι ακολουθίες διαφέρουν από τις παρατάξεις (arrays) στο γεγονός ότι δε μπορούμε να έχουμε πρόσβαση σε οποιοδήποτε στοιχείο τους, ακριβώς όπως για παράδειγμα συμβαίνει με μία ουρά: κανείς πάει πάντα στο τέλος και περιμένει την σειρά του. Μια ακολουθία αντικειμένων είναι μια δομή δεδομένων η οποία είναι είτε κενή, οπότε γράφεται [], είτε μη-κενή και αποτελείται από ένα αντικείμενο h, την κεφαλή, και μία άλλη ακολουθία αντικειμένων t, την ουρά. Μια μη-κενή ακολουθία γράφεται h:t. Για παράδειγμα η ακολουθία 1:2:3:[] αποτελείται από τους αριθμούς 1, 2 και 3, ενώ η άδεια ακολουθία μπαίνει απλά για να ορίσουμε το τέλος της ακολουθίας. Εναλλακτικά κανείς μπορεί να γράψει την προηγούμενη ακολουθία ως εξής: [1,2,3]. Τα κορδόνια, String, δεν είναι παρά [Char], δηλαδή ακολουθίες χαρακτήρων τα οποία όμως επιτρέπεται να γράφονται και σε συμπαγή μορφή: η ακολουθία ['A',' ','S','t','r','i','n','g'] γράφεται "A String". 6

7 Αν τα a και b δηλώνουν κάποιους τύπους, ο τύπος (a,b) δηλώνει τον τύπο ζευγών που το πρώτο μέλος είναι τύπου a και το δεύτερο τύπου b. Φυσικά μπορούμε να δημιουργήσουμε τριάδες, τετράδες, κ.ο.κ., αλλά ζεύγη όπου ο ένας τύπος είναι μια τριάδα, κ.λπ. Γενικότερα οι νιάδες αντιστοιχούν σε records της Pascal ή σε structures της C. Αν τα a και b δηλώνουν κάποιους τύπους, ο τύπος a->b δηλώνει τον τύπο συναρτήσεων που έχουν ως πεδίο ορισμού τον τύπο a και ως πεδίο τιμών τον τύπο b. Για παράδειγμα η συνάρτηση strlen η οποία βρίσκει το μήκος ενός κορδονιού έχει τύπο [Char]->Int. Αφού μάθαμε τους διάφορους δυνατούς τύπους που παρέχει η γλώσσα Haskell, ας δούμε πώς γράφουμε συναρτήσεις. Κάθε συνάρτηση έχει όνομα και χαρακτηρίζεται από τον αριθμό των παραμέτρων που δέχεται καθώς και το τι υπολογίζει, το οποίο είναι μια γενικευμένη αλγεβρική παράσταση. Την ονομάζουμε γενικευμένη απλά γιατί μπορεί να περιέχει παραστάσεις συνθήκης, απλές αλγεβρικές παραστάσεις, κ.ά. Για παράδειγμα οι συναρτήσεις square y = y*y factorial x = product [1..x] sign n = if n>0 then "plus" else if n=0 then "zero" else "minus" υπολογίζουν το τετράγωνο, το παραγοντικό ενός αριθμού και το πρόσημο ενός αριθμού. Η συνάρτηση factorial ορίζεται με βάση την συνάρτηση product η οποία υπολογίζει το γινόμενο όλων των μελών μιας ακολουθίας αριθμών. Προσέξτε ότι η ακολουθία [x..y] αποτελείται από όλους τους ακεραίους από το x ως και το y. Ενώ η ακολουθία [x,y..z] αποτελείται από τους ακεραίους από το x ως το z ανά y-x, δηλαδή η ακολουθία [1,3..10] είναι ισοδύναμη με την [1,3,5,7,9]. Ένα ιδιαίτερο χαρακτηριστικό της Haskell είναι ότι υπολογίζει τα ορίσματα κάθε συνάρτησης μόνο αν χρειάζεται και όσο αυτό χρειάζεται. Έτσι αν ορίσουμε την συνάρτηση myfunc x y = x και ζητήσουμε από κάποια υλοποίηση της γλώσσας να υπολογίσει την παράσταση myfunx 3 3/0 το αποτέλεσμα θα είναι 3, επειδή σύμφωνα με τον ορισμό το δεύτερο όρισμα απλά δεν λαμβάνεται υπ όψη. Από την άλλη καμία προστακτική γλώσσα δεν θα μπορούσε να υπολογίσει την αντίστοιχη παράσταση. Αυτό το ιδιαίτερο χαρακτηριστικό πολλών συναρτησιακών γλωσσών προγραμματισμού είναι γνωστό στη διεθνή βιβλιογραφία ως lazy evaluation. Εκτός όμως από τη δυνατότητα ορισμού ακολουθιών με απλή αναγραφή των μελών της μπορούμε να βάζουμε τη γλώσσα να υπολογίζει τα μέλη μιας ακολουθίας, ακριβώς όπως όταν ορίζουμε ένα σύνολο περιγραφικά, π.χ., η ακολουθία [ x x <- [0..100], odd x ] αποτελείται από τους περιττούς αριθμούς που βρίσκονται μεταξύ του 0 και του 100. Προσέξτε ότι ο ορισμός είναι σχεδόν ίδιος με τον αντίστοιχο μαθηματικό: {x 0 x 100 και x περιττός}. Αυτή ακριβώς η δυνατότητα χρησιμοποιείται από την Haskell για τον ορισμό παρατάξεων (arrays). Έτσι αν θέλουμε να ορίσουμε μια παράταξη, πρέπει να ορίσουμε τα άκρα της καθώς και τον τρόπο δημιουργίας των στοιχείων της: squares = array(1,100)[(i,i*i) i <- [1..100]] Βλέπουμε ότι ορίζουμε η παράταξη να έχει 100 στοιχεία με δείκτες από το 1 ως το 100. Το ζεύγος στις αγκύλες χρησιμεύει στο να δείξουμε σε πιο στοιχείο της παράταξης πρέπει να βάλουμε πια τιμή. Αν θέλουμε το έβδομο στοιχείο της παράταξης, απλά γράφουμε squares!7. Στις περισσότερες προστακτικές γλώσσες προγραμματισμού, υπάρχει η δυνατότητα ορισμού επαγωγικών τύπων, όπως δένδρων, λιστών, σωρών, κ.λπ. Μόνο που εκεί συνήθως ένας ορισμός ενός επαγωγικού τύπου γίνεται με τη βοήθεια δεικτών. Οι συναρτησιακές γλώσσες δίνουν αυτή τη δυνατότητα, αλλά 7

8 επιπλέον το κάνουν με ένα πολύ απλό και σχεδόν φυσικό τρόπο. Έστω ότι θέλουμε να ορίσουμε έναν επαγωγικό τύπο που να αναπαριστά τους φυσικούς αριθμούς, τότε στην Haskell θα γράψουμε data Nat = Zero Succ Nat όπου Zero ο αριθμός μηδέν και Succ ο επόμενος κάποιου φυσικού αριθμού (το σύμβολο διαβάζεται, σε αυτή την περίπτωση, ή). Το παράδειγμα στηρίζεται στην θεώρηση ότι κάθε φυσικός αριθμός μπορεί να παρασταθεί με βάση το μηδέν και μια συνάρτηση που υπολογίζει τον επόμενο κάποιου αριθμού. Έτσι ο αριθμός 2 = SuccSuccZero. Αν θέλουμε να ορίσουμε για παράδειγμα ένα δυαδικό δένδρο, τότε πρέπει να καταφύγουμε στον ορισμό ενός παραμετρικού επαγωγικού τύπου: data BinTree a = Null Node a (BinTree a) (BinTree a) Προσέξτε ότι εδώ ορίζουμε το δυαδικό δένδρο να είναι είτε κενό, είτε να αποτελείται από ένα κόμβο που περιέχει μια πληροφορία τύπου a και δύο υπό-δένδρα, τα οποία με την σειρά των μπορούν να είναι είτε κενά, είτε να περιέχουν πληροφορίες, κ.ο.κ. Όταν έχουμε επαγωγικούς τύπους μπορούμε να χρησιμοποιήσουμε τον ορισμό των για να ορίσουμε συναρτήσεις που θα τους διαχειρίζονται. Οι συναρτήσεις αυτές ορίζονται με πρότυπα, δηλαδή γενικές περιγραφές της δομής κάποιου ορίσματος. Για παράδειγμα στο σχήμα 2 δίνουμε την υλοποίηση του αλγορίθμου ταξινόμησης QuickSort του C.A.R. Hoare σε Haskell και C/C++ για να καταδείξουμε την εκφραστική δύναμη του συναρτησιακού προγραμματισμού αλλά και για να δείξουμε ένα παράδειγμα της χρήσης προτύπων (pattern matching). Προσέξτε ότι μια ακολουθία είναι είτε άδεια είτε περιέχει κάποια στοιχεία. Αν είναι άδεια, τότε απλά επιστρέφουμε την άδεια ακολουθία. Αν είναι γεμάτη, τότε πρέπει να γνωρίζουμε το πρώτο της στοιχείο και «συλλογικά» τα υπόλοιπα. Έτσι αν θέλουμε να υπολογίσουμε το μήκος μιας ακολουθίας η παρακάτω συνάρτηση κάνει με το παραπάνω την δουλειά μας: len [] = 0 len (x:xs) = 1 + len xs Το ενδιαφέρον σε αυτό τον ορισμό είναι ότι μπορεί να εφαρμοσθεί σε κάθε είδους ακολουθία. Η δυνατότητα που έχουν πολλές συναρτησιακές γλώσσες να δηλώνει κανείς συναρτήσεις για ένα ευρύ φάσμα ομοειδών δομών ονομάζεται πολυμορφία. Ας δούμε ένα ακόμη παράδειγμα μιας πολύμορφης συνάρτησης η οποία αντιστρέφει μια ακολουθία: reverse [] = [] reverse (h:t) = reverse t ++ [h] Προσέξτε ότι εδώ δημιουργούμε νέες ακολουθίες που αποτελούνται από ένα μόνο στοιχείο. Εκτός από τους επαγωγικούς τύπους μπορούμε να έχουμε και άπειρες δομές δεδομένων, η ύπαρξη και χρήση των οποίων είναι αποτέλεσμα του lazy evaluation. Για παράδειγμα, οι παρακάτω συναρτήσεις ορίζουν η μεν πρώτη μια άπειρη ακολουθία αποτελούμενη μόνο από το ψηφίο 1, ενώ η δε δεύτερη μια ακολουθία αποτελούμενη από τους αριθμούς από κάποιο ακέραιο n ως το άπειρο. Η τρίτη αποτελεί ένα εναλλακτικό τρόπο γραφής της δεύτερης. Η παράσταση [m..] αντιστοιχεί σε μία ακολουθία από το m ως το άπειρο. Αυτή η δυνατότητα, δηλαδή το να μπορεί κανείς να γράφει κάτι με κομψό τρόπο, ονομάζεται syntactic sugar. ones = 1:ones numsfrom n = n:numsfrom(n+1) numbersfrom m = [m..] (Μπορείτε μήπως να βρείτε τον τύπο της δεύτερης συνάρτησης?) Γλώσσες όπως η C και Pascal δίνουν τη δυνατότητα σε κάποιο χρήστη να ορίζει λειτουργίες ή διαδικασίες των οποίων κάποιο όρισμα είναι μια άλλη λειτουργία ή διαδικασία. Η ίδια δυνατότητα παρέχεται και στις συναρτησιακές γλώσσες προγραμματισμού. Μάλιστα, αν μια συνάρτηση έχει ως παράμετρο μια άλλη συνάρτηση, ονομάζεται συνάρτηση υψηλότερης τάξης. Ιδού μια τέτοια συνάρτηση: 8

9 void qsort(void *v[], int left, int right, int (*comp)(void *, void *)) { int i, last; void swap(void *v[], int, int); qsort [] = [] qsort (x:xs) = qsort [y y <- xs, y<x] ++ [x] ++ qsort [y y <- xs, y>=x] Ο αλγόριθμος QuickSort σε Haskell. Ο τελεστής ++ ενώνει δύο ακολουθίες σε μία. } if(left>=right) return; swap(v,left,(left+right)/2); last=left; for(i=left+1; i<=right; i++) if((*comp)(v[i],v[left])<0) swap(v,++last,i); swap(v,left,last); qsort(v.left,last-1,comp); qsort(v,last+1,right,comp); Ο αλγόριθμος QuickSort σε C/C++. Σχήμα 2: Υλοποίηση του αλγορίθμου QuickSort σε Haskell και C/C++. map f [] = [] map f (x:xs) = f x : map f xs Έτσι η παράσταση map square [1,2,3,4,5] θα δημιουργήσει την ακολουθία [1,4,9,16,25]. Προσέξτε ότι δεν χρειάζεται να καταφύγουμε σε κόλπα με δείκτες, όπως στην C, ή σε μονολιθικές δηλώσεις, όπως στην Pascal, για να ορίσουμε μια συνάρτηση υψηλότερης τάξης. Η υλοποίηση αναλαμβάνει τα πάντα! Ένα άλλο ενδιαφέρον χαρακτηριστικό των συναρτησιακών γλωσσών αποτελεί η δυνατότητα ορισμού κάποιου συμβόλου ή λέξης ως δυαδικού τελεστή, όπως, π.χ., το +, το *, κ.λπ. Ορίστε πως ορίζεται στην Haskell ο τελεστής ++: [] ++ ys = ys (x:xs) ++ ys = x:(xs ++ ys) Βέβαια, δεν καλύψαμε πλήρως τη γλώσσα, αλλά δώσαμε μια γεύση των δυνατοτήτων της. Το σημαντικό ερώτημα που πολλοί νέοι στο χώρο θέτουν είναι: Όντως είναι ενδιαφέρουσες και μαθηματικά κομψές οι συναρτησιακές γλώσσες προγραμματισμού, έχουν όμως χρησιμοποιηθεί σε «πραγματικές» εφαρμογές; 4 Συναρτησιακές γλώσσες και εφαρμογές Οι συναρτησιακές γλώσσες προγραμματισμού έχουν χρησιμοποιηθεί επιτυχώς σε αρκετά σημαντικά προγράμματα (projects). Για παράδειγμα o Mobility Server, ένα προϊόν που πωλείται σε δώδεκα ευρωπαϊκές χώρες, ελέγχει τα κινητά τηλέφωνα του Ευρωπαϊκού Κοινοβουλίου στο Στρασβούργο. Το σύστημα αυτό είναι γραμμένο στην Erlang, μια συναρτησιακή γλώσσα προγραμματισμού σχεδιασμένη από την Ericsson για τηλεπικοινωνιακές εφαρμογές. Η φιλοσοφία της εταιρείας είναι στα επόμενα χρόνια ότι λογισμικό παράγει, να γράφεται σε Erlang (το όνομα της δεν προέρχεται από τα αρχικά των λέξεων Ericsson language, αλλά από το όνομα του δανού μαθηματικού A.K. Erlang). Περισσότερες πληροφορίες σχετικά με την Erlang μπορείτε να βρείτε στο URL: Μια άλλη εφαρμογή στον τηλεπικοινωνιακό τομέα είναι το σύστημα Pdiff το οποίο είναι γραμμένο σε SML και αποτελεί τμήμα 9

10 του τηλεπικοινωνιακού συστήματος 5ESS (phone switch system). Το σύστημα αυτό παράγεται από τα Εργαστήρια Bell. Ένα άλλο είδος εφαρμογών στο οποίο χρησιμοποιούνται κύρια συναρτησιακές γλώσσες προγραμματισμού είναι τα συστήματα αυτόματης απόδειξης θεωρημάτων. Για παράδειγμα το σύστημα HOL( Higher Order Logic) χρησιμοποιήθηκε στην παραγωγή των επεξεργαστών HP9000 της εταιρείας Hewlett-Packard. Μάλιστα μπόρεσε να διαγνώσει προβλήματα τα οποία δεν ήταν δυνατό να ανακαλυφθούν μετά από έξι μήνες προσομοίωσης. Επίσης ο Οργανισμός Αμυντικής Τεχνολογίας και Επιστήμης του Υπουργείου Αμύνης της Αυστραλίας, χρησιμοποιεί το σύστημα Isabelle για την επαλήθευση των συνθηκών οπλισμού παγίδων βλημάτων. Τα δύο αυτά συστήματα είναι γραμμένα σε SML. Η γλώσσα SML είναι απόγονος της γλώσσας ML η οποία χρησιμοποιούταν ως «μεταγλώσσα» στο σύστημα LCF, ενός πρωτοποριακού συστήματος απόδειξης θεωρημάτων. Κάθε πτήση από ή προς τα αεροδρόμια Orly και Roissy του Παρισιού επεξεργάζεται από ένα έμπειρο σύστημα το οποίο ονομάζεται Ivanhoe το οποίο είναι γραμμένο στο κέλυφος εμπείρων συστημάτων Natural Expert. Το κέλυφος αυτό παρέχει μια γλώσσα προγραμματισμού η οποία μοιάζει πάρα πολύ με την Haskell. Έτσι κανείς ουσιαστικά προγραμματίζει έμπειρα συστήματα σε μία συναρτησιακή γλώσσα προγραμματισμού. Παράλληλα, στην Γαλλία η εταιρεία Polygram, η οποία ελέγχει το ένα τρίτο της ευρωπαϊκής αγοράς CD και κασετών, χρησιμοποιεί το έμπειρο σύστημα Colisage στην γραμμή πακεταρίσματος. Το σύστημα αυτό είναι γραμμένο στο κέλυφος Natural Expert. Η Εnsemble είναι μια βιβλιοθήκη πρωτοκόλλων η οποία μπορεί να χρησιμοποιηθεί για την εύκολη αλλά και γρήγορη δημιουργία κατανεμημένων (distributed) εφαρμογών. Το σύστημα Εnsemble βρίσκεται σε καθημερινή χρήση στο Πανεπιστήμιο Cornell, όπου μεταξύ άλλων χρησιμοποιείται για την υποστήριξη της αποθήκευσης ηχητικών CD αλλά και της αναπαραγωγής των. Το ίδιο σύστημα χρησιμοποιείται από μια σειρά εταιρειών (BBN, Lockheed Martin, Microso, κ.ά.) για τη δημιουργία εμπορικών προϊόντων. Το πρόγραμμα είναι γραμμένο στη γλώσσα Objective Caml, μιας διαλέκτου της SML. Επιπλέον σε μια προσπάθεια να φανούν οι δυνατότητες του συναρτησιακού προγραμματισμού, ερευνητές του Πανεπιστημίου Carnegie Mellon δημιούργησαν όλα τα εργαλεία που απαιτούνται για το στήσιμο ενός συστήματος πρόσβασης σε ιστοσελίδες (web server). Για περισσότερες πληροφορίες για το σύστημα μπορείτε να διαβάσετε τα σχετικά στο URL: Περισσότερες πληροφορίες για μεγάλες εφαρμογές των συναρτησιακών γλωσσών προγραμματισμού μπορείτε να βρείτε στο παρακάτω URL: Αφού λοιπόν έχουν τόσες εφαρμογές οι συναρτησιακές γλώσσες προγραμματισμού, γιατί δεν είναι ευρέως διαδεδομένες; Καταρχήν ένας σημαντικός λόγος είναι το γεγονός ότι οι περισσότερες από τις συναρτησιακές γλώσσες αναπτύχθηκαν σε ερευνητικά κέντρα στα οποία ενδιαφέρονταν για γλώσσες μαθηματικώς «καθαρές». Η πραγματικότητα όμως επιβάλει τη δυνατότητα κλήσης ρουτινών σε άλλες γλώσσες (κυρίως σε C), μιας και δεν υπάρχει κανένας λόγος να ανακαλύπτουμε συνεχώς το τροχό. Αντιλαμβανόμενοι αυτό το μειονέκτημα, πολλά ενεργά μέλη της κοινότητας του συναρτησιακού προγραμματισμού προχώρησαν σε βήματα προς τον ορθό δρόμο. Έτσι η Erlang παρέχει τη δυνατότητα κλήσης λειτουργιών σε C, ενώ η SISAL υπορουτινών σε FORTRAN. Επίσης πρόσφατες εξελίξεις επιτρέπουν κάθε πρόγραμμα Haskell να γίνεται ένα στοιχείο COM, ενώ κάθε τέτοιο στοιχείο μπορεί να χρησιμοποιείται από οποιοδήποτε πρόγραμμα σε Haskell. Ένα άλλο σημαντικό στοιχείο αποτελεί το γεγονός ότι οι περισσότερες συναρτησιακές γλώσσες έχουν παρά μόνο βασικές βιβλιοθήκες. Από την άλλη η Java δεν οφείλει την επιτυχία της τόσο στο ότι είναι μια πραγματικά σπουδαία γλώσσα, αλλά στο γεγονός ότι παρέχει μια τεράστια βιβλιοθήκη με δυνατότητες σχεδιασμού γραφικών, επεξεργασίας εικόνας, τηλεφωνίας, κ.ο.κ. Βέβαια υπάρχουν βιβλιοθήκες και για την Haskell για, π.χ., σχεδιασμό γραφικών και δημιουργία εφαρμογών τύπου GUI, δηλαδή με γραφικό διάμεσο, αλλά με κανένα τρόπο δεν φτάνουν την πληθώρα των βιβλιοθηκών της Java. Αυτό ίσως να σχετίζεται και με το γεγονός ότι μόνο ελάχιστες συναρτησιακές γλώσσες προγραμματισμού είναι πραγματικά εμπορικά προϊόντα όπως: η Erlang, η ML Works της Harlequin ( products/ads/ml/), η Miranda της Research So ware Limited, και μερικές ακόμη. 10

11 Στην εποχή που η Java και η Perl διαφημίζονται ως γλώσσες στις οποίες γράφεις ένα πρόγραμμα και αυτό τρέχει σε οποιαδήποτε υπολογιστική πλατφόρμα, οι συναρτησιακές γλώσσες δυστυχώς δεν έχουν υλοποιηθεί παρά στις πλέον γνωστές. Βέβαια αυτό δεν είναι μεγάλο πρόβλημα, αφού κανείς μπορεί εύκολα να φτιάξει μια εν δυνάμει μηχανή (virtual machine) σε C και αυτή να λειτουργεί σε οποιαδήποτε πλατφόρμα, ακριβώς όπως συμβαίνει με την Java. Στο σημείο αυτό αξίζει να αναφέρουμε ότι η Java έγινε γνωστή και για το γεγονός ότι δεν απαιτεί από τον χρήστη της να διαχειρίζεται τη μνήμη μιας και το κάνει αυτό αυτόματα (η τεχνική αυτή ονομάζεται «αποκομιδή σκουπιδιών» ή garbage collection). Όμως η τεχνική αυτή είναι γνωστή στους κύκλους των συναρτησιακών προγραμματιστών εδώ και δεκαετίες! Ένας άλλος λόγος που κάνει σχετικά δύσκολη τη χρήση των συναρτησιακών γλωσσών προγραμματισμού είναι η ελλιπής κατάρτιση των προγραμματιστών. Δεν αρκεί κάποιος να γνωρίζει μία (προστακτική) γλώσσα ώστε να μπορεί να μάθει μια συναρτησιακή. Απαιτούνται δύο περίπου βδομάδες ώστε κάποιος να μάθει να προγραμματίζει συνθέτοντας συναρτήσεις και μη έχοντας στη διάθεσή του μεταβλητές, παρά μόνο σταθερές. Βέβαια έχουν γίνει βήματα για την αντιμετώπιση του προβλήματος, αλλά αυτό που ουσιαστικά απαιτείται είναι οι φοιτητές των τμημάτων των υπολογιστικών επιστημών να αποκτούν εξοικείωση με αυτού του είδους τις γλώσσες. Να σημειωθεί ότι η εκμάθηση της Lisp είναι όχι μόνο παρωχημένη αλλά και δεν προσφέρει τίποτα το ουσιαστικό πλέον. Όλοι οι παραπάνω είναι λόγοι που αποτρέπουν αρκετό κόσμο να ασχοληθεί σοβαρά με τον συναρτησιακό προγραμματισμό, ενώ υπάρχουν και δύο βασικοί μύθοι οι οποίοι διαψεύδονται από τα γεγονότα. Μύθος πρώτος: οι υλοποιήσεις των συναρτησιακών γλωσσών είναι αργές. Αυτό δεν ισχύει αφού σε πολλές περιπτώσεις υπάρχουν συναρτησιακά προγράμματα που «τρέχουν» γρηγορότερα από τα αντίστοιχα προγράμματα σε C. Επιπλέον, η Java που είναι τόσο δημοφιλής είναι μια σχετικά αργή γλώσσα, ακόμη και σε Solaris! Μύθος δεύτερος: ο συναρτησιακός προγραμματισμός είναι δύσκολος. Μια ανακρίβεια που οφείλεται στο γεγονός ότι απαιτείται κανείς να μάθει να σκέφτεται διαφορετικά. Όμως το ίδιο δεν συμβαίνει όταν κανείς μαθαίνει μια άλλη (φυσική) γλώσσα, π.χ., γαλλικά, ρωσικά, κ.ά. 5 Περισσότερες πληροφορίες Αν έχετε πιεσθεί ότι αξίζει τον κόπο να ασχοληθείτε με τον συναρτησιακό προγραμματισμό, θα πρέπει να «κατεβάσετε» μια γλώσσα για το υπολογιστικό σας σύστημα. Αυτό είναι πολύ απλό: επισκεφθείτε το URL: Εκεί θα βρείτε πάρα πολλές πληροφορίες σχετικά με την Haskell, την υλοποίησης της γλώσσας αλλά και βιβλιογραφία σχετικά με τον συναρτησιακό προγραμματισμό γενικότερα. Εμείς για αρχή σας προτείνουμε να πειραματιστείτε με την Hugs, έναν διερμηνευτή της Haskell. Αρκετές πληροφορίες, σχετικά με τον συναρτησιακό προγραμματισμό αλλά και άλλες γλώσσες προγραμματισμού, μπορείτε να βρείτε στις σελίδες των ερευνητικών ομάδων στα αντίστοιχα τμήματα των Πανεπιστημίων Chalmers & Goteborg της Σουηδίας ( Functional/), του Πανεπιστημίου της Γλασκόβης στη Σκοτία ( fp/) και του Πανεπιστημίου Yale στις ΗΠΑ ( Επιπλέον, μπορείτε να διαβάζεται το newsgroup comp.lang.faunctional. Επίσης υπάρχει και ένα επιστημονικό περιοδικό σχετικά με τον συναρτησιακό προγραμματισμό: Journal of Functional Programming ( που εκδίδεται από τον εκδοτικό οίκο Cambridge University Press. Τέλος, υπάρχει και μια στήλη στο περιοδικό SIGPLAN Notices της ACM με θέματα σχετικά με τον συναρτησιακό προγραμματισμό. Ελπίζουμε η σύντομη αυτή παρουσίαση να συντελέσει στην άνοδο της χρήσης αυτού του τόσο γοητευτικού τρόπου επίλυσης υπολογιστικών προβλημάτων! 11

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

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

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

Κεφάλαιο 9 Συναρτησιακός προγραμματισμός Υπολογισμός με συναρτήσεις

Κεφάλαιο 9 Συναρτησιακός προγραμματισμός Υπολογισμός με συναρτήσεις Κεφάλαιο 9 Συναρτησιακός προγραμματισμός Υπολογισμός με συναρτήσεις Σύνοψη Σκοπός του κεφαλαίου αυτού είναι η εισαγωγή του αναγνώστη στη φιλοσοφία του συναρτησιακού προγραμματισμού. Ο συναρτησιακός προγραμματισμός

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

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

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

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

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Διάλεξη 2η: Αλγόριθμοι και Προγράμματα Τμήμα Επιστήμης Υπολογιστών, Πανεπιστήμιο Κρήτης Εισαγωγή στην Επιστήμη Υπολογιστών Βασίζεται σε διαφάνειες του Κ Παναγιωτάκη Πρατικάκης (CSD) Αλγόριθμοι και Προγράμματα

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

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

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

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

Μαλούτα Θεανώ Σελίδα 1

Μαλούτα Θεανώ Σελίδα 1 ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΑΡΧΕΣ ΤΗΣ ΕΠΙΣΤΗΜΗΣ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ Α. ΕΡΩΤΗΣΕΙΣ ΘΕΩΡΙΑΣ ΦΥΛΛΑΔΙΟ 6 ο ( Ενότητες 2.3 ) 1.Τι είναι πρόγραμμα; 2. Ποια είναι τα πλεονεκτήματα των γλωσσών υψηλού επιπέδου σε σχέση με τις γλώσσες

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

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

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

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

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος Κεφάλαιο 2.3: Προγραμματισμός 1 2.3.1 Αναφορά σε γλώσσες προγραμματισμού και «Προγραμματιστικά Υποδείγματα» 2.3.1.1 Πρόγραμμα και Γλώσσες Προγραμματισμού Πρόγραμμα: σύνολο εντολών που χρειάζεται να δοθούν

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

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

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

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στην επιστήμη των υπολογιστών

Εισαγωγή στην επιστήμη των υπολογιστών Εισαγωγή στην επιστήμη των υπολογιστών Λογισμικό Υπολογιστών Γλώσσες Προγραμματισμού 1 Εξέλιξη Οι γλώσσες προγραμματισμού είναι σύνολα από προκαθορισμένες λέξεις οι οποίες συνδυάζονται σε προγράμματα σύμφωνα

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

τις αναδρομικές ακολουθίες (recursive sequences) στις οποίες ορίζαμε

τις αναδρομικές ακολουθίες (recursive sequences) στις οποίες ορίζαμε Κεφάλαιο 9: Αναδρομή Ο τρόπος με τον οποίο σκεφτήκαμε και σχεδιάσαμε τις συναρτήσεις στο προηγούμενο κεφάλαιο ακολουθούσε τη φιλοσοφία του προγραμματισμού που είχαμε αναπτύξει σε όλο το προηγούμενο βιβλίο.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #4 2 Γενικά Στο Τετράδιο #4 του Εργαστηρίου θα αναφερθούμε σε θέματα διαχείρισης πινάκων

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

Συναρτησιακός Προγραμματισμός. Εισαγωγικές Έννοιες

Συναρτησιακός Προγραμματισμός. Εισαγωγικές Έννοιες Συναρτησιακός Προγραμματισμός Εισαγωγικές Έννοιες Κίνητρο Οι συναρτησιακές γλώσσες προγραμματισμού προσφέρονται για «μαζικό» προγραμματισμό: Έχουν σαφείς μαθηματικές ιδιότητες που μπορούν να αξιοποιηθούν

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

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

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

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

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

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

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

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

Διαδικασιακός Προγραμματισμός Τμήμα ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΤΕ ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ Διαδικασιακός Προγραμματισμός Διάλεξη 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

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

Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας

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

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

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος. 1. Δώστε τον ορισμό του προβλήματος. 2. Σι εννοούμε με τον όρο επίλυση ενός προβλήματος; 3. Σο πρόβλημα του 2000. 4. Σι εννοούμε με τον όρο κατανόηση προβλήματος; 5. Σι ονομάζουμε χώρο προβλήματος; 6.

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΝΑΠΤΥΞΗ ΚΑΙ ΣΧΕΔΙΑΣΗ ΛΟΓΙΣΜΙΚΟΥ Η γλώσσα προγραμματισμού C ΕΡΓΑΣΤΗΡΙΟ 2: Εκφράσεις, πίνακες και βρόχοι 14 Απριλίου 2016 Το σημερινό εργαστήριο

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

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

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

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

Θεωρία Υπολογισμού Άρτιοι ΑΜ. Διδάσκων: Σταύρος Κολλιόπουλος. eclass.di.uoa.gr. Περιγραφή μαθήματος

Θεωρία Υπολογισμού Άρτιοι ΑΜ. Διδάσκων: Σταύρος Κολλιόπουλος. eclass.di.uoa.gr. Περιγραφή μαθήματος Περιγραφή μαθήματος Θεωρία Υπολογισμού Άρτιοι ΑΜ Σκοπός του μαθήματος είναι η εισαγωγή στη Θεωρία Υπολογισμού και στη Θεωρία Υπολογιστικής Πολυπλοκότητας (Θεωρία Αλγορίθμων). Διδάσκων: Σταύρος Κολλιόπουλος

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

Θεωρία Υπολογισμού Αρτιοι ΑΜ Διδάσκων: Σταύρος Κολλιόπουλος eclass.di.uoa.gr

Θεωρία Υπολογισμού Αρτιοι ΑΜ Διδάσκων: Σταύρος Κολλιόπουλος eclass.di.uoa.gr Θεωρία Υπολογισμού Άρτιοι ΑΜ Διδάσκων: Σταύρος Κολλιόπουλος eclass.di.uoa.gr Περιγραφή μαθήματος Σκοπός του μαθήματος είναι η εισαγωγή στη Θεωρία Υπολογισμού και στη Θεωρία Υπολογιστικής Πολυπλοκότητας

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf(%u\n, x); Β. unsigned char ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ Εξετάσεις Β Περιόδου 2015 (8/9/2015) ΟΝΟΜΑΤΕΠΩΝΥΜΟ:................................................................................ Α.Μ.:...............................................

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

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δρ. Κόννης Γιώργος Πανεπιστήμιο Κύπρου - Τμήμα Πληροφορικής Προγραμματισμός Στόχοι 1 Να περιγράψουμε τις έννοιες του Υπολογιστικού Προβλήματος και του Προγράμματος/Αλγορίθμου

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

Μηχανές Turing (T.M) I

Μηχανές Turing (T.M) I Μηχανές Turing (T.M) I Οι βασικές λειτουργίες μιας TM είναι: Διάβασε το περιεχόμενο του τρέχοντος κυττάρου Γράψε 1 ή 0 στο τρέχον κύτταρο Κάνε τρέχον το αμέσως αριστερότερο ή το αμέσως δεξιότερο κύτταρο

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

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

FORTRAN και Αντικειμενοστραφής Προγραμματισμός FORTRAN και Αντικειμενοστραφής Προγραμματισμός Παραδόσεις Μαθήματος 2016 Δρ Γ Παπαλάμπρου Επίκουρος Καθηγητής ΕΜΠ georgepapalambrou@lmentuagr Εργαστήριο Ναυτικής Μηχανολογίας (Κτίριο Λ) Σχολή Ναυπηγών

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

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια: Εργαστήριο 6: 6.1 Δομές Επανάληψης Βρόγχοι (Loops) Όταν θέλουμε να επαναληφθεί μια ομάδα εντολών τη βάζουμε μέσα σε ένα βρόχο επανάληψης. Το αν θα (ξανα)επαναληφθεί η εκτέλεση της ομάδας εντολών καθορίζεται

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

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα Ενότητες βιβλίου: 6.4, 6.7 Ώρες διδασκαλίας: 1 Τεχνικές σχεδίασης προγραμμάτων Στο βιβλίο γίνεται αναφορά σε μία τεχνική για την ανάπτυξη

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

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες.

Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες. Κεφάλαιο ΙV: Δείκτες και πίνακες. 4.1 Δείκτες. Η C, όπως έχουμε αναφέρει, είναι μια γλώσσα προγραμματισμού υψηλού επιπέδου η οποία αναπτύχθηκε για πρώτη φορά το 1972 από τον Dennis Ritchie στα AT&T Bell

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

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

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

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

Αριθμητική Ανάλυση & Εφαρμογές

Αριθμητική Ανάλυση & Εφαρμογές Αριθμητική Ανάλυση & Εφαρμογές Διδάσκων: Δημήτριος Ι. Φωτιάδης Τμήμα Μηχανικών Επιστήμης Υλικών Ιωάννινα 2017-2018 Υπολογισμοί και Σφάλματα Παράσταση Πραγματικών Αριθμών Συστήματα Αριθμών Παράσταση Ακέραιου

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

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

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ Διάλεξη 6: Διαχείριση Μνήμης & Δυναμικές Δομές Δεδομένων Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Δυναμικές Δομές Δεδομένων Γενικά Δυναμική Δέσμευση/Αποδέσμευση Μνήμης Δομή τύπου structure

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

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

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2 «Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 2 Γενικά Στο Εργαστήριο αυτό θα αναλύσουμε τη χρήση της βασικής εντολής ελέγχου ροής

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού

Εισαγωγή στην επιστήμη των υπολογιστών. Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού Εισαγωγή στην επιστήμη των υπολογιστών Λογισμικό Υπολογιστών Κεφάλαιο 9ο Γλώσσες Προγραμματισμού 1 Εξέλιξη Οι γλώσσες προγραμματισμού είναι σύνολα από προκαθορισμένες λέξεις οι οποίες συνδυάζονται σε προγράμματα

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

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ ΣΤΑΘΕΡΕΣ είναι τα μεγέθη που δεν μεταβάλλονται κατά την εκτέλεση ενός αλγόριθμου. Εκτός από τις αριθμητικές σταθερές (7, 4, 3.5, 100 κλπ), τις λογικές σταθερές (αληθής και ψευδής)

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

Αναδρομή Ανάλυση Αλγορίθμων

Αναδρομή Ανάλυση Αλγορίθμων Αναδρομή Ανάλυση Αλγορίθμων Παράδειγμα: Υπολογισμός του παραγοντικού Ορισμός του n! n! = n x (n - 1) x x 2 x 1 Ο παραπάνω ορισμός μπορεί να γραφεί ως n! = 1 αν n = 0 n x (n -1)! αλλιώς Παράδειγμα (συνέχ).

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

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

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

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

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

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

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

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ

Επανάληψη για τις Τελικές εξετάσεις. (Διάλεξη 24) ΕΠΛ 032: ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕΘΟΔΩΝ ΕΠΙΛΥΣΗΣ ΠΡΟΒΛΗΜΑΤΩΝ Επανάληψη για τις Τελικές εξετάσεις (Διάλεξη 24) Εισαγωγή Το μάθημα EPL032 έχει ως βασικό στόχο την επίλυση προβλημάτων πληροφορικής με την χρήση της γλώσσας προγραμματισμού C. Επομένως πρέπει: Nα κατανοήσετε

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

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ

ΕΡΩΤΗΣΕΙΣ ΑΞΙΟΛΟΓΗΣΗΣ Α) Να γράψετε στο τετράδιό σας τον αριθμό κάθε πρότασης και δίπλα το γράμμα "Σ", αν είναι σωστή, ή το γράμμα "Λ", αν είναι λανθασμένη. (Μονάδες 25) 1. Ένα αδόμητο πρόβλημα είναι ταυτόχρονα και ανοικτό

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

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

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

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

Προγραµµατισµός Η/Υ. Μέρος2

Προγραµµατισµός Η/Υ. Μέρος2 Προγραµµατισµός Η/Υ Μέρος2 Περιεχόμενα Επανάληψη Βασικών Σύμβολων Διαγραμμάτων Ροής Αλγόριθμος Ψευδοκώδικας Παραδείγματα Αλγορίθμων Γλώσσες προγραμματισμού 2 Επανάληψη Βασικών Σύμβολων Διαγραμμάτων Ροής

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

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ )

Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ ) Κεφάλαιο 2 ο Βασικές Έννοιες Αλγορίθμων (σελ. 25 48) Τι είναι αλγόριθμος; Γ ΛΥΚΕΙΟΥ Αλγόριθμος είναι μία πεπερασμένη σειρά ενεργειών, αυστηρά καθορισμένων και εκτελέσιμων σε πεπερασμένο χρονικό διάστημα,

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

Ψευδοκώδικας. November 7, 2011

Ψευδοκώδικας. November 7, 2011 Ψευδοκώδικας November 7, 2011 Οι γλώσσες τύπου ψευδοκώδικα είναι ένας τρόπος περιγραφής αλγορίθμων. Δεν υπάρχει κανένας τυπικός ορισμός της έννοιας του ψευδοκώδικα όμως είναι κοινός τόπος ότι οποιαδήποτε

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

Αριθμητική Ανάλυση και Εφαρμογές

Αριθμητική Ανάλυση και Εφαρμογές Αριθμητική Ανάλυση και Εφαρμογές Διδάσκων: Δημήτριος Ι. Φωτιάδης Τμήμα Μηχανικών Επιστήμης Υλικών Ιωάννινα 07-08 Πεπερασμένες και Διαιρεμένες Διαφορές Εισαγωγή Θα εισάγουμε την έννοια των διαφορών με ένα

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

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

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

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

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

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

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

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19 Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών Κεφ. 2 Θεωρητική Επιστήμη Υπολογιστών 2.3.1.1 Έννοια προγράμματος Τι είναι πρόγραμμα και τι προγραμματισμός; Πρόγραμμα είναι το σύνολο εντολών που χρειάζεται

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

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 3 : Γλώσσες προγραμματισμού. Δρ.

Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου. Πληροφορική II. Ενότητα 3 : Γλώσσες προγραμματισμού. Δρ. 1 Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου Πληροφορική II Ενότητα 3 : Γλώσσες προγραμματισμού Δρ. Γκόγκος Χρήστος 2 Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου Τμήμα Χρηματοοικονομικής

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

Αλγόριθμοι για αυτόματα

Αλγόριθμοι για αυτόματα Κεφάλαιο 8 Αλγόριθμοι για αυτόματα Κύρια βιβλιογραφική αναφορά για αυτό το Κεφάλαιο είναι η Hopcroft, Motwani, and Ullman 2007. 8.1 Πότε ένα DFA αναγνωρίζει κενή ή άπειρη γλώσσα Δοθέντος ενός DFA M καλούμαστε

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

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

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

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

K15 Ψηφιακή Λογική Σχεδίαση 3: Προτασιακή Λογική / Θεωρία Συνόλων

K15 Ψηφιακή Λογική Σχεδίαση 3: Προτασιακή Λογική / Θεωρία Συνόλων K15 Ψηφιακή Λογική Σχεδίαση 3: Προτασιακή Λογική / Θεωρία Συνόλων Γιάννης Λιαπέρδος TEI Πελοποννήσου Σχολή Τεχνολογικών Εφαρμογών Τμήμα Μηχανικών Πληροφορικής ΤΕ Στοιχεία προτασιακής λογικής Περιεχόμενα

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

Κεφάλαιο 1 Διαδικαστικός και δηλωτικός προγραμματισμός

Κεφάλαιο 1 Διαδικαστικός και δηλωτικός προγραμματισμός Κεφάλαιο 1 Διαδικαστικός και δηλωτικός προγραμματισμός Σύνοψη Στο κεφάλαιο αυτό γίνεται συγκριτική παρουσίαση, κυρίως μέσω απλών παραδειγμάτων, του διαδικαστικού και του δηλωτικού προγραμματισμού, δύο

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

Ηλεκτρονικοί Υπολογιστές

Ηλεκτρονικοί Υπολογιστές ΑΡΙΣΤΟΤΕΛΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΟΝΙΚΗΣ ΑΝΟΙΧΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Ενότητα 5: Εντολές Αντικατάστασης, Συναρτήσεις και Σχόλια στη C++ Ζαχαρούλα Ανδρεοπούλου Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται

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

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

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

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 1: Εισαγωγή Ποιος είμαι εγώ! 2 Ναύπλιο, 4/1976-9/1993 Πάτρα, 9/1993-6/2004 Williamsburg, VA, USA, 7/2004-7/2006 Μυτιλήνη, 10/2006-2/2007 Βόλος, 2/2007 - H Υπεύθυνη των

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

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

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

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

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

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C Master Mind εφαρμογή στη γλώσσα προγραμματισμού C Φεβρουάριος/Μάρτιος 2013 v. 0.1 Master-mind: κανόνες παιχνιδιού Στο master mind χρειάζεται να παράγονται κάθε φορά 4 τυχαία σύμβολα από ένα πλήθος 6 διαφορετικών

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 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. Εισαγωγή Χαρακτηριστικά της γλώσσας Τύποι δεδοµένων Γλώσσα προγραµµατισµού

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

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

Προγραμματισμός Ι (ΗΥ120) Προγραμματισμός Ι (ΗΥ120) Διάλεξη 9: Συναρτήσεις Ορισμός συναρτήσεων () { /* δήλωση μεταβλητών */ /* εντολές ελέγχου/επεξεργασίας */ o Μια συνάρτηση ορίζεται δίνοντας

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

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ Εισαγωγή στην γλώσσα προγραμματισμού Ακαδημαϊκό έτος 2016-2017, Εαρινό εξάμηνο Οι σημειώσεις βασίζονται στα συγγράμματα: A byte of Python (ελληνική

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

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β

ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β ΤΕΜ-101 Εισαγωγή στους Η/Υ Εξεταστική Ιανουαρίου 2011 Θέματα Β 1. (10 μον.) Απαντήστε σωστό ή λάθος στις παρακάτω ερωτήσεις (αʹ) _2togo είναι έγκυρο όνομα μεταβλητής (βʹ) Αν p είναι δείκτης στο πρώτο στοιχείο

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

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

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

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

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

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

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

Διδάσκων: Παναγιώτης Ανδρέου

Διδάσκων: Παναγιώτης Ανδρέου Διάλεξη 7: Διαχείριση Μνήμης,Δυναμικές Δομές Δεδομένων, Αναδρομή Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: Εισαγωγή στις έννοιες: - Δυναμικές Δομές Δεδομένων Γενικά - Δυναμική Δέσμευση/Αποδέσμευση

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

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

Εισαγωγή στον Προγραμματισμό Εισαγωγή στον Προγραμματισμό Εισαγωγή Δημήτρης Μιχαήλ Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο Ακ. Έτος 2012-2013 Βιβλιογραφία "C Προγραμματισμός", Deitel & Deitel, Πέμπτη Έκδοση, Εκδόσεις

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

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

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

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

ΕΠΛ 001: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Προγραμματισμός

ΕΠΛ 001: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ. Προγραμματισμός ΕΠΛ 001: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Προγραμματισμός Στόχοι 1 Να περιγράψουμε τις έννοιες του υπολογιστικού προβλήματος και του αλγορίθμου. Να περιγράψουμε την πορεία από ένα υπολογιστικό πρόβλημα

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

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών 6

Αυτόματα. Παράδειγμα: πωλητής καφέ (iii) Παράδειγμα: πωλητής καφέ (iv) Εισαγωγή στην Επιστήμη των Υπολογιστών 6 Εισαγωγή στην Επιστήμη των Υπολογιστών 3η ενότητα: Αυτόματα και Τυπικές Γραμματικές http://www.corelab.ece.ntua.gr/courses/ Αυτόματα Τρόπος κωδικοποίησης αλγορίθμων. Τρόπος περιγραφής συστημάτων πεπερασμένων

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

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

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

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

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

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

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

Εισαγωγή στη Γλώσσα ML

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

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

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην. I (JAVA) Ονοματεπώνυμο: Α. Μ.: + ΦΥΛΛΟ ΑΠΑΝΤΗΣΕΩΝ Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην. + 1 ΦΥΛΛΟ ΑΠΑΝΤΗΣΕΩΝ (σελ. 2/3) 2 ΦΥΛΛΟ ΑΠΑΝΤΗΣΕΩΝ (σελ. 3/3)

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

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

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

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

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

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

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

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

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

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

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ Εισαγωγή στον Προγραµµατισµό Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ Συναρτήσεις 19.11.16 Β. Ντουφεξή 2 Προβλήματα: Οσο μεγαλώνουν τα προγράμματα, γίνονται πιο πολύπλοκα.

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

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

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

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

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

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

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1 Γλώσσα Προγραμματισμού C++ ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1 Τα δεδομένα Οι σταθερές Τα δεδομένα (πληροφορίες-data) είναι απαραίτητα στοιχεία ενός προγράμματος, καθώς οι βασικές λειτουργίες ενός προγράμματος είναι

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

Outline. 4 Object-Oriented Programming

Outline. 4 Object-Oriented Programming Προγραμματισμός Ηλεκτρονικών Υπολογιστών Φιλοσοφίες γλωσσών προγραμματισμού Διδάσκων: Στάθης Ζάχος Επιμέλεια Διαφανειών: Μάκης Αρσένης CoReLab ΣΗΜΜΥ - Ε.Μ.Π. Ιανουάριος 2016 ιδάσκων: Στάθης Ζάχος ( CoReLab

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

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

Δομές Δεδομένων και Αλγόριθμοι Δομές Δεδομένων και Αλγόριθμοι Χρήστος Γκόγκος ΤΕΙ Ηπείρου Χειμερινό Εξάμηνο 2014-2015 Παρουσίαση 19 Hashing - Κατακερματισμός 1 / 23 Πίνακες απευθείας πρόσβασης (Direct Access Tables) Οι πίνακες απευθείας

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

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ ΚΕΦΑΛΑΙΟ 10 Όπως είδαμε και σε προηγούμενο κεφάλαιο μια από τις βασικότερες τεχνικές στον Δομημένο Προγραμματισμό είναι ο Τμηματικός Προγραμματισμός. Τμηματικός προγραμματισμός ονομάζεται η τεχνική σχεδίασης

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

ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΑ ΣΥΣΤΗΜΑΤΑ

ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΑ ΣΥΣΤΗΜΑΤΑ ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΑ ΣΥΣΤΗΜΑΤΑ Δρ. Κουζαπάς Δημήτριος Πανεπιστήμιο Κύπρου - Τμήμα Πληροφορικής Προγραμματισμός Στόχοι 1 Να περιγράψουμε τις έννοιες του Υπολογιστικού Προβλήματος

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

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

ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΥΠΟΛΟΓΙΣΤΩΝ Εισαγωγή ΒΑΣΙΚΕΣ ΕΝΝΟΙΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΥΠΟΛΟΓΙΣΤΩΝ Όπως για όλες τις επιστήμες, έτσι και για την επιστήμη της Πληροφορικής, ο τελικός στόχος της είναι η επίλυση προβλημάτων. Λύνονται όμως όλα τα προβλήματα;

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

Κεφάλαιο 7: Υπορουτίνες

Κεφάλαιο 7: Υπορουτίνες Κεφάλαιο 7: Υπορουτίνες Αρχές Γλωσσών Προγραμματισμού και Μεταφραστών Ορισμός Αφαίρεση με χρήση υπορουτινών (subroutine abstraction) είναι η αντιστοίχιση ενός συνόλου εισόδων σε ένα σύνολο εξόδων που μπορεί

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

Ο αλγόριθμος πρέπει να τηρεί κάποια κριτήρια

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

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

ΑΕΠΠ Ερωτήσεις θεωρίας

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

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

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

Η γλώσσα προγραμματισμού C Η γλώσσα προγραμματισμού C Εισαγωγή στη C Λίγα λόγια για την C Γλώσσα προγραμματισμού υψηλού επιπέδου. Σχεδιάστηκε και υλοποιήθηκε από τον Dennis Richie στις αρχές της δεκαετίας του 1970 (Bell Labs). Η

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