ΣΥΝΑΡΤΗΣΕΙΣ. Διαφάνειες από τους Robert Sedgewick και Kevin Wayne

Σχετικά έγγραφα
Η βασική λειτουργία σε όλες αυτές τις συναρτήσεις είναι η εκτύπωση γραµµών.

Συναρτήσεις. Κατασκευαστικά Τεµάχια για τη ηµιουργία Αρθρωτών Προγραµµάτων

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

Επανάληψη. Εντολές while, for, do-while

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

ΕΠΛ131 Αρχές Προγραμματισμού

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

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

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

Η τιµή εξόδου κάποιας συνάρτησης µπορεί να είναι δείκτης, π.χ.

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

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

ΕΠΛ131 Αρχές Προγραμματισμού

Προγραμματισμός Η/Υ. Ενότητα 7: Συναρτήσεις

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

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

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

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

Συναρτήσεις και Πίνακες

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

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

ΥΠΟΛΟΓΙΣΤΕΣ ΙΙ. Τι είναι ; Συναρτήσεις. Παράδειγμα #1. double convert ( double cm ) { double inch;

Μεθόδων Επίλυσης Προβλημάτων

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

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

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

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

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

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

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

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

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Οντοκεντρικός Προγραμματισμός

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

Μία Μελέτη Περίπτωσης: Διήθηση

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

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

Λογισµικό (Software SW) Γλώσσες

Δομημένος Προγραμματισμός

lab2 -Στην printf να βάζεις \n έτσι ώστε να αλλάζει γραµµή όποτε σου εµφανίζει κάποιο µήνυµα.

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

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

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

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

8. Μέθοδοι (Methods)

Μεθόδων Επίλυσης Προβλημάτων

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

Προγραμματισμός Υπολογιστών & Υπολογιστική Φυσική

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

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

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

Μεθόδων Επίλυσης Προβλημάτων

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

Εισαγωγή στον Προγραμματισμό Python Μάθημα 4: Συναρτήσεις (functions) και δομοστοιχεία (modules) στην Python

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

Συναρτήσεις. Εισαγωγή

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

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

ΕΡΓΑΣΙΑ 2. Κατασκευάζοντας Ημερολόγια. Ημερομηνία Ανάρτησης: 23/02/2018 Ημερομηνία Παράδοσης: 13/03/2018, 09:00

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

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

Κεφάλαιο 3.1, : Συναρτήσεις I. (Διάλεξη 11)

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

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

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

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους

ΣΥΝΑΡΤΗΣΕΙΣ (Functions)

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

Κεφάλαιο 2.6: Είσοδος / Έξοδος Δεδομένων, Μορφοποίηση Δεδομένων Εξόδου. (Διάλεξη 7) Είσοδος/ Έξοδος

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

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

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

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Συναρτήσεις και διαδικασίες

Θέματα Προγραμματισμού Η/Υ

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

Δομές ελέγχου ροής προγράμματος

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

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

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Υπολογισμός - Εντολές Επανάληψης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

Η βασική συνάρτηση προγράμματος main()

ΠΛΗΡΟΦΟΡΙΚΗ Ι Ενότητα 3: Συναρτήσεις

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

Transcript:

ΣΥΝΑΡΤΗΣΕΙΣ 1

Θεμελιώδη για Προγραμματισμό Οποιοδήποτε πρόγραμμα το οποίο θα θέλεις να γράψεις αντικείμενα Συναρτήσεις και ενότητες γραφικά, ήχος, και εικόνα Ε/Ε Για δημιουργία μεγαλύτερων προγραμμάτων και επαναχρησιμοποίηση κώδικα συστοιχίες Συνθήκες and επαναλήψεις Μαθηματικά Κείμενο Ε/E Αρχέγονοι τύποι δεδομένων Προτάσεις ανάθεσης 2

Τι είναι οι Συναρτήσεις; x y z f f (x, y, z)

Τι είναι οι Συναρτήσεις; Επικοινωνία με το υπόλοιπο πρόγραμμα Δέχονται ορίσματα Επιστρέφουν μια τιμή Απομονώνουν την επίλυση του υπο-προβλήματος Ιδανικά, δεν θέλουμε καμία άλλη επίδραση στο υπόλοιπο πρόγραμμα πέραν των παραπάνω 4

Συναρτήσεις (Στατικές Μέθοδοι) Java συνάρτηση Παίρνει καμία ή περισσότερες παραμέτρους εισόδου Επιστρέφει μία τιμή εξόδου Εφαρμογές Οι επιστήμονες χρησιμοποιούν μαθηματικές συναρτήσεις για να υπολογίσουν μαθηματικούς τύπους. Οι προγραμματιστές χρησιμοποιούν συναρτήσεις για να φτιάξουν αρθρωτά προγράμματα. Εσείς χρησιμοποιείτε συναρτήσεις και για τις δύο παραπάνω εφαρμογές. Παραδείγματα Ενσωματωμένες συναρτήσεις: Math.random(), Math.abs(), Integer.parseInt(). Οι Ε/Ε βιβλιοθήκες μας: StdIn.readInt(), StdDraw.line(), StdAudio.play(). Ορισμένες από το χρήστη συναρτήσεις: main(). 5

Πλεονεκτήματα των συναρτήσεων Περισσότερο αρθρωτός ο προγραμματισμός Σπάει το πρόγραμμα σε ξεχωριστές εργασίες Κάθε εργασία μπορεί να ανατεθεί σε διαφορετικό προγραμματιστή Επαναχρησιμοποίηση κώδικα Χρησιμοποίηση του κώδικα ξανά και ξανά Θα μπορούσε να είναι μία βιβλιοθήκη κώδικα (όπως η Math.sqrt()) Λιγότερη επικάλυψη κώδικα Βελτιωμένη αναγνωσιμότητα Κάθε συνάρτηση μπορεί να κάνει λίγες ξεκάθαρες εργασίες 6

