Βασικές Αρχές Προγραμματισμού Κεφάλαιο 1 Εισαγωγή
Προβλήματα Πρόβλημα: Μία κατάσταση η οποία χρήζει αντιμετώπισης, απαιτεί λύση, η δε λύση της οποίας δεν είναι γνωστή, ούτε προφανής Π.χ. Το πρόβλημα του 2000 (millennium bug) αναφέρονταν στο ότι η πλειοψηφία του λογισμικού που αναπτύχθηκε στη διάρκεια του προηγούμενου αιώνα, χρησιμοποιούσε 2 ψηφία για την αναπαράσταση του έτους (1977 77) 2/24
Κατηγορίες Προβλημάτων Με βάση την δυνατότητα επίλυσης: Επιλύσιμα: Η λύσητουςείναιγνωστήήμπορείνααποδειχθείότιέχουν λύση Ανοικτά: Δεν υπάρχει διατυπωμένη λύση αλλά δεν έχει αποδειχθεί ότι δεν λύνονται Άλυτα: Έχει αποδειχθεί ότι δεν έχουν λύση Με βάση το ζητούμενο: Απόφασης: Το ζητούμενο του προβλήματος είναι η λήψη μιας απόφασης (π.χ. Αν ο αριθμός 11 είναι πρώτος ή όχι) Υπολογιστικά: Το ζητούμενο είναι το αποτέλεσμα μιας σειράς υπολογισμών (π.χ. Να βρεθεί η δόση για πενταετές δάνειο 40000 με επιτόκιο 4,82%) Βελτιστοποίησης: Τοζητούμενοείναιηεύρεσηενόςαποτελέσματος που ελαχιστοποιεί ή μεγιστοποιεί κάποια κριτήρια (π.χ. Το πρόβλημα του πλανόδιου πωλητή) 3/24
Προβλήματα και Η/Υ Λόγοι επίλυσης προβλημάτων μέσω Η/Υ Ταχύτητα εκτέλεσης πράξεων (π.χ. Ένας Η/Υ μεεπεξεργαστήστα3ghz μπορεί να εκτελεί 3,000,000,000 απλές πράξεις ανά δευτερόλεπτο) Μεγάλο πλήθος δεδομένων Πολυπλοκότητα υπολογισμών Επαναληπτικότητα διαδικασιών Πρωταρχικές λειτουργίες Η/Υ Πρόσθεση: βασική αριθμητική πράξη Σύγκριση: βασική λογική πράξη Μεταφορά δεδομένων 4/24
Αλγόριθμοι Αλγόριθμος: Πεπερασμένη σειρά ενεργειών, αυστηρά καθορισμένων και εκτελέσιμων σε πεπερασμένο χρόνο, που επιλύουν ένα πρόβλημα Χαρακτηριστικά Αλγορίθμων Είσοδος (Input): Δεδομένα που δίνονται στον αλγόριθμο Έξοδος (Output): Δεδομένα που ο αλγόριθμος παράγει ως αποτέλεσμα Καθοριστικότητα: Κάθε εντολή πρέπει να καθορίζεται με πλήρη σαφήνεια Αποτελεσματικότητα: Κάθε εντολή πρέπει να είναι απλή και να εκτελείται σε εύλογο χρονικό διάστημα Περατότητα: Ο αλγόριθμος πρέπει να τερματίζει μετά από πεπερασμένο αριθμό βημάτων 5/24
Αναπαράσταση Αλγορίθμων Ένας αλγόριθμος μπορεί να αναπαρασταθεί με διάφορους τρόπους Ελεύθερο κείμενο Ανεπεξέργαστος και αδόμητος τρόπος παρουσίασης Δεν εξασφαλίζει ούτε την καθοριστικότητα ούτε την αποτελεσματικότητα Διαγραμματικές Τεχνικές Γραφικός τρόπος παρουσίασης Ο πιο συνηθισμένος είναι με τα διαγράμματα ροής Φυσική γλώσσα κατά βήματα Π.χ. Ψευδοκώδικας Χρειάζεται προσοχή για να μην παραβιαστεί το κριτήριο της καθοριστικότητας Κωδικοποίηση Συγγραφή του αλγορίθμου σε μια γλώσσα προγραμματισμού 6/24
Πληροφορική Πληροφορική: Η επιστήμη που μελετά τους αλγορίθμους από τις ακόλουθες σκοπιές: Υλικού (Hardware): Η ταχύτητα εκτέλεσης ενός αλγορίθμου επηρεάζεται από τις διάφορες τεχνολογίες των τμημάτων του υλικού Γλωσσών Προγραμματισμού: Το είδος της γλώσσας προγραμματισμού που θα χρησιμοποιηθεί επηρεάζει την αποδοτικότητα του αλγορίθμου Θεωρητική: Έρευνα θεωρητικών θεμάτων όπως ή ύπαρξη ή όχι λύσης για ένα πρόβλημα Αναλυτική: Μελέτη του πλήθους των υπολογιστικών πόρων που απαιτούνται από έναν αλγόριθμο 7/24
Προγράμματα & Προγραμματισμός Η/Υ Πρόγραμμα Η/Υ (Computer Program): Μια οργανωμένη λίστα οδηγιών που όταν εκτελείται από έναν υπολογιστή, αυτός συμπεριφέρεται με έναν συγκεκριμένο προσχεδιασμένο τρόπο Προγραμματισμός Η/Υ (Computer Programming): Η διαδικασία της δημιουργίας ενός προγράμματος που επιλύει ένα συγκεκριμένο πρόβλημα. Ο Προγραμματισμός περιλαμβάνει δύο βήματα: Σχεδιασμός της λογικής που επιλύει το πρόβλημα Κωδικοποίησης της λογικής σε μια γλώσσα προγραμματισμού Γλώσσες Προγραμματισμού (Programming Languages): Τεχνητές γλώσσες κωδικοποίησης προγραμμάτων Η/Υ Μεγάλη σαφήνεια και ακρίβεια Γεφυρώνουν το χάσμα ανάμεσα στις γλώσσες Η/Υ και ανθρώπων 8/24
Τεχνικές Προγραμματισμού Οι Τεχνικές Προγραμματισμού (Programming Techniques or Paradigms) αποτελούν τρόπους αποδοτικής εκπόνησης της διαδικασίας προγραμματισμού Αναφέρονται στο πώς μια λογική που επιλύει ένα πρόβλημα θα πρέπει να μελετηθεί ώστε να γίνει πρόγραμμα Καθορίζουν τον τρόπο με τον οποίο ο προγραμματιστής αντιλαμβάνεται τα τμήματα του προγράμματος, τιςεξαρτήσειςτους και τον τρόπο εκτέλεσης τους. Συνήθως συνδέονται με κάποια γλώσσα προγραμματισμού, αν και υπάρχουν γλώσσες που υλοποιούν περισσότερες της μίας τεχνικές προγραμματισμού 9/24
Βασικές Τεχνικές Προγραμματισμού Μη δομημένος Προγραμματισμός (Unstructured programming) Ο κώδικας περιέχεται σε ένα συνεχόμενο μπλοκ εντολών. (π.χ. Basic) Διαδικαστικός ή Προστακτικός Προγραμματισμός (Procedural or Imperative programming) Ο κώδικας έχει τη μορφή μιας ακολουθίας βημάτων τα οποία πρέπει να εκτελεστούν για να περιέλθει το σύστημα στην επιθυμητή κατάσταση Στα βήματα περιλαμβάνονται κλήσεις σε διαδικασίες (π.χ. Pascal, C) Δομημένος ή Τμηματικός Προγραμματισμός (Structured or Modular programming) Υποσύνολο του διαδικαστικού προγραμματισμού Ακολουθείται μια top-down προσέγγιση διαχωρισμού της δομής σε τμήματα Ευκολότερη ανάπτυξη, κατανόηση και επέκταση κώδικα 10/24
Προηγμένες Τεχνικές Προγραμματισμού Συναρτησιακός Προγραμματισμός (Functional programming) Αντικειμενοστραφής Προγραμματισμός (object-oriented programming) Οπτικός Προγραμματισμός (Visual programming) Αυτόματος Προγραμματισμός (Automatic programming) Ταυτόχρονος Προγραμματισμός (Concurrent programming) Λογικός Προγραμματισμός (Logic programming) 11/24
Συναρτησιακός Προγραμματισμός Βασίζεται στην ιδέα ότι η επίλυση ενός προβλήματος μπορεί να θεωρηθεί ως η αποτίμηση μαθηματικών συναρτήσεων Δεν χρησιμοποιεί τη λογική των καταστάσεων που αλλάζουν με την εκτέλεση εντολών, όπως ο Προστακτικός προγραμματισμός Επικεντρώνεται σε αλυσίδες συναρτήσεων που η έξοδος της μίας χρησιμοποιείται ως είσοδος σε κάποιες άλλες Η έννοια της αναδρομής χρησιμοποιείται πολύ συχνά σε αυτό το προγραμματιστικό μοντέλο Οι γλώσσες αυστηρού συναρτησιακού προγραμματισμού χρησιμοποιούνται περισσότερο για ερευνητικούς σκοπούς Παραδείγματα γλωσσών που χρησιμοποιούνται από ευρύτερο κοινό: Lisp, R (στατιστική), K (οικονομική ανάλυση), κ.α. 12/24
Αντικειμενοστραφής Προγραμματισμός Χρησιμοποιεί την έννοια της αφαίρεσης (abstraction) για τη δημιουργία μοντέλων που βασίζονται στον πραγματικό κόσμο. Κύριες έννοιες κλάσεις/τάξεις (ιδιότητες & μέθοδοι) αντικείμενα. Χρησιμοποιεί διάφορες τεχνικές: Πέρασμα μηνυμάτων (Message passing) Κληρονομικότητα (Inheritance) Απόκρυψη (Encapsulation) Πολυμορφισμός (Polymorphism) Π.χ. C++, SmallTalk, Java, C# 13/24
Οπτικός Προγραμματισμός Δημιουργία προγράμματος σε γλώσσα οπτικού προγραμματισμού (Visual Programming Language ή VPL) και όχι σε απλό κείμενο Χρήση οπτικών εκφράσεων, γραφικών συμβόλων και τμημάτων κειμένου που τοποθετούνται στον χώρο και συνδέονται μεταξύ τους. Τα βασικά σύμβολα είναι τα κουτιά (boxes) και τα βέλη (arrows) Βήματα Εκτέλεσης: Δημιουργία προγράμματος σε μια VPL Έλεγχοι εγκυρότητας του προγράμματος Μεταγλώττιση του σε γλώσσα μηχανής ή άλλη γλώσσα προγραμματισμού Προσομοίωση της εκτέλεσης του προγράμματος 14/24
Αυτόματος Προγραμματισμός Ο Αυτόματος Προγραμματισμός βασίζεται στην παραγωγή του κώδικα από τον υπολογιστή και όχι από τον άνθρωπο Ο υπολογιστής δέχεται από τον άνθρωπο τις προδιαγραφές (specifications) του προγράμματος σε γλώσσες υψηλού επιπέδου ΟΑ. Π. είναι συνδυασμός Τεχνητής Νοημοσύνης με Μεταγλωττιστές Χρειάζονται τεχνικές ΤΝ για αναγνώριση προτύπων αναζήτηση για την εύρεση του συνδυασμού των προγραμματιστικών τμημάτων Χρειάζονται τεχνικές Μεταγλωττιστών για σχεδίαση του προγράμματος παραγωγή και βελτιστοποίηση του κώδικα 15/24
Ταυτόχρονος Προγραμματισμός Διακρίνεται σε Παράλληλο Προγραμματισμό Κατανεμημένο Προγραμματισμό Ασχολείται με τον σχεδιασμό, την υλοποίηση και την ρύθμιση προγραμμάτων που εκτελούνται σε πολλαπλούς Η/Υ -CPU Σκοπός του ταυτόχρονου προγραμματισμού είναι η παραλληλοποίηση των σειριακών προγραμμάτων. Υπάρχουν δύο προσεγγίσεις: Τα σημαντικότερα ζητήματα στον ταυτόχρονο προγραμματισμό είναι Η επικοινωνία μεταξύ των προγραμμάτων που εκτελούνται ταυτόχρονα Η εξισορόπηση του φόρτου εργασίας (load balancing) Ο διαμοιρασμός κοινόχρηστων πόρων 16/24
Λογικός Προγραμματισμός Ένα πρόγραμμα αποτελείται από τα τμήματα της Λογικής και του Ελέγχου Στις συμβατικές γλώσσες ο προγραμματιστής αναπτύσσει και τα δύο Στον Λογικό Προγραμματισμό ασχολείται μόνο με το τμήμα της Λογικής Τα Λογικά προγράμματα αποτελούνται από ένα σύνολο προτάσεων (clauses) που περιγράφουν την υπάρχουσα γνώση Π.χ. Προτάσεις Horn A B1,B2,..,Bn Ο χρήστης θέτει ερωτήσεις, τις οποίες το σύστημα προσπαθεί να απαντήσει με βάση την γνώση που περιέχει Μηχανισμός Ενοποίησης (unification): προσπαθεί να καταστήσει δύο όρους ταυτόσημους με τις ελάχιστες αναθέσεις τιμών σε μεταβλητές Π.χ. Prolog 17/24
Υλοποίηση Προγραμμάτων Βήματα υλοποίησης ενός προγράμματος: Συγγραφή πηγαίου κώδικα (source code) Δημιουργία αρχείου κειμένου (.c) που περιέχει τις εντολές του προγράμματος Δημιουργείται είτε σε οποιοδήποτε κειμενογράφο (π.χ. Wordpad, Textpad) ή στον συντάκτη (editor) ολοκληρωμένων περιβαλλόντων ανάπτυξης (IDE), όπως είναι το DEV C/C++ Μεταγλώττιση (compilation) πηγαίου κώδικα Διαδικασία μετάφρασης του πηγαίου κώδικα σε κώδικα αντικειμένου (.obj) Υλοποιείται από εξειδικευμένα προγράμματα (μεταγλωττιστές - compilers) Γίνεται έλεγχος για συντακτικά και γραμματικά λάθη στον πηγαίο κώδικα Σύνδεση τμημάτων (linking) Πραγματοποιείται από ειδικά προγράμματα (συνδέτες - linkers) Γίνεται η σύνδεση όλων των αρχείων κώδικα αντικειμένου και των εξωτερικών βιβλιοθηκών σε ένα ενιαίο εκτελέσιμο αρχείο Γίνεται έλεγχος για βιβλιοθήκες και τμήματα κώδικα που λείπουν Εκτέλεση (execution) για έλεγχο καλής λειτουργίας 18/24
Διάγραμμα Υλοποίησης Προγράμματος Αρχή Επεξεργασία πηγαίου κώδικα example.c Γραμματικά Συντακτικά Μεταγλώττιση πηγαίου κώδικα Βιβλιοθήκες Αρχεία Obj ναι Λάθη όχι Σύνδεση example.obj Σύνδεσης ναι Λάθη όχι example.exe Λογικά Εκτέλεση ναι Λάθη όχι Τέλος 19/24
Βασικές Έννοιες Προγραμματισμού Τα συστατικά που συνθέτουν ένα πρόγραμμα είναι τα ακόλουθα: Τύποι Δεδομένων Μεταβλητές Σταθερές Εντολές Αναγνωριστικά (identifiers): Τα ονόματα που χρησιμοποιεί η γλώσσα για να αναφέρεται στα επί μέρους στοιχεία της. (π.χ. Το όνομα μιας μεταβλητής ή ενός υποπρογράμματος) 20/24
Μεταβλητές myvar 12 0 56 129 Τα δεδομένα, οι ενδιάμεσες πράξεις και τα αποτελέσματα ενός προγράμματος αποθηκεύονται προσωρινά στην μνήμη RAM του Η/Υ Η διαχείριση της RAM είναι μέλημα της γλώσσας προγραμματισμού Για να χρησιμοποιηθεί ένα τμήμα (θέση) της RAM θα πρέπει να του δοθεί ένα όνομα, ώστε να μπορεί το πρόγραμμα να αναφέρεται σε αυτό Τα ονόματα των θέσεων μνήμης σε ένα πρόγραμμα ονομάζονται μεταβλητές (variables) Μεταβλητή είναι το όνομα μιας συγκεκριμένης θέσης μνήμης, που έχουμε δεσμεύσει. Το περιεχόμενο της συγκεκριμένης θέσης ονομάζεται τιμή της μεταβλητής. Υπάρχουν διάφορα είδη μεταβλητών σε αναλογία με τα διάφορα είδη τύπων δεδομένων (π.χ. Ακέραιες μεταβλητές) 21/24
Σταθερές Οι σταθερές είναι προκαθορισμένες τιμές που δεν μεταβάλλονται κατά τη διάρκεια εκτέλεσης ενός προγράμματος Υπάρχουν αντίστοιχες σταθερές για κάθε τύπο δεδομένων Ακέραια σταθερά: 202 Πραγματική σταθερά: 3.14 Σταθερά Χαρακτήρα: z Οι σταθερές μπορούν είτε να χρησιμοποιούνται απ ευθείας μέσα στο πρόγραμμα (π.χ. Myvar m ) ή να τους αποδίδεται κάποιο όνομα στην αρχή του προγράμματος (π.χ. PI: 3.1415926) και στη συνέχεια να χρησιμοποιούνται μέσω του ονόματος τους (π.χ. Mysecondvar PI) 22/24
Εντολές Εντολή είναι μια φράση της γλώσσας προγραμματισμού που αναγκάζει τον υπολογιστή να εκτελέσει μια συγκεκριμένη λειτουργία Κάθε εντολή έχει μια αυστηρά καθορισμένη σύνταξη, που ορίζεται από την ίδια τη γλώσσα Οι εντολές επιτελούν διάφορες λειτουργίες Εκτέλεση πράξης Απόδοση τιμής Εμφάνιση μηνύματος στην οθόνη Εγγραφή στο δίσκο κ.α. Το πρόγραμμα αποτελείται από μια ακολουθία εντολών που εκτελούνται σειριακά εκτός και αν κάποια εντολή αλλάξει τη σειρά εκτέλεσης Τα προγράμματα μπορεί να είναι ενιαία ή να αποτελούνται από περισσότερα τμήματα (υποπρογράμματα) 23/24