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

Shock

Retired Admin
Joined
13 Ιουν 2006
Μηνύματα
5.315
Αντιδράσεις
230
Αφού γνωρίσαμε 3-4 απλές εντολές της Locomotive Basic, τα loops και τις μεταβλητές ήρθε η ώρα να μάθουμε τους ελέγχους (If) αλλά και μερικά τεχνάσματα της Locomotive.

Σκέφτομαι να το κάνω αυτό με μικρά παραδείγματα

Κώδικας:
10 cls
20 input"What is your name";name$
30 print"Hello ";name$
Το παραπάνω κομμάτι κώδικα ζητάει από τον χρήστη να πληκτρολογήσει κάτι και με το πάτημα του enter το αποθηκεύει στην μεταβλητή name$. Το μήνυμα "What is your name" θα εμφανιστεί στην οθόνη μαζί με ένα ερωτηματικό που προσθέτει η εντολή Input

Στην γραμμή 30 τυπώνεται το μήνυμα Hello ενωμένο με τα περιεχόμενα της μεταβλητής name$

Tip 1

Στην περίπτωση που κάνουμε κάποιο λάθος μπορούμε να γράψουμε edit και τον αριθμό της γραμμής που είναι το λάθος. Διορθώνουμε, πατάμε enter και ξανατρέχουμε με run

Tip 2

Αντί Print μπορούμε να βάλουμε ένα Αγγλικό ερωτηματικό. "?"

Αριθμητικές πράξεις

Πρόσθεση

? 1+1

2

Πολλαπλασιασμός

?2*2

4

Διαίρεση

?4/2

2

Διαίρεση που αφήνει μόνο το ακέραιο μέρος, τρώει δηλαδή τα δεκαδικά ψηφία

?3\2

1

Τετραγωνική ρίζα

?sqr(9)

3

TIp 3

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

Π.χ

Κώδικας:
10 REM This program scrolls a message across the screen
20 REM made for GRM-B2R
Αν δεν βάλουμε την εντολή REM η Basic θα νομίζει ότι αυτά που γράφουμε είναι εντολές της και φυσικά θα μας βγάλει άπειρα λάθη

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

Μερικές χρήσιμες εντολές στα γρήγορα

Κώδικας:
mode 0
Με αυτή την εντολή αλλάζουμε το Mode γραφικών του Amstrad. Έχουμε άλλες 2 επιλογές την 1 και 2. Δοκιμάστε τις και μετρήστε πόσες γραμμές και πόσες στήλες εμφανίζονται.

Υπάρχει και κάτι άλλο που αλλάζει εκτός από την ανάλυση και τον αριθμό των χαρακτήρων που εμφανίζονται στην οθόνη και αυτό είναι ο αριθμός των χρωμάτων. Όσο ανεβαίνουμε σε ανάλυση κατεβαίνουμε σε αριθμό χρωμάτων.

Σημείωση: Όλα και όλα τα χρώματα στον Amstrad είναι 27. Το θέμα είναι ότι δεν μπορούμε να τα εμφανίσουμε όλα μαζί ταυτόχρονα στην οθόνη σαν μια παλέτα ζωγράφου.

Είπαμε ότι θα μάθουμε να χρησιμοποιιούμε την If. Αυτό θα το κάνουμε σε συνδυασμό με τη γνωριμία μας με τα χρώματα στον Amstrad. Πάμε λοιπόν σε ένα παράδειγμα