Ανατομία μίας συνάρτησης Απαιτούμενη σύνταξη Τύπος απάντησης Τύπος 1 ης παραμέτρου Τύπος τελευταίας παραμέτρου public static type name(type arg1,,type argn) { statement1; statement2; statementm; Όνομα συνάρτησης Όνομα 1 ης παραμέτρου Όνομα τελευταίας παραμέτρου Κώδικας που γίνεται από τη συνάρτηση 7

Ένα απλό παράδειγμα Δίνοντας 2 ακεραίους, βρείτε τον μικρότερο ακέραιο. public static int min(int a, int b) { if( a < b ) return a; else return b; 8

Συναρτήσεις που επιστρέφουν τιμές Είναι δυνατόν να τις διαχωρίσουμε σε δύο τύπους: Οι συναρτήσεις που επιστρέφουν τιμές Κενές (void) συναρτήσεις Οι συναρτήσεις που επιστρέφουν μία τιμή επιστρέφουν μία απάντηση: int small = min(x, y); 9

Void μέθοδοι Οι κενές συναρτήσεις δηλώνονται με το void ως τύπο επιστροφής τους public static void help(int times) { for( int i = 1; i <= times; i++ ) Void methods just do something System.out.println( Help! ); If you try to save the value they give back, there will be an error return; 10

return δηλώσεις Στη Java, ο κώδικας μέσα σε μία συνάρτηση εκτελείται γραμμή προς γραμμή. Βέβαια, μπορεί κανείς να χρησιμοποιήσει υπό συνθήκη δηλώσεις και βρόγχους επανάληψης μέσα στις συναρτήσεις. Μπορεί επίσης να χρησιμοποιηθούν return δηλώσεις. Μία συνάρτηση θα σταματήσει την εκτέλεση και θα κάνει άλμα πίσω όπου και αν κλήθηκε η return. 11

Ροή Ελέγχου Σημείο κλειδί. Οι συναρτήσεις παρέχουν ένα νέο τρόπο για να ελέγχουν τη ροή εκτέλεσης. 12

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

Καλώντας συναρτήσεις Θα πρέπει να καλεστούν οι συναρτήσεις για να χρησιμοποιηθούν. Καλώντας μία συνάρτηση σημαίνει ότι δίνεις σε μία μέθοδο τις παραμέτρους (ή ορίσματα) που χρειάζεται και στη συνέχεια αναμένεις την απάντηση. System.out.println() Math.sqrt() 14

Η σύνταξη της κλήσης Η σωστή σύνταξη για να καλεστεί μια στατική συνάρτηση είναι πρώτα το όνομα της κλάσης όπου η συνάρτηση ανήκει, μία τελεία, το όνομα της συνάρτησης, και στη συνέχεια οι παράμετροι. Εάν η συνάρτηση είναι στην ίδια κλάση καθώς ο κώδικας την καλεί, μπορείτε να αφήσετε έξω το Class. τμήμα Εάν η συνάρτηση επιστρέφει τιμή, μπορείτε να αποθηκεύσετε αυτή την τιμή στη μεταβλητή με τον κατάλληλο τύπο. Class.name(arg1, arg2, arg3); 15

Η Ανατομία μίας Java Συνάρτησης Java συναρτήσεις. Εύκολα μπορείτε να γράψετε και τη δικιά σας συνάρτηση. είσοδος f(x) = x έξοδος 2.0 1.414213 16

Ορίσματα Πραγματικές Παράμετροι Arguments Actual Parameters Τιμές (values), οι οποίες μπορεί να διατυπωθούν ως οποιαδήποτε έκφραση π.χ. απόλυτη τιμή, μεταβλητή, κλήση συνάρτησης, κτλ που αποτιμάται σε τιμή συμβατή με τον τύπο της αντίστοιχης τυπικής παραμέτρου 17

Binding Μια μαγική διαδικασία που ονομάζεται δεσμευτική (binding) αντιγράφει τις τιμές από τον καλούντα κώδικα στις παραμέτρους της συνάρτησης Η κλήση του κώδικα μπορεί να χρησιμοποιήσει τις μεταβλητές με το ίδιο όνομα, με διαφορετικά ονόματα, ή ακόμα και κατά γράμμα (όπως 3 ή 2.6758) Η συνάρτηση δεν αλλάζει τις τιμές των μεταβλητών στον αρχικό κώδικα - Έχει μόνο αντίγραφα των τιμών 18

Αντιστοιχία Ορισμάτων με Παραμέτρους Τυπικές παράμετροι ή απλά παράμετροι αναφέρονται μία φορά, στον ορισμό της συνάρτησης Πραγματικές παράμετροι ή απλά ορίσματα αναφέρονται σε κάθε ξεχωριστή κλήση της συνάρτησης Η αντιστοιχία ανάμεσα σε ορίσματα και παραμέτρους είναι μία-προς-μία Συναρτήσεις με παραμέτρους είναι πιο χρήσιμες ευρύτερο πεδίο εφαρμογής γενικά χαρακτηρίζονται από υψηλότερη αυτοδυναμία 19

Αντιστοιχία Ορισμάτων με Παραμέτρους 1. Ο αριθμός ορισμάτων σε δεδομένη κλήση της συνάρτησης πρέπει να είναι ο ίδιος με τον αριθμό παραμέτρων στον ορισμό της συνάρτησης. 2. Η αντιστοιχία αποφασίζεται από τη σειρά των ορισμάτων. Το πρώτο όρισμα αντιστοιχεί στην πρώτη παράμετρο, το δεύτερο όρισμα στη δεύτερη παράμετρο, κτλ. 3. Ο τύπος κάθε ορίσματος πρέπει να είναι συμβατός προς τον τύπο της αντίστοιχης παραμέτρου, δηλαδή ο τύπος μπορεί να καταχωρηθεί στην εν λόγω παράμετρο, χωρίς την απροσδόκητη απώλεια πληροφορίας, π.χ. int μπορεί να ανατεθεί σε double χωρίς καθόλου απώλεια πληροφορίας, και double μπορεί να ανατεθεί σε int, με αναμενόμενη όμως την απώλεια των δεκαδικών ψηφίων. 20

Binding παράδειγμα int a = 10; int x = 3; int y = add( 5, a ); //το y περιέχει 15 τώρα public static int add(int x, int y){ int z = x + y; //5 + 10 return z; No connection between the two different x s and y s 21

public static double cyl_volume (double area, double height) { ροή πληροφοριών cyl_volume(3.0, 5.0) Οι παράμετροι area και height λαμβάνουν σάρκα και οστά από τα ορίσματα 3.0 και 5.0 αντιστοίχως. Τα εν λόγω ορίσματα είναι τιμές πέρασμα δια τιμής (call by value) 22

Πέρασμα δια τιμής radius height cyl_volume double res = cyl_volume (3.0, 5.0); res 141.37 Οι τιμές αντιγράφονται τοπικά, δηλαδή σε χώρο που ανήκει στην εν λόγω ενεργοποίηση της συνάρτησης 3.0 5.0 radius height cyl_volume 141.37 23

double r = 3.0, h = 5.0; h 5.0 r 3.0 cyl_volume(r, h); 3.0 5.0 radius height cyl_volume 141.37? 24

Εμβέλεια Οι μεταβλητές από έξω από τη μέθοδο δεν υπάρχουν εάν δεν έχουν περαστεί ως παράμετροι. Ανεξάρτητα με το πόσο πολύπλοκο είναι ένα πρόγραμμα, μέσα στη συνάρτηση μόνο οι x, y, και z μεταβλητές υπάρχουν public static int add(int x, int y) { int z = x + y; return z; 25

Εμβέλεια Εμβέλεια (ενός ονόματος). Ο κώδικας ο οποίος αναφέρεται σε αυτό το όνομα. Π.χ. Η εμβέλεια μίας μεταβλητής είναι ο κώδικας που ακολουθεί τη δήλωση στο μπλοκ. 2 διαφορετικές μεταβλητές με το ίδιο όνομα i public class Newton { public static double sqrt(double c) { double epsilon = 1e-15; if (c < 0) return Double.NaN; double t = c; while (Math.abs(t - c/t) > epsilon * t) t = (c/t + t) / 2.0; return t; public static void main(string[] args) { double[] a = new double[args.length]; for (int i = 0; i < args.length; i++) a[i] = Double.parseDouble(args[i]); for (int i = 0; i < a.length; i++) { double x = sqrt(a[i]); StdOut.println(x); Η εμβέλεια της c Η εμβέλεια του epsilon Η εμβέλεια του t Η εμβέλεια του a Η καλύτερη πρακτική: δηλώστε μεταβλητές για να περιορίσετε την εμβέλεια τους. 26

Κανόνες Ξεκινά η συνάρτηση με λέξεις κλειδιά public static. Μετά έρχεται ο τύπος επιστροφής. Μετά το όνομα της συνάρτησης. Μετά, σε παρενθέσεις, τα ορίσματα που θα δοθούν στη συνάρτηση. Μέσα στις αγκύλες, μπαίνει το σώμα της συνάρτησης. Περιέχει μία return δήλωση η οποία επιστρέφει μία τιμή με βάση τον τύπο της συνάρτησης. 27

Πρόκληση 1a Ερώτηση. Τι συμβαίνει όταν μεταγλωττίσετε και εκτελέσετε τον παρακάτω κώδικα; public class Cubes1 { public static int cube(int i) { int j = i * i * i; return j; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i)); % javac Cubes1.java % java Cubes1 6 1 1 2 8 3 27 4 64 5 125 6 216 28

Πρόκληση 1β Ερώτηση. Τι συμβαίνει όταν μεταγλωττίσετε και εκτελέσετε τον παρακάτω κώδικα; public class Cubes2 { public static int cube(int i) { int i = i * i * i; return i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i)); 29

Πρόκληση 1γ Ερώτηση. Τι συμβαίνει όταν μεταγλωττίσετε και εκτελέσετε τον παρακάτω κώδικα; public class Cubes3 { public static int cube(int i) { i = i * i * i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i)); 30

Πρόκληση 1δ Ερώτηση. Τι συμβαίνει όταν μεταγλωττίσετε και εκτελέσετε τον παρακάτω κώδικα; public class Cubes4 { public static int cube(int i) { i = i * i * i; return i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i)); 31

Πρόκληση 1ε Ερώτηση. Τι συμβαίνει όταν μεταγλωττίσετε και εκτελέσετε τον παρακάτω κώδικα; public class Cubes5 { public static int cube(int i) { return i * i * i; public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 1; i <= N; i++) StdOut.println(i + " " + cube(i)); 32

Απόσταση Η εύρεση της Ευκλίδειας μεταξύ 2 σημείων είναι πολύ σημαντική Υπάρχουν εφαρμογές : Σχεδιασμό δρόμων Λογισμικό για σχεδίαση γραφικών Video παιχνίδια d ) 2 ( ) 2 1 2 1 2 ( x x y y 33

method euclid() No matter how complex a program is, inside this method, only x, y, and public static double euclid (double x1, z variables exist double x2, double y1, double y2) { double xsq = (x1-x2)*(x1-x2); double ysq = (y1-y2)*(y1-y2); double d = Math.sqrt(xsq+ysq); return d; 34

Παραδείγματα public static final double PI= 3.14159; /* Συνάρτηση για τον υπολογισμό του εμβαδού ενός κύκλου. */ public static double area (double radius) { return PI * radius * radius; radius 35

/* Συνάρτηση για τον υπολογισμό του όγκου ενός κυλίνδρου */ public static double cyl_volume (double radius, double height) { double vol; vol = PI * radius * radius * height; return vol; r h 36

/* Εναλλακτικοί ορισμοί */ public static double cyl_volume (double radius, double height) { double vol; vol = area(radius) * height; return vol; public static double cyl_volume (double radius, double height) { double vol = area(radius) * height; return vol; public static double cyl_volume (double radius, double height) { return area(radius) * height; 37

cyl-volume radius height area * cyl-volume area * Γράφος εξαρτήσεων (dependency graph) 38

Ολόκληρο το Πρόγραμμα public class program { public static final PI= 3.14159; /* Πρωτότυπα Συναρτήσεων */ public static double area (double radius); public static double cyl_volume (double radius, double height); public static void main(string[] args){ System.out.println ( Δώσε την ακτίνα και το ύψος του κυλίνδρου: ); r = double.parseint(args[0]); h = double.parseint(args[1]); System.out.println( Εμβαδόν = + area(r)+ Όγκος = + cyl_volume(r,h)); public static double area (double radius) { return PI * radius * radius; public static double cyl_volume (double radius, double height) { return area(radius) * height; 39

Δώσε την ακτίνα και μετά το ύψος του κυλίνδρου: 3.0 5.0 Εμβαδόν = 28.27 Όγκος = 141.37 Σχολιάστε το πρόγραμμα από τη σκοπιά της επαλήθευσης των δεδομένων (input validation) 40

Το παιχνίδι της ζωής του Conway Ένα κελί αναπαρίσταται από ένα μπλοκ σε ένα πλέγμα Κάθε κελί έχει 8 γείτονες Απλοί κανόνες για ένα κελί όταν έρχεται στη ζωή ή όταν πεθαίνει : Ένα ζωντανό κελί με λιγότερους από 2 ζωντανούς γείτονες πεθαίνει από μοναξιά. Ένα ζωντανό κελί με περισσότερους από 3 ζωντανούς γείτονες πεθαίνει από υπερπληθυσμό. Ένα ζωντανό κελί με ακριβώς 2 ή 3 ζωντανούς γείτονες παραμένει ζωντανό. Ένα νεκρό κελί με ακριβώς 3 ζωντανούς γείτονες έρχεται στη ζωή. 41

method conway() public static void conway (int[][] cell, int m, int n) No matter how complex a program is, inside this method, only x, y, and { z variables exist int live = 0; for (int i=m-1; i<=m+1; i++) { for (int j=n-1; j<=n+1; j++) { if (cell(i,j)==1) live++; 42

method conway() if (cell(m,n)==1) { live--; z variables exist if (live < 2 live > 3) cell(m,n) = 0; else { if (live == 3) cell (m,n) = 1; return; No matter how complex a program is, inside this method, only x, y, and 43

Παράδειγμα: Υπολογισμός τετραγωνικών ριζών με τη μέθοδο του Νεύτωνα Είσοδος: x, πραγματικός αριθμός Έξοδος: x, εάν x 0.0, διαφορετικά μήνυμα λάθους Σταθερά ακρίβειας προσέγγισης epsilon 1e-15 Εάν x 0.0 y x Ενόσω ( x y 2 epsilon) επανέλαβε y (y + x / y) / 2.0 Εκτύπωσε (y) Διαφορετικά εκτύπωσε μήνυμα λάθους 44

public class Sqrt { public static void main (String[] args) { double epsilon = 1e-15; double x = Double.parseDouble(args[0]); double y = x; if (x >= 0.0){ while (Math.abs(x y * y) > epsilon) y = (y + x / y) / 2.0; System.out.println(y); else System.out.println( ERROR: Negative Number ); % java Sqrt 2.0 1.414213562373095 45

/* Introducing Modularity */ public class Sqrt { public static double square (double x){ return x * x; public static boolean goodenough (double x, double y){ double epsilon = 1e-15; return Math.abs(x square(y)) <= epsilon; public static double nextapprox (double x, double y){ return (y + x / y) / 2.0; public static double sqrt (double x) { double y = x; while (!goodenough(x,y)) y = nextapprox(x,y); return y; public static void main (String[] args) { double x = Double.parseDouble(args[0]); if (x >= 0.0) System.out.println(sqrt(x)); else System.out.println( ERROR: Negative Number ); 46

Άρθρωση Διάσπαση Προβλήματος sqrt goodenough nextapprox Math.abs square 47

Γράφος Εξαρτήσεων main Δείχνει τις σχέσεις ανάμεσα στα τμήματα ενός προγράμματος ή ανάμεσα σε προγράμματα ή μεθόδους και βασικές εντολές = >=! sqrt Double.parseDouble System.out.println nextapprox goodenough + / Math.abs square * return 48

Εναλλακτικός Ορισμός της sqrt χρησιμοποιώντας for public static double sqrt(double x){ double y; for (y = x;!goodenough(x,y); y = nextapprox(x,y)); return y;

Παρένθεση: Η μέθοδος του Νεύτωνα υπολογίζει τη ρίζα δεδομένης συνάρτησης η οποία είναι συνεχής και παραγωγίσιμη γύρω από ένα δεδομένο σημείο, που αποτελεί την αρχική προσέγγιση της ρίζας Εάν το y είναι μία προσέγγιση στη ρίζα της συνάρτησης f, η έκφραση f(y) y = f (y) δίνει μία καλύτερη προσέγγιση 50

f(y) f(y) y o y o y o y o Εφαρμογή μεθόδου για τον υπολογισμό τετραγωνικών ριζών, x = y Η τετραγωνική ρίζα αντιστοιχεί στη ρίζα της συνάρτησης f(y) = y 2 x Συνεπώς, η επόμενη προσέγγιση υπολογίζεται ως y f(y) / f (y) = y (y 2 x) / 2y = (y + x / y) / 2 51

Εφαρμογή μεθόδου για τον υπολογισμό τριγωνικών ριζών, 3 x = y Η τριγωνική ρίζα αντιστοιχεί στη ρίζα της συνάρτησης f(y) = y 3 x Συνεπώς, η επόμενη προσέγγιση υπολογίζεται ως y f(y) / f (y) = y (y 3 x) / 3y 2 = (2y + x / y 2 ) / 3 52

/* Computing cube roots using Newton s method */ public class CubeRoots { public static double square (double x){ return x * x; public static double cube (double x){ return x * x * x; public static boolean goodenough (double x, double y){ double epsilon = 1e-15; return Math.abs(x cube(y)) <= epsilon; public static double nextapprox (double x, double y){ return (2*y + x / square(y)) / 3.0; public static double cuberoot (double x) { double y = x; while (!goodenough(x,y)) y = nextapprox(x,y); return y; public static void main (String[] args) { double x = Double.parseDouble(args[0]); System.out.println(cubeRoot(x)); 53

Συναρτήσεις Περαιτέρω Παραδείγματα: Δημιουργία Διακριτών Σχημάτων Ι-54

Παραδείγματα Διακριτών Σχημάτων ******************* ******************* *** *** *** *** *** *** *** *** ******************* ******************* * * ******** * * **** * * * * * * * ******* ***** * * * * * * * * * * * * * ******** ***** ***** **** 55

Προσοχή! Χρησιμοποιούμε γραμματοσειρά όπου χρησιμοποιείται ο ίδιος χώρος για την εκτύπωση κάθε χαρακτήρα, όπως δηλαδή σε μία γραφομηχανή (proportionally spaced), π.χ. Courier ή Courier New Ποιές είναι οι βασικές εντολές; «Εκτύπωσε *» System.out.print ( * ); «Εκτύπωσε space» System.out.print ( ); «Νέα γραμμή» System.out.println(); 56

Ποιά είναι η επίδραση μιας απλής εντολής όπως «Εκτύπωσε *»; Εξαρτάται από την κατάσταση πραγμάτων που ίσχυε πριν την εκτέλεση της εντολής. Διαγράμματα «Πριν-Μετά» HELLO Εκτύπωσε * HELLO* goodbye Πριν Εκτύπωσε * goodbye* Μετά HELLO Εκτύπωσε * Πριν HELLO * Μετά 57

Ποιά είναι η επίδραση μιας απλής εντολής όπως «Εκτύπωσε *»; Εξαρτάται από την Τρέχουσα Θέση Εκτύπωσης (Current Printing Position CPP ), η οποία ορίζει που θα εμφανιστεί το επόμενο σημάδι όταν πιεστεί κάποιο πλήκτρο ή όταν εκτελεστεί κάποια εντολή εκτύπωσης χαρακτήρα. HELLO Εκτύπωσε * HELLO* HELLO Εκτύπωσε * Πριν HELLO * Μετά { Εκτύπωσε * ; Εκτύπωσε * HELLO Εκτύπωσε * HELLO * Εκτύπωσε * HELLO ** Πριν Ενδιαμέσως Μετά 58

Πιο επακριβώς δίνεται και η τρέχουσα θέση εκτύπωσης (CPP ) { Εκτύπωσε * ; Εκτύπωσε * HELLO Εκτύπωσε * HELLO * Εκτύπωσε * HELLO ** Πριν Ενδιαμέσως Μετά Ορισμοί των επιδράσεων της εκτέλεσης των βασικών εντολών «Εκτύπωσε *» Εκτυπώνει ένα αστερίσκο (*) στη θέση CPP και μετακινεί τη CPP μία θέση στα δεξιά «Εκτύπωσε space» Μετακινεί τη CPP μία θέση στα δεξιά «Νέα γραμμή» Μετακινεί τη CPP κάτω μία γραμμή και στο αριστερό περιθώριο του χαρτιού/οθόνης 59

Υπολογίζοντας Ερμηνείες (Calculating Meanings) Γιατί οι ορισμοί των ερμηνειών (των εντολών) χρειάζεται να είναι τόσο ακριβείς; Το σημαντικό πλεονέκτημα που απορρέει είναι ότι έτσι μπορούμε να συμπεραίνουμε ή να υπολογίζουμε την επίδραση ενός προγράμματος χωρίς κατ ανάγκη να χρειάζεται να δοκιμάσουμε το πρόγραμμα στον υπολογιστή, αποφεύγοντας έτσι μεγάλη σπατάλη χρόνου σε δοκιμές και λάθη Ο συλλογισμός αυτός μπορεί να γίνει αφού ο υπολογιστής απλά ακολουθεί ηλιθιοδώς και στα τυφλά τις ίδιες ερμηνείες για να παράξει την επίδραση του προγράμματος 60

Υπολογίζοντας Ερμηνείες Ομαλές και Ανώμαλες Περιστάσεις Πόση λεπτομέρεια χρειάζεται για να μπορούν να θεωρούνται οι ορισμοί των ερμηνειών (των εντολών) ως ακριβείς; Για παράδειγμα, στην ερμηνεία της εντολής «Εκτύπωσε *» δεν γίνεται αναφορά στο δεξιό περιθώριο ή στο πλάτος του χαρτιού/οθόνης, κτλ Μία ερμηνεία είναι επαρκώς ακριβής αν καλύπτει τις «ομαλές» συνθήκες εκτέλεσης Μπορεί φυσικά να υπάρχουν και «ανώμαλες» περιστάσεις όπου η εκτέλεση μίας εντολής είναι μη εφαρμόσιμη και συνεπώς η συμπεριφορά είναι μη προβλέψιμη Οι υποθέσεις (assumptions) που προσδιορίζουν τις «ομαλές» συνθήκες εκτέλεσης (με άλλα λόγια προσδιορίζουν ένα ιδεατό αφηρημένο κόσμο στο πλαίσιο του οποίου μπορεί να εκτελεστεί ομαλά το πρόγραμμα) πρέπει να διατυπώνονται ρητά για να είναι οι ερμηνείες ολοκληρωμένες και ακριβείς 61

Διακριτά Σχήματα *** *** *** τετράγωνο public static void draw_square () {System.out.println();System.out.print( *** ); System.out.println();System.out.print( *** ); System.out.println();System.out.print( *** ); * ** *** τρίγωνο Α public static void draw_tria () {System.out.println();System.out.print( * ); System.out.println();System.out.print( ** ); System.out.println();System.out.print( *** ); ** *** * τρίγωνο B public static void draw_trib () {System.out.println();System.out.print( * ); System.out.println();System.out.print( ** ); System.out.println();System.out.print( *** ); 62

Περαιτέρω Διακριτά Σχήματα *** ** * τρίγωνο C public static void draw_tric () {System.out.println();System.out.print( *** ); System.out.println();System.out.print( ** ); System.out.println();System.out.print( * ); *** ** * * ** *** *** ** * τρίγωνο D ένα σχήμα public static void draw_trid () {System.out.println();System.out.print( *** ); System.out.println();System.out.print( ** ); System.out.println();System.out.print( * ); public static void draw_some_fig () {System.out.println();System.out.print( * ); System.out.println();System.out.print( ** ); System.out.println();System.out.print( *** ); System.out.println();System.out.print( *** ); System.out.println();System.out.print( ** ); System.out.println();System.out.print( * ); public static void draw_some_fig () {draw_trib(); draw_trid(); 63

Σχεδιάζοντας «τετράγωνα» *** *** *** τετράγωνο public static void two_square () { draw_square(); draw_square(); *** *** *** *** *** *** public static void two_square() {draw_square (); new_draw_square(); public static void draw_square () {System.out.println(); System.out.print( *** ); System.out.println(); System.out.print( *** ); System.out.println(); System.out.print( *** ); Εναλλακτικός ορισμός για «τετράγωνο» public static void new_draw_square () {System.out.println( *** ); *** System.out.println( *** ); *** System.out.println( *** ); ****** *** *** Γιατί; 64

Διαγράμματα «Πριν-Μετά» square: square: draw_square(); *** *** *** new_draw_square(); square: *** *** *** 65

Διαγράμματα «Πριν-Μετά» square: *** draw_square(); *** *** square: square:*** new_draw_square(); *** *** 66

Πώς ξέρουμε ότι η draw_square() είναι ορθή; Σίγουρα ξέρουμε ότι η new_draw_square() δεν είναι ορθή διότι ένα και μοναδικό παράδειγμα λάθους αρκεί Ο μόνος τρόπος για να επιβεβαιωθεί η καθολική ορθότητα της draw_square() είναι μέσω κάποιας μαθηματικής απόδειξης της ορθότητάς της Υπάρχουν διάφοροι τρόποι συλλογισμού και απόδειξης ιδιοτήτων αναφορικά με προγράμματα, π.χ. Η αντικατάσταση μίας φόρμουλας με άλλη ισοδύναμη φόρμουλα μπορεί να αποτελέσει κανόνα για τον υπολογισμό της ερμηνείας μίας φόρμουλας 67

Άσκηση 1: Γράψτε συναρτήσεις για κάθε ένα από τα ακόλουθα σχήματα: ***** * * ***** * * * * * * * * * ***** ***** * * * * * * * ***** * * ***** ***** 68

Άσκηση 2: Χρησιμοποιήστε τις συναρτήσεις για να δημιουργήσετε το σχήμα: * * * * ***** * * * * ***** * ***** * ***** * * * * ***** * * * * ***** ***** * * * * * * ***** 69

Άσκηση 3: Μπορείτε να χρησιμοποιήστε τις συναρτήσεις που γράψατε στην Άσκηση 1 (χωρίς αλλαγές) για να δημιουργήσετε το ακόλουθο σχήμα; Ναι ή όχι και γιατί; * * ***** * * ***** * * * * * * * ***** ***** * * * * * * * * * * * * * ***** ***** ***** ***** 70

Περιορισμένη Λειτουργικότητα Με τις συναρτήσεις που αναπτύξαμε (draw_square, draw_tria, draw_trib, κτλ) μπορούμε να συνθέσουμε κάθετες αλυσίδες, αποτελούμενες από συνδυασμούς των συγκεκριμένων απλών σχημάτων. Όμως δεν μπορούμε: Να σχεδιάσουμε σχήματα αποτελούμενα από διαφορετικούς χαρακτήρες, π.χ. 0 00 000 +++ ++ + 71

Περιορισμένη Λειτουργικότητα Δεν μπορούμε: Να σχεδιάσουμε σχήματα διαφορετικών μεγεθών, π.χ. 0 00 000 0000 Να έχουμε οριζόντιες τοποθετήσεις σχημάτων, π.χ. 00 00 0000 0000 000000 000000 000000 0000 00 72

** o o + + $ $$$ **** oo oo ++ ++ $$ $$ ****** oooooo ++++++ $$$$ ****** oooooo ++++++ $$$$ **** oooo ++ ++ $$ $$ ** oo + + $$$ $ rombus kite butterfly windmill Διάσπαση και σύνθεση 73

Ανάγκη για Παραμετροποίηση Συναρτήσεων (Επεκτασιμότητα Αφαιρετικότητα) Για τη δημιουργία σχημάτων διαφορετικών μεγεθών και αποτελούμενων από διαφορετικούς χαρακτήρες απαιτείται η χρήση παραμέτρων: 1. Παράμετρο για το μέγεθος του σχήματος (size) 2. Παράμετρο για το γέμισμα του σχήματος (fill) size fill draw_square draw_square(4, o ); oooo oooo oooo oooo draw_square(1, x ); x draw_square(2, + ); ++ ++ 74

Νέος ορισμός συνάρτησης draw_square Ποιά θα πρέπει να είναι η κύρια αλγοριθμική δομή; ακολουθία, επιλογή, επανάληψη; Διπλή Επανάληψη Εξωτερικός Βρόχος για κάθε σειρά Εσωτερικός Βρόχος για κάθε στήλη της σειράς Προσοχή! Κάθε βρόχος πρέπει να τερματίζει Ανάλυση περιπτώσεων 1. Βασικές περιπτώσεις, όπου η επανάληψη τερματίζεται (τετράγωνο 1x1) 2. Γενικές περιπτώσεις, όπου η επανάληψη συνεχίζεται αλλά σταδιακά οδηγεί σε τερματισμό της επεξεργασίας 75

/* Η παράμετρος size δίνει το μέγεθος του τετραγώνου, και η παράμετρος fill το χαρακτήρα που θα απαρτίζει το τετράγωνο. */ public static void draw_square (int size, char fill) { int row, col; row = 1; /* αρχίζοντας από την πρώτη σειρά */ while (row <= size) /* και επαναλαμβάνοντας για κάθε σειρά */ {System.out.println(); /* άρχισε καινούρια γραμμή */ col = 1; /* αρχίζοντας από την πρώτη στήλη της σειράς */ while (col <= size) /* και επαναλαμβάνοντας για κάθε στήλη της σειράς*/ {System.out.print(fill); col = col + 1; /* επόμενη στήλη */ row = row + 1; /* επόμενη σειρά */ 76

Ξετύλιγμα Επανάληψης σε Ακολουθία Μία εντολή επανάληψης ξετυλίγεται σε μία ακολουθία απλών εντολών draw_square(3, * ); System.out.println( *** ); System.out.println( *** ); System.out.println( *** ); System.out.println(); System.out.print( * ); System.out.print( * ); System.out.print( * ); System.out.println(); System.out.print( * ); System.out.print( * ); System.out.print( * ); System.out.println(); System.out.print( * ); System.out.print( * ); System.out.print( * ); 77

Συναρτήσεις για Τρίγωνα Πάλι διπλή επανάληψη, όπου υπάρχουν δύο εσωτερικές επαναλήψεις: 1. μία για τις στήλες της σειράς, που αποτελούνται από το χαρακτήρα fill, και 2. μία για τις στήλες που αποτελούνται από το χαρακτήρα (space). Όπως και προηγουμένως η εξωτερική επανάληψη είναι για τις σειρές Διπλή Επανάληψη Εξωτερικός Βρόχος για κάθε σειρά Εσωτερικός Βρόχος 1 για κάθε στήλη της σειράς που έχει το χαρακτήρα fill Εσωτερικός Βρόχος 2 για κάθε στήλη της σειράς που έχει το χαρακτήρα space 78

space CPP draw_tria(4, X ); X XX XXX XXXX draw_trib(5, I ); I II III IIII IIIII System.out.println(); System.out.print( x ); System.out.print( ); System.out.print( ); System.out.print( ); System.out.println(); System.out.print( x ); System.out.print( x ); System.out.print( ); System.out.print( ); System.out.println(); System.out.print( x ); System.out.print( x ); System.out.print( x ); System.out.print( ); System.out.println(); System.out.print( x ); System.out.print( x ); System.out.print( x ); System.out.print( x ); 79

space CPP draw_tric(4, $ ); $$$$ $$$ $$ $ draw_trid(5, a ); aaaaa aaaa aaa aa a 80

/* Συνάρτηση για τρίγωνα τύπου Α */ public static void draw_tria(int size, char fill) { int row, col; row = 1; while (row <= size) {System.out.println(); col = 1; while (col <= row) {System.out.print(fill); col = col + 1; while (col <= size) {System.out.print( ); col = col + 1; row = row + 1; 81

/* Συνάρτηση για τρίγωνα τύπου Β */ public static void draw_triβ(int size, char fill) { int row, col; row = 1; while (row <= size) {System.out.println(); col = size; /* αντίστροφη μέτρηση των στηλών */ while (col > row) {System.out.print( ); col = col 1; while (col > 0) {System.out.print(fill); col = col 1; row = row + 1; 82

/* Συνάρτηση για τρίγωνα τύπου C */ public static void draw_tric(int size, char fill) { int row, col; row = size; while (row > 0) /* αντίστροφη μέτρηση των σειρών */ {System.out.println(); col = 1; while (col <= row) {System.out.print(fill); col = col + 1; while (col <= size) {System.out.print( ); col = col + 1; row = row 1; 83

/* Συνάρτηση για τρίγωνα τύπου D */ public static void draw_trid(int size, char fill) { int row, col; row = size; /* αντίστροφη μέτρηση των σειρών */ while (row > 0) {System.out.println(); col = size; /* αντίστροφη μέτρηση των στηλών */ while (col > row) {System.out.print( ); col = col 1; while (col > 0) {System.out.print(fill); col = col 1; row = row 1; 84

Είναι οι πιο πάνω ορισμοί ανθεκτικοί (robust) ως προς τις τιμές εισόδου τους; Π.χ. τι γίνεται αν οι συναρτήσεις κληθούν με το 0 ή με αρνητικό αριθμό ως προς το size; Υπενθύμιση: Επανάληψη τύπου, while (συνθήκη) εντολή, δεν εκτελείται καθόλου εάν από την αρχή η συνθήκη δεν επαληθεύεται. 85

Άρθρωση Για να επιτευχθεί πλήρως η απαιτούμενη λειτουργικότητα, π.χ. οριζόντια τοποθέτηση σχημάτων, χρειάζεται να εισαχθεί άρθρωση στις συναρτήσεις. Επομένως, ποια είναι η βασική λειτουργία σε όλες αυτές τις συναρτήσεις; Η βασική λειτουργία είναι η εκτύπωση γραμμών /* Συνάρτηση για την εκτύπωση γραμμής δεδομένου μήκους, len, και αποτελούμενης από δεδομένο χαρακτήρα, fill. */ public static void draw_line (int len, char fill) { int col = len; while (col > 0) {System.out.print(fill); col = col 1; 86

draw_line(10, % ); draw_line(-5, + ); %%%%%%%%%% draw_line(0, + ); draw_line(15, k ); kkkkkkkkkkkkkkk draw_line(115, o ); ooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooo 87

Επαναδιατύπωση των συναρτήσεων draw_square, draw_tria, draw_trib, draw_tric, και draw_trid Προσοχή: Εξακολουθεί να μην είναι εφικτή η οριζόντια τοποθέτηση σχημάτων, π.χ. H E L L O public static void draw_square (int size, char fill) { int row, col; row = 1; /* αρχίζοντας από την πρώτη σειρά */ while (row <= size) /* και επαναλαμβάνοντας για κάθε σειρά */ {System.out.println(); /* άρχισε καινούρια γραμμή */ draw_line(size,fill); row = row + 1; /* επόμενη σειρά */ 88

Παρατηρούμε, ότι ο εσωτερικός βρόχος έχει αντικατασταθεί από την κλήση της βασικής συνάρτησης draw_line - αφαιρετικότητα draw_square draw_square(2, * ) putchar putchar(nl) putchar(nl) draw_line draw_line(2, * ) draw_line(2, * ) Γράφος Εξαρτήσεων Ορισμός συνάρτησης Η σειρά δεν έχει σημασία putchar( * ) Ξετύλιγμα επαναλήψεων System.out.println() System.out.print( * ) System.out.print( * ) System.out.println() System.out.print( * ) System.out.print( * ) putchar( * ) putchar( * ) putchar( * ) Διάγραμμα Εκτέλεσης (Execution Diagram) Κλήση συνάρτησης Η σειρά έχει σημασία 89

/* Συνάρτηση για τρίγωνα τύπου Α */ public static void draw_tria(int size, char fill) { int row, col; row = 1; while (row <= size) {System.out.println(); draw_line(row, fill); draw_line(size row, ); row = row + 1; Οι εσωτερικές επαναλήψεις έχουν αντικατασταθεί από τις σχετικές κλήσεις της βασικής συνάρτησης draw_line. Έτσι δεν εμφανίζεται ρητά η διπλή επανάληψη. 90

/* Συνάρτηση για τρίγωνα τύπου Β */ public static void draw_triβ(int size, char fill) { int row, col; row = 1; while (row <= size) {System.out.println(); draw_line(size row, ); draw_line(row, fill); row = row + 1; 91

/* Συνάρτηση για τρίγωνα τύπου C */ public static void draw_tric(int size, char fill) { int row, col; row = size; while (row > 0) /* αντίστροφη μέτρηση των σειρών */ { System.out.println(); draw_line(row, fill); draw_line(size row, ); row = row 1; 92

/* Συνάρτηση για τρίγωνα τύπου D */ void draw_trid(int size, char fill) { int row, col; row = size; /* αντίστροφη μέτρηση των σειρών */ while (row > 0) {System.out.println(); draw_line(size row, ); draw_line(row, fill); row = row 1; 93

Παρατηρήσεις 1. Τώρα μπορούμε να σχεδιάσουμε τετράγωνα και τρίγωνα διαφόρων μεγεθών και γεμισμάτων. 2. Επίσης μπορούμε να συνθέσουμε περίπλοκα σχήματα βάσει κάθετων τοποθετήσεων απλούστερων σχημάτων. 3. Όμως δεν μπορούμε να συνθέσουμε σχήματα βάσει οριζόντιων τοποθετήσεων απλούστερων σχημάτων, π.χ. rombus, kite, butterfly, ή windmill. 4. Για να υπάρχει η δυνατότητα για οριζόντιες τοποθετήσεις, τα σχήματα δεν δημιουργούνται εξ ολοκλήρου, αλλά κάθε σειρά τους δημιουργείται ξεχωριστά. 5. Συνεπώς, χρειάζεται περαιτέρω διάσπαση του προβλήματος και διαχωρισμός του κεντρικού υπο-προβλήματος που είναι η δημιουργία δεδομένης σειράς ενός σχήματος. 94

/* Η συνάρτηση draw_line_tria εκτυπώνει δεδομένη σειρά δεδομένου τριγώνου τύπου Α. Η παράμετρος size δίνει το μέγεθος του τριγώνου, η παράμετρος row τον αριθμό της σειράς (οι σειρές απαριθμούνται από το 1 μέχρι το size), και η παράμετρος fill δίνει το χαρακτήρα που απαρτίζει το σχήμα */ draw_line_tria (int size, int row, char fill) { draw_line(row, fill); draw_line(size row, ); 95

/* Επαναδιορισμός της draw_tria */ public static void draw_tria (int size, char fill) { int row = 1; while (row <= size) {System.out.println(); draw_line_tria(size, row, fill); row = row + 1; draw_tria draw_line_tria draw_line putchar 96

/* Βασικές συναρτήσεις για υπόλοιπους τύπους τριγώνων */ /* Για τρίγωνα τύπου Β */ public static void draw_line_trib (int size, int row, char fill) {draw_line(size row, ); draw_line(row, fill); /* Για τρίγωνα τύπου C */ public static void draw_line_tric (int size, int row, char fill) {draw_line(size row + 1, fill); draw_line(row 1, ); /* Για τρίγωνα τύπου D */ public static void draw_line_trid (int size, int row, char fill) {draw_line(row 1, ); draw_line(size row + 1, fill); 97

Σύνθεση Ανεμόμυλων Σειρά 1 Α Σειρά 1 C + +++++ ++ ++++ +++ +++ ++++ ++ ++++++ Σειρά 5 A Σειρά 5 C ++++++ Σειρά 1 Β Σειρά 1 D ++ ++++ +++ +++ ++++ ++ +++++ + Σειρά 5 Β Σειρά 5 D ανεμόμυλος μεγέθους 5 αποτελούμενος από το χαρακτήρα + 98

/* Συνάρτηση για το σχεδιασμό ανεμόμυλου μεγέθους κενού αποτελούμενου από το χαρακτήρα fill */ public static void draw_windmill (int size, char fill) { int row; row = 1; while (row <= size) {System.out.println(); draw_line_tria(size, row, fill); draw_line_tric(size, row, fill); row = row + 1; row = 1; while (row <= size) {System.out.println(); draw_line_trib(size, row, fill); draw_line_trid(size, row, fill); row = row + 1; 99

/* Περαιτέρω Άρθρωση */ /* Συνάρτηση που δημιουργεί το πάνω μισό του ανεμόμυλου */ public static void draw_tophalf_wm (int size, char fill) {int row = 1; while (row <= size) {System.out.println(); draw_line_tria(size, row, fill); draw_line_tric(size, row, fill); row = row + 1; /* Συνάρτηση που δημιουργεί το κάτω μισό του ανεμόμυλου */ public static void draw_bottomhalf_wm (int size, char fill) {int row = 1; while (row <= size) {System.out.println(); draw_line_trib(size, row, fill); draw_line_trid(size, row, fill); row = row + 1; 100

/* Συνάρτηση για ολόκληρο τον ανεμόμυλο. */ public static void draw_windmill (int size, char fill) { draw_tophalf_wm(size,fill); draw_bottomhalf_wm(size, fill); Διάσπαση Προβλήματος draw_windmill draw_tophalf_wm draw_bottomhalf_wm draw_line_tria draw_line_tric draw_line_trib draw_line_trid draw_line 101

Συναρτήσεις υπερφόρτωση Πολλαπλοί παράμετροι 102

Gaussian Κατανομή Standard Gaussian κατανομή Καμπύλη καμπάνας." Αποτελεί τη βάση της στατιστικής ανάλυσης για κοινωνικές και φυσικές επιστήμες. Π.χ. Οι 2000 SAT τιμές σημειώθηκαν ακολουθούν Gaussian κατανομή με μέση τιμή = 1019, σταθερή απόκλιση = 209. 601 810 1019 1228 1437 (x) 1 2 e x2 /2 (x,, ) 1 2 e (x )2 / 2 2 x / 103

Java Συνάρτηση για (x) Μαθηματικές Συναρτήσεις. Χρησιμοποιήστε ενσωματωμένες συναρτήσεις όπου είναι δυνατόν. Δημιουργήστε τις δικές σας όταν δεν είναι διαθέσιμες. public class Gaussian { (x) 1 2 e x2 /2 public static double phi(double x) { return Math.exp(-x*x / 2) / Math.sqrt(2 * Math.PI); public static double phi(double x, double mu, double sigma) { return phi((x - mu) / sigma) / sigma; (x,, ) x / Υπερφόρτωση. Συναρτήσεις με διαφορετικές υπογραφές είναι διαφορετικές. Πολλαπλοί παράμετροι. Συναρτήσεις μπορούν να παίρνουν οποιοδήποτε αριθμό παραμέτρων. Κλήση άλλων συναρτήσεων. Συναρτήσεις μπορούν να καλούν άλλες συναρτήσεις. Βιβλιοθήκη ή ορισμένη από το χρήστη συνάρτηση 104

Gaussian Αθροιστική Συνάρτηση Πιθανότητας Στόχος. Υπολογίστε τη Gaussian cdf (z). Πρόκληση. Μη κλειστής μορφής έκφραση και όχι στη Java βιβλιοθήκη. (z) (x) 1 2 e x2 /2 z Taylor series Κατώτατη γραμμή. 1,000 χρόνια μαθηματικών τύπων στα χέρια σας 105

Java συνάρτηση για (z) public class Gaussian { public static double phi(double x) // as before public static double Phi(double z) { if (z < -8.0) return 0.0; if (z > 8.0) return 1.0; double sum = 0.0, term = z; for (int i = 3; sum + term!= sum; i += 2) { sum = sum + term; term = term * z * z / i; return 0.5 + sum * phi(z); accurate with absolute error less than 8 * 10-16 public static double Phi(double z, double mu, double sigma) { return Phi((z - mu) / sigma); (z,, ) z (z,, ) ((z ) / ) 106

Δημιουργία Συναρτήσεων Οι συναρτήσεις σας δίνουν τη δυνατότητα να δημιουργήσετε ένα νέο επίπεδο αφαιρετικότητας. Σας οδηγεί πέρα από τις βιβλιοθήκες με έτοιμα πακέτα. Δημιουργείτε τα εργαλεία που εσείς χρειάζεστε: Gaussian.phi(), Διεργασία. Βήμα 1: προσδιορίστε ένα χρήσιμο χαρακτηρηστικό. Βήμα 2: υλοποιήστε το. Βήμα 3: χρησιμοποιήστε το. Βήμα p 3': επαναχρησιμοποιήστε το σε οποιοιδήποτε από τα προγράμματά σας. 107