Control Statements – Selection

Μέχρι στιγμής τα προγράμματα που έχουμε δει έχουν το εξής χαρακτηριστικό: οι εντολές τους εκτελούνται μια-μια, με την σειρά. Σε αυτό το tutorial θα δούμε πως μπορούμε να κάνουμε τα προγράμματα μας να εκτελούν διαφορετικές εντολές, αναλόγως με το αν ικανοποιούνται διάφορες συνθήκες που θέτουμε. Πιο συγκεκριμένα θα δούμε τις παρακάτω δομές ελέγχου:

  • if statement
  • switch statement

Καθώς και πως χρησιμοποιούμε τις εντολές break και goto.

Για να δοκιμάσουμε τα παρακάτω αρκεί να δημιουργήσουμε ένα νέο C# Console Application στο Visual Studio.

if statement

 

Η εντολή if μας επιτρέπει να εκτελέσουμε μια εντολή ή ένα μπλοκ εντολών αναλόγως με το αν ικανοποιείται μια συνθήκη. Η σύνταξη της είναι η παρακάτω:

 

if (condition)
            statement;

 

Ως συνθήκη μπορούμε να ορίσουμε μια οποιαδήποτε λογική έκφραση, για παράδειγμα:

  • true
  • false
  • x> = y
  • x == 0 && y < 10
  • κ.ο.κ.

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

 

int x = 10;

if (x >= 10)
    Console.WriteLine("x is greater/equal 10");
        
// continues here

Εάν θέλουμε μέσα στο if να εκτελέσουμε παραπάνω από μια εντολές αρκεί να χρησιμοποιήσουμε μπλοκ κώδικα. Δηλαδή πολλές εντολές που βρίσκονται ανάμεσα σε { και } και συμπεριφέρονται ως ενιαίο κομμάτι. Παράδειγμα:

 

int x = 42;
 
if (x >= 10) {
    Console.WriteLine("x is greater than 10");
    Console.WriteLine("or equal to 10");
}

if-else statement

 

Η λειτουργία της είναι παρόμοια με την if μόνο που ορίζουμε και ποιες εντολές θα εκτελεστούν εάν δεν ισχύει η συνθήκη. Η σύνταξη είναι η εξής:

 

if (condition)
    statement_1;
else
    statement_2;

 

Ας δούμε ένα παράδειγμα και την έξοδο που δίνει:

int x = 42;
 
if (x == 0 || x < 0)
    Console.WriteLine("your number is negative or zero");
else
    Console.WriteLine("your number is positive");


Εάν θέλουμε να χρησιμοποιήσουμε παραπάνω από μια συνθήκες τότε μπορούμε να χρησιμοποιήσουμε συνεχόμενα if-else-if. Η σύνταξη είναι η εξής:

 

if (condition_1)
    statement_1;
else if (condition_2)
    statement_2;
else if (condition_3)
    ...
else if (condition_n)
    statement_n;
else
    statement_else;

 

Το παρακάτω παράδειγμα δείχνει την χρήση των πολλαπλών if-else. Τυπώνει σε ποια περιοχή (< 0, 0-10,10-20, > 20) βρίσκεται ο αριθμός x.

int x = 4;
 
if (x < 0)
    Console.WriteLine("x < 0");
else if (x >= 0 && x <= 10)
    Console.WriteLine("x in [0,10]");
else if (x > 10 && x <= 20)
    Console.WriteLine("x in (10,20]");
else
    Console.WriteLine("x > 20");

 

switch statement

 

Η εντολή switch είναι ένας άλλος τρόπος να εκτελέσουμε διαφορετικά κομμάτια κώδικα, ανάλογα με τις τιμές μιας μεταβλητής. Η σύνταξη είναι η εξής:

 

switch (variable)
{
    case value_1:
        statement_1a;
        statement_1b;
        break;
    case value_2:
        statement_2a;
        statement_2b;
        break;
    case value_3:
        ...
        ...
    case value_n:
        statement_na;
        statement_nb;
        break;
    default:
        statement_default;
        break;
}

 

