Xbasic: FOR ... NEXT μέσα σε άλλο FOR..NEXT
Description: This is issue 30 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #30
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
Επόμενο Προηγούμενο Περιεχόμενα ### 3. FOR ... NEXT μέσα σε άλλο FOR..NEXT Υπάρχει η δυνατότητα να έχουμε πολλαπλά `FOR ... ΝΕΧΤ` το ένα μέσα στο άλλο. Απαραίτητη προυπόθεση είναι αυτά να έχουν διαφορετικές μεταβλητές μέτρησης. Αν χρησιμοποιηθεί η ίδια μεταβλητή μέτρησης τότε το ένα `NEXT` θα επηρεάζει το άλλο με απρόβλεπτα αποτελέσματα στην εκτέλεση του κώδικα. Έτσι είναι λάθος να γράψουμε:
    FOR i=1 TO 10
       FOR i=2 TO 7
       .
       .
       .
       NEXT i
    NEXT i
Θα παρατηρήσουμε ότι στο παραπάνω παράδειγμα έχει τοποθετηθεί το δεύτερο `FOR` δεξιότερα από το πρώτο. Αυτό μας βοηθάει πάρα πολύ κατά την ανάγνωση το προγράμματός μας να βλέπουμε που τελειώνει η κάθε ανακύκλωση χωριστά. Ένα άλλο λάθος που γίνεται μερικές φορές είναι η λάθος αντιστοίχηση των `FOR` με τα αντίστοιχα `NEXT`. Κάποιος που θα γράψει:
    FOR i= 1 TO 10
         FOR k= 1 TO 5
         .
         .
         .
         NEXT i
    NEXT k
θα λάβει μήνυμα λάθους `NESTING ERROR`. Αυτό συμβαίνει γιατί κατά την ανάγνωση του κώδικα ο υπολογιστής έχει καταχωρίσει ότι η τελευταία μεταβλητή μέτρησης είναι η `k` και όχι η `i`. Ένα άλλο λάθος που μπορεί να γίνει είναι ο λάθος υπολογισμός της τελικής τιμής άν έχουμε βήμα διαφορετικό από το 1 όπως στο προηγούμενο παράδειγμα και έτσι ενώ έχουμε γράψει
    FOR i = 1 TO 10 STEP 3
    .
    .

    ΝΕΧΤ i
Ετσι η τελική τιμή της μεταβλητής i είναι διαφορετική από αυτήν που περιμένουμε να έχει η i κατά την τελευταία ανακύκλωση. ### 3.1 Παράδειγμα πολλαπλών FOR...NEXT. Θα γράψουμε ένα μικρό πρόγραμμα που θα δημιουργεί μια επιφάνεια από Χ ανάλογα με τις διαστάσεις που εισάγουμε.
    1. '
    2. '
    3. ' ####################
    4. ' #####  PROLOG  #####
    5. ' ####################
    6. '
    7. PROGRAM      "progname"  ' 1-8 char program/file name without .x or any .extent
    8. VERSION      "0.0000"    ' version number - increment before saving altered program
    9. '
    10. ' You can stop the PDE from inserting the following PROLOG comment lines
    11. ' by removing them from the prolog.xxx file in your \xb\xxx directory.
    12. '
    13. ' Programs contain:  1: PROLOG          - no executable code - see below
    14. '                    2: Entry function  - start execution at 1st declared func
    15. ' * = optional       3: Other functions - everything else - all other functions
    16. '
    17. ' The PROLOG contains (in this order):
    18. ' * 1. Program name statement             PROGRAM "progname"
    19. ' * 2. Version number statement           VERSION "0.0000"
    20. ' * 3. Import library statements          IMPORT  "libName"
    21. ' * 4. Composite type definitions         TYPE <typename> ... END TYPE
    22. '   5. Internal function declarations     DECLARE/INTERNAL FUNCTION Func (args)
    23. ' * 6. External function declarations     EXTERNAL FUNCTION FuncName (args)
    24. ' * 7. Shared constant definitions        $$ConstantName = literal or constant
    25. ' * 8. Shared variable declarations       SHARED  variable
    26. '
    27. ' ******  Comment libraries in/out as needed  *****
    28. '
    29. '   IMPORT  "xma"   ' Math library     : SIN/ASIN/SINH/ASINH/LOG/EXP/SQRT...
    30. '   IMPORT  "xcm"   ' Complex library  : complex number library  (trig, etc)
    31. '   IMPORT  "xst"   ' Standard library : required by most programs
    32. '   IMPORT  "xgr"   ' GraphicsDesigner : required by GuiDesigner programs
    33. '   IMPORT  "xui"   ' GuiDesigner      : required by GuiDesigner programs
    34. '
    35. DECLARE FUNCTION  Entry ()
    36. '
    37. '
    38. ' ######################
    39. ' #####  Entry ()  #####
    40. ' ######################
    41. '
    42. ' Programs contain:
    43. '   1. A PROLOG with type/function/constant declarations.
    44. '   2. This Entry() function where execution begins.
    45. '   3. Zero or more additional functions.
    46. '
    47. FUNCTION  Entry ()
    48.     USHORT i1,i2
    49.     USHORT side1,side2
    50.     STRING sside1,sside2
    51.     sside1=INLINE$("side 1 ")
    52.     sside2=INLINE$("side 2 ")
    53.     side1=USHORT(sside1)
    54.     side2=USHORT(sside2)
    55.     FOR i1 = 1 TO side1
    56.             FOR i2 = 1 TO side2
    57.                             PRINT "X";
    58.             NEXT i2
    59.             PRINT ""
    60.     NEXT i1
    61.
    62.
    63.
    64. END FUNCTION
    65. END PROGRAM
