Java Hellenic User Group logo

Αρχική Σελίδα
Αγορά Συζήτησης
Κείμενα/Βοηθήματα

Valid CSS!

Έλεγχος ροής στην Java - Μέρος Α (δομές επανάληψης)
(control flow structures - Loops- FOR )

Εισαγωγή

Η ροή ενός προγράμματος συνήθως δεν είναι ποτέ γραμμική. Δηλαδή, το σύνολο των εντολών που θέλουμε να εκτελεστούν, δεν θα εκτελεστούν η μία μετά την άλλη. Μερικές απο αυτές ίσως χρειαστεί να τις επαναλάβουμε ή άλλες θα θελήσουμε να εκτελεστούν κάτω απο ορισμένες συνθήκες (πχ αν ο χρήστης πατησει 'Enter' ή αν η τιμή μίας μεταβλητής ισούται με 2 (==2)).Ας δούμε όμως ένα παράδειμα ενός απλού γραμμικού προγράμματος.


package org.javahellug.papo;
/**
 * <p>Title:Test Example </p>
 * <p>Description:Απλό γραμμικό πρόγραμμα.</p>
 * <p>Copyright: JavaHellug,orgCopyright (c) 2004</p>
 * @author papo(javaneze@gmail.com)
 * @version 1.0
 */
public class TestExample {
  public TestExample() {
  }

  public static void main(String[] args) {
    System.out.println("Έναρξη"); 
    int x = 0;                    
    int y = 0;                    

    int z = x+ y+ 3;                
    System.out.println("Αποτέλεσμα : z = "+z);
  }
}//end of class

Η παραπάνω κλάση είναι ένα απλοικό πρόγραμμα γραμμικής εκτέλεσης, του οποίου οι εντολές εκτελούντε η μία μετά την άλλη χωρίς να αλλάζει κάτι στην σειρά. Παρόλα αυτά επειδή είναι αμφίβολο για το άν πάντα θα γράφουμε τόσο απλοικά στην λογική και εκτέλεση προγράμματα, θα δούμε ένα σενάριο που θα αλλάξει την μορφή του προγραμμάτος μας. Ας υποθέσουμε λοιπόν οτι θέλουμε η εντολή κατα την οποία το πρόγραμμα μας δείχνει το αποτέλεσμα της πρόσθεσεις των 3 ακεραίων να εμφανίζεται Οχι μόνο μια φορά αλλά 5 φορές.

package org.javahellug.papo;
/**
 * <p>Title:Test Example2 </p>
 * <p>Description:Πρόγραμμα με χρήση βρόγχου (loop).</p>
 * <p>Copyright: JavaHellug,orgCopyright (c) 2004</p>
 * @author papo(javaneze@gmail.com)
 * @version 1.0
 */
public class TestExample2 {
  public TestExample() {
  }

  public static void main(String[] args) {

    System.out.println("Έναρξη");

    int i = 0;                   
    int y = 0;                   
    int z = i+ y+ 3;

    for(int x=0;x<5;x++){             
      System.out.println("Εκτύπωση ("+x+") Αποτέλεσμα : z = "+z);
    }

}
}//end of class



Παρατηρούμε ότι χρησιμοποιήσαμε κάποιες νέες εντολές (for) σε συνδιασμό με έντονη χρήση παρενθέσεων και λοιπών χαρακτήρων με σκοπό την εκτύπωση του αποτελέσματος 5 φορές. Οι εντολές οι οποίες ονομάζοντε BΡΟΧΟΙ (loops) και μας βοηθάνε να υλοποιήσουμε την λογική της επανάληψης στα προγράμματα μας θα μας απασχολήσουν στο κείμενο αυτό. Μία απο αυτές είναι το for που μάλλον είναι και το πιο διάσημο μέλος της οικογένειας. Άλλα ειναι το while, do while.  Κάθε μια απο αυτές ανήκει στο λεξικό της γλώσσας και δεν μπορούμε να τις χρησιμοποιήσουμε για άλλη χρήση. Πχ ΔΕΝ μπορουμε να ονομάσουμε μια μεταβλητή μας for  (int for =1 ; ΕΙΝΑΙ ΛΑΘΟΣ).

FOR

Εισαγωγή

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

Δομή του FOR

