College Compass

College Compass

Software Development · CN4001

Εβδομάδα 1: Πρώτα βήματα στη Java

  • java
  • jvm
  • data-types
  • operators

Σημειώσεις μελέτης βασισμένες στο «Learn Programming with Java – Lesson 1». Οι διαφάνειες, με τα παραδείγματα σε εικόνες, βρίσκονται στο Moodle.

Τι είναι ο προγραμματισμός

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

Κάθε πρόγραμμα, όσο μεγάλο κι αν είναι, χτίζεται από τέσσερα βασικά στοιχεία:

Στοιχείο Τι κάνει Στην κουζίνα
Εντολές λένε στον υπολογιστή τι να κάνει τα βήματα της συνταγής
Μεταβλητές κρατούν δεδομένα τα δοχεία με τα υλικά
Αποφάσεις επιλέγουν τι θα γίνει, με βάση μια συνθήκη «αν βράζει το νερό, ρίξε τα μακαρόνια»
Βρόχοι επαναλαμβάνουν μια ενέργεια «ανακάτευε μέχρι να πήξει»

Από το πρόβλημα στον αλγόριθμο

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

  1. Διάβασε πόσοι είναι οι βαθμοί.
  2. Ξεκίνα ένα άθροισμα από το 0.
  3. Για κάθε βαθμό, πρόσθεσέ τον στο άθροισμα.
  4. Διαίρεσε το άθροισμα με το πλήθος των βαθμών: αυτός είναι ο μέσος όρος.
  5. Αν ο μέσος όρος είναι κάτω από 50, γράψε «FAIL»· αλλιώς γράψε «PASS».

Ένα πρόγραμμα είναι μέρος του κύκλου ζωής ανάπτυξης λογισμικού: σχεδιασμός, ανάλυση, σχεδίαση, υλοποίηση (ο κώδικας), δοκιμές, παράδοση και συντήρηση. Σε αυτό το μάθημα εστιάζουμε κυρίως στην υλοποίηση.

Γιατί Java

  • Δημιουργήθηκε από τη Sun Microsystems το 1995· από το 2010 ανήκει στην Oracle.
  • Είναι γλώσσα υψηλού επιπέδου (κοντά στη γλώσσα του ανθρώπου, όχι στη γλώσσα της μηχανής), αντικειμενοστραφής και βασισμένη σε κλάσεις.
  • Έχει τεράστια κοινότητα και είναι σταθερά μία από τις πιο δημοφιλείς γλώσσες.
  • Χρησιμοποιείται παντού: σε ιστοσελίδες, εφαρμογές κινητών (Android), επιχειρησιακά συστήματα.
  • Είναι ανεξάρτητη από την πλατφόρμα: «γράψε μία φορά, τρέξε παντού».

Πώς τρέχει ένα πρόγραμμα Java

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

  1. Γράφεις τον κώδικα σε ένα αρχείο .java.
  2. Ο μεταγλωττιστής javac τον μετατρέπει σε bytecode, σε ένα αρχείο .class.
  3. Το bytecode το εκτελεί η JVM (Java Virtual Machine). Υπάρχει JVM για Windows, macOS και Linux, γι’ αυτό το ίδιο .class τρέχει σε όλα.

Τι χρειάζεσαι

  • Ένα JDK (Java Development Kit): είτε το Oracle JDK (το επίσημο, δωρεάν για προσωπική χρήση), είτε το OpenJDK (ανοιχτού κώδικα, δωρεάν για κάθε χρήση).
  • Ένα IDE (περιβάλλον ανάπτυξης), όπως το IntelliJ IDEA, το Eclipse ή το NetBeans, ρυθμισμένο να χρησιμοποιεί το JDK σου.

Κλάσεις και μέθοδοι

Η Java οργανώνει τον κώδικα σε κλάσεις. Μια κλάση μοιάζει με το σχέδιο ενός σπιτιού: δεν είναι σπίτι η ίδια, αλλά από αυτήν μπορείς να χτίσεις πολλά σπίτια (αντικείμενα).

  • Οι ιδιότητες (attributes) είναι τα χαρακτηριστικά: πόσα δωμάτια, τι χρώμα τοίχοι.
  • Οι μέθοδοι (methods) είναι οι ενέργειες: άνοιξε την πόρτα, άναψε το φως.

