ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος 2001-2002 ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #2
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 2 Γενικά Στο Εργαστήριο αυτό θα αναλύσουμε τη χρήση της βασικής εντολής ελέγχου ροής <if (Συνθήκη) Πρόταση_1 Πρόταση_2> 1, καθώς και τη σύνταξη και κλήση συναρτήσεων (functions) που ορίζονται από το χρήστη Πιο συγκεκριμένα, και μέσω δύο παραδειγμάτων που παρατίθενται στη συνέχεια, αναλύεται η χρήση της εντολής if, με τρόπο που να προσεγγίζει την ανθρώπινη σκέψη σε περιπτώσεις λήψης αποφάσεων με δύο ή παραπάνω επιλογές, καθώς και η χρήση συναρτήσεων για επίλυση προβλημάτων (πχ, για υπολογισμό μαθηματικών σχέσεων, φυσικών μεγεθών, κλπ) Η Εντολή Ελέγχου Ροής (if ) Στη γενική της μορφή, μια τέτοια πρόταση (εντολή), περιέχει έναν αριθμό υπο-προτάσεων, από τις οποίες μόνο μία επιλέγεται για εκτέλεση Οι υπο-προτάσεις αυτές συνήθως αφορούν εναλλακτικές ενέργειες Παράδειγμα (ψευδοκώδικας): if (ο βαθμός του φοιτητή είναι μεγαλύτερος ή ίσος με 5) τύπωσε προάγεται τύπωσε απορρίπτεται Εάν η συνθήκη (ο βαθμός του φοιτητή είναι μεγαλύτερος ή ίσος με 5) είναι αληθής (true), τότε εκτελείται η εντολή που τυπώνει το μήνυμα προάγεται και το πρόγραμμα συνεχίζει από την επόμενη εντολή (αγνοώντας το και ότι περιέχεται σε αυτό) Εάν η παραπάνω συνθήκη είναι ψευδής (false), τότε αγνοείται η εντολή που τυπώνει το μήνυμα προάγεται κι εκτελείται η εντολή που τυπώνει το μήνυμα απορρίπτεται (αυτή δηλαδή που περιέχεται στο ) Παράδειγμα (σε C, παρατηρήστε ομοιότητες με τον ψευδοκώδικα) if ( vathmos >= 5 ) printf( "Προάγεται\n" ); printf( Απορρίπτεται\n ); 1 Οι εντολές ελέγχου ροής, ονομάζονται αλλιώς και «προτάσεις διακλάδωσης υπό συνθήκη», διότι η ροή του προγράμματος διακλαδώνεται ανάλογα με το αν η πρόταση είναι αληθής ή όχι
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 3 Στο Διάγραμμα Ροής που ακολουθεί, o ρόμβος δηλώνει ότι στο σημείο αυτό πρέπει να ληφθεί μια απόφαση Προσέξτε ότι ένας τέτοιος ρόμβος (σύμβολο απόφασης): Περιέχει μια συνθήκη που μπορεί να είναι αληθής ή ψευδής Ελέγχει την ορθότητα της συνθήκης αυτής κι επιλέγει την ανάλογη «διαδρομή» στη ροή του προγράμματος Το Διάγραμμα Ροής για το παράδειγμα της προηγούμενης σελίδας έχει ως εξής: ψευδής vathmos >= 5 αληθής Τύπωσε Απορρίπτεται τύπωσε Προάγεται Ορισμός και κλήση συναρτήσεων Η χρήση συναρτήσεων (functions) μας παρέχει έναν καλό τρόπο κατάτμησης (τμηματοποίησης) σύνθετων διεργασιών προγραμματισμού σε επιμέρους απλούστερες (και μικρότερες όσον αφορά το μέγεθος του αντίστοιχου κώδικα) διεργασίες Τα προγράμματά σας είναι προτιμότερο να περιέχουν πολλές και μικρές συναρτήσεις, παρά λίγες και μεγάλες, κυρίως για λόγους εύκολης ανάγνωσης και αποφυγής άσκοπων επαναλήψεων του κώδικα Έχουμε ήδη δει, ότι η χρήση κάποιων «έτοιμων» συναρτήσεων (πχ της printf από τη βασική βιβλιοθήκη εισόδου/εξόδου stdioh) μας επιτρέπει ουσιαστικά να χρησιμοποιούμε κώδικα που άλλοι έχουν ετοιμάσει για μας Στο εργαστήριο αυτό θα μάθουμε πώς να ορίζουμε, δηλώνουμε και καλούμε τις «δικές μας» συναρτήσεις Η κατάστρωση («χτίσιμο») μιας συνάρτησης περιλαμβάνει δύο στάδια: 1 Τη δήλωση της συνάρτησης (βλ θεωρία), τον καθορισμό δηλαδή του ονόματος της συνάρτησης και των παραμέτρων κλήσης της στην αρχή του προγράμματος (πριν το main) Ο ορισμός συνάρτησης έχει τη μορφή: <Τύπος Συν> <Όνομα Συν> (<τύπος_1> <όνομαπαραμέτρου_1>,, <τύπος_ν> <όνομαπαραμέτρου_ν);
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 4 2 Τον ορισμό της συνάρτησης (βλ θεωρία), την ανάπτυξη δηλαδή του σώματος εντολών της συνάρτησης μετά το τέλος του main Ένα τυπικό παράδειγμα προγράμματος που περιέχει μια συνάρτηση έχει την παρακάτω μορφή: #include <stdioh> int abs(int x); /* Δήλωση συνάρτησης */ main() int a, apol; Κύριο Πρόγραμμα apol= abs(a); /* Κλήση Συνάρτησης */ int abs(int x) /* Σώμα Εντολών Συνάρτησης */ return(παράσταση ή μεταβλητή); /*Επιστροφή τιμής στο κύριο πρόγραμμα */ Προσοχή: Πολύ σημαντικό στοιχείο στην κατανόηση των συναρτήσεων αποτελεί και η εντολή επιστροφής της τιμής της στο κύριο πρόγραμμα (πιο συγκεκριμένα, μια συνάρτηση επιστρέφει κάποια τιμή στο σημείο από το οποίο κλήθηκε) Η επιστροφή μιας τιμής γίνεται με την εντολή return(μεταβλητή ή παράσταση) Η επιστρεφόμενη μεταβλητή ή τιμή της παράστασης μετατρέπεται αυτόματα στον τύπο της συνάρτησης πριν επιστραφεί στο κύριο πρόγραμμα
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 5 Πρόβλημα 1 Να γραφεί ένα πρόγραμμα που να υπολογίζει τον μέγιστο μεταξύ δύο ακεραίων αριθμών x και y που εισάγονται από το χρήστη Σε περίπτωση που οι αριθμοί είναι ίσοι, θα πρέπει να τυπώνεται κατάλληλο μήνυμα στην οθόνη Ανάλυση του προβλήματος Στο συγκεκριμένο πρόβλημα καλούμαστε να επιλέξουμε τον μέγιστο μεταξύ δύο αριθμών Στον προγραμματισμό, οποιαδήποτε στιγμή κληθούμε να επιλέξουμε μεταξύ δύο ή περισσότερων εναλλακτικών περιπτώσεων, χρησιμοποιούμε τις εντολές ελέγχου ροής (διακλάδωσης) Στη συγκεκριμένη περίπτωση, το πρόγραμμα πρέπει να συγκρίνει τους δύο αριθμούς και να επιλέξει τον μεγαλύτερο από τους δύο (επιλογή μεταξύ δύο εναλλακτικών) Ακόμα, πρέπει να ελέγξουμε αν οι δύο αριθμοί είναι ίσοι (τρίτη επιλογή) Σκεπτόμενοι λοιπόν αλγοριθμικά, δουλεύουμε ως εξής: Σχεδιάζουμε τον πίνακα Σταθερών και Μεταβλητών, σύμφωνα με τα δεδομένα του προβλήματος Πίνακας Μεταβλητών & Σταθερών Ονομασία Μεταβλητή / Σταθερά Τύπος Τιμή x Μεταβλητή int Δίνεται από το χρήστη y Μεταβλητή int Δίνεται από το χρήστη Επιλέγουμε τους τελεστές που θα χρησιμοποιήσουμε για τη συνθήκη ελέγχου των δύο αριθμών Γράφουμε την εντολή (ή το σύνολο εντολών) που θα εκτελεστεί/στούν σε κάθε περίπτωση (για κάθε μία από τις εναλλακτικές που εξετάζουμε) Τυπώνουμε το αποτέλεσμα (κατάλληλο μήνυμα) στην οθόνη Προσοχή: Κάθε φορά που χρησιμοποιούμε εντολές ελέγχου (διακλάδωσης), είναι σημαντικό να λαμβάνουμε υπ όψιν μας όλες τις πιθανές τιμές που μπορεί να πάρει μια μεταβλητή, έτσι ώστε να μπορούμε να αντιμετωπίσουμε τυχόν λάθη ή ειδικές/ακραίες περιπτώσεις στις εισαγόμενες από το χρήστη τιμές Για παράδειγμα, στο συγκεκριμένο πρόβλημα, μια τέτοια περίπτωση θα μπορούσε να ήταν η εισαγωγή του ίδιου αριθμού Εάν δεν είχε προβλεφθεί στο πρόγραμμα που ακολουθεί μια τρίτη επιλογή (μετά τις δύο πρώτες και προφανείς συγκρίσεις), το πρόγραμμά μας θα έδινε λανθασμένα αποτελέσματα Ο τρόπος αυτός του προγραμματισμού ονομάζεται «αμυντικός προγραμματισμός» και χρησιμοποιείται για την αποφυγή σφαλμάτων που προκύπτουν από την εισαγωγή δεδομένων
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 6 Προτεινόμενη Λύση /* Προγραμματιστής : Όνομα Επώνυμο, Αριθμός Μητρώου Ημερομηνία συγγραφής : 27/3/2002 Λειτουργία Προγράμματος : Υπολογίζει το μέγιστο μεταξύ δύο αριθμών */ #include <stdioh> /* Βιβλιοθήκη βασικών συναρτήσεων Εισόδου/Εξόδου */ main() int x,y; /* Δήλωση Μεταβλητών */ printf("πληκτρολογήστε τους δύο αριθμούς x και y: "); scanf("%d%d", &x,&y); if (x>y) printf("\n Ο μεγαλύτερος αριθμός είναι ο %d",x); if (x<y) printf("\n Ο μεγαλύτερος αριθμός είναι ο %d",y); printf("\n Οι αριθμοί που πληκτρολογήσατε είναι ίσοι!");
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 7 Πρόβλημα 2 Να γραφεί πρόγραμμα που να υπολογίζει την απόλυτη τιμή ενός ακεραίου a, με τη χρήση της συνάρτησης int abs(int x) Η συνάρτηση θα πρέπει να δέχεται σαν όρισμα τον αριθμό που θα πληκτρολογεί ο χρήστης και να επιστρέφει την απόλυτη τιμή του αριθμού αυτού Η απόλυτη τιμή ενός αριθμού δίνεται από τη σχέση: α = α, α 0 -α, α<0 Ανάλυση του προβλήματος Το συγκεκριμένο πρόγραμμα μας εισάγει στη χρήση συναρτήσεων Οι συναρτήσεις είναι ένα χρήσιμο εργαλείο που βοηθά στη λεγόμενη αφαιρετικότητα των προγραμμάτων Σε πολλές περιπτώσεις, χρησιμοποιούμε συναρτήσεις όταν ένα block εντολών χρειάζεται να επαναληφθεί παραπάνω από μία φορά στο συνολικό κώδικα ενός προγράμματος Έτσι, για παράδειγμα, εάν η τιμή της Μηχανικής ενέργειας που υπολογίσαμε στο Τετράδιο #1, χρειαζόταν να υπολογισθεί και σε κάποιο άλλο σημείο του προγράμματός μας, θα μπορούσαμε να ορίσουμε μια συνάρτηση που να δέχεται ως ορίσματα τους γνωστούς όρους (μεταβλητές & σταθερές) και να επιστρέφει κάθε φορά την τιμή της Μηχανικής Ενέργειας Τη συνάρτηση αυτή θα την καλούσαμε σε οποιοδήποτε σημείο του προγράμματος χρειαζόταν ανάλογος υπολογισμός Εφαρμόζοντας τα όσα έχουμε μάθει, δουλεύουμε ως εξής: 1 Δηλώνουμε το όνομα της συνάρτησης που θα υπολογίζει την απόλυτη τιμή ενός αριθμού, όπως ακριβώς ορίζεται στο πρόβλημα 2 Δηλώνουμε τις μεταβλητές που θα χρησιμοποιήσουμε 3 Συνεχίζουμε με τον ορισμό της συνάρτησης, την ανάπτυξη δηλαδή του σώματος εντολών της (καθορίζουμε και τις τιμές που η συνάρτηση θα επιστρέφει στο κύριο πρόγραμμα) 4 Εισάγουμε τον αριθμό του οποίου την απόλυτη τιμή θέλουμε να υπολογίσουμε 5 Καλούμε τη συνάρτηση που υπολογίζει την απόλυτη τιμή ενός αριθμού 6 Τυπώνουμε στην οθόνη το αποτέλεσμα με ένα κατάλληλο μήνυμα Με τον τρόπο αυτό έχουμε δημιουργήσει μια συνάρτηση, την οποία θα μπορούμε να χρησιμοποιούμε (καλούμε) όσες φορές θέλουμε μέσα στο σώμα του main προγράμματος Είναι προφανές πως μπορούμε να ορίσουμε όσες συναρτήσεις επιθυμούμε και να τις καλέσουμε όσες φορές θέλουμε στα πλαίσια ενός προγράμματος, κάνοντας έτσι το πρόγραμμά μας πιο κατανοητό, μικρότερο σε όγκο και εύκολο στην αποσφαλμάτωση
«Προγραμματισμός Η/Υ» - Τετράδιο Εργαστηρίου #2 8 Προτεινόμενη Λύση /* Προγραμματιστής : Όνομα Επώνυμο, Αριθμός Μητρώου Ημερομηνία συγγραφής : 27/3/2002 Λειτουργία Προγράμματος : Υπολογίζει το απόλυτο ενός ακεραίου */ #include <stdioh> /* Βιβλιοθήκη βασικών συναρτήσεων Εισόδου/Εξόδου */ int abs(int x); /* Δήλωση Συνάρτησης */ int a,apol; /* Δήλωση Μεταβλητών του κυρίου προγράμματος*/ main() printf("πληκτρολογήστε το αριθμό : "); scanf("%d", &a); apol= abs(a); /* Κλήση Συνάρτησης */ printf("το απόλυτο του %d είναι : %d ",a,apol); int abs(int x) /* Το σώμα εντολών της συνάρτησης */ if (x>=0) return(x); return(-x); Σημείωση: Προσπαθήστε να πειραματιστείτε με τον τρόπο κλήσης και τα ορίσματα των συναρτήσεων Δοκιμάστε, για παράδειγμα, να καλέσετε τη συνάρτηση abs(a) απ ευθείας μέσα από την εντολή printf, χωρίς δηλαδή να εκχωρείτε την τιμή που αυτή επιστρέφει στη μεταβλητή apol