Δυο μέρες εργασία! Σε αυτήν την αναθεώρηση ήθελα και πέτυχα να δουλεύουν τα LOOP, RESTART, BREAK, CONTINUE, EXIT παντού. Ελληνικές εντολές αντίστοιχα είναι τα ΚΥΚΛΙΚΑ, ΞΕΚΙΝΑ, ΔΙΕΚΟΨΕ, ΣΥΝΕΧΙΣΕ, ΕΞΟΔΟΣ.
Σε ένα μπλοκ κώδικα μπορούμε να δώσουμε το Έξοδος για να συνεχίσουμε μετά από αυτό. Επίσης μπορούμε να δώσουμε το Διέκοψε για να διακόψουμε και όλα τα μπλοκ που φωλιάζουν το τρέχον. Επίσης με το Κυκλικά κάνουμε για μια φορά το μπλοκ να επαναληφθεί όταν φθάσουμε στο τέλος του. Αν κάθε φορά βρίσκει ο διερμηνευτής την εντολή αυτή, θα κάνει συνέχεια επαναλήψεις (κύκλους). Κάθε μπλοκ έχει μια σημαία για να κάνει ή όχι επανάληψη μετά την τελευταία εντολή. Κάθε φορά που ξεκινάει το μπλοκ κώδικα η σημαία γίνεται ψευδής. Έτσι αν την γυρίσουμε σε αληθής, με την Κυκλικά θα πετύχουμε την επανάληψη.
Ορισμένα μπλοκ κώδικα κάνουν επανάληψη γιατί ανήκουν σε δομές με επανάληψη, όπως την ΓΙΑ (FOR), την ΕΝΩ (While) την Επανέλαβε (REPEAT ή DO). Σε αυτά καθώς και στα μπλοκ που σημαδέψαμε για επανάληψη, η Συνέχισε κάνει άμεση επανάληψη, χωρίς να φθάσει στο τέλος. Η ίδια εντολή, σε ένα μπλοκ που δεν έχει σημανθεί για επανάληψη κάνει έξοδο. Τέλος η Ξεκίνα κάνει επανάληψη άμεσα, αδιαφορώντας για τη σημαία επανάληψης. Η Συνέχισε πότε λειτουργεί σαν Έξοδος (σημαία επανάληψης ψευδής) και πότε σαν Ξεκίνα (σημαία επανάληψης αληθής).
Εκεί που μπλέκονται τα πράγματα είναι στην δομή ΕΠΙΛΕΞΕ ΜΕ (SELECT CASE). Αυτή η δομή έχει σχεδιαστεί για να λειτουργεί με και χωρίς μπλοκ κώδικα. Σε κάθε Με (Case) ή στο τελευταίο Αλλιώς Με ή (ELSE CASE) μπορούμε να βάλουμε μια γραμμή εντολών ή ένα μπλοκ εντολών με πολλές γραμμές ανάμεσα. Ο διερμηνευτής δέχεται το Αλλιώς και χωρίς το ΜΕ αλλά θα υπάρχει πρόβλημα αν είναι φωλιασμένο σε μια Αν Τέλος Αν ( δομή χωρίς μπλοκ κώδικα), επειδή και αυτή έχει μια Αλλιώς. Για συμβατότητα με τα παλιά προγράμματα η τωρινή έκδοση δέχεται και το παλιό τύπο με την απλή Αλλιώς. Στην νέα αναθεώρηση μπορούμε να βάζουμε πολλές εντολές σε μια γραμμή μετά την Με ή την Αλλιώς Με, ενώ στις παλαιότερες εκτελούνταν μόνο μια και οι τυχόν άλλες στην γραμμή απορρίπτονταν.Επίσης μπορούμε να βάζουμε δομή Αν σε μια γραμμή με όλα τα καλά της Αλλιώς.Αν και Αλλιώς, με ή χωρίς μπλοκ κώδικα (αρκεί τα μπλοκ να είναι εντός γραμμής).
Στη περίπτωση λοιπόν που έχουμε μια γραμμή κώδικα και όχι μπλοκ, οι εντολές για τα μπλοκ, όπως είδαμε παραπάνω, μπορούν να εκτελεστούν σε αυτή και θα επηρεάσουν το μπλοκ που ανήκει η ΕΠΙΛΕΞΕ ΜΕ (παλαιότερα μόνο τα ΔΙΕΚΟΨΕ και ΕΞΟΔΟΣ λειτουργούσαν, ως απλές εντολές μόνο, και όχι σε κάποια δομή Αν με πολλά μέρη (σε μια γραμμή εδώ).
Οι εντολές Διέκοψε και Συνέχισε σε μπλοκ μετά την Με κάνουν άλλη δουλειά. Ενώ θα περίμενε κανείς ότι η Διέκοψε διακόπτει το μπλοκ, εδώ κάνει κάτι άλλο: Διακόπτει τον έλεγχο συνθηκών στην ΜΕ (CASE) και εκτελεί όλα τα ΜΕ (χωρίς να εκτελεί τις συνθήκες), μέχρι ή να τελειώσουν (δεν εκτελεί της Αλλιώς Με) ή μέχρι κάποιο μπλοκ να εκτελέσει τη Συνέχισε η οποία κάνει έξοδο από την δομή ΕΠΙΛΕΞΕ ΜΕ (υπάρχει και ως ΕΠΕΛΕΞΕ ΜΕ).
Υπήρχε μεγάλη δυσκολία για να προγραμματιστεί σωστά ο διερμηνευτής, διότι στις Αν χωρίς μπλοκ σε μια γραμμή ουσιαστικά εκτελεί μπλοκ εσωτερικά και τα "σινιάλα" από τις παραπάνω πέντε εντολές πρέπει να μεταβιβάζονται στο πιο πάνω μπλοκ, και αν έχουμε την Επίλεξε ακριβώς από πάνω, τότε έχουμε τριπλό πέρασμα, μια στη ΑΝ, μια στην ΕΠΙΛΕΞΕ και μια στο μπλοκ που θέλουμε να ισχύουν αυτά. Παράλληλα διόρθωσα και την εμφάνιση κώδικα στη φόρμα Έλεγχος, ώστε να συμβαδίζει ο χρωματισμένος κώδικας και η σημειωμένη τρέχουσα εντολή σε περίπτωση της Επίλεξε Με.
Το παρακάτω δείχνει τη λειτουργία των BREAK/CONTINUE στην SELECT CASE. Θα ανοίξει η φόρμα Έλεγχος και εμείς πατάμε το Next Step και βλέπουμε τις εντολές καθώς εκτελούνται. Θα μας τυπώσει τα break, me, 1000, bad και ok. Αλλάξτε την Print "me" με την Exit. Θα πάρετε τα break και ok. Αλλάξτε την Exit με την Break, τώρα θα πάρετε μόνο το break, γιατί θα γίνει έξοδος από το τμήμα alfa.
Module alfa {
Test "this"
{
select case true
case true
{print "break" : break}
case 50
Print "me"
case 100
{ Print 1000 : continue}
case 500
Print "nothing" : Goto 100
end select
Print "bad"
exit
}
100 Print "ok"
}
alfa
Εκτός από τις Έξοδος και Διέκοψε (Exit & Break) υπάρχει και η Προς ή Goto για έξοδο σε προκαθορισμένο σημείο (μπορεί να γίνει προς οποιαδήποτε πλευρά αλλά όχι εκτός χώρου τμήματος/συνάρτησης. Δοκιμάστε μερικές αλλαγές, πχ το 900 αντί του 9, ή το break στο Case 4 (σε αυτή την αναθεώρηση μπορούμε να τα βάλουμε και τα δυο χωρίς μπλοκ, αρκεί να είναι σε μια γραμμή). Επίσης η Προς λειτουργεί χωρίς μπλοκ, αν θέλουμε, και με δομή Αν.
module zz {
test "me too"
{
a=9 ' 900
here:
a-=4
Print "Last Test"
Select case A
Case 1
if true then exit else Print "ok"
Case 1.5
break
Case 2
{if true then break}
Case 4
Print "case 4" ' : break
Case 5
{
goto here
}
Else
{
goto finish
}
End Select
print "no error"
}
print "end"
finish:
? "done"
}
zz
? "end zz"
Στο παρακάτω παράδειγμα η εντολή Print "ok" θα εκτελεστεί είτε είχαμε true είτε false στο If. Αν δεν είχαμε σε μπλοκ τα δυο Print, τότε όλη η γραμμή θα ελεγχόταν από το If. Κάντε αλλαγές! Πχ τι θα αλλάξουμε για να πάει η ροή από το Case 5 στο Case 100.(να εκτελέσει και τα δυο δηλαδή)
Module CheckIt {
Pen 14 {
select case 5
case 5
if true then {print "break" : Print "1000"} : Print "ok"
case 100
{ Print 1000 : continue}
case 500
Print "nothing" : Goto 100
else case
Print "else case"
end select
Print "bad"
}
100 Print "ok"
}
Checkit
Σε ένα μπλοκ κώδικα μπορούμε να δώσουμε το Έξοδος για να συνεχίσουμε μετά από αυτό. Επίσης μπορούμε να δώσουμε το Διέκοψε για να διακόψουμε και όλα τα μπλοκ που φωλιάζουν το τρέχον. Επίσης με το Κυκλικά κάνουμε για μια φορά το μπλοκ να επαναληφθεί όταν φθάσουμε στο τέλος του. Αν κάθε φορά βρίσκει ο διερμηνευτής την εντολή αυτή, θα κάνει συνέχεια επαναλήψεις (κύκλους). Κάθε μπλοκ έχει μια σημαία για να κάνει ή όχι επανάληψη μετά την τελευταία εντολή. Κάθε φορά που ξεκινάει το μπλοκ κώδικα η σημαία γίνεται ψευδής. Έτσι αν την γυρίσουμε σε αληθής, με την Κυκλικά θα πετύχουμε την επανάληψη.
Ορισμένα μπλοκ κώδικα κάνουν επανάληψη γιατί ανήκουν σε δομές με επανάληψη, όπως την ΓΙΑ (FOR), την ΕΝΩ (While) την Επανέλαβε (REPEAT ή DO). Σε αυτά καθώς και στα μπλοκ που σημαδέψαμε για επανάληψη, η Συνέχισε κάνει άμεση επανάληψη, χωρίς να φθάσει στο τέλος. Η ίδια εντολή, σε ένα μπλοκ που δεν έχει σημανθεί για επανάληψη κάνει έξοδο. Τέλος η Ξεκίνα κάνει επανάληψη άμεσα, αδιαφορώντας για τη σημαία επανάληψης. Η Συνέχισε πότε λειτουργεί σαν Έξοδος (σημαία επανάληψης ψευδής) και πότε σαν Ξεκίνα (σημαία επανάληψης αληθής).
Εκεί που μπλέκονται τα πράγματα είναι στην δομή ΕΠΙΛΕΞΕ ΜΕ (SELECT CASE). Αυτή η δομή έχει σχεδιαστεί για να λειτουργεί με και χωρίς μπλοκ κώδικα. Σε κάθε Με (Case) ή στο τελευταίο Αλλιώς Με ή (ELSE CASE) μπορούμε να βάλουμε μια γραμμή εντολών ή ένα μπλοκ εντολών με πολλές γραμμές ανάμεσα. Ο διερμηνευτής δέχεται το Αλλιώς και χωρίς το ΜΕ αλλά θα υπάρχει πρόβλημα αν είναι φωλιασμένο σε μια Αν Τέλος Αν ( δομή χωρίς μπλοκ κώδικα), επειδή και αυτή έχει μια Αλλιώς. Για συμβατότητα με τα παλιά προγράμματα η τωρινή έκδοση δέχεται και το παλιό τύπο με την απλή Αλλιώς. Στην νέα αναθεώρηση μπορούμε να βάζουμε πολλές εντολές σε μια γραμμή μετά την Με ή την Αλλιώς Με, ενώ στις παλαιότερες εκτελούνταν μόνο μια και οι τυχόν άλλες στην γραμμή απορρίπτονταν.Επίσης μπορούμε να βάζουμε δομή Αν σε μια γραμμή με όλα τα καλά της Αλλιώς.Αν και Αλλιώς, με ή χωρίς μπλοκ κώδικα (αρκεί τα μπλοκ να είναι εντός γραμμής).
Στη περίπτωση λοιπόν που έχουμε μια γραμμή κώδικα και όχι μπλοκ, οι εντολές για τα μπλοκ, όπως είδαμε παραπάνω, μπορούν να εκτελεστούν σε αυτή και θα επηρεάσουν το μπλοκ που ανήκει η ΕΠΙΛΕΞΕ ΜΕ (παλαιότερα μόνο τα ΔΙΕΚΟΨΕ και ΕΞΟΔΟΣ λειτουργούσαν, ως απλές εντολές μόνο, και όχι σε κάποια δομή Αν με πολλά μέρη (σε μια γραμμή εδώ).
Οι εντολές Διέκοψε και Συνέχισε σε μπλοκ μετά την Με κάνουν άλλη δουλειά. Ενώ θα περίμενε κανείς ότι η Διέκοψε διακόπτει το μπλοκ, εδώ κάνει κάτι άλλο: Διακόπτει τον έλεγχο συνθηκών στην ΜΕ (CASE) και εκτελεί όλα τα ΜΕ (χωρίς να εκτελεί τις συνθήκες), μέχρι ή να τελειώσουν (δεν εκτελεί της Αλλιώς Με) ή μέχρι κάποιο μπλοκ να εκτελέσει τη Συνέχισε η οποία κάνει έξοδο από την δομή ΕΠΙΛΕΞΕ ΜΕ (υπάρχει και ως ΕΠΕΛΕΞΕ ΜΕ).
Υπήρχε μεγάλη δυσκολία για να προγραμματιστεί σωστά ο διερμηνευτής, διότι στις Αν χωρίς μπλοκ σε μια γραμμή ουσιαστικά εκτελεί μπλοκ εσωτερικά και τα "σινιάλα" από τις παραπάνω πέντε εντολές πρέπει να μεταβιβάζονται στο πιο πάνω μπλοκ, και αν έχουμε την Επίλεξε ακριβώς από πάνω, τότε έχουμε τριπλό πέρασμα, μια στη ΑΝ, μια στην ΕΠΙΛΕΞΕ και μια στο μπλοκ που θέλουμε να ισχύουν αυτά. Παράλληλα διόρθωσα και την εμφάνιση κώδικα στη φόρμα Έλεγχος, ώστε να συμβαδίζει ο χρωματισμένος κώδικας και η σημειωμένη τρέχουσα εντολή σε περίπτωση της Επίλεξε Με.
Το παρακάτω δείχνει τη λειτουργία των BREAK/CONTINUE στην SELECT CASE. Θα ανοίξει η φόρμα Έλεγχος και εμείς πατάμε το Next Step και βλέπουμε τις εντολές καθώς εκτελούνται. Θα μας τυπώσει τα break, me, 1000, bad και ok. Αλλάξτε την Print "me" με την Exit. Θα πάρετε τα break και ok. Αλλάξτε την Exit με την Break, τώρα θα πάρετε μόνο το break, γιατί θα γίνει έξοδος από το τμήμα alfa.
Module alfa {
Test "this"
{
select case true
case true
{print "break" : break}
case 50
Print "me"
case 100
{ Print 1000 : continue}
case 500
Print "nothing" : Goto 100
end select
Print "bad"
exit
}
100 Print "ok"
}
alfa
Εκτός από τις Έξοδος και Διέκοψε (Exit & Break) υπάρχει και η Προς ή Goto για έξοδο σε προκαθορισμένο σημείο (μπορεί να γίνει προς οποιαδήποτε πλευρά αλλά όχι εκτός χώρου τμήματος/συνάρτησης. Δοκιμάστε μερικές αλλαγές, πχ το 900 αντί του 9, ή το break στο Case 4 (σε αυτή την αναθεώρηση μπορούμε να τα βάλουμε και τα δυο χωρίς μπλοκ, αρκεί να είναι σε μια γραμμή). Επίσης η Προς λειτουργεί χωρίς μπλοκ, αν θέλουμε, και με δομή Αν.
module zz {
test "me too"
{
a=9 ' 900
here:
a-=4
Print "Last Test"
Select case A
Case 1
if true then exit else Print "ok"
Case 1.5
break
Case 2
{if true then break}
Case 4
Print "case 4" ' : break
Case 5
{
goto here
}
Else
{
goto finish
}
End Select
print "no error"
}
print "end"
finish:
? "done"
}
zz
? "end zz"
Στο παρακάτω παράδειγμα η εντολή Print "ok" θα εκτελεστεί είτε είχαμε true είτε false στο If. Αν δεν είχαμε σε μπλοκ τα δυο Print, τότε όλη η γραμμή θα ελεγχόταν από το If. Κάντε αλλαγές! Πχ τι θα αλλάξουμε για να πάει η ροή από το Case 5 στο Case 100.(να εκτελέσει και τα δυο δηλαδή)
Module CheckIt {
Pen 14 {
select case 5
case 5
if true then {print "break" : Print "1000"} : Print "ok"
case 100
{ Print 1000 : continue}
case 500
Print "nothing" : Goto 100
else case
Print "else case"
end select
Print "bad"
}
100 Print "ok"
}
Checkit
Δεν υπάρχουν σχόλια:
Δημοσίευση σχολίου
You can feel free to write any suggestion, or idea on the subject.