Εισαγωγή στην Basic (Μερος Β)

Shock

Retired Admin
Joined
13 Ιουν 2006
Μηνύματα
5.315
Αντιδράσεις
230
Λόγω προβλημάτων που έχουμε με τη σωστή λειτουργία του Dynamics θα βάλω εδώ προς το παρόνένα μικρό κείμενο που έγραψα και πιστεύω ότι θα βοηθήσει στην κατανόηση των μεταβλητών. Ως την Κυριακή ελπίζω να το έχουμε φτιάξει και να μεταφερθεί εκεί.

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

2o μέρος της εισαγωγής μας στη Basic και ποιο συγκεκριμένα στη Locomotive και αυτή τη φορά θα γνωρίσουμε τις μεταβλητές.

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

Ο Amstrad 664 έχει 64 ΚΒ μνήμης από ότι θυμόσαστε. Αυτό σημαίνει

64 Kilo Bytes

δηλαδή

64 * 1024 Bytes = 65535

μνήμης αφού το κάθε Kilo ισούται με 1024 Bytes.

Το κάθε Byte αποτελείται από 8 bits. Το bit είναι και η μικρότερη μονάδα μέτρησης μνήμης.

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

Το κάθε Byte από τα 65535 είναι αριθμημένο με τη λογική ότι ο επεξεργαστής μπορεί να “δει” ή αλλιώς να αναφερθεί σε κάθε ένα από αυτά. με το όνομα του, δηλαδή έναν αριθμό από το 0 ως το 65535.

Ο αριθμός αυτός λέγεται και διεύθυνση για το κάθε byte. To bit η υποδιαίρεση δηλαδή του byte έχει και αυτό αρίθμηση αλλά είναι από το 1 ως 8 και είναι εσωτερική σε κάθε byte.

Στη διεύθυνση 1 λοιπόν που αντιστοιχεί στο byte με αριθμό 1 υπάρχουν 8 bits με αρίθμηση από 1 ως 8.

Στη διεύθυνση 2 που αντιστοιχεί στο byte με αριθμό 2 υπάρχουν 8 bits με αρίθμηση από 1 ως 8 και ούτω κάθε εξής.

Το κάθε byte μπορεί να αποθηκεύσει ή να κρατήσει έναν αριθμό όχι μεγαλύτερο από 255. Αυτός ο αριθμός είναι άσχετος με τη διεύθυνση του byte. Το byte μπορείτε να το φανταστείτε σαν ένα κουτάκι με έναν αριθμό απέξω που είναι η διεύθυνση του και ανοίγοντας το βλέπουμε έναν αριθμό από 0 ως 255. Βασικά θα έλεγα από -128 ως 128 αλλά δε θέλω να σας μπερδέψω ακόμα με πρόσημα.

Γιατί όμως 255 και όχι 500 ή 1000 ή κάποιον άλλο αριθμό?

Η απάντηση βρίσκεται στο δυαδικό σύστημα που χρησιμοποιήται από τους επεξεργαστές και δε μας επιτρέπει με 8 μόλις bits να αναπαραστήσουμε μεγαλύτερο αριθμό από 255.

Χρησιμοποιώντας 2 bytes στη σειρά βέβαια μπορούμε να αναπαραστήσουμε αριθμούς ως και 65535. Η ικανότητα του επεξεργαστή να διαχειρίζεται 2 bytes σαν 1 ή και 4 bytes σαν 1 ώστε να μπορεί να κάνει πράξεις με μεγάλους αριθμούς επιταχύνει πολύ τα πράγματα γιατί θέλει κόπο να κάνεις πράξεις με μεγάλα νούμερα σπάζοντας τα συνέχεια σε 255. Τι θα κάναμε για παράδειγμα αν θέλαμε να πολλαπλασιάσουμε 255*100 ? Το αποτέλεσμα πως θα χωρέσει σε ένα κουτάκι μνήμης ένα byte δηλαδή που χωράει νούμερα μέχρι το 255?

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

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

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

Π.χ

Κώδικας:
10 moto$=”Friends dont fear, Shock is here”
Στο παραπάνω παράδειγμα ορίσαμε μια μεταβλητή με όνομα moto η οποία θα δέχεται αλφαριθμητικά, δηλαδή οτιδήποτε συνδυασμό από γράμματα και αριθμούς και της δώσαμε τιμή τη πρόταση ”Friends dont fear, Shock is here”.

Το $ που βλέπετε δηλώνει την ικανότητα της μεταβλητής να αποθηκεύσει γράμματα. Σε άλλες γλώσσες Basic αυτό είναι περιττό.

Δηλώνοντας τις μεταβλητές με το $ δεν μπορούμε να κάνουμε αυτό π,χ

Κώδικας:
10 x$=”1”
20 y$=”2”
30 print x$+y$
και να περιμένουμε να μας εμφανίζει 3. Από τη στιγμή που δηλώσαμε ότι αυτό που βρίσκεται ανάμεσα στα διπλά αυτάκια μπορεί να είναι και χαρακτήρες η Basic είναι υποχρεωμένη να το εκλάβει σαν χαρακτήρα οπότε “1” + “2” μας κάνει “12”. Η πρόσθεση δηλαδή όπως τη γνωρίζουμε από τους αριθμούς, στις μεταβλητές αυτού του τύπου πρακτικά ενώνει τα περιεχώμενα των μεταβλητών.