Κώδικας:
10 border 1
20 cls
30 input "Please give a number between 0 and 26";col
40 if col >=0 and col <27 then gosub 100
50 else
60 print "wrong number. Possible values 0-26"
70 goto 30
100 border col
Χμμ μόλις θυμήθηκα γιατί η Basic είναι απαράδεκτη σαν γλώσσα :(

Τα goto είναι ότι χειρότερο έχει σκεφτεί κάποιος για γλώσσα υψηλού επιπέδου.

Το πρόγραμμα μας ζητάει έναν αριθμό από τον χρήστη και τον αποθηκεύει στην μεταβλητή col.

Στην γραμμή 40 γνωρίζουμε την εντολή if με την οποία κάνουμε τον έλεγχο των δεδομένων που εισήγαγε ο χρήστης. Βλέπουμε δηλαδή αν η col έχει τις τιμές που θέλουμε.

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

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

Τώρα για το τι κωδικό έχει το κάθε χρώμα στον Amstrad θα πρέπει ή να αντγράψω το κλασσικό πινακάκι από το βιβλίο του Amstrad η να το βρείτε στο Internet

Το συγκεκριμένο κείμενο το θεωρώ draft και θα ανέβει αργότερα στο articles.
 
Shock είπε:
Στην γραμμή 30 τυπώνεται το μήνυμα Hello ενωμένο με τα περιεχόμενα της μεταβλητής name$
Δηλαδή, στη γραμμή 30 θα πρέπει να τυπωθεί το μήνυμα:

Hello. What is your name?

Σωστά; (Γιατί εμένα μου εμφανίζει μόνο Hello).

Το πάω καλά ή μήπως να το πάρω αλλιώς; :nervous:
 
Shock είπε:
Χμμ μόλις θυμήθηκα γιατί η Basic είναι απαράδεκτη σαν γλώσσα : Τα goto είναι ότι χειρότερο έχει σκεφτεί κάποιος για γλώσσα υψηλού επιπέδου.
Έχεις απόλυτο δίκιο, καλύτερα να δομείται ο προγραμματισμός με υπορουτίνες, τις οποίες τις καλείς κάθε φορά που χρειάζεται.

Πρόσεξε όμως, καμμιά φορά ένα "μπάλωμα" με GOTO είναι αναγκαίο, όταν (πάντα μέσα σε μία υπορουτίνα, και όχι εκτός), η συνθήκη IF-THEN-ELSE δεν είναι επαρκής.
 
Shock,

Στο "Εισαγωγή στην Basic (Μερος Β)" έκανα μία παρέμβαση ως συμπλήρωμα. Δεν ξέρω αν έκανα καλά, μην με παρεξηγήσεις!
 
Φιλε zoro,οι παρεμβασεις οχι μονο δεν ειναι μεμπτες αλλα τις επιζητουμε!
 
Ο.Κ. θα βάλω κι εγώ τα "λιθαράκια" μου όταν μπορώ. Στο σπίτι δεν έχω σύνδεση, απλά μελετώ και πάλι την Locomotive Basic με έναν Amstrad 6128 που ξέθαψα πριν από τρεις εβομάδες από την αποθήκη και με βοήθησε ο pontium να το επισκευάσω (από το '87 έχω να ασχοληθώ, με έπιασε μάλλον "παλινπαιδισμός"). Μπαίνω στο forum από τον χώρο εργασίας, μόνον όταν ο boss λείπει.

Όσοι γνωρίζουμε κάτι, πρέπει να το βάλουμε στο θέμα που άρχισε ο Shock. Πιστεύω πως το θέμα του, είναι ίσως το πλέον δημιουργικό του forum.
 
Αφού δώσεις run...

...για να τρέξει το πρόγραμμα, τότε αυτό σε ρωτά:

What is your name?

Εσύ τότε ΠΡΕΠΕΙ να πληκτρολογήσεις το όνομα σου:

nessie

και να πατήσεις [ENTER].Το "nessie", αμέσως αποθηκεύεται στην αλφαριθμητική μεταβλητή a$ και ο Amstrad απαντά:

Hello nessie

Το λάθος που έκανες, ήταν ότι αφού έτρεξες το πρόγραμμα, πάτησες [ENTER], χωρίς να δώσεις τίποτα στην ερώτηση "What is your name?", γι' αυτόν ακριβώς το λόγο, η αλφαριθμητική a$ έμεινε κενή και δεν τυπώθηκε τίποτα μετά το "Hello"

nessie είπε:
Δηλαδή, στη γραμμή 30 θα πρέπει να τυπωθεί το μήνυμα: Hello. What is your name?

Σωστά; (Γιατί εμένα μου εμφανίζει μόνο Hello).

Το πάω καλά ή μήπως να το πάρω αλλιώς; :nervous:
 
Μάλιστα! Κατάλαβα!

Ευχαριστώ Ace! :thumbup:
 
Λοιπον,θα μιλησω με τον Keeper μηπως ανεβασουμε online τον CPC emulator του Marcus ωστε να συμμετεχουν και φιλοι που δεν εχουν (ή δεν μπορουν ΑΚΑ δουλεια :D ) να εγκαταστησουν emulators...
 
Wally είπε:
Λοιπον,θα μιλησω με τον Keeper μηπως ανεβασουμε online τον CPC emulator του Marcus ωστε να συμμετεχουν και φιλοι που δεν εχουν (ή δεν μπορουν ΑΚΑ δουλεια :D ) να εγκαταστησουν emulators...
Μπράβο Wally, κανόνισέ το με τον Keeper. Ένας online emulator γιά όλους θα βοηθούσε να μετέχουν με έυκολο τρόπο όσοι παρακολουθούν το θέμα.

Εγώ δουλεύω μόνο με τον Amstrad (για συναισθηματικούς λόγους), αλλά αυτό είναι προσωπικό θέμα, δεν έχει σχέση με τους υπόλοιπους, που χρειάζονται την ευκολία ενός online emulator.
 
Bug?

Nessie μόλις ανακάλυψες το πρώτo μας Bug !! 3 γραμμές κώδικα και καταφέραμε να κάνουμε λάθος :)

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

Αυτό γίνεται με μια εντολή If που θα ελέγχει αν η Name έχει κάποια τιμή. Αν δεν έχει θα πρέπει η ροή του προγράμματος να ξαναγυρνάει πάλι στη γραμμή που είναι η input. Κάτι σαν και αυτό δηλαδή

Κώδικας:
if name$="" then goto xx
 
Και η ρουτινίτσα για αλλαγή border...

...έχει ένα minor bug, αφού της λείπει η γραμμή:

Κώδικας:
110 return
Βέβαια, αυτό δεν θα φανεί ποτέ, αφού τελειώνει η ροή του προγράμματος στην γραμμή 100 και επιστρέφει στην Basic, αλλά αν έμπαινε σε νέο loop, με κάποιο GOTO ή GOSUB, κάποια στιγμή θα τιναζόταν το πρόγραμμα στον αέρα, με ένα ωραιότατο "Out of memory".

Αλλά αυτά φαντάζομαι, ότι θα αναλυθούν διεξοδικά, σε επόμενα γραπτά σου...

Shock είπε:
Αφού γνωρίσαμε 3-4 απλές εντολές της Locomotive Basic, τα loops και τις μεταβλητές ήρθε η ώρα να μάθουμε τους ελέγχους (If) αλλά και μερικά τεχνάσματα της Locomotive.

Κώδικας:
10 border 1
20 cls
30 input "Please give a number between 0 and 26";col
40 if col >=0 and col <27 then gosub 100
50 else
60 print "wrong number. Possible values 0-26"
70 goto 30
100 border col

Shock είπε:
Nessie μόλις ανακάλυψες το πρώτo μας Bug !! 3 γραμμές κώδικα και καταφέραμε να κάνουμε λάθος :) Για να αποφύγουμε το λάθος που έγινε πρέπει να ελέγξουμε την τιμή της μεταβλητής που κρατάει το όνομα πριν τυπωθεί να έχει κάποια τιμή.

