Software Development · CN4001
Εβδομάδα 2: Αποφάσεις και χειρισμός σφαλμάτων
Σημειώσεις μελέτης βασισμένες στο «Learn Programming with Java – Lesson 2». Οι διαφάνειες, με τα παραδείγματα κώδικα και τις ασκήσεις τους, βρίσκονται στο Moodle.
Ένα πρόγραμμα σπάνια κάνει πάντα το ίδιο. Ανάλογα με τα δεδομένα, παίρνει
αποφάσεις: αν ο βαθμός είναι πάνω από 50 τυπώνει «PASS», αλλιώς «FAIL». Μια
συνθήκη είναι μια έκφραση που βγαίνει true ή false, και το πρόγραμμα
ακολουθεί τον έναν ή τον άλλον δρόμο.
if και else
int score = 62;
if (score >= 50) {
System.out.println("PASS");
} else {
System.out.println("FAIL");
}
Αν η συνθήκη στην παρένθεση είναι true, εκτελείται το πρώτο μπλοκ· αλλιώς το
μπλοκ του else. Η ίδια απόφαση μπορεί να γραφτεί και ανάποδα
(if (score < 50) → «FAIL»): το αποτέλεσμα είναι ίδιο, αρκεί οι δύο κλάδοι να
αντιστοιχούν σωστά.
else if: πολλές περιπτώσεις
Όταν οι περιπτώσεις είναι περισσότερες από δύο, οι συνθήκες ελέγχονται με τη σειρά, και εκτελείται μόνο η πρώτη που ισχύει:
int score = 84;
char grade;
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else if (score >= 60) {
grade = 'D';
} else if (score >= 50) {
grade = 'E';
} else {
grade = 'F';
}
System.out.println("Βαθμός: " + grade); // Βαθμός: B
Η σειρά έχει σημασία. Αν έβαζες πρώτα το score >= 50, κάθε βαθμός πάνω από
50 θα έπαιρνε «E», γιατί αυτή θα ήταν η πρώτη συνθήκη που ισχύει.
switch
Όταν συγκρίνεις μία μεταβλητή με πολλές συγκεκριμένες τιμές, το switch είναι
πιο καθαρό από πολλά else if:
int month = 3;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("Χειμώνας");
break;
case 3:
case 4:
case 5:
System.out.println("Άνοιξη");
break;
default:
System.out.println("Άλλη εποχή");
}
- Κάθε
caseείναι μια πιθανή τιμή. Πολλάcaseστη σειρά μοιράζονται τον ίδιο κώδικα. - Το
breakσταματά τοswitch. Αν το ξεχάσεις, η εκτέλεση συνεχίζει («πέφτει») και στο επόμενοcase. - Το
defaultεκτελείται όταν δεν ταιριάζει κανέναcase. - Δουλεύει με
int,char,Stringκαι μερικούς ακόμα τύπους, όχι όμως μεdoubleήboolean.
switch expression
Από τη Java 14, το switch μπορεί να επιστρέφει τιμή, με τη σύνταξη ->.
Δεν χρειάζεται break, και ο μεταγλωττιστής σε αναγκάζει να καλύψεις όλες τις
περιπτώσεις:
int day = 6;
String type = switch (day) {
case 1, 2, 3, 4, 5 -> "Καθημερινή";
case 6, 7 -> "Σαββατοκύριακο";
default -> "Λάθος ημέρα";
};
System.out.println(type); // Σαββατοκύριακο
try, catch, finally: όταν κάτι πάει στραβά
Κάποια λάθη εμφανίζονται μόνο όταν τρέχει το πρόγραμμα: διαίρεση ακεραίου με το
μηδέν, ή κείμενο που δεν είναι αριθμός. Η Java τα λέει εξαιρέσεις
(exceptions). Αν δεν τις χειριστείς, το πρόγραμμα σταματά απότομα. Με το
try-catch μπορείς να αντιδράσεις «ευγενικά»:
String input = "δώδεκα";
try {
int number = Integer.parseInt(input); // εδώ μπορεί να γίνει λάθος
System.out.println("Ο αριθμός είναι " + number);
} catch (NumberFormatException e) {
System.out.println("Σφάλμα: αυτό δεν είναι αριθμός.");
} finally {
System.out.println("Τέλος ελέγχου.");
}
Σφάλμα: αυτό δεν είναι αριθμός.
Τέλος ελέγχου.
try: ο κώδικας που μπορεί να «πετάξει» εξαίρεση. Μόλις γίνει το λάθος, η εκτέλεση πηδά κατευθείαν στοcatch.catch: χειρίζεται τη συγκεκριμένη εξαίρεση, π.χ. τυπώνει ένα μήνυμα. Μπορείς να έχεις πολλάcatch, ένα για κάθε είδος λάθους.finally: εκτελείται πάντα, είτε έγινε λάθος είτε όχι. Χρησιμεύει για «καθάρισμα», π.χ. για να κλείσεις ένα αρχείο. Είναι προαιρετικό.
Δύο συνηθισμένες εξαιρέσεις:
| Εξαίρεση | Πότε | Παράδειγμα |
|---|---|---|
ArithmeticException |
διαίρεση ακεραίου με το 0 | 10 / 0 |
NumberFormatException |
μετατροπή κειμένου που δεν είναι αριθμός | Integer.parseInt("abc") |
try {
int result = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Δεν γίνεται διαίρεση με το μηδέν.");
} catch (NumberFormatException e) {
System.out.println("Λάθος μορφή αριθμού.");
}
Μόνο η διαίρεση ακεραίων με το 0 πετάει εξαίρεση. Το 10.0 / 0 δεν
πετάει: δίνει Infinity.
Ερωτήσεις αυτοαξιολόγησης
1. Τι τυπώνει το παράδειγμα με το else if για score = 95; Και για score = 45;
Για 95 τυπώνει «Βαθμός: A», γιατί η πρώτη συνθήκη (score >= 90) ισχύει. Για
45 καμία συνθήκη δεν ισχύει, οπότε εκτελείται το else: «Βαθμός: F».
2. Τι γίνεται αν στο switch των εποχών λείπει το break μετά το «Χειμώνας» και month = 1;
Τυπώνεται «Χειμώνας» και μετά «Άνοιξη», γιατί η εκτέλεση συνεχίζει στο επόμενο
case μέχρι να βρει break ή το τέλος του switch.
3. Γιατί χρησιμοποιούμε try-catch αντί να αφήσουμε το πρόγραμμα να σταματήσει;
Για να αντιδράσει το πρόγραμμα με τρόπο ελεγχόμενο, π.χ. να εξηγήσει στον χρήστη τι έγινε ή να του ζητήσει ξανά είσοδο, αντί να κλείσει απότομα με ένα μήνυμα σφάλματος που δεν καταλαβαίνει.
4. Πότε εκτελείται το μπλοκ finally;
Πάντα: και όταν ο κώδικας του try τελειώσει κανονικά, και όταν γίνει
εξαίρεση και εκτελεστεί ένα catch.
5. Γράψε με switch expression μια μεταβλητή που παίρνει «Σωστό» για 'A' ή 'B' και «Λάθος» για οτιδήποτε άλλο.
String result = switch (letter) {
case 'A', 'B' -> "Σωστό";
default -> "Λάθος";
};
Πηγές: «Learn Programming with Java – Lesson 2» του μαθήματος· Oracle Java Tutorials.
Ασκήσεις της εβδομάδας
2η Εβδομαδιαία Εργασία (Κοσμίδης)
- Προθεσμία
- Χωρίς προθεσμία — για εξάσκηση
Εκφώνηση
Ερώτημα 1
Συμπληρώστε το κενό για να υπολογίσετε το άθροισμα δύο ακεραίων αριθμών.
int a = 5;
int b = 3;
int sum = ________;
System.out.println("The sum is: " + sum);
Αναμενόμενο αποτέλεσμα:
The sum is: 8
Ερώτημα 2
Υπολογίστε το γινόμενο δύο αριθμών.
int x = 4;
int y = 7;
int product = ________;
System.out.println("The product is: " + product);
Αναμενόμενο αποτέλεσμα:
The product is: 28
Ερώτημα 3
Υπολογίστε το υπόλοιπο μιας πράξης διαίρεσης.
int num = 10;
int divisor = 3;
int remainder = ________;
System.out.println("The remainder is: " + remainder);
Αναμενόμενο αποτέλεσμα:
The remainder is: 1
Ερώτημα 4
Συγκρίνετε δύο αριθμούς και εκτυπώστε αν ο ένας είναι μεγαλύτερος.
int a = 15;
int b = 10;
boolean isGreater = a ________ b;
System.out.println("Is a greater than b? " + isGreater);
Αναμενόμενο αποτέλεσμα:
Is a greater than b? true
Ερώτημα 5
Προσδιορίστε αν δύο αριθμοί είναι ίσοι.
int a = 5;
int b = 5;
boolean isEqual = a ________ b;
System.out.println("Are a and b equal? " + isEqual);
Αναμενόμενο αποτέλεσμα:
Are a and b equal? true
Ερώτημα 6
Αυξήστε έναν αριθμό κατά 1 χρησιμοποιώντας τον τελεστή increment.
int number = 9;
number ________;
System.out.println("The incremented number is: " + number);
Αναμενόμενο αποτέλεσμα:
The incremented number is: 10
Ερώτημα 7
Μείωση ενός αριθμού κατά 1 χρησιμοποιώντας τον τελεστή μείωσης.
int number = 7;
number ________;
System.out.println("The decremented number is: " + number);
Αναμενόμενο αποτέλεσμα:
The decremented number is: 6
Ερώτημα 8
Ανάθεση ενός μηνύματος με βάση μια συνθήκη.
int age = 20;
String message = (age ________) ? "Adult" : "Minor";
System.out.println("The person is: " + message);
Αναμενόμενο αποτέλεσμα:
The person is: Adult
Ερώτημα 9
Αρνηση (αντιστροφή) μιας boolean τιμής.
boolean isTrue = true;
boolean isFalse = ________;
System.out.println("The negated value is: " + isFalse);
Αναμενόμενο αποτέλεσμα:
The negated value is: false
Ερώτημα 10
Αποτιμήστε μια λογική πράξη AND.
boolean condition1 = true;
boolean condition2 = false;
boolean result = condition1 ________ condition2;
System.out.println("The AND result is: " + result);
Αναμενόμενο αποτέλεσμα:
The AND result is: false
Ερώτημα 11
Αποτιμήστε μια λογική πράξη OR.
boolean condition1 = true;
boolean condition2 = false;
boolean result = condition1 ________ condition2;
System.out.println("The OR result is: " + result);
Αναμενόμενο αποτέλεσμα:
The OR result is: true
Ερώτημα 12
Προσδιορίστε αν ένας αριθμός είναι ζυγός χρησιμοποιώντας τον τελεστή modulo.
int number = 6;
boolean isEven = number ________ 2 == 0;
System.out.println("Is the number even? " + isEven);
Αναμενόμενο αποτέλεσμα:
Is the number even? true
Ερώτημα 13
Υπολογίστε το άθροισμα τριών αριθμών.
int a = 2;
int b = 3;
int c = 4;
int sum = ________;
System.out.println("The sum of three numbers is: " + sum);
Αναμενόμενο αποτέλεσμα:
The sum of three numbers is: 9
Ερώτημα 14
Χρησιμοποιήστε τον τελεστή σύνθετης πρόσθεσης.
int number = 5;
number ________ 3;
System.out.println("The updated number is: " + number);
Αναμενόμενο αποτέλεσμα:
The updated number is: 8
Ερώτημα 15
Χρησιμοποιήστε τον τελεστή σύνθετου πολλαπλασιασμού.
int number = 4;
number ________ 2;
System.out.println("The updated number is: " + number);
Αναμενόμενο αποτέλεσμα:
The updated number is: 8
Ερώτημα 16
Γράψτε ένα πρόγραμμα που να ελέγχει αν ένας μαθητής πέρασε ή απέτυχε με βάση τη βαθμολογία του. Μια βαθμολογία 50 ή περισσότερο θεωρείται επιτυχία.
int score = 45;
if (score ________ 50) {
System.out.println("You passed!");
} else {
System.out.println("You failed.");
}
Αναμενόμενο αποτέλεσμα:
You failed.
Ερώτημα 17
Γράψτε ένα πρόγραμμα για να ελέγξετε αν ένας αριθμός είναι μεταξύ 10 και 20 (συμπεριλαμβανομένου).
int number = 15;
if (number ________ 10 ________ number ________ 20) {
System.out.println("The number is within the range.");
} else {
System.out.println("The number is outside the range.");
}
Αναμενόμενο αποτέλεσμα:
The number is within the range.
Ερώτημα 18
Γράψτε ένα πρόγραμμα για να ελέγξετε αν ένα άτομο έχει δικαίωμα ψήφου. Η επιλεξιμότητα βασίζεται στο ότι πρέπει να είναι 18 ετών και άνω και να έχει την ιθαγένεια.
int age = 19;
boolean isCitizen = true;
if (age ________ 18 ________ isCitizen) {
System.out.println("You are eligible to vote.");
} else {
System.out.println("You are not eligible to vote.");
}
Αναμενόμενο αποτέλεσμα:
You are eligible to vote.
Ερώτημα 19
Γράψτε ένα πρόγραμμα για να ελέγξετε αν ένα έτος είναι δίσεκτο. Ένα δίσεκτο έτος διαιρείται με το 4 αλλά δεν διαιρείται με το 100, εκτός αν διαιρείται με το 400.
int year = 2024;
if ( (year ________ 4 == 0 ________ year ________ 100 != 0) ________ year ________ 400 == 0) {
System.out.println("It is a leap year.");
} else {
System.out.println("It is not a leap year.");
}
Αναμενόμενο αποτέλεσμα:
It is a leap year.
Ερώτημα 20
Γράψτε ένα πρόγραμμα για να προσδιορίσετε αν ένας μαθητής είναι επιλέξιμος για να δώσει εξετάσεις για προχωρημένους. Τα κριτήρια για την επιλεξιμότητα είναι τα εξής:
- Ο μαθητής πρέπει να έχει βαθμό 60 ή μεγαλύτερο.
- Εάν ο βαθμός του μαθητή είναι μεταξύ 50 και 59 (συμπεριλαμβανομένου), πρέπει να έχει παρακολουθήσει πάνω από το 80% των μαθημάτων για να είναι επιλέξιμος.
- Εάν ο βαθμός του μαθητή είναι κάτω από 50, δεν είναι επιλέξιμος, ανεξάρτητα από την παρακολούθηση.
Αρχικές μεταβλητές:
int grade = 55; // Example grade, you can change it
double attendancePercentage = 85.0; // Example attendance percentage, you can change it
Αναμενόμενο αποτέλεσμα (Για τις δεδομένες αρχικές μεταβλητές):
Eligible for advanced exam.
2nd Weekly Task
- Προθεσμία
- Χωρίς προθεσμία — για εξάσκηση
Εκφώνηση
Καλείστε να φτιάξετε κώδικα που να υλοποιεί τα παρακάτω (μόνο κώδικας μέσα στη main() και χρήση συναρτήσεων) Γράψτε συνάρτηση που:
- δοσμένου ενός πίνακα ακεραίων, βρίσκει το μέγιστο αριθμό σε ένα πίνακα ακεραίων.
- δοσμένου ενός πίνακα ακεραίων, αντιστρέφει τη σειρά των στοιχείων του.
- δοσμένου ενός πίνακα ακεραίων και ενός αριθμού, ελέγχει αν αυτός ο αριθμός βρίσκεται εντός του πίνακα και αν ναι, επιστρέφει τιμή αλήθειας true, διαφορετικά επιστρέφει false.
- δοσμένου ενός πίνακα ακεραίων, επιστρέφει νέο πίνακα που περιέχει τα στοιχεία του πρώτου σε όλες τις μονές θέσεις μόνο..
- δοσμένου ενός string, κοιτάει αν το αλφαρηθμητικό αυτό είναι παλινδρομικό. Ως παλινδρομικό, νοείται το αλφαρηθμητικό όπου η σειρά των γραμμάτων του είναι η ίδια αν το διαβάσουμε και από την ανάποδη. “A string is said to be palindrome if the reverse of the string is the same as the string. For example, “abba” is a palindrome because the reverse of “abba” will be equal to “abba” so both of these strings are equal and are said to be a palindrome, but “abbc” is not a palindrome”.
- δοσμένου ενός πίνακα ακεραίων, επιστρέφει το άθροισμα των στοιχείων του με
χρήση
for-loop καιwhile-loop. - δοσμένου δύο πινάκων ακεραίων, επιστρέφει συνδυασμό των δύο.
- δοσμένου δύο πινάκων ακεραίων, επιστρέφει έναν πίνακα με εναλλάξ τα στοιχεία των προηγούμενων πινάκων.