Iteration Statements - Δομές Επανάληψης

Περιγραφή

Σε αυτά τα tutorials θα δούμε τις δομές επανάληψης for, while, do-while και foreach όπως αυτά συντάσσονται και χρησιμοποιούνται στην C#.

 

For

 

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

for  ( αρχικοποίηση; συνθήκη; επανάληψη )

{

      εντολές

}

Στο κομμάτι της αρχικοποίησης ορίζουμε μία μεταβλητή συνήθως ακέραια που δηλώνει από που θα αρχίσει η for να μετράει επαναλήψεις.Στο επόμενο κομμάτι έχουμε την συνθήκη της επανάληψης. Αυτό το κομμάτι είναι Boolean δηλαδή επιστρέφει πάντα true ή false.  Όσο η συνθήκη είναι true οι επαναλήψεις συνεχίζονται, σταματάνε όταν επιστραφεί η τιμή false. Το τελευταίο κομμάτι είναι αυτό της επανάληψης εκεί ορίζουμε μία εντολή που γίνετε κάθε φορά που τελειώνει μία επανάληψη.  Παράδειγμα:

 

int i;

string numbers = "";

for (i = 1; i <= 5; i++)

{
     numbers += i.ToString();
}

Console.WriteLine(numbers);

/* Output
 
12345
 
*/

Στο παράδειγμα αρχικοποιούμε το i = 1, ορίζουμε την συνθήκη i <= 5 που σημαίνει ότι οι επαναλήψεις θα συνεχίσουν μέχρι το i να γίνει 5 και τέλος ορίσαμε το i++ ώστε σε κάθε επανάληψη να αυξάνεται κατά 1. Πέρα από την απλή αυτή χρήση με την for μπορούμε   επίσης να διαβάσουμε και να εισάγουμε δεδομένα σε πίνακες . Παράδειγμα:

 

int[] array = new int[5];
int i;
int j;
string numbers="";
for (i = 0; i <= array.Length - 1; i++)
{
    array[i] = i;
    Console.WriteLine(array[i]);
}

for (j = 0; j <= array.Length-1; j++)
{
    numbers += array[j];
}

Console.WriteLine(numbers);

/* Output
 
0
 
1

2

3

4

01234

*/

Εμφωλευμένα for:

 

Υπάρχει η δυνατότητα να έχουμε μία δομή for μέσα σε μία άλλη δομή for. Αυτό συνήθως το κάνουμε να προσπελάσουμε πίνακες με παραπάνω από μία διάσταση. Παράδειγμα: 

int[,] table = new int[13, 13];

// Outer loop

for (int row = 0; row <= 12; row++)
{
    // Inner loop
    for (int col = 0; col <= 12; col++)
    {
        table[row, col] = row * col;
    }
}

Break - Continue:

 

Στις δομές επανάληψης μπορούμε να χρησιμοποιήσουμε τις δεσμευμένες λέξεις break και continue όπως εξηγούνται σε προηγούμενο tutorial. Παράδειγμα:

 

string[] items = new string[] { "A", "B", "C", "D", "E", "F", "G", "H" };
int pos;

for (pos = 0; pos <= items.Length; pos++)
{

   if (items[pos] == "C")
   {
      break;
   }
}
Console.WriteLine("C is at position {0}", pos); 

/* Output

C is at position 2

*/

 

Σε αυτό το παράδειγμα ψάχνουμε την τιμή C μέσα στον πίνακα. Όταν βρούμε την τιμή αυτή δεν έχει νόημα να συνεχίσει η for. Έτσι βάζουμε το break για να σταματήσει και να συνεχίσει η ροή του προγράμματος.

Στο επόμενο παράδειγμα θα δούμε την χρήση του keyword continue.

 

for (int i = 0; i <= 100; i++)
{
   if ((i % 2) == 0) continue;
   Console.WriteLine(i);
}

/* Output

Perittoi arithmoi apo to 0 mexri to 100

*/

 

Καθώς γίνονται οι επαναλήψεις με το if ελέγχουμε αν ο αριθμός είναι περιττός ή άρτιος. Αν είναι άρτιος εκτελείτε το continue και προχωράει η επανάληψη χωρίς να εκτελεστεί το Console.WriteLine(i); από την στιγμή που θέλουμε μόνο τους περιττούς αριθμούς.

 

Foreach

 

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

 

foreach ( τύπος μεταβλητή in συλλογή/πίνακας )

{

       εντολές

}

 

Όταν ξεκινάει η επανάληψη η μεταβλητή παίρνει την τιμή που υπάρχει στην πρώτη θέση του πίνακα. Σε κάθε επανάληψη συνεχίζει να παίρνει τις υπόλοιπες τιμές με την σειρά. Ο τύπος της μεταβλητής είναι πολύ σημαντικός στην foreach καθώς αν δεν ταιριάζει με τον τύπο των στοιχείων του πίνακα θα εμφανιστεί exception. Για παράδειγμα αν τα στοιχεία του πίνακα είναι τύπου int πρέπει και ο τύπος στην foreach να είναι int.

 

int[] values = new int[] { 1, 3, 5, 7, 9, 10, 15, 6, 4, 2 };
int maxValue = int.MinValue;
foreach (int i in values)
{
    if (i > maxValue)
    {
        maxValue = i;
    }
}

Στην foreach μπορούμε να χρησιμοποιήσουμε κανονικά τα keyword break και continue.

 

Παράδειγμα με break:

 

string[] items = new string[] { "A", "B", "C", "D", "E", "F", "G", "H" };
int pos = 0;
foreach (string s in items)
{
    pos++;
    if (s == "C")
    {
        Console.WriteLine("C found at position {0}", pos);
        break;
    }
}

/* Output
 
C found at position 3

*/

Παράδειγμα με continue:

 

int[] values = new int[] { 1, 3, 5, 7, 9, 10, 8, 6, 4, 2 };
//int maxValue = int.MinValue;
foreach (int i in values)
{
    if ((i % 2) == 0)
    {
        continue;
    }
    Console.WriteLine(i);
}

/* Output

1

3

5

7

9

*/


While – Do While

 

Αν και οι while και do-while δομές δεδομένων μοιάζουν με την for και την foreach  έχουν μία μεγάλη διαφορά. Ενώ στην for και στην foreach πρέπει να ξέρουμε τον αριθμό των επαναλήψεων στις while και do-while δεν χρειάζεται. Είναι πολλές φορές που θα χρειαστούμε μία επανάληψη να γίνετε μέχρι να εκπληρωθεί μία συνθήκη αν και δεν γνωρίζουμε πόσες φορές πρέπει να γίνει από πριν.

Σύνταξη της while:

 

while ( συνθήκη )

{

      εντολές

}

Όσο η συνθήκη είναι true οι επαναλήψεις θα συνεχίζονται. Ένα παράδειγμα χρήσης της while είναι ο υπολογισμός των δυνάμεων του 3 μέχρι το 1000. Σε αυτήν την περίπτωση δεν ξέρουμε από πριν πόσες επαναλήψεις θα γίνουν.

 

int current = 1;
string output = String.Empty;
// Loop while the value being checked is 1000 or less
while (current <= 1000)
{
    output += current.ToString() + " ";
    current *= 3;
}
Console.WriteLine(output);

/* Output
 
1 3 9 27 81 243 729
 
*/

Εδώ η συνθήκη ελέγχεται σε κάθε επανάληψη και αν γίνει false η επανάληψη θα σταματήσει.

 

Αν η συνθήκη είναι false από την αρχή δεν θα γίνει καμμία επανάληψη. Οι εντολές θα παραληφθούν.

int current = 1001;
string output = String.Empty;
// Loop while the value being checked is 1000 or less
while (current <= 1000)
{
    output += current.ToString() + " ";
    current *= 3;
}
Console.WriteLine(output);

/* Output
---
*/

Σύνταξη της do-while:

 

Η do-while μας επιτρέπει να εκτελούμε εντολές όσο η συνθήκη είναι true.  Η σύνταξη είναι παρόμοια με αυτή της while με την διαφορά ότι στην do-while η συνθήκη μπαίνει στο τέλος.

do

{

    εντολές

} while ( συνθήκη );

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

int value = 1;
int factorial = 10;
do
{
    value *= factorial;
    factorial--;
} while (factorial > 1);
Console.WriteLine(value);

/* Output

3628800

*/

 

Break – Continue

 

Οι εντολές break και continue υποστηρίζονται κανονικά όπως έχουν εξηγηθεί στην  δομή επανάληψης for και στην foreach.

  

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