Professional Documents
Culture Documents
Προγραμματισμός
ΕΛΛΗΝΙΚΗ
ΔΗΜΟΚΡΑΤΙΑ
Ανώτατο Εκπαιδευτικό
Ίδρυμα Πειραιά
Τεχνολογικού Τομέα Δρ. Χαράλαμπος Ζ. Πατρικάκης
Τμήμα Ηλεκτρονικών Μηχανικών Τ.Ε
Περιεχόμενα
6
Προσδοκώμενα Αποτελέσματα
1.1 Αντικειμενοστραφής
Προγραμματισμός
8
Ας θυμηθούμε κάποια πράγματα για τον
προγραμματισμό
10
Γενιές γλωσσών προγραμματισμού
11
12
Διαδικασιακός (δομημένος) Προγραμματισμός
13
14
Προγραμματισμός βασισμένος σε γεγονότα
(Εvent Driven Programming)
15
Τι σημαίνει Αντικειμενοστραφής
Προγραμματισμός;
• Δεν υπάρχουν:
– Μεμονωμένες συναρτήσεις.
– Μεμονωμένα τμήματα κώδικα.
16
Αντικείμενα, Κλάσεις, Μέθοδοι, Ιδιότητες
17
• Μελετάμε το πρόβλημα.
• Το αποσυνθέτουμε σε κλάσεις οι οποίες συνήθως
αντιστοιχούν σε οντότητες του πραγματικού κόσμου.
– Προσπαθούμε να κάνουμε χρήση από έτοιμες κλάσεις (από
προηγούμενες εφαρμογές ή από βιβλιοθήκες κλάσεων) όπου αυτό
είναι εφικτό.
– Κάθε κλάση αντικειμένων έχει μεθόδους οι οποίες καλούν μεθόδους
άλλων κλάσεων.
• Δημιουργούμε αντικείμενα ανάλογα με το πρόγραμμα που
θέλουμε να αναπτύξουμε και τα βάζουμε να
αλληλεπιδρούν.
19
Πλεονεκτήματα αντικειμενοστραφούς
προγραμματισμού
20
Χαρακτηριστικά Αντικειμενοστραφών Γλωσσών
• Αφαίρεση (Abstraction)
– Άρα ο προγραμματιστής δουλεύει σε υψηλό επίπεδο, με λιγότερες
λεπτομέρειες και σαφώς καθορισμένες διεπαφές.
• Ενθυλάκωση (Encapsulation)
– Προστασία των δεδομένων και των μεθόδων.
• Κληρονομικότητα (Inheritance)
– Επιτρέπει την δημιουργία νέων κλάσεων βάσει προηγουμένων.
• Πολυμορφισμός (Polymorphism)
– Χρήσιμη ιδιότητα που πρέπει να υπάρχει σε κάθε αντικειμενοστραφή
γλώσσα και επιτρέπει την αλλαγή της συμπεριφοράς κλάσεων.
21
Αντικειμενοστραφείς γλώσσες
προγραμματισμού
• C++ • Ruby
• C# • Perl (v5)
• Java • PHP5
• VB.Net • Object Pascal
• Lingo • Python
22
1.2 Η γλώσσα προγραμματισμού Java
24
Γιατί Java;
• Αντικειμενοστραφής
• Ανεξάρτητη από συγκεκριμένη αρχιτεκτονική
υπολογιστικού συστήματος.
- Δυνατότητα εκτέλεσης σε οποιαδήποτε πλατφόρμα και πάνω από
οποιοδήποτε λειτουργικό.
• Εκτελέσιμη μέσα από το διαδίκτυο
• Δυνατότητα ανάπτυξης
- Αυτόνομων εφαρμογών.
- Εφαρμογών Παγκοσμίου Ιστού.
• Διανέμεται δωρεάν.
25
Πλεονεκτήματα της γλώσσας
26
Λίγη ιστορία
27
Οι αρχές (principles) ανάπτυξης της Java
28
class Hello {
class Hello {
public static void main(String [] args){
public System.out.println("Hello
static void main(StringWorld");
[] args){
}
} System.out.println("Hello World");
}
}
29
Κατηγορίες Προγραμμάτων Java
Λειτουργικό
σύστημα
31
Πλατφόρμες και περιβάλλοντα ανάπτυξης
• Open Source
• JSDK
Περιβάλλοντα
– http://java.sun.com – Eclipse
– Κατεβάζουμε το Java (http://www.eclipse.org)
33
Τυπικό περιβάλλον ανάπτυξης σε Java (2/3)
Το πρόγραμμα δημιουργείται με
Στάδιο 1: έναν συντάκτη και αποθηκεύεται
Συντάκτης στον δίσκο σε ένα αρχείο με
Επεξεργασία Δίσκος
κατάληξη .java
Ο μεταγλωττιστής δημιουργεί
Στάδιο 2: bytecodes και τα αποθηκεύει στον
Μεταγλωττιστής
Μεταγλώττιση Δίσκος δίσκο σε ένα αρχείο με κατάληξη
.class
Πρωτεύουσα
μνήμη
Στάδιο 3:
Φορτωτής κλάσης
Φόρτωση
Ο φορτωτής κλάσης διαβάζει τα
.class αρχεία που περιέχουν τα
bytecodes από τον δίσκο και
μεταφέρει τα bytecodes αυτά στη
μνήμη
Δίσκος
34
Πρωτεύουσα
μνήμη
Στάδιο 4: Eπαληθευτής
Επαλήθευση Bytecode
Ο bytecode επαληθευτής,
επιβεβαιώνει πως όλα τα bytecodes
είναι έγκυρα και δεν παραβιάζουν τους
περιορισμούς ασφαλείας της Java.
Πρωτεύουσα
μνήμη Για την εκτέλεση του προγράμματος η
Στάδιο 5: Eικονική μηχανή εικονική μηχανή της Java (JVM) διαβάζει τα
Εκτέλεση της Java (JVM)
bytecodes και ακριβώς όταν χρειάζεται (just-
in-time, JIT) τα μεταγλωττίζει (μεταφράζει)
σε μια γλώσσα που ο υπολογιστής μπορεί να
καταλάβει. Κατά τη διάρκεια της εκτέλεσης
του προγράμματος, αποθηκεύει δεδομένα
στην κύρια μνήμη.
35
Χρήση εργαλείων για δημιουργία κώδικα σε
Java (1/3)
36
37
Χρήση εργαλείων για δημιουργία κώδικα σε
Java (3/3)
38
• Στάδιο 2
– Με χρήση της εντολής javac (ο μεταγλωττιστής Java)
μεταγλωττίζουμε το πρόγραμμα. Παράδειγμα: για
μεταγλώττιση του προγράμματος με όνομα Welcome.java,
πληκτρολογούμε
javac Welcome.java
– Αν το πρόγραμμα μεταγλωττιστεί επιτυχώς, δημιουργείται ένα
.class αρχείο με όνομα Welcome.class που περιέχει την
μεταγλωττισμένη έκδοση του προγράμματος.
39
Μεταγλώττιση κώδικα σε Java (2/3)
40
41
Φόρτωση κλάσεων σε Java
• Στάδιο 3
– Η JVM μεταφέρει το πρόγραμμα στην μνήμη για εκτέλεση
• Η διαδικασία είναι γνωστή ως φόρτωση.
– Ο φορτωτής των κλάσεων (class loader) λαμβάνει τα
.class αρχεία που περιέχουνε τα bytecodes του
προγράμματος και τα μεταφέρει στην κύρια μνήμη.
– Φορτώνει επίσης όσα .class αρχεία παρέχονται από
την Java τα οποία χρησιμοποιεί το πρόγραμμά μας.
• Τα .class αρχεία μπορούν να φορτωθούν από έναν δίσκο στο
σύστημά μας ή και μέσω δικτύου.
42
• Στάδιο 4
– Καθώς οι κλάσεις φορτώνονται, ο επαληθευτής bytecode
(Bytecode verifier) εξετάζει τα bytecodes τους:
Εξασφαλίζει ότι είναι έγκυρα και δεν παραβιάζουν τους
περιορισμούς ασφαλείας της Java.
– Η Java επιβάλει ισχυρή ασφάλεια ώστε να εξασφαλίσει
ότι τα προγράμματα Java που φθάνουν από το δίκτυο δεν
βλάπτουν τα αρχεία του συστήματός μας (όπως κάνουν οι
ιοί στους υπολογιστές).
43
Σφάλματα στη Java
44
String?
45
Ονομασία μεταβλητών
46
47
Συμβάσεις για χρήση ονομάτων στη Java (2/2)
48
50
Ενότητα 2: Τύποι δεδομένων,
μεταβλητές, τελεστές και
παραστάσεις.
Περιεχόμενα
2.3 Μέθοδοι
6
Προσδοκώμενα Αποτελέσματα
8
Τύποι Δεδομένων
Μεταβλητές
Παράδειγμα:
String a = "a";
String b = "letter b";
int k = 15;
a = "letter a";
String c = a + "and" + b;
10
Μεταβλητές και Σταθερές
11
Τελεστές
Ανάθεση: =
Πρόσθεση: +
Αφαίρεση: -
Πολ/μός: *
Διαίρεση: /
12
Χαρακτήρες
• Δηλώνονται με το char.
• Μπορούν να περιλαμβάνουν οποιοδήποτε χαρακτήρα
(γράμμα, ψηφίο, σημείο στίξης κ.λ.π).
• Οι ειδικοί χαρακτήρες χρησιμοποιούν τις ακολουθίες
διαφυγής (escape sequences) στην αναπαράστασή τους.
– \b backspace
– \t tab
– \n line feed
– \f form feed
– \r carriage return
– \" διπλά εισαγωγικά
– \’ απλό εισαγωγικό
– \\ backslash
13
Αλφαριθμητικά (String)
15
Μαθηματικές συναρτήσεις
• class GravityCalculator {
public static void main(String[]args){
double gravity = -9.81;
double initialVelocity = 0.0;
double fallingTime = 10.0;
double initialPosition = 0.0;
double finalPosition = .5 * gravity * fallingTime *
fallingTime;
finalPosition = finalPosition + initialVelocity *
fallingTime;
finalPosition = finalPosition + initialPosition;
System.out.println("I thesi enos antikeimenou meta apo " +
fallingTime + " sec einai " + finalPosition + " m.");
}
}
17
Παράδειγμα
18
2.2 Περισσότεροι τύποι δεδομένων
20
Διαίρεση
• Παράδειγμα:
• Δίνεται προτεραιότητα, όπως
double a= 5.0/2.0; // a = 2.5 και στα μαθηματικά, στην
int b = 4/2; // b = 2 εκτέλεση των πράξεων από τα
αριστερά προς τα δεξιά.
int c = 5/2; // c = 2
double d = 5/2; // d = 2.0
21
Σειρά Εκτέλεσης των Πράξεων
double x = 3 / 2 + 1; // x = 2.0
double y = 3 / (2+1); // y = 1.0
22
23
Μετατροπές Τύπου Δεδομένων (Casting)
24
int a = 2; // a = 2
double a = 2; // a = 2.0 (Έμμεση Μετατροπή)
int a = 2; // a = 2
double a = (double) 2/3; // a = 0.6666…
25
Ιεραρχία τύπων δεδομένων και implicit typecast
26
Explicit typecast
27
Παράδειγμα
2.3 Μέθοδοι
30
Μέθοδοι
31
Δημιουργώντας Μεθόδους
32
Παράδειγμα
class NewLine {
public static void newLine() {
System.out.println("");
}
public static void threeLines() {
newLine(); newLine(); newLine();
}
33
Παράδειγμα
class NewLine {
public static void newLine() {
System.out.println("");
}
public static void threeLines() {
newLine(); newLine(); newLine();
}
Παράμετροι
36
Παράδειγμα
class Square {
public static void printSquare(int x) {
System.out.println(x*x);
}
Σωστό Πρόγραμμα!
37
Παράδειγμα
class Square2 {
public static void printSquare(int x) {
System.out.println(x*x);
}
38
Παράδειγμα
class Square3 {
public static void printSquare(double x) {
System.out.println(x*x);
}
39
Πολλαπλοί Παράμετροι
40
Παράδειγμα
class Multiply {
public static void times (double a, double b) {
System.out.println(a*b);
}
41
42
Παράδειγμα
class Square3 {
public static void printSquare(double x) {
System.out.println(x*x);
}
43
Παράδειγμα
class Square4 {
public static double square(double x) {
return x*x;
}
45
Παράδειγμα
class SquareChange {
public static void printSquare(int x){
System.out.println("printSquare x =" + x); //printSquare x= 5
x = x*x;
System.out.println("printSquare x =" + x); //printSquare x= 25
}
46
Παράδειγμα
class Scope {
public static void main(String[] arguments) {
int x = 5;
if (x == 5) {
int x = 6;
int y = 72;
System.out.println("x = " + x + " y = " + y );
}
System.out.println("x = " + x + " y = " + y);
}
}
47
48
Μαθηματικές Συναρτήσεις
• Math.sin(x)
• Math.cos(Math.PI/2)
• Math.pow(2, 3)
• Math.log(Math.log(x + y))
49
2.3 Μέθοδοι
51
Ενότητα 3: Έλεγχος ροής και
επαναλήψεις.
Περιεχόμενα
6
Προσδοκώμενα Αποτελέσματα
8
Συνθήκη if
if (ΣΥΝΘΗΚΗ) {
ΚΑΤΑΣΤΑΣΕΙΣ
}
Παράδειγμα
10
Παραστάσεις – αναθέσεις - εκχωρήσεις
11
Τελεστές
12
Συνθήκη else
if (ΣΥΝΘΗΚΗ) {
ΚΑΤΑΣΤΑΣΕΙΣ
} else {
ΚΑΤΑΣΤΑΣΕΙΣ
}
13
Παράδειγμα
14
ELSE IF
if (ΣΥΝΘΗΚΗ) {
ΚΑΤΑΣΤΑΣΕΙΣ
} else if (ΣΥΝΘΗΚΗ) {
ΚΑΤΑΣΤΑΣΕΙΣ
} else if (ΣΥΝΘΗΚΗ) {
ΚΑΤΑΣΤΑΣΕΙΣ
} else {
ΚΑΤΑΣΤΑΣΕΙΣ
}
15
Παράδειγμα
16
Μετατροπή τύπου δεδομένων με μέθοδο
• Ακέραιος σε συμβολοσειρά:
String five = 5; // ΛΑΘΟΣ!
String five = Integer.toString(5);
String five = “” + 5; // five = “5”
• Συμβολοσειρά σε ακέραιο:
int foo = “18” // ΛΑΘΟΣ!
int foo = Integer.parseInt (“18”);
17
Τελεστές Σύγκρισης
• a = 6.123233995736766E-17
• a == b επιστρέφει ΛΑΝΘΑΣΜΕΝΗ τιμή!
18
3.2 Βρόχοι Επαναλήψεων
19
Βρόχος Επανάληψης
20
Βρόχος επανάληψης
21
Βρόχος επανάληψης
22
O Τελεστής while
while (συνθήκη) {
εντολές
}
23
O Τελεστής while
int i= 0;
while(i < 3) {
System.out.println( “Rule #“ + i);
i = i+1;
}
• Υπολογίστε προσεκτικά.
• Σιγουρευτείτε ότι ο βρόχος της επανάληψης έχει την
ευκαιρία να τερματίσει.
– Αλλιώς το πρόγραμμα θα πέσει σε ατέρμονο βρόχο
επανάληψης (Infinite loop).
24
Ο Τελεστής for
25
Ο Τελεστής for
26
Kαταστάσεις Διακλάδωσης
27
Kαταστάσεις Διακλάδωσης
28
Ενσωματωμένοι βρόχοι
29
30
Ενότητα 4: Πίνακες, Συνδυασμός
Βρόχων Επαναλήψεων και Πινάκων.
Περιεχόμενα
4.1 Πίνακες
6
Προσδοκώμενα Αποτελέσματα
4.1 Πίνακες
8
Πίνακες
Πίνακες
10
Πίνακες
11
Πίνακες
• Παράδειγμα:
int[] values = new int[5];
values[0] = 12; // ΣΩΣΤΟ
values[4] = 12; // ΣΩΣΤΟ
values [5] = 12; // ΛΑΘΟΣ!! Συντακτικά είναι σωστό
// αλλά εμφανίζεται σφάλμα κατά την
// εκτέλεση, καθώς τα στοιχεία
βρίσκονται // στις θέσεις από 0 έως 4.
12
Πίνακες
13
Πίνακες
15
16
Πρόσβαση στα Στοιχεία Πινάκων
• Παράδειγμα:
int [ ] values = { 12, 24, -23, 47 };
values [3] = 18; // { 12, 24 , -23, 18 }
int x = values[1] + 3; // { 12, 24 , -23, 18 }
// x = 27
17
Η Εντολή length
18
Πoλυδιάστατοι πίνακες
19
Πίνακες Συμβολοσειρών
20
4.2 Συνδυάζοντας Βρόχους Επαναλήψεων
και Πίνακες
21
• Παράδειγμα 1:
int [ ] values = new int[5];
• Παράδειγμα 2:
int [ ] values = new int [5];
int i = 0;
while (i < values.length) {
values[i] = i;
int y = values[i] * values[i];
System.out.println(y);
i++;
}
23
24
Σε αυτή την ενότητα μιλήσαμε για:
4.1 Πίνακες
26
Προσδοκώμενα Αποτελέσματα
7
5.1 Καθοριστικά Πρόσβασης
Καθοριστικά πρόσβασης
9
Καθοριστικά πρόσβασης - public
• Κλάση
– Προσβάσιμη από οποιαδήποτε κλάση
– Πρέπει να βρίσκεται σε αρχείο της μορφής <class
name>.java
• Ιδιότητα
– Προσβάσιμη από οποιαδήποτε κλάση
• Μέθοδος
– Προσβάσιμη από οποιαδήποτε κλάση
10
• Κλάση
– Δεν γίνεται να είναι private (γιατί;)
• Ιδιότητα
– Προσβάσιμη μόνο από την κλάση της
• Μέθοδος
– Προσβάσιμη μόνο από την κλάση της
11
Καθοριστικά πρόσβασης - final
• Κλάση
– Δεν μπορεί να κληρονομηθεί
• Ιδιότητα
– Δε μπορεί να αλλάξει (σταθερά)
• Μέθοδος
– Δεν μπορεί να υπερκαλυφθεί
12
• Ιδιότητα
– Προσβάσιμη μόνο από μέλη της ίδιας κλάσης και μέλη των
υποκλάσεων της
• Μέθοδος
– Προσβάσιμη μόνο από μέλη της ίδιας κλάσης και μέλη των
υποκλάσεων της
13
Παράδειγμα
public class bank_balance
{
public String owner;
private int balance;
15
Παράδειγμα
16
Παράδειγμα
Τιμές
Θέσεις
18
Περίπτωση 2
• Τι εκτυπώνει;
19
Περίπτωση 3
20
Περίπτωση 4
21
Περίπτωση 5
22
23
Μέθοδοι Εντοπισμού Σφαλμάτων 2
5.3 Αντικειμενοστραφής
Προγραμματισμός
25
Αντικειμενοστραφής Προγραμματισμός
Μωρό
26
Αντικειμενοστραφής Προγραμματισμός
Μωρό
Όνομα
Φύλο
Βάρος
Decibels
Δόντια
27
Αντικειμενοστραφής Προγραμματισμός
• Ομαδοποίηση αντικειμένων:
– Βασικοί τύποι μεταβλητών (int, double, char, etc..)
– Αντικείμενα (Strings, etc.. )
Μωρό
Όνομα: String onoma
Φύλο: boolean einaiAgori
Βάρος: double varos
Decibels: double decibels
Δόντια: int numDontia
28
29
Γιατί Χρησιμοποιούμε Κλάσεις;
Όνομα
Βάρος
Φύλο
…
Μωρό1
31
Γιατί Χρησιμοποιούμε Κλάσεις;
32
Βρεφοκομείο 33
Γιατί Χρησιμοποιούμε Κλάσεις;
Περισσότερες
Νοσοκόμα1 Νοσ/μα2 Νοσ/μα3 Νοσ/μα4 νοσοκόμες…
496 ακόμα
Μωρό1 Μωρό2 Μωρό3 Μωρό4
μωρά…
Βρεφοκομείο 34
[]
Νοσοκόμα1
[]
Μωρό1
Βρεφοκομείο 35
Γιατί Χρησιμοποιούμε Κλάσεις;
[]
Νοσοκόμα1
Εντατική Μονάδα
[] Θεραπείας
Μωρό1
Βρεφοκομείο
Νοσοκομείο 36
37
Κλάση
void newTooth() {
numberOfTeeth += 1;
System.out.println( “Mama ” + “my teeths hurt!” ) ;
}
}
38
Κλάση
39
Ας ορίσουμε την κλάση Baby
40
41
Σημείωση
42
TYPE var_name;
TYPE var_name = some_value;
43
Πεδία Κλάσης Baby
44
Υπάρχουν Αδέλφια??
45
Δημιουργία Στιγμιότυπου της Κλάσης Baby
Δημιουργοί (Constructors)
CLASSNAME ( [ ARGUMENTS ] ) {
}
}
CLASSNAME obj1 = new CLASSNAME ( ) ;
CLASSNAME obj2 = new CLASSNAME ( [ ARGUMENTS ] );
47
Δημιουργοί (Constructors)
48
49
Κλάση Baby - Μέθοδοι
50
51
Κλάση Baby
52
53
Ανασκόπηση της Εμβέλειας
54
55
Ανασκόπηση της Εμβέλειας
56
Εμβέλεια
57
Η Λέξη-Κλειδί ‘this’
Χρήση:
class Example {
int memberVariable ;
void setVariable ( int newVal ) {
this.memberVariable += newVal ;
}
}
58
59
Μόνο οι Μεταβλητές ‘servings’ της Μεθόδου έχουν
Ανανεωμένες Τιμές
60
// Ορισμός κλάσης
public class Baby { … }
// Αντικείμενα κλάσης
Baby shiloh = new Baby ( “Shiloh Jolie-Pitt” , true ) ;
Baby knox = new Baby ( “Knox Jolie-Pitt” , true ) ;
61
Πρόσβαση σε Πεδία Αντικειμένων των Κλάσεων
62
Καλούμενη Μέθοδος
63
5.3.3 Βασικοί Τύποι vs Αναφορές
64
65
Πως η Java Αποθηκεύει τους Βασικούς Τύπους;
66
67
Πως η Java Αποθηκεύει Αντικείμενα
68
Αναφορές
ΟΧΙ!
69
Αναφορές
70
Αναφορές
71
Αναφορές
72
Αναφορές
73
Αναφορές
74
Αναφορές
• Χρησιμοποιήστε [ ] ή •
– ακολουθεί την αναφορά στο αντικείμενο.
– ίσως τροποποιεί το αντικείμενο, αλλά ποτέ την αναφορά.
• Φανταστείτε ότι:
– ακολουθείτε οδηγίες για να βρείτε ένα σπίτι.
– μετακινείτε ένα έπιπλο τριγύρω.
• Είναι ανάλογο με το να:
– ακολουθείτε την αναφορά σε ένα αντικείμενο.
– αλλάζετε τα πεδία σε ένα αντικείμενο.
75
Μέθοδοι και Αναφορές
int i = 0 ;
int [ ] j = {0} ;
Baby k = new Baby ( “50” , true ) ;
doSomething (i, j, k) ;
77
Στατικός Τύπος (Static)
78
Τι είναι:
b1.numBabiesMade?
b2.numBabiesMade?
79
Static - Παράδειγμα
80
Static - Πεδίο
81
Static - Μέθοδος
82
Static - Σημειώσεις
83
Main
84
86
Ενότητα 6: Κληρονομικότητα,
Interfaces και I/O
Περιεχόμενα
6.1 Κληρονομικότητα
6
Προσδοκώμενα Αποτελέσματα
6.1 Κληρονομικότητα
8
Βασική Κλάση
Κληρονομικότητα
10
Κληρονομικότητα;
Αλλά περιμένετε!
Ένας Μάγος μπορεί και κάνει οτιδήποτε ένας
Person μπορεί και κάνει!
11
Κληρονομικότητα;
12
Χρήση Κληρονομικότητας
13
Κληρονομικότητα
14
Κληρονομικότητα
15
16
Πως το Καταφέρνει Αυτό η Java;
17
18
Τι Συμβαίνει στο Παράδειγμα μας;
20
Μπορείτε να Κληρονομήσετε Μόνο από μία Κλάση
21
22
Για να Διαβάσετε Περισσότερα:
• http://java.sun.com/docs/books/tutorial/java/IandI/subclasses.html
• http://home.cogeco.ca/~ve3ll/jatutor5.htm
• http://en.wikipedia.org/wiki/Inheritance_(computer_science)
• http://www.google.com
23
24
Υλοποίηση/ Διεπαφή
25
Διεπαφές Java
26
Παράδειγμα Διεπαφής: Σχεδιασμός ενός Κουτιού
// … Σχεδιασμός κουτιών…
for (BouncingBox box : boxes) {
box.draw(surface);
}
27
// … Σχεδιασμός λουλουδιών…
for (Flower flower : flowers) {
flower.draw(surface);
}
28
Παράδειγμα
29
Παράδειγμα
30
Διεπαφές
31
import java.awt.Graphics;
interface Drawable {
void draw(Graphics surface);
void setColor(Color color);
}
32
Υλοποιώντας Διεπαφές
import java.awt.Graphics;
class Flower implements Drawable {
// ... Υπόλοιπος κώδικας...
public void draw(Graphics surface) {
// ... Κώδικας σχεδιασμού flower εδώ...
}
}
33
Παρατηρήσεις
34
6.3 Είσοδος – Έξοδος (I/O)
35
• System.out.println(“some string”);
36
Η Ολοκληρωμένη Εικόνα
37
InputStream
38
InputStreamReader
new InputStreamReader(stream)
39
BufferReader
new BufferedReader(
new InputStreamReader(System.in));
40
Είσοδος Χρήστη
InputStreamReader ir = new
InputStreamReader(System.in);
BufferedReader br = new BufferedReader(ir);
br.readLine();
41
FileReader
42
Κώδικας FileReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
43
• http://java.sun.com/docs/books/tutorial/essential/io/
44
Εργασία
• Μαγικά Τετράγωνα
• Διαβάστε δύο αρχεία
• Ελέγξτε ότι όλες οι σειρές και οι στήλες έχουν άθροισμα
15
45
6.1 Κληρονομικότητα
47
Ενότητα 7: Εξαιρέσεις (Exceptions),
Εντοπισμός Σφαλμάτων (Debugging)
Περιεχόμενα
6
Προσδοκώμενα Αποτελέσματα
8
Παραδείγματα Εξαιρέσεων (Exceptions)
• NullPointerException
• ArrayIndexOutOfBoundsException
• ClassCastException
• RuntimeException
10
Γιατί Χρησιμοποιούμε μία Εξαίρεση;
11
12
Public class Εξαίρεση
13
14
Πιάνοντας μια Εξαίρεση
15
• Τι πρέπει να κάνουμε:
-προσπαθούμε (try) να τρέξουμε κώδικα ο οποίος
εμφανίζει μια εξαίρεση
- και στη συνέχεια να πιάσουμε (catch)την εξαίρεση
try {
get(-1);
} catch (ArrayOutOfBoundsException err) {
System.out.println(“oh dear!”);
}
16
Πιάνοντας μια Εξαίρεση
17
18
Πετώντας μια Εξαίρεση
19
20
Πετώντας μια Εξαίρεση
21
22
Πετώντας μια Εξαίρεση
23
24
Πετώντας μια Εξαίρεση
25
26
Πετώντας μια Εξαίρεση
27
• Αν τρέξετε
public static void main(String[] args) throws Exception {
doBad();
}
28
Περισσότερες Πληροφορίες;
• http://java.sun.com/docs/books/tutorial/essential/exceptions
• http://en.wikipedia.org/wiki/Exceptions
29
30
Εντοπισμός Σφαλμάτων
31
32
Βήμα 1: Μην Κάνετε Λάθη
33
Σχέδιο: Ψευδοκώδικας
34
Ψευδοκώδικας: Έλεγχος Διαστήματος
• Παράδειγμα:
– Είναι ένας αριθμός στο διάστημα [x,y);
35
Σχέδιο
36
Παράδειγμα
37
– Ελέγξτε το σχέδιο.
– Χρησιμοποιήστε εργαλεία για εντοπισμό πιθανών λαθών.
– Ελέγξτε την υλοποίηση σας.
– Ελέγξτε την εργασία σας βάζοντας συνθήκες.
38
Δοκιμή: Σημαντικοί Είσοδοι
• Παράδειγμα:
– Είναι ένας αριθμός στο διάστημα [x,y);
39
40
Διαστήματα: Σημαντικές Περιπτώσεις
41
42
Ψευδοκώδικας: Έλεγχος Διαστήματος
43
44
Εξακρίβωση
45
Παράδειγμα
46
Βήμα 3: Αναπαράγετε το Σφάλμα
47
• Τι πηγαίνει στραβά;
• Τι μπορεί να έχει προκαλέσει το σφάλμα;
48
Σε αυτή την ενότητα μιλήσαμε για:
50
Οδηγίες χρήσης και σύντομη εισαγωγή στην πλατφόρμα Greenfoot
Version 1.1
Λάζαρος Τουμανίδης,
Κόγιας Δημήτριος
1
Οι σημειώσεις βασίζονται στους αντίστοιχους οδηγούς που βρίσκονται στην ιστοσελίδα του Greenfoot, και στην ελληνική
μετάφραση αυτών (Mantzas Ioannis, Milolidakis Giannis).
Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [1]
Πίνακας περιεχομένων
Οδηγός 1: Αλληλεπιδρώντας με το Greenfoot .......................................................................................................... 3
Η διεπαφή Greenfoot ............................................................................................................................................ 3
Εισαγωγή αντικειμένων στον κόσμο ..................................................................................................................... 6
Ενεργοποίηση των αντικειμένων........................................................................................................................... 7
Εκτέλεση σεναρίου ................................................................................................................................................ 9
Άμεση εκτέλεση μεθόδων ................................................................................................................................... 10
Δημιουργία ενός νέου κόσμου ............................................................................................................................ 10
Κλήση μεθόδων του “κόσμου” ............................................................................................................................ 10
Οδηγός 2: Κίνηση και κλειδιά ελέγχου .................................................................................................................... 13
Το σενάριο Crabs ................................................................................................................................................. 13
Οδηγός 3: Εντοπισμός και αφαίρεση των Actors και δημιουργία μεθόδων .......................................................... 17
Τρώγοντας σκουλήκια ......................................................................................................................................... 17
Refactoring – ‘Η αλλιώς ανακατασκευή του κώδικα μας.................................................................................... 20
Οδηγός 4: Αποθήκευση του κόσμου, αναπαραγωγή και καταγραφή ήχου ........................................................... 22
Αποθήκευση του κόσμου..................................................................................................................................... 22
Αναπαραγωγή και αποθήκευση ήχων ................................................................................................................. 23
Οδηγός 5: Προσθήκη τυχαία κινούμενου εχθρού ................................................................................................... 24
Προσβασιμότητα ενός αντικειμένου από ένα άλλο ............................................................................................ 26
Παράρτημα Α: Λήψη, εγκατάσταση και χρήση του Greenfoot ............................................................................... 31
Παράρτημα Β: Χρήσιμοι σύνδεσμοι ........................................................................................................................ 32
Η διεπαφή Greenfoot
Ο οδηγός αυτός χρησιμοποιεί ένα σενάριο που ονομάζεται ‘wombats’ το οποίο διανέμεται με το
Greenfoot αλλά μπορείτε να το βρείτε και στην πλατφόρμα του μαθήματος και να το κατεβάσετε.
Ανοίγουμε το σενάριο wombats στο Greenfoot επιλέγοντας Scenario και Open και κατόπιν
διαλέγουμε τη θέση του αρχείου Project για το wombat στον σκληρό μας.
Η μεγάλη περιοχή με το πλέγμα που καλύπτει την πλειοψηφία του παραθύρου, ονομάζεται “The
World’ δηλαδή “Ο Κόσμος” της εφαρμογής μας. Εφόσον έχουμε ένα σενάριο το οποίο έχει να κάνει με
wombats βλέπουμε ένα wombat world.
Στην δεξιά μεριά του παραθύρου είναι η οθόνη των κλάσεων. Εδώ μπορούμε να δούμε όλες τις
κλάσεις τις java που εμπεριέχονται στο σενάριο (project). Οι κλάσεις ‘world’ και ‘actor’ θα είναι
πάντα εκεί καθώς έχουν προστεθεί από το σύστημα του Greenfoot. Οι υπόλοιπες κλάσεις ανήκουν
στο σενάριο wombat και θα είναι διαφορετικές ανάλογα με το σενάριο που ανοίγουμε ή
δημιουργούμε. Κάτω από τον “Κόσμο” είναι τα εργαλεία εκτέλεσης (Η περιοχή με τα κουμπιά “Act”,
“Run” “Reset” και τον ρυθμιστή της ταχύτητας).
Οι κλάσεις
Τα εργαλεία εκτέλεσης
Για την εισαγωγή αντικειμένων στον νέο κόσμο, επιλέγουμε με δεξί κλικ (σε υπολογιστές Mac, όπου
υπάρχει δεξί κλικ στον οδηγό αυτόν ο αντίστοιχος συνδυασμός είναι Control-κλικ) την κλάση Wombat
από την περιοχή όπου υπάρχουν όλες οι κλάσεις. Το αναδυόμενο μενού είναι το παρακάτω:
Αν θέλουμε να αφαιρέσουμε ένα αντικείμενο από τον κόσμο, μπορούμε να το κάνουμε με την
επιλογή που εμφανίζεται με δεξί κλικ πάνω στο αντικείμενο αυτό.
Με δεξί κλικ πάνω σε ένα αντικείμενο (και χωρίς να εκτελείται το σενάριο) μπορούμε να δούμε τις
διαθέσιμες μεθόδους που σχετίζονται με αυτό και να επιλέξουμε οποιαδήποτε από αυτές.
Υπάρχει περίπτωση, αν μετρήσουμε τα φύλλα που βλέπουμε στον κόσμο μετά την κλήση της μεθόδου
αυτής, να δούμε πως υπάρχουν λιγότερα από αυτά που θέσαμε. Κάτι τέτοιο μπορεί να συμβεί σε
περίπτωση που κάποια φύλλα τοποθετούνται στην ίδια θέση, οπότε δεν μπορούμε τα ξεχωρίσουμε.
Αφού εξοικειωθούμε με το περιβάλλον του Greenfoot μπορούμε να προχωρήσουμε στο μέρος του
προγραμματισμού.
Τα άγκιστρα στην Java χρησιμοποιούνται για να πλαισιώσουν μπλοκ κώδικα, όπως οι μέθοδοι ή τα
περιεχόμενα μιας κλάσης.
Το σενάριο Crabs
Χρειάζεται προσοχή έτσι ώστε να γράψουμε ακριβώς ότι βλέπουμε στην εικόνα, δηλαδή την εντολή
move ακολουθούμενη από παρενθέσεις που περιέχουν τον αριθμό 4 ακολουθούμενες από το
ελληνικό ερωτηματικό (;). Συνήθη λάθη είναι η χρήση κεφαλαίου M στο move (στη Java τα κεφαλαία
και τα μικρά γράμματα παίζουν ρόλο), η έλλειψη του ελληνικού ερωτηματικού, η χρήση λάθος
συμβόλων οριοθέτησης (παρένθεση) ή η από λάθος αφαίρεση των αγκίστρων {} πριν και μετά τον
κώδικα. Αν λάβετε κάποιο μήνυμα σφάλματος κατά τη διάρκεια του οδηγού αυτού, ελέγξτε αν έχετε
κάνει κάποιο από αυτά τα λάθη.
Αφού γράψουμε τον κώδικα, πατάμε το κουμπί Compile στην κεντρική διεπαφή του Greenfoot (ή
επάνω αριστερά στο παράθυρο του επεξεργαστή του κώδικα μας), τοποθετούμε ένα καβούρι (new
Crab()) και επιλέγουμε την εκτέλεση του σεναρίου (Run). Αυτή τη φορά το καβούρι κινείται κατά
μήκος του πλαισίου του κόσμου, έως ότου φτάσει
στο τέλος του πλαισίου και σταματήσει.
Μπορούμε επίσης να αλλάξουμε την τιμή 4 στον κώδικα που γράψαμε προηγουμένως με κάποια
άλλη, ώστε να διαμορφώσουμε την ταχύτητα κίνησης. Μεγαλύτερη τιμή θα δώσει μεγαλύτερη
ταχύτητα ενώ μικρότερη τιμή, μικρότερη ταχύτητα. Μπορούμε επίσης να δώσουμε και αρνητική τιμή
(τι θα αλλάξει στην κίνηση σε αυτή την περίπτωση;).
Αν θέλουμε το καβούρι να μην κινείται μόνο σε μια ευθεία, μπορούμε να προσθέσουμε και την
εντολή turn(n), ώστε να στρίβει κατά κάποιες μοίρες.
Σε αυτή την περίπτωση βλέπουμε πως το καβούρι τώρα ακολουθεί μια κυκλική τροχιά και ακόμα κι αν
βρεθεί σε κάποιο από τα όρια του κόσμου, κάποια στιγμή θα στρίψει και θα επιστρέψει εντός των
ορίων. Μπορούμε με αλλαγή της παραμέτρου της στροφής να αλλάξουμε την ακτίνα του κύκλου σε
μεγαλύτερη ή μικρότερη (Αν αλλάξουμε και την παράμετρο της μετακίνησης, τι αλλάζει στην τροχιά
της κίνησης και γιατί;).
Ας προσθέσουμε στον κώδικά μας λίγη διαδραστικότητα. Μπορούμε να πούμε στο καβούρι να
στρίβει μόνο αν πιέσουμε το πλήκτρο ‘→’ ή ‘←’ του πληκτρολογίου.
Χρησιμοποιούμε προκαθορισμένες μεθόδους του Greenfoot για να ελέγχουμε εάν ένα πλήκτρο είναι
πατημένο. Ανάμεσα στα εισαγωγικά είναι το όνομα του πλήκτρου, "left" είναι το πλήκτρο με το
αριστερό βελάκι, "right" είναι το πλήκτρο με το δεξί. Εάν θέλουμε κάτι σαν "a" ή "d", απλά
Αν βάλουμε πολλά καβούρια στον κόσμο, θα δούμε ότι πατώντας τα πλήκτρα ελέγχου όλα μαζί
ταυτόχρονα με σωστό συγχρονισμό, θα υπάρξει υπερφόρτωση: όλα τα καβούρια εκτελούν τον ίδιο
κώδικα, έτσι ώστε αν πατήσουμε το αριστερό πλήκτρο, όλα τους θα δουν ότι το αριστερό πλήκτρο
είναι πατημένο, και όλα θα κινηθούν αναλόγως.
Τι θα συμβεί αν κρατήσουμε πατημένο και το αριστερό και το δεξί την ίδια στιγμή; Δοκιμάστε το και
ανακαλύψτε - στη συνέχεια εξετάστε τον κώδικα και δείτε αν μπορείτε να ανακαλύψετε το λόγο που
συμβαίνει αυτό.
Τρώγοντας σκουλήκια
Συνεχίζοντας από προηγούμενο μέρος, όπου είχαμε τα καβούρια να
κινούνται στο εσωτερικό του κόσμου μας, κάτω από τον έλεγχό μας. Θα
προσθέσουμε τώρα και μερικά σκουλήκια για να τρώνε τα καβούρια. Το
σκουλήκι θα είναι κι αυτό ένας Actor, οπότε για να φτιάξουμε την νέα
κλάση ‘worm’ με δεξί κλικ στην κλάση Actor, επιλέγουμε New subclass.
Εισάγουμε το όνομα της νέας κλάσης Worm – σημειώστε πως χρησιμοποιούμε το κεφαλαίο γράμμα
W. Πρόκειται για μια σύμβαση στην Java να χρησιμοποιούμε κεφαλαία για το πρώτο γράμμα του
ονόματος μιας κλάσης. Για εικόνα επιλέγουμε το αρχείο “worm.png” και πατάμε ok.
Στο τέλος της μεθόδου act(), θα πρέπει να δημιουργήσουμε ένα αντικείμενο της κλάσης Worm και να
προσθέσουμε, κατόπιν, μια εντολή που θα ελέγχει αν ένα καβούρι ακουμπάει το σκουλήκι που
δημιουργήσαμε.
Αναλόγως την τιμή της μεταβλητής μας, μπορούμε να εξετάσουμε αν όντως υπάρχει κάποιο
αντικείμενο στην ίδια θέση με εμάς. Αν δεν υπάρχει, η μεταβλητή μας θα έχει την ειδική τιμή ‘null’,
οπότε μπορούμε να αφαιρέσουμε το σκουλήκι, μόνο εάν η μεταβλητή είναι διαφορετική από ‘null’,
συνεπώς και θα πρέπει να γίνει ο αντίστοιχος έλεγχος.
Ο κώδικας που εισάγαμε μέσα στον έλεγχο δουλεύει ως εξής: Πρώτα ορίζουμε μια μεταβλητή (με το
όνομα world) ώστε να μπορέσουμε να αλληλεπιδράσουμε με τον κόσμο μας και να του ζητήσουμε,
στη συνέχεια, να αφαιρέσει ένα αντικείμενο (δηλαδή το worm). Έπειτα, αρχικοποιούμε αυτήν την
μεταβλητή με τον συγκεκριμένο κόσμο που έχουμε δημιουργήσει με τη βοήθεια της εντολής
‘getWorld()’. Τέλος, αφαιρούμε το σκουλήκι από τον κόσμο με την μέθοδο ‘removeObject()’.
Στη μορφή που βρίσκεται τώρα, η μέθοδος ‘act()’ για το Καβούρι έχει δύο διαφορετικές
συμπεριφορές μέσα της: οι μισές συμπεριφορές έχουν να κάνουν με την κίνηση μέσα στον κόσμο, και
οι άλλες μισές έχουν να κάνουν με το φάγωμα των σκουληκιών. Θα ήταν πιο ευδιάκριτο αν τις
ονομάζαμε και τις χωρίζαμε, για να αποφύγουμε πιθανή σύγχυση στο μέλλον.
Αν συγκρίνουμε τις δύο εκδόσεις θα δούμε πως δεν έχουμε αλλάξει ή αφαιρέσει καθόλου από τον
υπάρχοντα κώδικα. Μεταφέραμε το πρώτο μισό σε μια νέα μέθοδο moveAndTurn(), και το δεύτερο
μισό σε μια άλλη eat().
Στη συνέχεια αντικαταστήσαμε το περιεχόμενο της μεθόδου act() με κλήσεις των δύο νέων αυτών
μεθόδων έτσι ώστε να διατηρηθεί η ίδια συμπεριφορά στο πρόγραμμα μας.
Για να το επιτύχουμε αυτό, επιλέγουμε Reset και στη συνέχεια προσθέτουμε τα αντικείμενα που
θέλουμε να δημιουργούνται στον κόσμο μας. Πριν πατήσουμε Run, με δεξί κλικ στον κόσμο
επιλέγουμε ‘Save the World’.
Με αυτή την επιλογή, προσθέσαμε λίγο κώδικα στην κλάση CrabWorld, έτσι ώστε όποτε επιλέξουμε
Reset ή να κάνουμε κάποια μεταγλώττιση, να τοποθετούνται πάντα τα αντικείμενα που έχουμε βάλει
στο σενάριο αυτό, στις θέσεις που επιλέξαμε.
Δεν θα εμβαθύνουμε στον κώδικα αυτό τώρα, αλλά μπορείτε να τον δείτε στο παράθυρο που
αναδύεται μετά την επιλογή Save the World. Αν θέλουμε να επιστρέψουμε στην αρχική κατάσταση,
χωρίς την αυτόματη αρχική προσθήκη αντικειμένων στον κόσμο, θα έπρεπε να αφαιρέσουμε από την
κλάση CrabWorld τον κώδικα αυτό.
Μπορούμε επίσης εάν διαθέτουμε μικρόφωνο στον υπολογιστή μας, να ηχογραφήσουμε τους δικούς
μας ήχους. Στο μενού Controls υπάρχει η επιλογή εμφάνισης του παραθύρου ηχογράφησης.
Αφού κλείσουμε το παράθυρο της ηχογράφησης, επιστρέφουμε στον κώδικα και αντικαθιστούμε στην
γραμμή που υπάρχει το “eating.wav” σε “myeating.wav” (ή όποιο όνομα δώσατε στο αρχείο). Τώρα
κάθε φορά που θα ακούγεται ο ήχος θα είναι από το αρχείο που προσθέσαμε εμείς.
Εργαστήριο Αντικειμενοστραφούς προγραμματισμού: Εισαγωγή στην πλαφόρμα Greenfoot [23]
Οδηγός 5: Προσθήκη τυχαία κινούμενου εχθρού
Στο τέλος του προηγούμενου οδηγού είχαμε καταλήξει στο σενάριο όπου ένα καβούρι που μπορούμε
να ελέγξουμε, κινείται κυκλικά και τρώει σκουλήκια. Αν και είναι λίγο δύσκολο να ελέγξουμε την
κίνηση του καβουριού, το παιχνίδι είναι αρκετά εύκολο. Είναι καιρός να το δυσκολέψουμε λίγο
προσθέτοντας έναν εχθρό: έναν αστακό!
Ας ξεκινήσουμε προσθέτοντας έναν αστακό που κινείται σε μία ευθεία γραμμή και τρώει καβούρια.
Μπορούμε να το κάνουμε με κώδικα που έχουμε ήδη χρησιμοποιήσει προηγουμένως. Αρχικά
δημιουργούμε την κλάση Lobster κάνοντας δεξί κλικ στην κλάση Actor=> new subclass και δίνοντας
στην καινούργια κλάση το όνομα Lobster. Η εικόνα του αστακού βρίσκεται στη λίστα με τις εικόνες
στα αριστερά.
Έχοντας δημιουργήσει την κλάση Lobster, μπορούμε να περάσουμε τον απαραίτητο κώδικα για την
κίνηση και το φάγωμα του καβουριού. Όλα τα βήματα αυτά έχουν γίνει στους προηγούμενους
οδηγούς, οπότε δε παραθέτουμε κάποια εικόνα ή κάποιο κώδικα. Δοκιμάστε και αν δεν τα
καταφέρετε μπορείτε να δείτε τον κώδικα εδώ.
Όλα καλά, αλλά ο αστακός μας δεν είναι και πολύ έξυπνος, αφού είναι εύκολο να τον αποφύγουμε
κινούμενοι κυκλικά δεξιά ή αριστερά με τα αντίστοιχα πλήκτρα. Επίσης, μόλις ο αστακός φτάσει στη
δεξιά άκρη του κόσμου, σταματάει, όπως έκανε και το καβούρι σε προηγούμενο οδηγό.
Ας δυσκολέψουμε λίγο το παιχνίδι, εισάγοντας λίγη τυχαιότητα στην κίνηση του αστακού. Το
Greenfoot μας παρέχει μία συνάρτηση ‘Greenfoot.getRandomNumber’ η οποία μας επιστρέφει έναν
τυχαίο αριθμό. Μια πρώτη δοκιμή στη συνάρτηση turn, όπου παράγουμε έναν τυχαίο αριθμό σαν
όρισμα της και επιτυγχάνουμε τυχαία στροφή περίπου ανά frame είναι η παρακάτω:
Με τον κώδικα αυτό έχουμε τυχαία στροφή σε κάθε frame κατά γωνία ανάμεσα σε 0
(συμπεριλαμβανομένου του 0) και 90 (χωρίς να συμπεριλαμβάνεται το 90) μοίρες (0 ≤ φ < 90).
Δοκιμάζοντάς τον κώδικα μας παρατηρούμε πως ο εχθρός που δημιουργήσαμε δεν είναι και πολύ
απειλητικός: ο αστακός περιστρέφεται ως επί το πλείστον σε ένα σημείο και γυρίζει πάντα προς τα
δεξιά. Ας διορθώσουμε αυτά τα προβλήματα ένα-ένα, ξεκινώντας με την περιστροφή γύρω από ένα
σημείο.
Μέχρι στιγμής, ο αστακός μας κινείται σε κάθε frame, κάτι που τον κάνει να περιστρέφεται και όχι να
περιπλανιέται. Υπάρχουν διάφοροι τρόποι, με τους οποίους θα μπορούσε να περιστρέφεται λιγότερο
Ας πούμε ότι ο αστακός έχει 10% πιθανότητα να περιστρέφεται ανά frame. Μπορούμε να το
προγραμματίσουμε αυτό, συγκρίνοντας το Greenfoot.getRandomNumber(100) με ένα δεδομένο
ποσοστό. Για το παράδειγμα μας, αφού το ποσοστό είναι 10%, θα συγκρίνουμε το
Greenfoot.getRandomNumber(100) με το 10:
Προσπαθήστε να σκεφτείτε πως δουλεύει ο παραπάνω κώδικας και, ιδιαίτερα, γιατί χρησιμοποιούμε
το σύμβολο < αντί για <=. Θα μπορούσαμε να το υλοποιήσουμε αυτό με διαφορετικό τρόπο;
Ο παραπάνω κώδικας μας θα κάνει τον αστακό μας να γυρίζει (κατά μέσο όρο) κάθε 10 καρέ. Αν το
μεταγλωττίσουμε, θα δούμε πως ο αστακός κινείται κυρίως σε μια ευθεία, περιστασιακά στρίβοντας
δεξιά. Αυτό είναι αποδεκτό, και μας φέρνει πίσω στο άλλο πρόβλημά μας: ο αστακός γυρίζει πάντα
δεξιά.
Γνωρίζουμε από το καβούρι μας ότι ο τρόπος για να στρίψει αριστερά είναι να χρησιμοποιήσουμε
έναν αρνητικό αριθμό για τη γωνία. Αν μπορούσαμε να αλλάξουμε τη στροφή του αστακού μας από
την εμβέλεια 0ο έως 90 ο στην εμβέλεια -45 ο έως 45 ο, θα έφτιαχνε το πρόβλημα μας.
Υπάρχουν αρκετοί τρόποι για να επιτευχθεί αυτό, αλλά θα δούμε τον απλούστερο, κατά τη γνώμη
μας: Κοιτάξτε ότι εάν αφαιρέσουμε από τον τυχαία παραγόμενο αριθμό το 45, θα καταλήξουμε με
έναν αριθμό στη σωστή εμβέλεια. Ας προσαρμόσουμε λοιπόν ανάλογα τον κώδικα μας:
Το μεταγλωττίζουμε, το εκτελούμε και τώρα έχουμε έναν αποτελεσματικό εχθρό που μπορεί να
γυρίσει προς το μέρος μας ανά πάσα στιγμή. Βάζουμε ένα καβούρι, μερικούς αστακούς και πολλά,
πολλά σκουλήκια στον κόσμο μας. Θυμηθείτε, πως μπορείτε ανά πάσα στιγμή να αποθηκεύσετε τον
κόσμο αν θέλετε.
Παρατηρούμε, ωστόσο, ότι υπάρχει ένα ακόμα ελάττωμα: οι αστακοί μπορεί να κολλήσουν για ένα
διάστημα στις άκρες του κόσμου. Αυτό οφείλεται στο γεγονός ότι από τη στιγμή που χτύπησε την
άκρη του κόσμου, θα κινηθεί μακριά από εκεί μόνο μετά από μερικές τυχαίες στροφές.
Με αυτό τελειώνουμε και τον οδηγό για τα καβούρια. Μπορείτε να πειραματιστείτε, προσθέτοντας
νέα χαρακτηριστικά (όπως ένας δεύτερος παίχτης), ή να χρησιμοποιήσετε ότι μάθατε για να
δημιουργήσετε ένα νέο σενάριο.
tut-access-p1 (ανοίγουμε τον σύνδεσμο σε νέο παράθυρο ή νέα καρτέλα) Το σενάριο αυτό είναι ένα
απλό παιχνίδι όπου, όταν πατάμε το πλήκτρο του κενού (Space bar) ένας πύραυλος πυροβολεί τους
αστεροειδής που περνάνε. Επίσης, υπάρχει ένας μετρητής του σκορ, αλλά δεν λειτουργεί ακόμα.
Ανοίγουμε το σενάριο από την τοποθεσία στον υπολογιστή μας όπου κατεβάσαμε το αρχείο και
ξεκινάμε.
Στο παράδειγμα αυτό, υπάρχουν διάφορες κλάσεις όπως “Counter”, “Rocket” και “Shot”. Η κλάση
Counter έχει μια μέθοδο “bumpCount()” η οποία αυξάνει το σκορ που εμφανίζει ο μετρητής:
Δεν πειράζει αν δεν καταλαβαίνετε ακόμα τον κώδικα. Το σημαντικό που πρέπει να κρατήσουμε είναι
το εξής: αν καλέσουμε την μέθοδο bumpCount(), ο αριθμός που εμφανίζει ο μετρητής θα αυξηθεί
κατά το ποσό που έχουμε καθορίσει κατά την κλήση της συνάρτησης (δηλαδή το amount στο
παραπάνω πρόγραμμα).
Στην κλάση Shot τώρα, μπορούμε να έχουμε μία μέθοδο η οποία και θα καλείται από την μέθοδο act()
της ίδιας κλάσης, όποτε χτυπάμε έναν αστεροειδή:
Λαμβάνουμε το σφάλμα αυτό γιατί ο μεταγλωττιστής ψάχνει μόνο στην ίδια κλάση (την Shot) για την
“bumpCount()” μέθοδο, η οποία φυσικά και δεν υπάρχει σε αυτή την κλάση. Επομένως, θα πρέπει με
κάποιο τρόπο να πούμε στον μεταγλωττιστή να ψάξει για τη μέθοδο “bumpCount()” στην κλάση
Counter. Πριν συνεχίσουμε, αφαιρούμε τον κώδικα κλήσης της μεθόδου “bumpCount()” από τη
μέθοδο “hitAnAsteroid()” ώστε να αποφύγουμε το παραπάνω σφάλμα μεταγλώττισης.
Σε αυτή τη λύση, θα αποθηκεύσουμε μια αναφορά στο μετρητή του σκορ στον κόσμο, ώστε να
μπορούμε να τον ανακτήσουμε από εκεί όποτε αυτό χρειαστεί.
Αφού σιγουρευτούμε ότι ο κώδικας μεταγλωττίζεται κανονικά, παρατηρούμε ότι έχουμε προσθέσει
μια δήλωση για μια μεταβλητή “theCounter”. Πρόκειται για μια μεταβλητή στιγμιότυπου, που
σημαίνει ότι θέλουμε να κρατήσουμε την τιμή της για όσο υπάρχει ο κόσμος, γι ‘αυτό δηλώνεται
εκτός του κατασκευαστή SpaceWorld (αλλά εντός της κλάσης SpaceWorld).
Τώρα προσθέτουμε μια μέθοδο στην κλάση Space που λαμβάνει την τιμή του “theCounter” ώστε να
μπορεί αυτή να είναι προσβάσιμη από τον πύραυλο.
Τώρα μπορούμε να έχουμε πρόσβαση στον κόσμο από την κλάση Shot και να καλέσουμε την μέθοδο
getCounter() στον κόσμο έτσι ώστε να αποκτήσουμε μια αναφορά στον μετρητή μας. Τέλος καλούμε
τη μέθοδο bumpCount() στην αναφορά του μετρητή μας.
Σύμφωνα με τα παραπάνω, η μέθοδος hitAnAsteroid() στην κλάση Shot που περιλαμβάνει όλα τα
παραπάνω, θα πρέπει να είναι:
tut-access-p2
Version 2.0
Επιμέλεια:
Κόγιας Δημήτρης,
Χαράλαμπος Πατρικάκης,
Aliaksandr Barushka
1
Το κείμενο έχει γραφτεί χρησιμοποιώντας υλικό από τις οδηγίες για τους χρήστες του προγράμματος DrJava που
είναι διαθέσιμες στη σελίδα http://drjava.org
Εργαστήριο Αντικειμενοστραφούς προγραμματισμού [1]
Πίνακας Περιεχομένων
Φιλοσοφία
Η γενική ιδέα πίσω από το DrJava είναι να αποτελέσει ένα ισχυρό εργαλείο ανάπτυξης, το οποίο να
μπορεί να χρησιμοποιηθεί όσο γίνεται πιο εύκολα.
Για το λόγο αυτό, το DrJava είναι απλό για να το τρέξει και να το καταλάβει ο χρήστης,
χρησιμοποιώντας μια απλή διεπαφή χρήστη, ευκολόχρηστα παράθυρα και μια ευανάγνωστη
γραμμή εργαλείων. Επιπλέον, επιδιώκει τη διευκόλυνση των αρχάριων χρηστών στην εξοικείωση
τους με τη σύνταξη κώδικα Java, επιτρέποντάς τους να αξιολογούν γρήγορα εκφράσεις στο
Παράθυρο Αλληλεπίδρασης του DrJava.
Απαιτήσεις
Το DrJava απαιτεί Java 5 ή νεότερη έκδοση. Σημειώστε ότι θα πρέπει να έχετε εγκατεστημένο το JDK
(όχι το JRE), εάν επιθυμείτε να χρησιμοποιήσετε το πρόγραμμα εντοπισμού σφαλμάτων (debugger)
ή να δημιουργήσετε Javadoc εντός DrJava. Σας συνιστούμε να κατεβάσετε και να χρησιμοποιήσετε
το τελευταίο JDK για την ομαλή λειτουργία του προγράμματος.
Αυτόματη Συμπλήρωση
Το DrJava υποστηρίζει μια πολύ περιορισμένη έννοια της αυτόματης συμπλήρωσης μιας λέξης, που
είναι ωστόσο πολύ χρήσιμη. Αυτό το χαρακτηριστικό ενεργοποιείται με την επιλογή "Auto-
Complete Word Under Cursor" στο Edit μενού και ως προεπιλεγμένη συντόμευση πληκτρολογίου με
την χρήση των πλήκτρων Ctrl-Shift-Space.
Όταν το καλέσουμε το DrJava θα εξετάσει τη λέξη στα αριστερά του κέρσορα και θα προσπαθήσει
να την ολοκληρώσει. Αν δεν υπάρχει ένα μοναδικό ταίρι, το DrJava εμφανίζει ένα προβλεπόμενο
διάλογο επιλογής με τις υποψήφιες εντολές συμπλήρωσης. Επίσης, όταν ένα project είναι ανοιχτό,
το DrJava μπορεί να ρυθμιστεί ώστε να σαρώσει όλα τα αρχεία των κλάσεων και μετά από μια
μεταγλώττιση να αποκτήσει τις απαραίτητες πληροφορίες ολοκλήρωσης. Με αυτό το σύνολο
επιλογών, το DrJava μπορεί αυτόματα να ολοκληρώσει τα ονόματα όλων των τάξεων στο έργο σας,
ακόμη και εκείνων των εσωτερικών τάξεων.
Πολλαπλά Αρχεία
Τα περισσότερα προγράμματα Java είναι γραμμένα σε πολλά συγγενή πηγαία αρχεία, έτσι το DrJava
υποστηρίζει το ταυτόχρονο άνοιγμα πολλών αρχείων. Μια λίστα με τα ονόματα όλων των ανοιχτών
εγγράφων εμφανίζεται σε ένα παράθυρο προς τα αριστερά, ταξινομώντας τα αρχεία με τη σειρά
που έχουν ανοιχτεί. Μπορείτε να δείτε και να επεξεργαστείτε ένα συγκεκριμένο έγγραφο
επιλέγοντάς το από τη λίστα, ή χρησιμοποιώντας τις εντολές Previous και Next Document του Edit
menu.
Η πλήρης διαδρομή του αρχείου του τρέχοντος εγγράφου εμφανίζεται στη γραμμή τίτλου και στη
γραμμή κατάστασης στο κάτω μέρος του παραθύρου.
Σελιδοδείκτες (bookmarks)
Το DrJava σας επιτρέπει να θέσετε σελιδοδείκτες στον κώδικά σας στα σημεία που θεωρείτε
σημαντικά. Πατώντας Ctrl-Shift-M ή χρησιμοποιώντας το στοιχείο "Bookmarks" στο μενού
Εργαλείων (Tools menu), μπορείτε να εμφανίσετε τη λίστα των σελιδοδεικτών στο παράθυρο
"Bookmarks". Οι σελιδοδείκτες ταξινομούνται με το έγγραφο και τον αριθμό της γραμμής.
Με τη συντόμευση πληκτρολογίου Ctrl-M ή το "Toggle Bookmark" από το μενού Εργαλείων,
μπορείτε να προσθέσετε και να αφαιρέσετε σελιδοδείκτες. Αν δεν έχει επιλεγεί κείμενο, το "Toggle
Bookmark" θα προσθέσει ή θα αφαιρέσει ένα σελιδοδείκτη για ολόκληρη τη γραμμή που βρίσκεται
ο κέρσορας. Εάν έχει επιλεγεί κείμενο, τότε ο σελιδοδείκτης θα προστεθεί στο κείμενο αυτό.
Με την επιλογή ενός σελιδοδείκτη στο παράθυρο "Bookmarks" και πατώντας το κουμπί "Go to",
μπορείτε να μεταβείτε στη θέση που σχετίζεται με το σελιδοδείκτη. Μπορείτε επίσης να επιλέξετε
έναν ή περισσότερους σελιδοδείκτες και να τα αφαιρέσετε με το κουμπί "Remove" ή να διαγράψετε
ολόκληρη τη λίστα με το κουμπί "Remove All".
Κλάση Main
Το project facility επιτρέπει στο χρήστη να καθορίσει μια κλάση "Main" για το project. Όταν πατηθεί
το πλήκτρο "Run Project" ή το"Run Main Class of Project" τότε στη συνέχεια επιλέγεται στο Project
menu, η μέθοδος main της "Κλάσης Main" και εκτελείται. Αν δεν έχει καθοριστεί η "Κλάση Main",
το στοιχείο "Run Main Document of Project" δεν θα είναι διαθέσιμο, και το κουμπί "Run Project"
αντικαθίσταται από το κουμπί "Run", που τρέχει τη μέθοδο main του τρέχοντος εγγράφου.
Η "Main Class" μπορεί να οριστεί ως ένα αρχείο, χρησιμοποιώντας το αρχείο διαλόγου επιλογής ή
ως ένα πλήρως αναγνωρισμένο όνομα της κλάσης που εγγράφονται απευθείας στο πεδίο (field).
Σημειώστε ότι για να τρέξει εσωτερικές κλάσεις, το όνομα πρέπει να εισάγονται απευθείας.
Πως Χρησιμοποιείται
Το παράθυρο Αλληλεπίδρασης υποστηρίζει την εκτέλεση οποιωνδήποτε έγκυρων δηλώσεων καθώς
και την αξιολόγηση των εκφράσεων Java. Απλά ορίζετε τις μεταβλητές και τις μεθόδους κλήσης,
όπως θα κάνατε σε μια συνήθη μέθοδο, ή ακόμη ορίζετε νέες κλάσεις και μεθόδους και τις καλείτε
διαδραστικά. Σε γενικές γραμμές, κάθε δήλωση ή έκφραση που τελειώνει χωρίς ερωτηματικό θα
εμφανίσει το αποτέλεσμά της στο παράθυρο Αλληλεπίδρασης, ενώ εκείνες που τελειώνουν με ένα
ερωτηματικό θα ολοκληρωθούν χωρίς να εμφανιστεί το αποτέλεσμα.
Κάθε έξοδος του συστήματος θα πρέπει να εμφανίζεται στο παράθυρο Αλληλεπίδρασης με πράσινο
χρώμα (καθώς και στην καρτέλα Console), ενώ τα σφάλματα του συστήματος θα εμφανίζονται με
κόκκινο χρώμα από προεπιλογή. Κάθε είσοδος του συστήματος θα προκαλεί την εμφάνιση ενός
κουτιού για να εισαχθεί στο παράθυρο Αλληλεπίδρασης όπου μπορείτε να πληκτρολογήσετε ό,τι
θέλετε να διαβαστεί από το System.in. Αυτό το κείμενο θα είναι χρωματισμένο μωβ. Αυτά τα
χρώματα μπορούν να τροποποιηθούν στην ενότητα "Colors" από το παράθυρο Preferences.
Σημειώστε ότι αυτή η λειτουργία δεν υποστηρίζει special flags ή παραμέτρους για το ίδιο το JVM,
όπως υποστηρίζεται στη γραμμή εντολών.
Μεταγλωττίζοντας Αρχεία
Για να μεταγλωττίσετε αρχεία που έχετε ανοίξει στο DrJava, κάντε κλικ στο κουμπί "Compile All" στη
γραμμή εργαλείων, είτε επιλέξετε "Compile All" ή "Compile Current Document" από το Tools menu.
Πριν αρχίσει η μεταγλώττιση, όλα τα ανοιχτά αρχεία πρέπει να αποθηκευτούν, ακόμη και αν γίνεται
μεταγλώττιση μόνο στο τρέχον έγγραφο. Αυτό είναι απαραίτητο επειδή ένα αρχείο μπορεί να
εξαρτάται από άλλα αρχεία, και είναι σημαντικό το ότι τα αρχεία δεν τροποποιούνται όταν
εμφανίζονται σφάλματα. (Διαφορετικά, ένα λάθος επισημαίνεται στη γραμμή που έχει αλλάξει).
Μόλις μια μεταγλώττιση ολοκληρωθεί με επιτυχία, το παράθυρο Αλληλεπίδρασης επαναφέρεται,
έτσι ώστε να μπορούν να χρησιμοποιηθούν τα νέα αρχεία των κλάσεων. Η έξοδος για το παράθυρο
της Κονσόλας (Console) επαναφέρεται επίσης για να ξεκινήσει εκ νέου η συγγραφή, εκτός αν η
επιλογή "Clear Console After Interactions Reset" στο τμήμα "Miscellaneous" των Ρυθμίσεων είναι
απενεργοποιημένη. Στη λειτουργία του project, έχετε την επιλογή να μεταγλωττίσετε όλα τα πηγαία
αρχεία του project, ακόμη και αν αυτά τα αρχεία δεν είναι ανοιχτά στο DrJava. Για να
μεταγλωττίσετε όλα τα πηγαία αρχεία, κάντε κλικ στο κουμπί "Compile Open Project Files" στο
Project Menu.
Επιλέγοντας Μεταγλωττιστή
Το DrJava υποστηρίζει τη χρήση διαφορετικών Java μεταγλωττιστών, όπως διαφορετικές εκδόσεις
του "Javac" compiler που παρέχεται με το JDK. Το DrJava θα προσπαθήσει να εντοπίσει από μόνο
του τον μεταγλωττιστή σας κατά την, αλλά μερικές φορές δεν είναι σε θέση να τον βρεί. Σε αυτή την
περίπτωση θα χρησιμοποιήσει τον συμπεριλαμβανόμενο μεταγλωττιστή του προγράμματος Eclipse.
Σημειώστε ότι η θέση του μεταγλωττιστή μπορεί να οριστεί στις Ρυθμίσεις. Εάν περισσότεροι από
ένα μεταγλωττιστή έχουν καθοριστεί, ο ενεργός μεταγλωττιστής μπορεί να επιλεγεί από ένα μενού
στο παράθυρο Μεταγλώττισης.
Το DrJava θα εμφανίσει μόνο ένα μεταγλωττιστή για κάθε σημαντική έκδοση, ακόμη και αν έχετε
περισσότερες από μία ενημερωμένες εκδόσεις του JDK εγκατεστημένες. (Παράδειγμα: έχετε JDK 6
Ενημερώσεις 10 και 14 εγκατεστημένο. Το DrJava θα εμφανίσει μόνο JDK 6 Update 14).
Απλά Σχόλια
Κανονικά σχόλια Javadoc μπορούν να τοποθετηθούν πριν από κάθε δήλωση κλάσης, πεδίου ή
μεθόδου για να περιγράψουν την πρόθεση ή τα χαρακτηριστικά του. Για παράδειγμα, η ακόλουθη
απλή κλάση Student έχει αρκετά σχόλια Javadoc.
Άλλες κοινές ετικέτες περιλαμβάνουν "@throws e" (για να περιγράψει κάποια εξαίρεση (Exception)
"e" που έρχεται από μια μέθοδο) και @see #foo " (για να παράσχει ένα σύνδεσμο σε ένα πεδίο ή
μέθοδο που ονομάζεται "foo").
Εργαστήριο Αντικειμενοστραφούς προγραμματισμού [20]
Κεφάλαιο 9. Το Πρώτο Πρόγραμμα στο DrJava
Στη συνέχεια, θα δημιουργήσουμε το πρώτο μας πρόγραμμα στο DrJava. Πρόκειται για ένα απλό
πρόγραμμα που θα εμφανίσει στην οθόνη έναν χαιρετισμό.
Στο πρώτο μας βήμα, πρέπει να δημιουργήσουμε ένα project. Για το λόγο αυτό πατάμε στην
επιλογή Project New και επιλέγουμε ένα όνομα για το project μας. Κατόπιν μας εμφανίζεται ένα
παράθυρο με τις ιδιότητες του project, τις οποίες αποδεχόμαστε και προχωράμε.
Τώρα είμαστε έτοιμοι να ξεκινήσουμε να γράφουμε στο νέο μας project. Επιλέγουμε το project μας,
το οποίο είναι κενό αρχικά και πατάμε στο FileNew Java Class. Στο παράθυρο που ανοίγεται
επιλέγουμε το όνομα της κλάσης. Αυτό είναι το όνομα που θα εμφανιστεί στον editor μας.
Προσέξτε στην προηγούμενη εικόνα ότι έχουμε επιλέξει να συμπεριλαμβάνεται στην κλάση μας η
μέθοδος main. Για να συμβαδίζει το όνομα στον editor με το όνομα του αρχείου πρέπει να πάμε να
ονομάσουμε και το αρχείο με τον ίδιο τρόπο. Έτσι πατάμε δεξί κλικ πάνω στο αρχείο μας (προς το
παρόν είναι Untitled) και επιλέγουμε Save File as και διαλέγουμε το ίδιο όνομα με αυτό που
δώσαμε στην κλάση μας. Στην περίπτωση μας έχουμε ονομάσει την κλάση (και το αρχείο μας) Hello.
Τον κώδικα του προγράμματος μας μπορούμε να τον δούμε στη συνέχεια. Περιλαμβάνει μέσα στη
μέθοδο main τον κώδικα για την εκτύπωση ενός απλού μηνύματος στην οθόνη μας.
Version 1.1
Επιμέλεια:
Κόγιας Δημήτρης,
Χαράλαμπος Πατρικάκης,
Να σημειωθεί, ότι τα προγράμματα είναι περασμένα με τη μορφή εικόνας (άρα το copy – paste δε
θα δουλέψει), όχι για να δυσκολέψουν τους φοιτητές, αλλά για να τους αναγκάσουν να περάσουν
τον κώδικα και να δουν τις δυνατότητες για στοίχιση, χρωματισμό, και αυτόματη συμπλήρωση που
παρέχει το Dr. Java, καθώς και μέσα από πιθανά λάθη πληκτρολόγησης, να μπορέσουν να
αντιμετωπίσουν σε μία πρώτη απλή μορφή, θέματα debugging.
Στο παραπάνω παράδειγμα βλέπουμε τη δημιουργία της κλάσης ClassExample που έχει 1
μεταβλητή (ιδιότητα) και 2 μεθόδους (setName, getName). Η πρώτη μέθοδος χρησιμοποιείται από
την κλάση για να δώσει τιμή στην ιδιότητα και η άλλη για να γίνει δυνατόν να έχουν πρόσβαση στο
διάβασμα της ιδιότητας της κλάσης και άλλες μέθοδοι, μιας και η ιδιότητα name είναι private.
Κατόπιν, ορίζουμε μια μέθοδο main και μέσα σε αυτήν δημιουργούμε ένα αντικείμενο από την
κλάση ClassExample και του δίνουμε μια τιμή και την παρουσιάζουμε στην οθόνη,
εκμεταλλευόμενοι τις μεθόδους της κλάσης.
Περάστε την κλάση στο DrJava και δείτε τι θα εκτυπωθεί στην οθόνη.
ΕΡΩΤΗΣΗ: Στο συγκεκριμένο παράδειγμα, παραβήκαμε έναν κανόνα από τις συμβάσεις που
έχουμε πει στην ονοματοδοσία στη Java. Μπορείτε να βρείτε ποιον; Υπάρχει κάποιο πρόβλημα;
Παραλλαγές:
- Δημιουργήστε ένα δεύτερο αντικείμενο της κλάσης το οποίο και θα του δώσετε το όνομα
Student. Εκτυπώστε το όνομα του στην οθόνη.
- Δημιουργήστε ένα ακόμα αντικείμενο και δώστε του το όνομα σας. Πως μπορείτε να
εκτυπώσετε στην οθόνη το παρακάτω μήνυμα:
Hello yourName! You are a good Student!
Όπου yourName το όνομα σας όπως το έχετε δώσει στο αντικείμενο που δημιουργήσατε.
Για να βρούμε αν ένας αριθμός είναι μονός ή ζυγός χρησιμοποιούμε το σύμβολο του modulo2,
δηλαδή το %. Η πράξη σε modulo2 μας επιστρέφει, στην ουσία, το υπόλοιπο της διαίρεσης ενός
αριθμού που δίνεται με το 2. Π.χ., 5 % 2 = 1. Όλοι οι μονοί αριθμοί θα έχουν υπόλοιπο 1 στην
περίπτωση αυτή και όλοι οι ζυγοί μηδέν.
Ο έλεγχος για το εάν είναι πρώτος ο αριθμός φαίνεται στη γραμμή 18-22, όπου ουσιαστικά
ελέγχουμε αν ο αριθμός διαιρείται ακριβώς από κάποιον άλλο αριθμό στο εύρος των υποψηφίων
τιμών.
Παραλλαγή:
- Στο παρακάτω πρόγραμμα εκτυπώστε τους αριθμούς από το 1- 100 που είναι δίπλα σε έναν
πρώτο π.χ ένας πρώτος αριθμός είναι ο 3 θα εκτυπώσουμε 2 και 4 (ανεξαρτήτως αν είναι
πρώτοι).
- Εκτυπώστε από τους πρώτους αριθμούς που βρήκατε μόνο όσους είναι μονοί.
Παραλλαγή: *****
- Φτιάξτε μια πυραμίδα με 10 αστερίσκους στη βάση της.
****
- Φτιάξτε μια πυραμίδα ανάποδα σε σχέση με την πρώτη. Δηλαδή, να έχει τη
***
μεγάλη βάση προς τα πάνω και τη μικρή προς τα κάτω, όπως φαίνεται δίπλα.
- Συνδυάστε τα 2 τελευταία σχήματα για να παράγετε μια καινούργια πυραμίδα
**
διπλάσιου μεγέθους. *
- Αντί για αστερίσκους, φτιάξτε μια πυραμίδα με νούμερα όπως αυτή που φαίνεται παρακάτω.
1
12
123
1234
12345
Περάστε το πρόγραμμα και τρέξτε το. Τι αποτέλεσμα βγάζει; Πως θα μπορούσαμε να βρούμε τον
μέσο όρο με 2 δεκαδικά ψηφία;
0 1 1 2 3 5 8 13 21
Στη συνέχεια θα δούμε ένα πρόγραμμα που θα υπολογίζει τους 20 πρώτους όρους της γνωστής
ακολουθίας.
Παραλλαγή:
- Φτιάξτε ένα πρόγραμμα που θα ελέγχει αν οι αριθμοί 500 και 987 είναι μέσα στους 20 πρώτους
όρους της ακολουθίας Fibonacci. Αν ναι, ποιοί όροι αυτής είναι;
Περάστε το πρόγραμμα και τρέξτε το. Βεβαιωθείτε ότι αντιλαμβάνεστε τον τρόπο που λειτουργεί.
Αν δοκιμάζαμε έναν 6-ψήφιο αριθμό θα έτρεχε κανονικά το πρόγραμμα μας ή θα έπρεπε να
αλλάξουμε κάποιο σημείο του κώδικα μας;