Θα τα δούμε αναλυτικά αργότερα στο μάθημα. Προς το παρόν, κάθε πρόγραμμά μας έχει μία κλάση με μία μέθοδο, τη main.

Το πρώτο πρόγραμμα

public class Welcome {
    public static void main(String[] args) {
        System.out.println("Καλώς ήρθες στη Java!");
    }
}
  • public class Welcome: ορίζει μια κλάση με όνομα Welcome. Το αρχείο πρέπει να λέγεται Welcome.java. Το public σημαίνει ότι η κλάση είναι προσβάσιμη από παντού.
  • public static void main(String[] args): η μέθοδος main είναι το σημείο εκκίνησης κάθε προγράμματος Java.
    • static: ανήκει στην κλάση, δεν χρειάζεται αντικείμενο για να κληθεί.
    • void: δεν επιστρέφει τιμή.
    • String[] args: τα ορίσματα από τη γραμμή εντολών, αν υπάρχουν.
  • System.out.println(...): τυπώνει το κείμενο στην κονσόλα και αλλάζει γραμμή. Το System είναι έτοιμη κλάση της Java και το out η «έξοδος» της κονσόλας.

Μια ματιά στο bytecode. Αν μεταγλωττίσεις ένα πρόγραμμα που κάνει int number = 10; System.out.println(number);, το bytecode θα περιέχει εντολές όπως: βάλε τη σταθερά 10 στη στοίβα, αποθήκευσέ την στη μεταβλητή number, φόρτωσε το System.out, φόρτωσε ξανά το number, κάλεσε την println. Οι αριθμοί των εντολών (0, 1, 2, 5…) «πηδάνε», γιατί κάποιες εντολές πιάνουν περισσότερα bytes από άλλες. Δεν χρειάζεται να γράφεις bytecode, αλλά βοηθά να καταλάβεις τι κάνει η JVM.

Μεταβλητές και τύποι δεδομένων

Μια μεταβλητή έχει τύπο, όνομα και τιμή:

int age = 19;
double average = 7.5;
char grade = 'A';
boolean passed = true;
String name = "Μαρία";

Πρωτογενείς τύποι (primitive)

Αποθηκεύουν απευθείας μια απλή τιμή. Είναι γρήγοροι και δεν είναι αντικείμενα.

Τύπος Μέγεθος Τι κρατά
byte 8 bit ακέραιο από −128 έως 127
short 16 bit ακέραιο από −32.768 έως 32.767
int 32 bit ακέραιο, περίπου ±2,1 δισεκατομμύρια
long 64 bit πολύ μεγάλο ακέραιο
float 32 bit δεκαδικό, μικρότερη ακρίβεια
double 64 bit δεκαδικό, μεγαλύτερη ακρίβεια
char 16 bit έναν χαρακτήρα Unicode, π.χ. 'A'
boolean – true ή false

Τύποι αναφοράς (reference)

Αποθηκεύουν μια αναφορά (διεύθυνση) προς τα πραγματικά δεδομένα, και μπορούν να είναι null («δεν δείχνουν πουθενά»). Παραδείγματα: το String (κείμενο), οι πίνακες και κάθε αντικείμενο.

Η βιβλιοθήκη της Java έχει και έτοιμες κλάσεις για πιο ειδικές ανάγκες: το StringBuilder για κείμενο που αλλάζει συχνά, το BigInteger και το BigDecimal για αριθμούς με απεριόριστα ψηφία ή απόλυτη ακρίβεια (π.χ. για χρήματα), και κλάσεις για ημερομηνίες.

Τελεστές

Οι τελεστές είναι σύμβολα που κάνουν μια πράξη πάνω σε τιμές και δίνουν ένα αποτέλεσμα.