#### Γραμμές 1..46 Οι ορισμοί του προγράμματος και των βιβλιοθηκών που χρειάζονται #### Γραμμές 47..64 Η συνάρτηση `ENTRY()` που περιέχει και τον εκτελέσιμο κώδικα του προγράμματός μας. Θα αναλύσουμε την `ENTRY()` για να δούμε την διαδοχική χρήση των εντολών `FOR ... NEXT` #### Γραμμή 48 Σε αυτές τις γραμμές ορίζουμε τις μεταβλητές που θα χρησιμοποιήσουμε παρακάτω στις εντολές `FOR ... NEXT` #### Γραμμή 49 Ορίζονται οι μεταβλητές που θα περιεχουν τις διαστάσεις της τετράγωνης επιφάνειας. #### Γραμμή 50 Εδώ ορίζουμε βοηθητικές μεταβλητές τύπου STRING για να πάρουμε την πληκτρολόγηση του χρήστη. #### Γραμμές 51 και 52 Με την γνωστή πια εντολή `INLINE$` δίνουμε μήνυμα στον χρήστη να εισάγει διαδοχική τις επιθυμιτές διαστάσεις του τετραγώνου. #### Γραμμές 53 και 54 Μετατροπή των μεταβλητών STRING σε αριθμητικές για να τις χρησιμοποιήσουμε παρακάτω και τις εντολές ανακύκλωσης `FOR ... NEXT` #### Γραμμή 55 Αρχή της πρώτης ανακύκλωσης. Εδώ ο μετρητής `i1` θα λάβει τιμές από 1 έως την τιμή της μεταβλητής `side1` που είναι η κάθετη διάσταση του τετραγώνου #### Γραμμή 56 Αρχή της δεύτερης ανακύκλωσης. Εδώ ο `i2` θα λάβει τιμές από 1 έως την τιμή της `side2` που είναι η οριζόντια διάσταση του τετραγώνου. #### Γραμμή 57 Εμφάνιση στο παράθυρο κονσόλας του χαρακτήρα `X` #### Γραμμή 58 Κλείσιμο της δεύτερης ανακύκλωσης και έτσι η εκτύπωση των `X` θα γίνει τόσες φορές όσες έχει επιλέξει ο χρήστης που έχουν αποθηκευθεί στην μεταβλητή `side2` #### Γραμμή 59 Αλλαγή γραμμής στο παράθυρο κονσόλας. #### Γραμμή 60 Κλείσιμο της πρώτης ανακύκλωσης. Εδώ τών αυξάνει κατά 1 ο μετρητής της κάθετης διάστασης του τετραγώνου. Ετσι ολόκληρη η διαδικασία [επαναλαμβανόμενη εμφάνισης των `X` (δεύτερη ανακύκλωση) και η αλλαγή γραμμής] θα γίνει τόσες φορές όσες έχει ζητήσει ο χρήστης όταν όριζε την πρώτη (κάθετη) διάσταση του τετραγώνου. Αυτή η τιμή είναι αποθηκευμένη στην μεταβλητή `side1`. Επόμενο Προηγούμενο Περιεχόμενα