Μετά το switch ακολουθεί το όνομα της μεταβλητής. Στα case δηλώνουμε την τιμή που ελέγχουμε στην συγκεκριμένη περίπτωση και στην συνέχεια ακολουθούν οι εντολές που θέλουμε να εκτελέσουμε, καθώς και το break. Τέλος αντί για case στην υπάρχει το default, δηλαδή το κομμάτι που θα εκτελεστεί αν η μεταβλητή δεν παίρνει καμία από τις παραπάνω τιμές. Πριν εξηγήσουμε την χρήση του break ας δούμε ένα απλό παράδειγμα:

int x = 2;
 
switch (x)
{
    case 0:
        Console.WriteLine("x equals 0 ");
        break;
    case 1:
    case 2:
        Console.WriteLine("x equals 1");
        Console.WriteLine("or x equals 2");
        break;
    case 3:
        Console.WriteLine("x equals 3");
        break;
    default:
        Console.WriteLine("x is negative or greater than 3");
        break;
}

Όπως βλέπουμε στο παραπάνω παράδειγμα μπορούμε να ομαδοποιήσουμε πολλά case γράφοντας το ένα κάτω από το άλλο (π.χ. case 1: case 2:), ώστε να εκτελείται ο ίδιος κώδικας αν η μεταβλητή πάρει κάποια από αυτές τις τιμές.

break

 

Παρατηρούμε στον παραπάνω κώδικα ότι εκεί που τελειώνει το σώμα του κάθε case υπάρχει η εντολή break. Η εντολή αυτή αποτελεί εντολή άλματος και αυτό που κάνει (όταν βρίσκεται μέσα σε switch) είναι να μεταφέρει την εκτέλεση του προγράμματος μετά το switch.

labels και goto

 

Στην C# μπορούμε να ορίσουμε labels, δηλαδή να δώσουμε ένα συμβολικό όνομα σε κάποιο σημείο του προγράμματος ώστε με την εντολή goto να μεταφέρουμε την  εκτέλεση του προγράμματος σε εκείνο το σημείο. Οι labels καθώς και η εντολή goto ορίζονται όπως φαίνεται παρακάτω:

 

label_name:
    statement;
    ....
 
 
    statement;
 
    goto label_name;

 

Ο ορισμός ενός label από μόνος του δεν αλλάζει τίποτα στην εκτέλεση του προγράμματος μας. Από την άλλη η εντολή goto μόλις εκτελεστεί εκτελεί άλμα στο όνομα του label που ακολουθεί. Το label μπορεί να ορίζεται είτε πριν, είτε μετά το goto. Ας δούμε ένα παράδειγμα όπου προτρέπουμε τον χρήστη να πληκτρολογήσει κάποιο string. Εάν η είσοδος είναι exit τότε τυπώνουμε bye και τερματίζουμε το πρόγραμμα, ενώ σε αντίθετη περίπτωση συνεχίζουμε να ζητάμε είσοδο.

 

using System;
 
class Program
{
    static void Main(string[] args)
    {
        string input;
 
    mylabel1:
 
        Console.Write("type something :");
        input = Console.ReadLine();
 
        if(input == "exit")
            goto mylabel2;
        else
            goto mylabel1;
 
    mylabel2:
 
        Console.WriteLine("bye");
    }
}

Βλέπουμε ότι η εντολή goto μας δίνει την δυνατότητα να επαναλαμβάνουμε την εκτέλεση εντολών με την βοήθεια και της if. Παρόλα αυτά η χρήση της goto θεωρείται κακή πρακτική και μπορεί να κάνει τον κώδικα και την κατανόηση του ιδιαίτερα πολύπλοκη. Αντί για αυτή χρησιμοποιούμε δομές επανάληψης, τις οποίες και θα εξετάσουμε σε επόμενο tutorial.

Επίλογος

 

Είδαμε λοιπόν πως μπορούμε να χρησιμοποιήσουμε τις εντολές if-else, switch-break, ώστε να εκτελέσουμε διαφορετικά κομμάτια κώδικα αναλόγως με διάφορες συνθήκες ή τιμές κάποιας μεταβλητής.