Τετάρτη, 17 Φεβρουαρίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 9ο

5. Ροή Εκτέλεσης Προγράμματος 

Η απλή σκέψη-πρόταση για την ροή προγράμματος είναι η "διαδοχική εκτέλεση". Δηλαδή ένα πρόγραμμα εκτελεί διαδοχικά εντολές. Αν σε ένα πρόγραμμα γνωρίζουμε τη σειρά των εντολών και το τι παραλαμβάνει κάθε μία και τι αφήνει, τότε γνωρίζουμε επακριβώς τι κάνει το πρόγραμμα.

Εδώ θα μπορούσε να αναρωτηθεί κανείς αν υπάρχει δυνατότητα οι εντολές να τρέξουν ανάποδα! Ουσιαστικά αυτό που υπάρχει και το συναντάμε σε έναν επεξεργαστή κειμένου, είναι το UNDO δηλαδή η αντίστροφη ενέργεια. Όμως για να σχεδιάσει κανείς μια γλώσσα με δυνατότητα αντίστροφης ενέργειας πρέπει  να σώνει σε κάθε βήμα την κατάσταση και την οδηγία αντίστροφης ενέργειας. Πράγμα εξαιρετικά δύσκολο. Παρόμοια τεχνική με τους επεξεργαστές εκτελούν και αποθετήρια  ανοικτού κώδικα τύπου GIT όπου βάζουμε τον κώδικα σε μια σειρά ανανεώσεων και μπορεί να μας γυρίσει μερικά βήματα πίσω. Πάλι και εκεί δουλεύει με μια λειτουργία κειμένου σαν την UNDO (δοκιμάστε να γράψετε στο Word ή άλλο επεξεργαστή και μετά από διάφορες ενέργειες πατήστε το Ctrl Z ας πούμε πέντε φορές, μετά πατήστε το Ctrl Y άλλες πέντε, το UNDO έχει το δικό του UNDO, το REDO).


5.1 Βασικές ιδέες διακλάδωσης

Μια γραφική μέθοδο που δείχνει τη ροή προγράμματος περιλαμβάνει κουτιά ενεργειών και βελάκια που δείχνουν το επόμενο κουτί. Με λίγα λόγια η ροή προγράμματος δύναται να σχεδιαστεί γραφικά και ο λόγος που κάποτε γίνονταν πάντα κάτι τέτοιο ήταν για να υπάρχει μια αναφορά του τι έχει σχεδιάσει κανείς. Δηλαδή το πρόγραμμα τότε δεν εμφάνιζε την ροή του με γρήγορο κοίταγμα. Έτσι το λογικό διάγραμμα (ροής εντολών) μας έδειχνε τα σημεία που το πρόγραμμα διακλάδωνε με ή χωρίς συνθήκη. Ο μηχανισμός διακλάδωσης υπάρχει σε πολλά επίπεδα, με κύριο το επίπεδο της λεγόμενης γλώσσας μηχανής. Η υψηλού επιπέδου γλώσσα Μ2000, έχει ρουτίνες που είναι μεταγλωττισμένες μόνιμα σε γλώσσα μηχανής (και περιλαμβάνονται στο εκτελέσιμο αρχείο m2000.exe), αλλά όταν διερμηνεύει ένα πρόγραμμα σε Μ2000 εκτελεί τις διακλαδώσεις του ανώτερου επιπέδου με "αδιάφανες" για μας διακλαδώσεις χαμηλού επιπέδου. Μια γλώσσα, υψηλού επιπέδου που μεταγλωττίζει το πρόγραμμα σε πρόγραμμα γλώσσας μηχανής τότε έχει εξαλείψει τις διακλαδώσεις που εμφανίζονται στο κώδικά της με επιλογές που πάλι μας είναι αδιαφανείς, αλλά είναι μόνιμες πια. Το κέρδος με τους μεταγλωττιστές είναι ο γρήγορος κώδικας, και η Μ2000 έχει γραφτεί με Visual Basic 6, που διαθέτει και τα δύο, διερμηνευτή για την ανάπτυξη και μεταγλωττιστή για το τελικό προϊόν, το εκτελέσιμο πρόγραμμα.Η Μ2000 είναι διερμηνευτής, προσανατολισμένη δηλαδή για ανάπτυξη προγραμμάτων, κατανόηση και πειραματισμό.

