+++
title = 'Xbasic'
date = '0000-09-01T00:00:00Z'
description = ''
author = 'Κώστας Τσακάλογλου(mailto:tsakf@hellug.gr)'
issue = ['Magaz 26']
issue_weight = 2
+++

----------------------------------------------------------------------------------------------------------------------------------------------------------------

*Μία γλώσσα προγραμματισμού Basic που έχει αρκετά στοιχεία C. Μέρος ΙΙΙ*

----------------------------------------------------------------------------------------------------------------------------------------------------------------

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

**1. Εντολές**
----------------------------------------

**2. Γραμμές κώδικα**
-----------------------------------------------

**3. Τελεστές**
-----------------------------------------

-   [3.1 Ο τελεστής εκχώρησης (=)](#ss3.1)
-   [3.2 Τελεστές μιας παραμέτρου](#ss3.2)
-   [3.3 Τελεστές δύο παραμέτρων](#ss3.3)
-   [3.4 Προτεραιότητα τελεστών](#ss3.4)
-   [3.5 Είδη τελεστών](#ss3.5)
-   [3.6 Ομάδες τελεστών](#ss3.6)
-   [3.7 Προτεραιότητα τελεστών](#ss3.7)

**4. Παράδείγμα χρήσης αριθμητικών τελεστών.**
------------------------------------------------------------------------

**5. Επίλογος 3ου μέρους:**
-----------------------------------------------------


### [1. Εντολές]{#s1}

Οι εντολές είναι λέξεις που προσδιορίζουν την εκτέλεση μιας πράξης, ακολουθούμενες από στοιχεία της γλώσσας που ταιριάζουν στην κάθε εντολή. Γενικά προτιμάται
να χρησιμοποιούμε συναρτήσεις της γλώσσας αντί για εντολές. Οι εντολές όμως έχουν δύο πλεονεκτήματα.

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

**Χρήση κενών και TABS**\
Γενικά μπορούμε να χρησιμοποιούμε τα κενά ή τα TABS για να μορφοποιούμε το πρόγραμμά μας εκτός από μια εξαίρεση. Ότι βρίσκεται ανάμεσα σε εισαγωγικά και
ορίζεται σαν περιεχόμενο αλφαριθμητικής μεταβλητής. Εκεί τα κενά παίζουν ρόλο και, αν υπάρχουν θα εμφανίζονται στα περιεχόμενα της μεταβλητής ενώ οπουδήποτε
αλλού αγνοούνται.

Παρακάτω θα δούμε δυο παραδείγματα όπου φαίνεται πόσο ευανάγνωστο γίνεται ένα πρόγραμμα όταν χρησιμοποιήσουμε κενά και TABS. Στην πρώτη περίπτωση δυσκολευόμαστε
να βρούμε πού αρχίζει και πού τελειώνει η επανάληψη των εντολών.

----------------------------------------------------------------------------------------------------------------------------------------------------------------

    FOR i1=1 to 1000
    PRINT i1
    IF i1>500 THEN PRINT "i1>500"
    NEXT i1

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Ενώ μόλις γίνει η διαμόρφωση με τα κενά είναι εύκολο να δούμε τις εντολές που επαναλαμβάνονται εύκολα.

----------------------------------------------------------------------------------------------------------------------------------------------------------------

    FOR i1=1 to 1000
         PRINT i1
         IF i1>500 THEN PRINT "i1>500"
    NEXT i1

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Τα πράγματα δυσκολεύουν, όταν οι εντολές που επαναλαμβάνονται είναι πάρα πολλές και δε χωράνε σε μια οθόνη. Τότε η μορφοποίηση είναι απαραίτητη, για να
μπορέσουμε να βγάλουμε κάποια άκρη, όταν εκ των υστέρων ξανακοιτάξουμε το πρόγραμμα μετά από καιρό.


### [2. Γραμμές κώδικα]{#s2}

Οι γραμμές του κώδικα ξεχωρίζουν με το ENTER που υπάρχει στο τέλος κάθε γραμμής. Στην ίδια γραμμή κώδικα μπορούν να υπάρχουν περισσότερες από μία εντολές με
διαχωριστικό το \':\'. Έτσι, για παράδειγμα, μπορούμε να έχουμε τις εντολές, a=a+1:PRINT a στην ίδια γραμμή εφ\' όσον τις ξεχωρίσουμε με το διαχωριστικό \':\'.

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


### [3. Τελεστές]{#s3}

Οι τελεστές είναι σύμβολα που με την χρήση τους γίνονται πράξεις και ενέργειες όπου συμμετέχουν μία ή και περισσότερες παράμετροι. όπως στην άλγεβρα. Στην
Xbasic υπάρχουν τελεστές αριθμητικοί, λογικοί, σε επίπεδο bit και τελεστές διευθύνσεων. Ο κάθε ένας έχει την προτεραιότητά του και ανήκει σε μια τάξη που
ορίζει:

-   τους δεκτούς τύπους παραμέτρων
-   τον τύπο του αποτελέσματος και,
-   τους κανόνες μετατροπής των τύπων για την εκτέλεση μιας πράξης

### [3.1 Ο τελεστής εκχώρησης (=)]{#ss3.1}

Αυτόν τον τελεστή τον χρησιμοποιούμε για να εκχωρήσουμε μια τιμή σε μια μεταβλητή Π.Χ. a1=10

### [3.2 Τελεστές μιας παραμέτρου]{#ss3.2}

Οι τελεστές μιας παραμέτρου έχουν μόνο μια παράμετρο δεξιά από τον τελεστή. Τέτοιο παράδειγμα είναι ο τελεστής - δηλώνει το αρνητικό αριθμητικό πρόσημο Π.Χ.
-10, -a1 -(a+b). Στην τελευταία περίπτωση το άθροισμα (a+b) επειδή περικλείεται από παρενθέσεις θεωρείται μία παράμετρος.

### [3.3 Τελεστές δύο παραμέτρων]{#ss3.3}

Οι τελεστές αυτοί υπολογίζουν τις δύο τιμές που τους δίνονται σαν παράμετροι και δίνουν ένα αποτέλεσμα. Όταν οι παράμετροι είναι διαφορετικού τύπου πρώτα
μετατρέπεται η μια στο είδος της άλλης και μετά εκτελείται η πράξη.

### [3.4 Προτεραιότητα τελεστών]{#ss3.4}

Όπως και στην άλγεβρα έτσι και εδώ οι τελεστές έχουν προτεραιότητα. Οι τελεστές με την μεγαλύτερη προτεραιότητα εκτελούνται πρώτα και τελευταίοι εκτελούνται
αυτοί που έχουν την μικρότερη προτεραιότητα. Αν για παράδειγμα γράψουμε x1=a+b\*c τότε, πρώτα θα υπολογιστεί το b\*c και μετά το αποτέλεσμα θα προστεθεί στο a.
Με την προτεραιότητα μειώνονται οι ανάγκες χρήσης παρενθέσεων για τον καθορισμό του τρόπου υπολογισμού των πράξεων. Οι παρενθέσεις χρειάζονται όταν θέλουμε να
ορίσουμε εμείς την σειρά εκτέλεσης. Δηλ.

-   x1=a+b\*c όπου είναι το ίδιο με το να γράφαμε x1=a+(b\*c) ή
-   x1=(a+b)\*c όπου εξαναγκάζουμε να γίνει πρώτα το άθροισμα και μετά ο πολλαπλασιασμός.

### [3.5 Είδη τελεστών]{#ss3.5}

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

Οι τελεστές επιπέδου bit κάνουν πράξεις σε ακέραιους αριθμούς και παράγουν ακέραιους αριθμούς σαν αποτέλεσμα, αλλά λειτουργούν σε επίπεδο bit χωρίς τα
κρατούμενα Carry και Borrow. Οι πράξεις με bit έχουν να κάνουν περισσότερο με την εσωτερική αρχιτεκτονική του επεξεργαστή (processor) και είναι γνωστές στους
προγραμματιστές που έχουν δουλέψει C και Assembly. Για τον μέσο χρήστη / προγραμματιστή συνήθως οι τελεστές επιπέδου bit δεν χρειάζονται αλλά τους αναφέρω εδώ
για να δείξω την δύναμη που έχει η Xbasic να φτάνει σε τόσο χαμηλό επίπεδο. Έτσι κάποιος που θέλει να κάνει μερικά πράγματα που οι γνωστές Basic δεν έχουν, και
χρειαζόταν να χρησιμοποιήσει την C ή την Assembly τώρα με την Xbasic μπορεί να παραμείνει στην Basic και να κάνει αυτά που θέλει.

Οι λογικοί τελεστές κάνουν πράξη σε αριθμητικές ή και αλφαριθμητικές μεταβλητές και δίνουν ένα λογικό αποτέλεσμα τύπου Αληθές. \[\$\$TRUE(-1)\] ή Ψευδές
\[\$\$FALSE(0)\].

### [3.6 Ομάδες τελεστών]{#ss3.6}

#### Ομάδα 1

Η ομάδα 1 των τελεστών περιλαμβάνει τους λογικούς τελεστές && (AND), \|\| (OR) και \^\^ (XOR).

#### Ομάδα 2

Η ομάδα 2 των τελεστών περιλαμβάνει τους τελεστές = (ίσο),\<\> (διάφορο),\< (μικρότερο), \<=(μικρότερο ή ίσο), \>= (μεγαλύτερο ή ίσο), \> (μεγαλύτερο) και τα
αντίστοιχά τους ==, !=, !\>=, !\>, !\<, !\<=. Οι παράμετροί τους μπορεί να είναι Ακέραιοι, δεκαδικοί ή αλφαριθμητικές μεταβλητές. Οι αλφαριθμητικές μεταβλητές
συγκρίνονται χαρακτήρα, χαρακτήρα από την αρχή μέχρι το τον πρώτο διαφορετικό χαρακτήρα. Έτσι βγαίνει το αποτέλεσμα της σύγκρισης. Το αποτέλεσμα είναι πάντα
XLONG ή \$\$TRUE ή \$\$FALSE.

#### Ομάδα 3

Η ομάδα 3 περιλαμβάνει τους τελεστές επιπέδου Bit AND, XOR και OR με τα αντίστοιχα σύμβολά τους &,\^,\|. Οι παράμετροί τους μπορεί να είναι ακέραιοι ή άλλες
πράξεις. Το αποτέλεσμά τους είναι πάντα του ίδιου τύπου με τον τύπο των παραμέτρων τους.

#### Ομάδα 4

Η ομάδα 4 περιλαμβάνει τους αριθμητικούς τελεστές +, -, \*, /, \*\*. Οι παράμετροι μπορεί να είναι ακέραιοι ή δεκαδικοί. Το αποτέλεσμα είναι πάντα τύπος
μεταβλητής της υψηλότερης ακρίβειας από τις μεταβλητές των παραμέτρων.

#### Ομάδα 5

Στην ομάδα 5 ανήκει ο τελεστής + που ανάλογα με τις παραμέτρους του είναι είτε αριθμητικός τελεστής είτε τελεστής συγχώνευσης δύο αλφαριθμητικών μεταβλητών. Οι
παράμετροί του μπορεί να είναι, ή υποχρεωτικά και οι δύο αριθμοί, ή υποχρεωτικά και οι δύο αλφαριθμητικές μεταβλητές. Το αποτέλεσμα είναι, είτε αριθμός, είτε
αλφαριθμητικά μεταβλητή ανάλογα με τις παραμέτρους που έχουν δοθεί.

#### Ομάδα 6

Σε αυτή την ομάδα έχουμε τους τελεστές MOD και \\. O MOD δίνει το υπόλοιπο της ακέραιας διαίρεσης των παραμέτρων του. Ο \\ δίνει το πηλίκο της ακέραιας
διαίρεσης των παραμέτρων του. Το αποτέλεσμα των τελεστών αυτής της ομάδας είναι πάντα ακέραιο.

#### Ομάδα 7

Εδώ έχουμε του τελεστές \<\<, \>\>, \<\<\<.\>\>\>. Αυτοί οι τελεστές έχουν την ιδιότητα να μεταφέρουν τα bits των παραμέτρων τους ορισμένες θέσεις αριστερά ή
δεξιά. Οι παράμετροι τους μπορεί να είναι ακέραιοι ή πράξεις. Το αποτέλεσμά τους είναι το ίδιο με τον τύπο της αριστερής παραμέτρου.

#### Ομάδα 8

Η ομάδα αυτή περιλαμβάνει τους τελεστές μιας παραμέτρου + και -.Η παράμετρος μπορεί να είναι ακέραιος αριθμός ή δεκαδικός. Το αποτέλεσμα είναι του ίδιου τύπου
με την παράμετρο.

#### Ομάδα 9

Εδώ έχουμε τους τελεστές ! και !!. Στον τελεστή ! το αποτέλεσμα είναι λογικό \$\$TRUE αν η παράμετρος έχει τιμή 0 και \$\$FALSE όταν έχουμε οποιαδήποτε άλλη
τιμή. Στον τελεστή !! το αποτέλεσμα είναι λογικό \$\$FALSE αν η παράμετρος έχει τιμή 0 και \$\$TRUE όταν έχουμε οποιαδήποτε άλλη τιμή.

#### Ομάδα 10

Ένας μόνο τελεστής ανήκει στην ομάδα αυτή και είναι ο   (ΝΟΤ) σε επίπεδο bit.Η παράμετρος μπορεί να είναι ή ακέραιος αριθμός ή το όνομα μιας συνάρτησης. Το
αποτέλεσμα είναι πάντα XLONG.

#### Ομάδα 11

Η ομάδα αυτή περιλαμβάνει τους τελεστές μιας παραμέτρου & και && πού δίνουν σαν αποτέλεσμα μια XLONG διεύθυνση. Η παράμετρος του τελεστή & μπορεί να είναι
αριθμητική ή αλφαριθμητική μεταβλητή, πίνακας ή και στοιχείο πίνακα. Η παράμετρος του τελεστή && μπορεί να είναι αλφαριθμητική μεταβλητή, πίνακας αλφαριθμητικών
μεταβλητών.

### [3.7 Προτεραιότητα τελεστών]{#ss3.7}

**Προτεραιότητα 12**\
&, && της ομάδας 11\
NOT της ομάδας 10\
!, !! της ομάδας 9\
+, - της ομάδας 8

**Προτεραιότητα 11**\
\<\<\<, \>\>\>, \<\<, \>\> της ομάδας 7

**Προτεραιότητα 10**\
\*\* της ομάδας 4

**Προτεραιότητα 9**\
\*, / της ομάδας 4 MOD, \\ της ομάδας 6

**Προτεραιότητα 8**\
+ της ομάδας 5 - της ομάδας 4

**Προτεραιότητα 7**\
& ή AND της ομάδας 3

**Προτεραιότητα 6**\
XOR \^ και OR \| της ομάδας 3

**Προτεραιότητα 5**\
\>, \>=, \<, \<= της ομάδας 2

**Προτεραιότητα 4**\
\<\>, = ή !=, == της ομάδας 2

**Προτεραιότητα 3**\
& Λογικό AND της ομάδας 1

**Προτεραιότητα 2**\
\^\^ Λογικό XOR και \|\| Λογικό OR της ομάδας 1

**Προτεραιότητα 1**\
= τελεστής εκχώρησης.


### [4. Παράδείγμα χρήσης αριθμητικών τελεστών.]{#s4}

Στο παρακάτω παράδειγμα θα χρησιμοποιήσουμε τους τελεστές \\ και MOD εφ\' όσον οι τελεστές + - \* και / μας είναι γνωστοί από την αριθμητική και νομίζω ότι δεν
έχει έννοια να επεκταθούμε σε αυτούς. Επαναλαμβάνω ότι δεν χρείαζεται να γράψουμε τους αριθμούς γραμμής απλά τους έχω βάλει για να ξέρουμε σε ποιες γραμμές
αναφερόμαστε κάθε φορά.

----------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.'
    2.' ####################
    3.' #####  PROLOG  #####
    4.' ####################
    5.'
    6.PROGRAM       "progname"  ' 1-8 char program/file name without .x or any .extent
    7.VERSION       "0.0000"    ' version number - increment before saving altered program
    8.'
    9.' You can stop the PDE from inserting the following PROLOG comment lines
    10.' by removing them from the prolog.xxx file in your \xb\xxx directory.
    11.'
    12.' Programs contain:  1: PROLOG          - no executable code - see below
    13.'                    2: Entry function  - start execution at 1st declared func
    14.' * = optional       3: Other functions - everything else - all other functions
    15.'
    16.' The PROLOG contains (in this order):
    17.' * 1. Program name statement             PROGRAM "progname"
    18.' * 2. Version number statement           VERSION "0.0000"
    19.' * 3. Import library statements          IMPORT  "libName"
    20.' * 4. Composite type definitions         TYPE <typename> ... END TYPE
    21.' * 5. Internal function declarations     DECLARE/INTERNAL FUNCTION Func (args)
    22.' * 6. External function declarations     EXTERNAL FUNCTION FuncName (args)
    23.' * 7. Shared constant definitions        $$ConstantName = literal or constant
    24.
    25.$$secspermin = 60
    26.$$secsperhr = 3600
    27.
    28.' * 8. Shared variable declarations       SHARED  variable
    29.'
    30.' ******  Comment libraries in/out as needed  *****
    31.'
    32.'    IMPORT  "xma"   ' Math library     : SIN/ASIN/SINH/ASINH/LOG/EXP/SQRT...
    33.'    IMPORT  "xcm"   ' Complex library  : complex number library  (trig, etc)
    34.     IMPORT  "xst"   ' Standard library : required by most programs
    35.'    IMPORT  "xgr"   ' GraphicsDesigner : required by GuiDesigner programs
    36.'    IMPORT  "xui"   ' GuiDesigner      : required by GuiDesigner programs
    37.'
    38.
    39.
    40.DECLARE FUNCTION  Entry ()
    41.'
    42.'
    43.' ######################
    44.' #####  Entry ()  #####
    45.' ######################
    46.
    47.Programs contain:
    48.'   1. A PROLOG with type/function/constant declarations.
    49.'   2. This Entry() function where execution begins.
    50.'   3. Zero or more additional functions.
    51.'
    52.FUNCTION  Entry ()
    53.        USHORT seconds,minutes,hours,secleft,minleft,nofsec
    54.     STRING ans
    55.
    56.     ans=INLINE$("Enter number of seconds :")
    57.     nofsec=USHORT(ans)
    58.
    59.     hours = nofsec \ $$secsperhr
    60.        minutes = nofsec \ $$secspermin
    61.     minleft = minutes MOD $$secspermin
    62.     secleft = nofsec MOD $$secspermin
    63.
    64.     PRINT nofsec;" Seconds are..."
    65.     PRINT hours;" Hours ";minleft;" min ";secleft;" seconds"
    66.
    67.
    68.END FUNCTION
    69.END PROGRAM

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Οι γραμμές 1-37 αποτελούν το κομμάτι **PROLOG** του προγράμματός μας όπου εκεί ορίζονται οι σταθερές, οι κοινές μεταβλητές για όλο το πρόγραμμα οι τυχόν τύποι
μεταβλητών και οι βιβλιοθήκες που χρειάζονται, στο τέλος μπαίνουν οι ορισμοί των συναρτήσεων. Στο συγκεκριμένο παράδειγμα στις γραμμές 25 και 26 ορίζουμε τις
σταθερές \$\$secspermin και \$\$secsperhr. Στην γραμμή 34 έχουμε δώσει εντολή να περιλιφθεί η βιβλιοθήκη xst και στην γραμμή 40 έχει μπεί ο ορισμός της
συνάρτησης ENTRY.

Οι γραμμές 53 και 54

\
Σε αυτές τις γραμμές ορίζουμε το είδος των μεταβλητών που θα χρησιμοποιήσουμε στην συνάρτηση.

Η γραμμή 56

\
Σε αυτή την γραμμή καλούμε την συνάρτηση INLINE\$ που την γνωρίσαμε από το προηγούμενο παράδειγμα.

Η γραμμή 57\
Εδώ γίνεται μετατροπή της μεταβλητής ans που είναι αλφαριθμητική σε αριθμητική για να μπορούν να γίνουν οι πράξεις παρακάτω.

Οι γραμμές 59 και 60

Βλέπουμε την χρήση του τελεστή \\ (ακέραια διαίρεση) έστι σαν αποτέλεσμα παίρνουμε το ακέραιο πηλίκο της διαίρεσης.

Οι γραμμές 61 και 62\
Η χρήση του τελεστή MOD για να βρούμε τα υπόλοιπα των διαιρέσεων.

Οι γραμμές 64 και 65

Με την χρήση της εντολής PRINT δίνουμε εντολή στην Xbasic να εμφανίσει τα αποτελέσματα στην κονσόλα.


### [5. Επίλογος 3ου μέρους:]{#s5}

Με τα παραδείγματα που είδαμε μέχρι τώρα έχουμε δεί τα βασικά μέρη που αποτελείται ένα πρόγραμμα Xbasic. Κάναμε μια σύντομη περιγραφή για τις μεταβλητές, τις
σταθερές και κάποιους τελεστές. Στο επόμενο θα συνεχίσουμε με παράδειγμα χρήσης των λογικών τελεστών και την εντολή IF. Γι αυτούς που έχουν κάποια εμπειρία από
άλλες Basic, να προσέξουν τους επιπλέον τελεστές που διατίθενται και προσοχή στο σημαντικότερο. Ο τελεστής \^ που σε άλλες Basic σημαίνει ύψωση σε δύναμη εδώ
αντικαθίσταται από τον \*\*. Ο τελεστής \^ εδώ είναι ο τελεστής επιπέδου bit OR.