Αυτό γίνεται με μια εντολή If που θα ελέγχει αν η Name έχει κάποια τιμή. Αν δεν έχει θα πρέπει η ροή του προγράμματος να ξαναγυρνάει πάλι στη γραμμή που είναι η input. Κάτι σαν και αυτό δηλαδή

Κώδικας:
if name$="" then goto xx
:)
 
Μόλις έφτιαξα ένα μικρό "τιπάκι", όταν μελετώντας τις αριθμητικές πράξεις που μας παρέθεσε ο Shock νωρίτερα, ανακάλυψα την χρησιμότητα του MOD (δίνει το υπόλοιπο που περισσεύει από μία ατελή διαίρεση). Δουλεύοντάς το σε διάφορες συναρτήσεις, βρήκα το εξής: Αν διαιρέσουμε τον εσωτερικό χρόνο του Amstrad (ΤΙΜΕ) δια των δευτερολέπτων (ΤΙΜΕ/300) που το βρήκα στο βιβλίο χρήσης του Amstrad, το υπόλοιπο (MOD) που προκύπτει κάθε φορά, αρχίζει από το μηδεν και αυξάνεται κατά μία μονάδα. Αυτό μου έδωσε την ιδέα για ένα μία μικρή ρουτίνα (εν είδει tip), που δίνει τα δευτερόλεπτα στην οθόνη μας, από την στιγμή που την τρέχουμε. Ουσιαστικά, μας δίνει το υπόλοιπο της διαίρεσης, αλλά αυτό μπορούμε να το εκλάβουμε ως δευτερόλεπτο, αφού η διαδοχή των αριθμών "απέχει" χρονικά κατά ένα second.