Αν θέλουμε να ορίσουμε απλές μεταβλητές που δέχονται νούμερα και θέλουμε να κάνουμε αριθμητικές πράξεις με αυτές τότε απλά δεν βάζουμε το $.

Ελπίζω αυτή η σύντομη εισαγωγή στις μεταβλητές να ήταν κατανοητή γιατί χωρίς αυτές δεν κάνουμε τίποτα :)

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

Περιμένω σχόλια αλλαγών πάνω στο κείμενο ώστε να το παγώσουμε και να το μεταφέρουμε στα wiki/dynamics.
 
Φίλε Shock,

Είσαι αρκετά κατατοπιστικός...

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

Επίσης, η ανάλυσή σου περί bytes και bites ήταν πολύ κατατοπιστική.

Μέχρι το μεσημέρι θα είμαι on-line, αν θέλεις να επικοινωνήσεις μαζί μου.

Ευχαριστώ
 
zoro είπε:
Σε 3ο μάθημα, θα ήταν καλό να αναφερθείς στην περίπτωση αναγνώρισης αριθμητικών μεταβλητών ως αριθμών (με έμμεσο τρόπο), ώστε να μπορούν να γίνουν πράξεις. Το μεσημέρι που θα πάω σπίτι θα κοιτάξω στα παλαιά μου βιβλία τον τρόπο (δεν τον θυμάμαι έπειτα από τόσα χρόνια) και αύριο θα σου απαντήσω.
Θυμήθηκα (ελπίζω δηλαδή)...

Είναι η εντολή VAL. Παίρνει από μία μεταβλητή το -αριθμητικό- περιεχόμενό της (ή μέρος του με την κατάλληλη καθοδήγηση από άλλη εντολή) και το "μεταφέρει" εκτός μεταβλητής ως αναγνωρίσιμο αριθμό.
 
OK θα προσθέσω ένα απλό παράδειγμα με χρήση μεταβλητών και πείτε μου αν είναι αρκετά κατανοητό

Κώδικας:
10 cls
20 moto$="GRM-B2R"
30 for y=2 to 20
40 locate 10,y
50 print moto$
60 locate 10,y-1:print "       "
70 next
Ίσως μπερδέψουν κάποιους οι εντολές for και next στις γραμμές 30 και 70. Αυτές ουσιαστικά είναι η αρχή και το τέλος μιας διαδικασίας που ονομάζουμε Loop.

Αυτός ο συνδυασμός (For-Next) χρησιμοποιείται πάρα πολύ και είναι σημαντικό να καταλάβουμε πως δουλεύει.

Loop λέγεται η διαδικασία επανάληψης ενός "μέρους" του κώδικα όσες φορές θέλουμε. Το κομμάτι του κώδικα που θέλουμε να επαναλάβουμε το βάζουμε ανάμεσα στις εντολές for Και next. Στο παράδειγμα μας επαναλαμβάνουμε τις εντολές Locate - print - Locate 18 φορές.

Αν δεν θέλαμε να χρησιμοποιήσουμε εντολές επανάληψης να κάνουμε loop δηλαδή, θα μπορούσαμε να γράψουμε 18 φορές τον κώδικα που βρίσκεται στις γραμμές 40/50/60 δηλαδή θα γράφαμε 18x3=54 γραμμές κώδικα και να αλλάζουμε μόνοι μας τις τιμές των παραμέτρων της locate.

Αντί αυτού εμείς τη σκαπουλάραμε με μόλις 5 γραμμές και σίγουρα δεν έχουμε κάνει λάθος στην αρίθμηση.

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

Όπως είπαμε σε ένα παιχνίδι υπάρχει σίγουρα μια μεταβλητή με το score. Εϊναι λογικό το νούμερο να μεταβάλλεται κατά τη διάρκεια που παίζουμε, αλλιώς όλοι θα είχαμε κάνει το ίδιο score στο παιχνίδι και θα ήταν αυτό που είχε γράψει ο προγραμματιστής στον κώδικα κατά τη διάρκεια που έφτιαχνε το παιχνίδι :)

Κάτι που ίσως παρατηρήσετε είναι ότι στη γραμμή 60 γράψατε 2 εντολές αντί για μια βάζοντας ανάμεσα τους άνω και κάτω τελεία. Μπορούμε να γράψουμε όσες εντολές θέλουμε σε μια γραμμή χωρίζοντας τις όμως με άνω και κάτω τελεία.
 
Shock είπε:
OK θα προσθέσω ένα απλό παράδειγμα με χρήση μεταβλητών και πείτε μου αν είναι αρκετά κατανοητό
Κώδικας:
10 cls
20 moto$="GRM-B2R"
30 for y=2 to 20
40 locate 10,y
50 print moto$
60 locate 10,y-1:print "       "
70 next
Κατανοητότατο!