Αναφέρθηκε πιο πριν η έννοια της συνθήκης. Συνθήκη λέμε την καταγεγραμμένη κατάσταση, π.χ. μπορεί μια μεταβλητή Α να πάρει ας πούμε τρία νούμερα 1, 2, 3 αν θέλω να δω την τι έχει, τότε θα φτιάξω μια λογική συνθήκη Α=1 για να μου δώσει Αληθές αν είναι 1 ή κάτι άλλο, αλλά κάθε φορά θα έχω μια λογική παράσταση με συγκρίσεις. Π.χ. αν έχω δυο μεταβλητές μια συνθήκη θα ήταν αυτή: Α>1 και Β=3. Κάθε συνθήκη έχει ένα από τα δύο πιθανά αποτελέσματα: Αληθές ή Ψευδές.
Διακλάδωση υπό συνθήκη σημαίνει να δω αν ισχύει μια συνθήκη και να ορίσω τι θα γίνει αν είναι Αληθές και τι θα γίνει αν είναι Ψευδές το αποτέλεσμα. Και τα δύο πρέπει να μου είναι γνωστά.
Η Μ2000 έχει και την "αρχαία μέθοδο", τη χρήση Προς (Goto) για διακλάδωση (Η Προς έχει μια παραξενιά και δεν πάει στη πρώτη γραμμή αν εκεί είναι αριθμός, Στο παράδειγμα έχουμε μια γραμμή σημείωσης, οπότε δεν έχουμε κανένα πρόβλημα)

\\ Αρχαία Μέθοδος
100 Εισαγωγή "Δώσε Όνομα:", Α$
110 Αν Α$="" Τότε Πρός 100
120 Τύπωσε "Γεια χαρά "+Α$


Το πρόγραμμα δέχεται από το πληκτρολόγιο, και το εμφανίζει καθώς το γράφουμε, ένα όνομα με ή χωρίς κενά. Δεν δέχεται το κόμμα, γιατί το χρησιμοποιεί για την επόμενη μεταβλητή, αν θέλουμε να πάρουμε γραμμή με οτιδήποτε τότε εκτελούμε το Γραμμή Εισαγωγής Α$:

\\ Αρχαία Μέθοδος 2
100 Τύπωσε "Δώσε ένα όνομα :";
105 Γραμμή Εισαγωγής Α$
110 Τύπωσε    \\  αλλαγή γραμμής
120 Αν Α$="" Τότε Πρός 100
130 Τύπωσε "Γεια χαρά "+Α$