Μπορεί στο παραπάνω παράδειγμα η γραφή και η δομή του FOR να μας φάνηκαν παράξενες παρόλα αυτά, τα φαινόμενα απατούν και όπως θα δούμε πρόκειται μια πολύ απλή εντολή και μάλιστα με πολύ λογική σύνταξη. Όπως είπαμε παρααπάνω η ελεύθερη μετάφραση της είναι 'για όσες φορές'. Απο την μετάφραση αυτή υποψιαζόμαστε οτι αφού λέμε φορές τότε κατι πρέπει να μετράμε και αφού μετράμε κάτι θα πρέπει μάλλον να έχει καποια αριθμιτική τιμή την οποία εμείς να ελέγχουμε και να αποφασίζουμε αν θα συνεχίσει να εκτελεί την επανάληψη η θα πρέπει να σταματήσει. Αυτο το κάτι δεν είναι τίποτα άλλο απο έναν αριθμό και στην προκειμένη περίπωση εμείς χρησιμοποιήσαμε έναν ακέραιο (int) αριθμό. Οπώς βλέπουμε λοιπόν μέσα στην σύνταξη του FOR εμείς δημιουργήσαμε έναν ακέραιο και του δώσαμε μια αρχική τιμή , στην συνέχεια του ορισαμε ένα οριο στην τιμη του και τέλος  δώσαμε μια εντολή για το τι θα κάνει κάθε φορά που η τιμή του θα είναι μικρότερη απο το όριο. Του είπαμε λοιπόν να αυξάνει την τιμή κατά ένα.

 Γενικότερα λοιπόν μέσα στην σύνταξη του for θα ακολουθούμε 3 βήματα. ΄Οσα ειναι γραμμένα με κόκκινα είναι η βασική σύνταξη και δεν θα πρέπει να  την ξεχνάμε.


    for(BHMA-1 ; BHMA -2 ; BHMA-3){             

      //Εντολές οι οποίες θέλουμε να επαvαληφθούν. Μπορεί να είναι παραπάνω
      // απο μία
    }



ΒΗΜΑ-1 : Πάντα σε αυτό το κομμάτι θα δημιουργούμε και θα αρχικοποιούμε μια μια τιμή τον μετρητή αριθμό μας. Δεν είναι πάντα απαραίτηο να ορίζουμε τον αριθμό μεσα στην σύνταξη του for μπορούμε να χρησιμοποιήσουμε μια μεταβλητή η οποία έχει ήδη οριστεί πχ.


                                                                         int x ;
  for( x=0; x< 5;x++){
  // do things
                              }

Σημειωση:Είναι καλή πρακτική αλλα και συνήθης να ορίζουμε την αρχική τιμή του μετρητή μας στην τιμή 0 (μηδέν). Αυτό συνηθίζεται μιας και η αρίθμηση στους πίνακες στην Java αρχίζουν στην θέση 0. To πρώτο στοιχείο σε έναν πίνακα με ακέραιους έχει πάντα την θέση 0 (μηδέν) .


                                                                                     int[0]= 5;

ΒΗΜΑ-2 : Σε αυτό το κομμάτι θα ορίζουμε την συνθήκη η οποία θα δηλώνει τον τερματισμό της επανάληψης. Με άλλα λόγια στο πάνω παράδειγμα είπαμε οτι θέλουμε να εκτυπώσουμε το αποτέσμα 5 φορές. Αρα ο μετρητής αριθμός μας δεν θα πρέπει να ξεπεράσει την τιμή του 5. Αργότερα θα φέρουμε και άλλα παραδείγματα με τέτοιες συνθήκες.

                                  x<5;

ΒΗΜΑ-3 : Τέλος θα πρέπει να ορίσουμε τον βαθμό που ο μετρητής μας θα αυξάνεται έτσι ώστε μετά απο κάποια στιγμή με την συνεχόμενη αύξηση και την επανάληψη να μπεί στα όρια της συνθήκης και να τερματίσει την επανάληψη (η αλλιώς γνωστή και σαν loop - λούπα). Εδώ χρησιμοποιούμε συνήθως τους λεγόμενους αριθμητικούς τελεστές οι οποίοι έχουν την εξής σημασία.


 ( x++ ): Η τιμή του X ισούται με την υπάρχουσα τιμη του ΣΥΝ ένα (+1).Αν πχ η τιμη του Χ ήταν 4 μετά την εκτέλεση του βήματος 3 η τιμή θα έφτανε στο 5.

( x-- ): Η τιμή του Χ ισούται με την υπάρχουσα τιμη ΠΛΥΝ ένα (-1). Αν πχ η τιμή του Χ ήταν 4
μετά την εκτέλεση του βήματος 3 η τιμη θα έφτανε στο 3.

( Υπάρχουν 2 ακόμα παραλλαγές ( ++x ) , ( --x ) οι οποίες διαφέρουν στο ότι πρώτα προσθέτουν +/- 1 στο x και μετά γίνεται όποιος ελεγχος στην υπαρχουσα τιμή του. Στα 2 παραπάνω πρώτα ελέγχεται η υπάρχουσα τιμή και μετά ακολουθεί η αλλαγή.)


ΤΕΛΟΣ:  Μέσα στι αγκύλες μπορούμε να βάλουμε όσες εντολές θέλουμε ΔΕΝ υπάρχει όριο.

                          
   int x ;
   for( x=0; x< 5;x++){
     System.out.println("To x ="+ x);
            System.out.println("To einai ison me"+ x);                                 //μπορούν να ακολουθήσουν όσα θέλουμε εμείς
        }