Αυτό που, εν κατακλείδι δηλαδή, αποτελεί το νόημα της ύπαρξης των μεταβλητών, είναι η ανάγκη "εκπροσώπησής" τους με ένα όνομα, με το οποίο τις καλούμε μέσα στο πρόγραμμα, αντί για τις ίδιες. Δηλαδή, στην μεταβλητή GRM-B2R έχουμε δώσει το όνομα moto$, και την καλούμε με αυτό, αντί να την γράφουμε κάθε φορά. Έτσι, γλυτώνουμε αρκετό κόπο.

Όσο για το For-Next loop, πρέπει να αποτελέσει, κατά την γνώμη μου, το επόμενο θέμα (όταν βέβαια θα έχει ολοκληρωθεί το θέμα των αλφαριθμητικών και αριθμητικών μεταβλητών).
 
Αναφερόμενος στα δύο πρώτα μαθήματα του Shock περί μεταβλητών, βρήκα χθες το βράδυ (από το '87 τα έχω ξεχάσει όλα και τα ανακαλύπτω από την αρχή ως beginner πάλι) πως μπορούμε να "ανασύρουμε" έναν αριθμητικό χαρακτήρα από το string και να τον χρησιμοποιήσουμε ως αριθμό:

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

1η περίπτωση:

Γράφουμε το εξής πρόγραμμα:

10 a$="1"20 b$="2"

30 c$="a"

40 PRINT a$+b$+c$

50 PRINT VAL(a$+b$+c$)*2
Αν το τρέξουμε, η γραμμή 40 θα μας δώσει: 12a

Αυτό, επειδή "ένωσε" τις τρεις μεταβλητές, κατανοώντας τις απλώς ως χαρακτήρες.

Η γραμμή 50 θα μας δώσει: 24

Αυτό, επειδή η εντολή VAL "εξάγει" τον πρώτο χαρακτήρα ενός string και του δίνει αριθμητική αξία (VALue).

Αναλυτικότερα, έγινε το εξής: Πήρε το 1 από την a$, το 2 από την b$, έδωσε τιμή 0 στο a της c$, τα αναγνώρισε πλέον ως αριθμούς, τα πρόσθεσε μεταξύ τους και πολλαπλασίασε το άθροισμα με το 2, δίνοντας το τελικό 24.

Σε μία αμιγώς αριθμητική μεταβλητή, η εντολή VAL εξάγει όλο το string και του δίνει αριθμητικη αξία: π.χ.

10 a$="1234"20 PRINT VAL(a$)*2
Θα μας δώσει 2468 (γινόμενο του 1234 *2).

2 περίπτωση:

Όταν ένας αριθμός βρίσκεται ανάμεσα σε ένα string χαρακτήρων, επειδή η VAL βρίσκει μόνο τον πρώτο χαρακτήρα, πρέπει πρώτα να "τεμαχίσουμε" το string σε μεταβλητές ενός χαρακτήρα και να βάλουμε την VAL να τους δώσει αριθμητικές αξίες. Πληκτρολογούμε την εξής υπορουτίνα:

10 CLS20 INPUT "Give a string";a$

30 FOR n=1 TO LEN(a$)

40 v=VAL(MID$(a$,n,1))

50 PRINT v

60 NEXT n

70 PRINT "Press a button to continue"

80 WHILE INKEY$="":WEND

90 GOTO 10
Αν πληκτρολογήσετε, όταν σας ζητηθεί, π.χ. το string "abc4def5g", θα σας δώσει διαδοχικά ως αποτέλεσμα την εξής σειρά:

0

0

0

4

0

0

0

5

0

Τελικά, καταφέραμε να "βγάλουμε" τους αριθμούς 4 και 5 από το string. Παρατηρούμε (όπως και στο παράδειγμα της 1ης περίπτωσης) πως όταν η VAL συναντά ένα γράμμα, του δίνει μηδενική τιμή.

Υ.Γ. Δεν ξέρω αν η παρέμβασή μου αποτελεί ενόχληση ή συμπλήρωση στα θέματα του αγαπητού Shock, πιστεύω όμως οτι έτσι δικαιώνεται το νόημα ενός forum, και αποτελεί πηγή "πληροφορίας" και γνώσης μέσω ανάδρασης.

Ευχαριστώ
 
Δεν ξέρω αν η παρέμβασή μου αποτελεί ενόχληση ή συμπλήρωση στα θέματα του αγαπητού Shock, πιστεύω όμως οτι έτσι δικαιώνεται το νόημα ενός forum, και αποτελεί πηγή "πληροφορίας" και γνώσης μέσω ανάδρασης.
Μα καλέ μου φίλε zoro πρέπει να προσθέτει ο καθένας ότι μπορεί. Εγώ απλά ξεκίνησα κάτι, δε σημαίνει ότι έχω μονοπώλιο την πένα :)

Είναι χαρά μου να βλέπω κόσμο να ασχολείται με το αντικείμενο!
 
Πίσω
Μπλουζα