Είδος Τελεστές Παράδειγμα
Αριθμητικοί + - * / % 17 % 5 δίνει 2 (το υπόλοιπο)
Σχεσιακοί == != > < >= <= age >= 18 δίνει true ή false
Λογικοί && (ΚΑΙ), || (Η), ! (ΟΧΙ) age >= 18 && hasId
Ανάθεσης = += -= *= /= total += 5 σημαίνει total = total + 5
Μοναδιαίοι + - ++ -- count++ αυξάνει κατά 1
Τριαδικός ? : age >= 18 ? "Ενήλικας" : "Ανήλικος"
Bit & | ^ ~ << >> >>> 6 & 3 δίνει 2

Προσοχή στη διαίρεση ακεραίων: το 7 / 2 δίνει 3, γιατί και οι δύο τελεστέοι είναι int. Για δεκαδικό αποτέλεσμα, τουλάχιστον ένας πρέπει να είναι δεκαδικός: 7 / 2.0 δίνει 3.5.

int a = 7, b = 2;
System.out.println(a / b);      // 3
System.out.println(a % b);      // 1
System.out.println(a / 2.0);    // 3.5
System.out.println(a > b && b > 0); // true

Ερωτήσεις αυτοαξιολόγησης

1. Τι κάνει ο μεταγλωττιστής javac και τι η JVM;

Ο javac μετατρέπει τον κώδικα .java σε bytecode (.class). Η JVM εκτελεί αυτό το bytecode στο συγκεκριμένο λειτουργικό σύστημα.

2. Γιατί λέμε ότι η Java είναι «ανεξάρτητη από την πλατφόρμα»;

Γιατί το bytecode δεν εξαρτάται από το λειτουργικό σύστημα. Το ίδιο αρχείο .class τρέχει σε οποιονδήποτε υπολογιστή έχει JVM.

3. Τι τυπώνει το System.out.println(10 / 4); και γιατί;

2, γιατί και το 10 και το 4 είναι ακέραιοι, οπότε η διαίρεση κρατά μόνο το ακέραιο μέρος. Το 10 / 4.0 θα έδινε 2.5.

4. Ποια είναι η διαφορά ανάμεσα σε int και String;

Το int είναι πρωτογενής τύπος: κρατά απευθείας έναν ακέραιο. Το String είναι τύπος αναφοράς: κρατά μια αναφορά σε ένα αντικείμενο με κείμενο, και μπορεί να είναι null.

5. Τι τιμή έχει το x μετά από int x = 5; x += 3; x++;

9: το x += 3 το κάνει 8 και το x++ το αυξάνει κατά 1.


Πηγές: «Learn Programming with Java – Lesson 1» του μαθήματος· Oracle Java Tutorials.

Ασκήσεις της εβδομάδας

Άσκηση

1st Weekly Task

Προθεσμία
Χωρίς προθεσμία — για εξάσκηση

Χαιρετισμός, αθροίσματα, πολλαπλάσια και πρώτοι αριθμοί σε μία main().

Εκφώνηση

Δώστε κώδικα ο οποίος να πραγματοποιεί σε διακριτά βήματα τα παρακάτω (στην ίδια main()):

  • Ζητά από το χρήστη το όνομά του και του τυπώνει ένα μήνυμα χαιρετισμού.
  • Τροποιήστε το παραπάνω ώστε το πρόγραμμα να χαιρετά μόνο το Γιάννη και τη Μαρία.
  • Ζητήστε από το χρήστη να εισάγει έναν ακέραιο n. Υπολογίστε το άθροισμα όλων των ακεραίων από τον 1 έως τον αριθμό n>0 που έδωσε ο χρήστης.
  • Τυπώστε όλα τα πολλάπλάσια του 5 μεταξύ του 1 και του παραπάνω αριθμού n.
  • Ο χρήστης δίνει εκ νέου έναν οποιδήποτε ακέραιο αριθμό ως είσοδο. Υπολογίστε όλους τους ενδιάμεσους πρώτους αριθμούς. Ως πρώτος ορίζεται ο αριθμός που δίνει ακέραιο υπόλοιπο 0 διαιρώντας τον με το 1 ή τον εαυτό του (prime number).