Επίσης είναι πολύ σύνηθες όταν πρόκειται να βάλουμε μέσα στο for μας ΜΟΝΟ μία εντολή να ΜΗΝ βάζουμε αγκύλη. Π.χ



   int x ;
   for( x=0; x< 5;x++)
    System.out.println("To x ="+ x);
                                                                    

Επίσης ΔΕΝ είναι απαραίτητο να γράφουμε και τα 3 βήματα στην συγγραφή κάποιου for. Η Java μας επιτρέπει να μην συμπεριλάβουμε κάποιο απο τα τρία ή και όλα μαζί. Προς το παρόν και και χάρη απλότητας δεν θα επεκταθούμε σε αυτη την περίπτωση παρόλα ορίστε ένα παράδειγμα.


 for(int x=0;x<5;){
   System.out.println("Εκτύπωση  "+x);
    x++;
 }

Χρήσιμες παρατήρησεις

  • Ατέρμον βρόχος ή Infinite Loop

Ένα από τα προβλήματα που έχουμε με δομές όπως το for είναι ότι η λαθεμένη χρήση του μπορεί να προκαλέσει μεγάλα προβλήματα στην εκτέλεση του προγράμματος μας. Το πιο σύνηθες είναι η δημιουργία του λεγόμενου ατέρμον βρόχου ή infinite loop ο οποίος δεν είναι τίποτα άλλο απο ενα for (για την περιπτωση μας, μπορει να δημιουργηθεί και με άλλες δομές) το οποίο δεν τερματίζει ποτέ και επαναλαμβάνει συνέχεια τις εντολές που βρίσκοντε μέσα του. Αυτό προκαλεί την μή σωστή εκτέλεση του προγραμμάτος μας, μιας και η ροή του φαίνεται οτι έχει ανωμαλίες αλλα και κοστίζει σε επεξεργαστική ισχύ. Παραδείγματα αυτής της περίπτωσης βλέπουμε παρακάτω,



  for(;;){
   System.out.println("Δεν σταματάει ποτέ");
 }

 


for(int x=0;x>-1;x++){
   System.out.println("Δεν σταματάει ποτέ");
   //το x είναι πάντα > 0
}


  • Πώς 'σπάμε' έναν βρόχο - BREAK

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



package org.javahellug.papo;
/**
 * <p>Title:Test Example3 </p>
 * <p>Description:Χρήση breakΑπλό γραμμικό πρόγραμμα.</p>
 * <p>Copyright: JavaHellug,orgCopyright (c) 2004</p>
 * @author papo(javaneze@gmail.com)
 * @version 1.0
 */
public class TestExample {
  public TestExample() {
  }

  public static void main(String[] args) {
    String[] words = new String[8];
    words[0]="C++";
    words[1]="VB";
    words[2]="VB.net";
    words[3]="C#";
    words[4]="Java";
    words[5]="Cobol";
    words[6]="C";
    words[7]="LISP";
   
   for(int x=0;x<words.length;x++){
    
     String alang = words[x];
     System.out.println("Index x:"+x+" "+alang);
     if(alang.equals("Java"))
       break;
   }
   System.out.println("This is the end, after the loop");
}
}//end of class


Παραδείγματα

  • Δημιουργία βρόχου for που να εκτυπώνει αρίθμηση απο το 1- 10.



for(int x=0;x<10;x++){
   System.out.println(x+1);
   //αρχίζουμε απο το 0
}

ή

for(int x=1;x<11;x++){
   System.out.println(x);
 //αρχίζουμε απο το 1 και αλλάζουμε το όριο
}



  • Δημιουργία βρόχου for που να εκτυπώνει αρίθμηση απο το 10 - 1



    for(int x=10;x>0;x--)
     System.out.println(x);



  • Δημιουργία βρόχου για την εκτύπωση δεδομένων μέσα σε ένα πίνακα



package org.javahellug.papo;
/**
 * <p>Title:Test Example4 </p>
 * <p>Description:Εκτύπωση στοιχείων πίνακα.</p>
 * <p>Copyright: JavaHellug,orgCopyright (c) 2004</p>
 * @author papo(javaneze@gmail.com)
 * @version 1.0
 */
public class TestExample {
  public TestExample() {
  }

  public static void main(String[] args) {
    String[] words = new String[8];
    words[0]="C++";
    words[1]="VB";
    words[2]="VB.net";
    words[3]="C#";
    words[4]="Java";
    words[5]="Cobol";
    words[6]="C";
    words[7]="LISP";
   
   for(int x=0;x<words.length;x++)
          System.out.println(words[x]);
  
   }
}//end of class


Aποστολόπουλος Πάρις


  Get Java Now!