Προγραμματισμός ΙΙ: Έλεγχος Ροής και Επαναλήψεις

Προγραμματισμός ΙΙ

Έλεγχος ροής προγράμματος

Συνθήκες

Συγκρισιακοί τελεστές.

> μεγαλύτερο
>= μεγαλύτερο ή ίσο
< μικρότερο
<= μικρότερο ή ίσο
== ίσο
!= διάφορο

Λογικοί τελεστές.

| boolean x | boolean y | x && y | x || y | | boolean x | !x |
|-----------|-----------|--------|--------| |-----------|-------|
| true | true | true | true | | true | false |
| true | false | false | true | | true | true |
| false | true | false | true |
| false | false | false | false |

boolean x = true;
int y = 4, z = 5;
System.out.println(!x || ((y == z) || x));

if

if (συνθήκη) {
    // σώμα κώδικα
}

Παράδειγμα

int mark = 7;
if (mark >= 5) {
    System.out.println("Student didn't fail the exams");
}

if/else

Παράδειγμα

int mark = 7;
if (mark >= 5) {
    System.out.println("Student didn't fail the exams");
} else {
    System.out.println("Student failed the exams");
}

if/elseif/else

if (συνθήκη) {
    // σώμα κώδικα
} else if (αλληΣυνθηκη) {
    // άλλο σώμα κώδικα
} else if (καιΑλληΣυνθηκη) {
    // κι αλλο σώμα κώδικα
} else {
    // αν δεν ικανοποιηθεί καμία από τις παραπάνω συνθήκες σώμα κώδικα
}

Παράδειγμα

int mark = 7;
if (mark < 5) {
    System.out.println("Student failed the exams");
} else if (mark >= 5 && mark < 8) {
    System.out.println("Student is good");
} else { // equivalent with "else if (mark >= 8) {"
    System.out.println("Student is excellent");
}

Παρατηρήσεις

int mark = 7;
if (mark < 5) {
    System.out.println("Student failed the exams");
} else if (mark < 8) {
    System.out.println("Student is good");
} else if (mark <= 10) {
    System.out.println("Student is excellent");
}

switch

switch (variable) {
    case value1:
        // σώμα 1
        break;
    case value2:
        // σώμα 2
        break;
    default:
        // σώμα 3
}

όπου εξετάζεται σε κάθε case αν "variable == value'i'".

παράδειγμα

int numOfAngles = 3;

switch (numOfAngles) {
case 3:
    System.out.println("triangle");
    break;
case 4:
    System.out.println("rectangle");
    break;
case 5:
    System.out.println("pentagon");
    break;
default:
    System.out.println("Higher polygon");
}

Παρατηρήσεις

?:

συνθήκη ? εντολή 1 : εντολή 2;

που σημαίνει ότι αν ικανοποιείται η συνθήκη το πρόγραμμα θα τρέξει την "εντολή 1"
αλλιώς θα τρέξει την "εντολή 2"

for

for (αρχικοποίηση; συνθήκη; μεταβολή) {
    // κώδικας
}

for(2)

Παράδειγμα

// Άθροισμα στοιχείων ενός πίνακα για κάθε δεύτερο δείκτη του.
public static int calculateSumOfEvenIndexes(int[] array) {
    int sum = 0;
    for (int i = 1; i < array.length; i += 2) {
        sum += array[i]; // sum = sum + array[i];
    }
    return sum;
}

while

while (συνθήκη) {
    // κώδικας
}

Παράδειγμα

// Άθροισμα στοιχείων ενός πίνακα για κάθε δεύτερο δείκτη του.
public static int calculateSumOfEvenIndexes(int[] array) {
    int sum = 0;
    int index = 1;
    while (index < array.length) {
        sum += array[i];
        index += 2;
    }
    return sum;
}

Άσκηση

do...while

do {
    // κώδικας
} while (συνθήκη);

Άσκηση

Η ενισχυμένη for

for (Τύπος μεταβλητή : συλλογή) {
    // Κώδικας
}

Παρατηρήσεις

Η εντολή 'break'

Σε κάποιες περιπτώσεις μπορεί να είναι απαραίτητο να διακοπεί η επανάληψη πρόωρα. Η εντολή 'break' με το που διαβαστεί στο σώμα κάποιας επανάληψης, τερματίζει άμεσα αυτή την επανάληψη και συνεχίζει το πρόγραμμα απο την αμέσως επόμενη εντολή. Αν η επανάληψη με την εντολή 'break' είναι εμφολευμένη σε άλλη εξωτερική επανάληψη, τοτέ η δεύτερη επανάληψη δεν επηρρεάζεται από το 'break' της πρώτης.

Παράδειγμα

    public static findSpecificNumber(int[] array, int number) {
        for (int i = 0; i < array.lenght; ++i) {
            if (array[i] == number) {
                System.out.println("Number found at position " + i);
                break;
            }
        }
    }

Η εντολή 'continue'

Είναι πιθανό κάποιος από τους κύκλους της επανάληψης να είναι αδιάφορος είτε να μη πρέπει να επεξεργαστεί. Σε αυτή τη περίπτωση μπορεί να χρησιμοποιήθει η εντολή 'continue'. Με το που διαβαστεί αυτή η εντολή το πρόγραμμα δε διαβάζει το υπόλοιπο σώμα της επανάληψης και ξεκινάει κατευθείαν τον επόμενο κύκλο. Όπως και στην περίπτωση της 'break' η 'continue' επηρρεάζει μόνο την άμεση επανάληψη στο σώμα της οποίας βρίσκεται η εντολή.

Παράδειγμα

// Εξετάζει αν ο πίνακας έχει θετικό άρτιο αριθμό.
public static boolean arrayHasEvenPositiveNumber(int[] array) {
    boolean outcome = false;
    for (int number : array) {
        if (number < 0 || number % 2 != 0) {
            continue;
        }
        outcome = true;
        break;
    }
    return outcome;
}

Αναδρομή

Παράδειγμα

public static int binarySearch(int[] array, int key, int start,
    int end) {
    if (start > end) {
        return -1;
    }
    int middle = (end + start) / 2;
    if (array[middle] == key) {
        return middle;
    } else if (array[middle] < key) {
        return binarySearch(array, key, middle + 1, end);
    } else {
        return binarySearch(array, key, start, middle - 1);
    }
}

Παράδειγμα (2)

Επανάληψη

private static long factorialIterative (int theNumber) {
  int theFactorial = 1;
  for (int i = 0; i < theNumber; i++) {
    theFactorial = theFactorial * i;
  }
  return theFactorial;
}

Αναδρομή

private static long factorialRecursive (int theNumber) {
  if (theNumber == 1)
    return 1;
  else
    return theNumber * factorialRecursive(theNumber - 1);
}

Παρατηρήσεις - Τα θετικά της αναδρομής

Παρατηρήσεις - Τα αρνητικά της αναδρομής

Άσκηση

Άσκηση

Άσκηση

Άσκηση


Creative Commons Licence
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.