Άσκηση

Εβδομάδα 1: Ασκήσεις με μεταβλητές και τύπους

Προθεσμία
Χωρίς προθεσμία — για εξάσκηση

Έξι μικρά προγράμματα: περίμετρος κύκλου, τόκος δανείου, Fahrenheit, περίμετρος, μέσος όρος και αντιμετάθεση τιμών.

Εκφώνηση

Η δραστηριότητα αυτή αποτελείται από 6 ερωτήματα, ήτοι, 6 αρχεία τα οποία οφείλετε να τα δημιουργήσετε.

Ερώτημα 1ο

Στην αίθουσα είδαμε μέσω παραδείγματος πως υπολογίζουμε το εμβαδό του κύκλου μέσω του τύπου π * radius², κατά την ίδια λογική στο ερώτημα αυτό θα πρέπει να υπολογίσετε την περίμετρο του κύκλου η οποία προκύπτει από τον τύπο 2 * π * radius.

Ερώτημα 2ο

Να υπολογίσετε το κέρδος της τράπεζας για ένα δάνειο 6 ετών, με 8% επιτόκιο για κεφάλαιο €15.000 και να τυπώσετε στο τέλος ένα κείμενο που θα είναι της μορφής “The interest of the loan for a principle of €15.000 with 8% rate and a period of 6 years, is: €” και το αποτέλεσμα. Δε θα πρέπει να χρησιμοποιείσετε “καρφωτές” τιμές αλλά να κάνετε χρήση των μεταβλητών σας για την παραγωγή του μηνύματος στην κονσόλα. Ο τύπος που θα πρέπει να χρησιμοποιήσετε θα είναι:

Interest = (P * R * T) / 100

Όπου:

  • P = το αρχικό κεφάλαιο
  • R = το επιτόκιο
  • T = ο χρόνος σε έτη

Παράδειγμα:

Για αρχικό κεφάλαιο €8000, με 5% ετήσιο επιτόκιο δανείου 2 ετών, θα έχουμε:

Interest = (8000 * 5 * 2) / 100 = 80000 / 100 = 800

Άρα το κέρδος της τράπεζας για το εν λόγω δάνειο θα ανέρχεται σε €800.

Ερώτημα 3ο

Να μετατρέψετε τους 29,5°C σε βαθμούς Fahrenheit και να τυπώσετε στην κονσόλα το αποτέλεσμα με ένα μήνυμα του τύπου “The 29,5C are equivelent to XF”, όπου αντί για X θα έχετε το αποτέλεσμα της μεταβλητής σας. Ο τύπος μετατροπής των βαθμών κελσίου σε βαθμούς Fahrenheit είναι:

F = (C * 9/5) + 32

Ερώτημα 4ο

Να υπολογίσετε την περίμετρο ενός ορθογώνιου παραλληλόγραμμου με μήκος 8 και πλάτος 5. Να τυπώσετε αντίστοιχο μήνυμα στην κονσόλα. Ο τύπος της περιμέτρου είναι:

Perimeter = 2 * (length + width)

Ερώτημα 5ο

Να υπολογίσετε τον μέσο όρο τριών αριθμών της επιλογής σας (3 μεταβλητές), και να τυπωθεί το αντίστοιχο μήνυμα στην κονσόλα.

Ερώτημα 6ο

Να γίνει αντιστροφή των τιμών δύο μεταβλητών χωρίς χρήση προσωρινής (δηλαδή 3ης) μεταβλητής.

int a = 5;
int b = 10;

Μετά την αντιστροφή θα πρέπει η μεταβλητή a να φέρει την τιμή 10 και αντίστοιχα η μεταβλητή b να φέρει την τιμή 5. Η διαδικασία αυτή θα πρέπει να γίνει χωρίς τη χρήση τρίτης μεταβλητής. Θα πρέπει να τυπωθεί στην κονσόλα ένα μήνυμα που θα δείχνει τις τιμές των μεταβλητών πριν την αντιστροφή “Before swap:” και μετά “After swap:”.