10 CLS20 t=TIME/300

30 DEF FNa=(TIME/300-t)

40 X=(FNa MOD t)

50 LOCATE 20,12

60 PRINT X

70 GOTO 40
Αυτή η μικρή ρουτίνα θα μπορούσε να βελτιωθεί και να ενσωματωθεί σε ένα πρόγραμμα. Έχω δει αντίστοιχες ρουτίνες που διαβάζουν δευτερόλεπτα, αλλά αυτή είναι μάλλον είναι πιό ντελικάτη, ή έτσι τουλάχιστον μου φαίνεται, επειδή αυτόν τον καιρό "ανακαλύπτω πάλι τον τροχό", ικανοποιώντας τον παλινπαιδισμό που με έχει πιάσει.

Υ.Γ. Ελπίζω να μην ξεφεύγω από το θέμα, αλλά δεν πειράζει
 
Zorro αν θέλεις ανάλυσε την DEF μιας και έχει αρκετό ψωμί και ενδιαφέρον.

Βλέπω αρκετό ενδιαφέρον τελικά, θέλετε να το πάμε λίγο πιο γρήγορα?
 
Shock είπε:
Zorro αν θέλεις ανάλυσε την DEF μιας και έχει αρκετό ψωμί και ενδιαφέρον.Βλέπω αρκετό ενδιαφέρον τελικά, θέλετε να το πάμε λίγο πιο γρήγορα?
Δεν έχω αντίρρηση, αλλά, όπως είχα αναφέρει χθές, μπαίνω στο forum μόνο από τον χώρο εργασίας μου, "στα κλεφτά", όταν ο boss είναι απασχολημένος για λίγο στο διπλανό γραφείο, ενώ η δουλειά έχει εφιαλτικό φόρτο καθημερινά. Στο σπίτι δεν έχω σύνδεση, λόγω κακών γραμμών του ΟΤΕ στην περιοχή μου.

Φοβάμαι λοιπόν οτι θα μπαίνω στο forum όταν έχω ευκαιρία, σαν "κομήτης".

Άλλωστε, είμαι ουσιαστικά "νέος" μαθητής (αν και καλός πιστεύω:what:), αφού ξαναπιάνω την Locomotive Basic του Amstrad έπειτα από 21 χρόνια, άρα χρειάζομαι χρόνο (τα βράδια στο σπίτι) για να ανακαλύψω πάλι τον χώρο της.

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

"Keep walking"!!!

Προς θεού όμως, να παραμείνεις αναλυτικός, αφού υπάρχουν beginners που το παρακολουθούν.

Υ.Γ. Τι έγινε με τα παιδιά που πρότειναν να ανέβει online emulator; Προχωράει το θέμα;
 
Shock είπε:
40 if col >=0 and col <27 then gosub 100

50 else

60 print "wrong number. Possible values 0-26"

70 goto 30
Πω πω, πολύ σκουριασμένος είμαι, αλλά ωραία φάση να τα ξαναθυμηθούμε.

Λοιπόν, πολύ πιθανό να κάνω λάθος, είχα όμως την εντύπωση ότι η else έμπαινε στην ίδια γραμμή και όχι μόνη της σε δική της γραμμή, δηλαδή το ισοδύναμο του από πάνω θα ήταν κάτι σαν:

Κώδικας:
40 if col>=0 and col<27 then gosub 100 else print"wrong number. Possible values 0-26":goto 30
Δεν έχω ούτε χρόνο ούτε τον Amstrad εύκαιρο για να το δοκιμάσω βέβαια, τεσπα.
 
Ενας on-line emulator για Amstrad θα ήταν καλή φάση , αν είχε και copy-paste δυνατότητες τότε θα αφίσω την Τατιάνα και θα πιάσω πάλι τον Amstrad :D . Αν πάλι δεν έχει ο on-line ξέρετε κάποιον άλλον; ο Caprice δεν νομίζω να κάνει copy-paste... ο winApe έχει; Το έχει ψάξει κανείς γιατί δεν έχω όρεξη για πληκτρολόγιση από τότε που βγήκαν τα mouse και το δεξί click - copy, δεξί click paste.. lol :)
 
Θα το δοκιμασω αυριο σε real hardware, αλλα νομιζω οτι ο Giama εχει δικιο - η if then else εντολη μπαινει στην ιδια γραμμη, τουλαχιστον στην Locomotive.
 
Πίσω
Μπλουζα