Δείτε λίγο την αλλαγή. Έχουμε προσαρμόσει και τα νούμερα (αν και η Μ2000 τα παραβλέπει εκτός αυτών που θέλουμε για την Προς αλλά και την Διαμέσου (Gosub).

Ο κώδικας με τις Αν και Προς μαζί λέγεται και σπαγγέτι κώδικας

Δείτε όμως κάτι άλλο. Και στα δυο προγράμματα χρησιμοποιούμε διακλάδωση υπό συνθήκη. Η συνθήκη είναι το Α$="" που θα είναι Αληθές αν το αλφαριθμητικό είναι κενό (αυτό σημαίνει). Στην γραμμή 110 στο πρώτο παράδειγμα και στην 120 στο δεύτερο έχουμε μια ΑΝ ΤΟΤΕ η οποία ελέγχει την συνθήκη και αν είναι αληθές τότε εκτελεί το κομμάτι μετά το "Τότε" αλλιώς συνεχίζει στην επόμενη. Άρα εδώ ξέρουμε τι γίνεται, γιατί ξέρουμε τι λέει η συνθήκη και τι θα γίνει αν είναι αληθές και τι θα γίνει αν είναι ψευδές.

Δείτε επίσης λίγο το μπάχαλο με τα νούμερα! Αν θέλουμε να βάλουμε γραμμές ενδιάμεσα πρέπει να βάλουμε άλλα νούμερα. Κάποια στιγμή θα κάνουμε αρίθμηση ξανά και δεν γίνεται αυτόματα. Ίσως μπερδευτούμε και με τα νούμερα και βάλουμε την Προς να πάει αλλού, π.χ. αντί στην 100 στο δεύτερο πρόγραμμα να πάει στο 105. Ένας τρόπος να γλιτώσουμε από πιθανά τέτοια λάθη είναι να χρησιμοποιήσουμε ετικέτες:

\\ Αρχαία Μέθοδος 3
ΔώσεΌνομα:
      Τύπωσε "Δώσε ένα όνομα :";
      Γραμμή Εισαγωγής Α$
      Τύπωσε    \\  αλλαγή γραμμής
      Αν Α$="" Τότε Πρός ΔώσεΌνομα
      Τύπωσε "Γεια χαρά "+Α$


Στις ετικέτες η Μ2000 είναι πολύ προσεκτική, αν δει διαφορά σε πεζά-κεφαλαία-τόνους τότε κάνει την αδιάφορη...Όταν ένα Προς δεν βρεθεί τότε εκτελεί έξοδο!

5.2 Επανάλαβε Μέχρι (Επανέλαβε Μέχρι)

Η σύγχρονη μέθοδος διακλάδωσης είναι περισσότερο περιφραστική και παραστατική (δηλαδή φαίνεται εύκολα)

\\ Νέα Μέθοδος 1
Επανάλαβε {
      Τύπωσε "Δώσε ένα όνομα :";
      Γραμμή Εισαγωγής Α$
      Τύπωσε    \\  αλλαγή γραμμής
} Μεχρι Όχι Α$=""
Τύπωσε "Γεια χαρά "+Α$


Τώρα δεν έχουμε αριθμούς ή ετικέτες. Έχουμε ένα μπλοκ εντολών που έχουμε μετακινήσει δεξιά για να ξεχωρίζει  (επιλέγουμε συνεχόμενες γραμμές στο διορθωτή και πατάμε TAB για δεξιά και SHIFT TAB για αριστερά). Τώρα μας είναι ξεκάθαρο ότι οι γραμμές που είναι "πιο μέσα" είναι ένα σύνολο μέσα στο σύνολο που λέμε πρόγραμμα και το οποίο πάνω γράφει Επανέλαβε ή Επανάλαβε (υπάρχουν και τα δύο...διαλέξτε όποιο θέλετε), και κάτω Μέχρι Όχι Α$="" θα μπορούσαμε να το γράψουμε και έτσι Μέχρι Α$<>"" που είναι το ίδιο σημαίνει όχι κενό.

Δείτε κάτι άλλο όμως. Ενώ στην αρχή συζητούσαμε για διακλάδωση, είδαμε ότι αυτή μπορεί λόγω συνθήκης να "επιμένει" δηλαδή να φαίνεται ως επανάληψη, ή μια επαναληπτική διαδικασία. Επακριβώς αυτά τα δύο, διακλάδωση και επαναληπτική διαδικασία δεν ξεχωρίζουν παρά μόνο εκ του αποτελέσματος. Θα μπορούσε βέβαια κάποιος να κάνει ένα τόσο πολύπλοκο δέσιμο διάφορων Προς που οι νέες μέθοδοι δεν θα μπορούσαν να το βγάλουν χωρίς επανάληψη κώδικα σε διάφορα σημεία. Και ο λόγος που πραγματικά όλες οι γλώσσες (σχεδόν) έχουν την Goto είναι αυτός της οικονομίας κατά την ανάπτυξη πολύπλοκης λογικής. Δείτε εδώ παράδειγμα όπου φαίνεται η διαφορά.

Δείτε ακόμη ότι η Επανέλαβε έκανε έλεγχο στο τέλος της πρώτης εκτέλεσης του εσωτερικού μπλοκ. Δείτε ακόμα ότι η συνθήκη προϋποθέτει την ύπαρξη της Α$. Στη Μ2000 μπορούμε να δημιουργούμε μεταβλητές και στις εντολές Διάβασε, Εισαγωγή, Γραμμή Εισαγωγής. Όμως θα μπορούσαμε να γράφαμε σαν πρώτη γραμμή Στη Α$="" ή χωρίς το Στη (απλά με αυτήν βάζουμε κόμμα και τις επόμενες μεταβλητές σε μια ωραία γραμμή).

Υπάρχει και μια παραλλαγή με την αλλαγή του Μέχρι με το Πάντα (εδώ έχω χρησιμοποιήσει το όνομα Επανέλαβε, αλλά πάει και το Επανάλαβε). Είναι μια επανάληψη χωρίς συνθήκη (ουσιαστικά η συνθήκη βρίσκεται μέσα στον εσωτερικό κώδικα):
\\ Νέα Μέθοδος 1.1
Α$=""
Επανέλαβε {
      Τύπωσε "Δώσε ένα όνομα :";
      Γραμμή Εισαγωγής Α$
      Τύπωσε    \\  αλλαγή γραμμής
      Αν Α$<>"" Τότε Έξοδος
} Πάντα
Τύπωσε "Γεια χαρά "+Α$


5.3 Ενώ

Δείτε τώρα μια άλλη μέθοδο, όπου η συνθήκη ελέγχεται πριν την είσοδο στο εσωτερικό μπλοκ

\\ Νέα Μέθοδος 2
Α$=""
Ενώ Α$="" {
      Τύπωσε "Δώσε ένα όνομα :";
      Γραμμή Εισαγωγής Α$
      Τύπωσε    \\  αλλαγή γραμμής
}
Τύπωσε "Γεια χαρά "+Α$


5.4 Έξοδος
Και στο πρόγραμμα με την Ενώ θα μπορούσαμε να βάλουμε έξοδο από την Ενώ στα μέσα του εσωτερικού κώδικα με έναν έλεγχο συνθήκης με την Αν  και τελικά να κάνουμε Έξοδο.
Η έξοδος όπως και στο παράδειγμα Επανέλαβε Πάντα οδηγεί τη ροή έξω από το μπλοκ, αμέσως μετά το τέλος του!
Ουσιαστικά η εντολή έξοδος είναι εντολή διακλάδωσης!
Π.χ.

{
      Τύπωσε "αυτό"
      έξοδος
      Τύπωσε "όχι αυτό"
}
Τύπωσε "οκ"


Δεν θα εμφανιστεί το "όχι αυτό". Είναι ίδιο με αυτό (όταν χρησιμοποιούμε ετικέτες βάζουμε τον κώδικα μια θέση δεξιά ώστε οι ετικέτες να ξεχωρίζουν)

      Τύπωσε "αυτό"
      Προς άλλο
      Τύπωσε "όχι αυτό"
άλλο:
      Τύπωσε "οκ"


Και στις δύο περιπτώσεις πριν την έξοδος /Προς άλλο θα μπορούσαμε να είχαμε μια Αν κάτι Τότε, δηλαδή να κάναμε μια διακλάδωση υπό συνθήκη!

5.5 Αν Τότε Αλλιώς.Αν Αλλιώς

Κάποιοι το σκέφτηκαν λοιπόν και έβαλαν την συνθήκη να έχει δικά της μπλοκ εντολών και να τα εκτελεί στο Αληθές και το Ψευδές, και το επέκτειναν ακόμα με την προσθήκη σταδιακού ελέγχου (κοιτάμε την πρώτη αν όχι την δεύτερη...μέχρι εκείνη που θα πέσει, ή αλλιώς έχουμε και μια περίπτωση για τότε που καμία συνθήκη δεν είναι αληθής)

Η Μ2000 υλοποιεί αυτό το σχεδιασμό:

\\ χωρίς εισαγωγή βγαίνει λάθος
\\ εδώ δεν θα εξετάσουμε την επαναφορά από λάθος
Εισαγωγή "Χ,Υ=",Χ,Υ
Αν Χ>Υ Τότε {
      Τύπωσε "Ο Χ είναι μεγαλύτερος"
} Αλλιώς {
      Τύπωσε "Ο Χ δεν είναι μεγαλύτερος"
}
Τύπωσε "Συνέχεια..."


Στη περίπτωση δυο αριθμών έχουμε τρεις καταστάσεις. Το προηγούμενο δεν μας βολεύει (βέβαια κάνει μια δουλεία, μας λέει αν το Χ είναι ή όχι μεγαλύτερο του Υ). Πάμε για άλλο όμως που να λέει αν είναι μεγαλύτερο, μικρότερο ή ίδιο. Θα χρησιμοποιήσουμε το διπλό ίσον που για αριθμητική σύγκριση πραγματικών είναι το καλύτερο!

\\ χωρίς εισαγωγή βγαίνει λάθος
\\ εδώ δεν θα εξετάσουμε την επαναφορά από λάθος
Εισαγωγή "Χ,Υ=",Χ,Υ
Αν Χ==Υ Τότε {
      Τύπωσε "Ο Χ και ο Υ είναι ίσοι"
} Αλλιώς.Αν Χ>Υ Τότε {
      Τύπωσε "Ο Χ είναι μεγαλύτερος"
} Αλλιώς {
      Τύπωσε "Ο Χ είναι ο μικρότερος"
}
Τύπωσε "Συνέχεια..."


Θα μπορούσαμε σε μια άλλη περίπτωση να βάλουμε μια σειρά με Αλλιώς.Αν πριν την τελική Αλλιώς. Επίσης θα μπορούσαμε να παραβλέψουμε την Αλλιώς.
Άλλες μορφές:
ΑΝ  συνθήκη ΑΛΛΙΩΣ
Αντί να κάνουμε αυτό Αν όχι κάτι Τότε...  μπορούμε να κάνουμε αυτό  Αν κάτι Αλλιώς...είναι το ίδιο πράγμα (εκτός και αν θέλουμε στη πρώτη περίπτωση να χρησιμοποιήσουμε και μία Αλλιώς).
ΑΝ  συνθήκη  ΤΟΤΕ {  } ΑΛΛΙΩΣ
Συνεχόμενα Αν μετά από το Τότε θα εκτελεστούν αν έχουμε αληθές πριν

ΑΝ συνθήκη ΤΟΤΕ ΑΝ  συνθήκη  ΤΟΤΕ ΑΝ  συνθήκη ΤΟΤΕ

Δεν μπορούμε να δώσουμε το ΑΝ  συνθήκη  Τότε κάνεαυτό Αλλιώς κάνετοάλλο διότι αν το  Τότε το ακολουθεί το Αλλιώς θέλει τις εντολές σε μπλοκ:
ΑΝ  συνθήκη  Τότε { κάνεαυτό } Αλλιώς κάνετοάλλο

Με τον τρόπο που μόλις είδαμε αποφεύγουμε το πρόβλημα Απροσδιόριστου Αλλιώς

χ=10
Υ=3
\\ή θα βάλουμε έτσι ένα μπλοκ
Αν Χ=10 Τότε { Αν Υ<5 Τότε Τύπωσε "Οκ 1" } Αλλιώς Τύπωσε "Συνέχεια 1"
\\ή έτσι
Αν Χ=10 Τότε Αν Υ<5 Τότε {Τύπωσε "Οκ 2" } Αλλιώς Τύπωσε "Συνέχεια 2"
\\ οκ1 και οκ2


χ=10
Υ=14
\\ή θα βάλουμε έτσι ένα μπλοκ
Αν Χ=10 Τότε { Αν Υ<5 Τότε Τύπωσε "Οκ 1" } Αλλιώς Τύπωσε "Συνέχεια 1"
\\ή έτσι
Αν Χ=10 Τότε Αν Υ<5 Τότε {Τύπωσε "Οκ 2" } Αλλιώς Τύπωσε "Συνέχεια 2"
\\ Συνέχεια 2


χ=11
\\ το Υ είναι αδιάφορο εδώ για τις επόμενες γραμμές αφού το Χ δεν είναι 10
\\ή θα βάλουμε έτσι ένα μπλοκ
Αν Χ=10 Τότε { Αν Υ<5 Τότε Τύπωσε "Οκ 1" } Αλλιώς Τύπωσε "Συνέχεια 1"
\\ή έτσι
Αν Χ=10 Τότε Αν Υ<5 Τότε {Τύπωσε "Οκ 2" } Αλλιώς Τύπωσε "Συνέχεια 2"
\\ Συνέχεια 1


5.6 Επέκταση της Αν σε άλλες εντολές εντός γραμμής

Στο τελευταίο  αλλιώς  αν θέλουμε βάζουμε μπλοκ αν έχουμε εντολές σε πολλές γραμμές ή δεν βάζουμε αν θέλουμε να τις κρατήσουμε στην ίδια γραμμή, ή έχουμε μια ή περισσότερες με χωρισμό τους με το χαρακτήρα ":". Ισχύει και για το Τότε αν δεν ακολουθεί μια Αλλιώς στην γραμμή!
Δηλαδή μετά μια Αλλιώς ή μια Τότε αν δεν υπάρχει μπλοκ στην γραμμή θεωρείται ο κώδικας μέχρι το τέλος της γραμμής ως κώδικας της Αλλιώς ή της Τότε

Προσοχή λοιπόν σε αυτό:
Χ=5
Αν Χ=6 Τότε Τύπωσε "Ναι" : Χ++
Τύπωσε Χ \\ τυπώνει 5


Χ=6
Αν Χ=6 Τότε Τύπωσε "Ναι" : Χ++
Τύπωσε Χ \\ τυπώνει 7


(συνεχίζεται στο επόμενο τεύχος, υπάρχουν πολλοί τρόποι για αλλαγή ροής εκτέλεσης προγράμματος)

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου