Δευτέρα 21 Σεπτεμβρίου 2015

Προγραμματισμός 0001 (παραδείγματα στη Μ2000)

Δελτίο: 0001
Τίτλος: Περί Αναθεωρήσεων, Επαναλήψεων και Φόρτου (Μ2000)

Σε αυτό το κείμενο θα δούμε τρία θέματα (που έχουν κάποια συνάφεια).
1. Μ2000 έκδοση 8, Αναθεώρηση 45
Συνήθως οι αναθεωρήσεις γίνονται για εμπλουτισμό, εφόσον κάθε φορά είμαι σίγουρος ότι ο κώδικας είναι εντάξει. Παρόλα αυτά μπορεί να υπάρχει κάποιο πρόβλημα και να βρεθεί πολύ αργότερα. Όπως το σημερινό που έλυσα.

Η αναθεώρηση 45 είναι ελαφρώς πιο γρήγορη από τη 44. Και επιπλέον διορθώθηκε το GOSUB σε ετικέτα τύπου αριθμός (σε ετικέτα τύπου λέξη δεν υπήρχε πρόβλημα) !
Αυτό το πρόγραμμα δεν έτρεχε σωστά, τώρα τρέχει!

GOSUB AA(100)
AA(100) \\ νέος τρόπος  αναθ. 144, πρόβλημα αν υπάρχει πίνακας ΑΑ()
SUB AA(L)
      GOSUB BB(100,5)
      BB(100,5) \\ νέος τρόπος  αναθ. 144
      PRINT L
      GOSUB 1000
END SUB


SUB BB(K,M)
     PRINT K*M
END SUB
1000 PRINT 10000 : RETURN


Εδώ είναι στα ελληνικά (τρέχει και στις δυο γλώσσες)

\\ οι εντολές μπορούν να πάρουν τόνους
\\ και τα αναγνωριστικά εκτός από τις εττικέτες και τα ονόματα των ρουτινών
\\ όπου αν δώσουμε τόνο πρέπει να έχει τόνο και στη θέση που δείχνει.
Διαμέσου αά(100) \\ αν στο αα βάλουμε τόνο πρέπει να υπάρχει και στον ορισμό.
αά(100)
Ρουτίνα αά(Λ)
      Διαμέσου ββ(100,5)
      ββ(100,5)
      Τύπωσε Λ
      Διαμέσου 1000
Τέλος Ρουτίνας


Ρουτίνα ββ(Φ,Ξ)
     Τύπωσε Φ*Ξ
Τέλος Ρουτίνας
1000 Τύπωσε 10000 : Επιστροφή



2. Επανάληψη τύπου Από Εώς
Υπάρχει το γνωστό(το γράφω σε μια γραμμή):
Για ν=1 έως 100 ανά 2 { τύπωσε ν }
α) Στη Μ2000 το βήμα είναι πάντα θετικό. Η κατεύθυνση προσδίδεται από τις τιμές. Αν βάλουμε 100 έως 1 ανά 2 θα κατεβαίνουνε 2 (μπορούμε να παραλείψουμε την ανά αν έχουμε βήμα ανά 1)
β) Η μεταβλητή ελέγχου (εδώ ν) μπορεί να είναι ακέραια (ν%) αλλά όχι στοιχείο πίνακα π.χ. α(3)
γ) Αν αλλάξουμε την μεταβλητή ελέγχου μέσα στο μπλοκ { } δεν αλλάζει για τη δομή. Δηλαδή θα πάει στο επόμενο, γιατί κρατάει ο μεταφραστής την κανονική τιμή "απροσπέλαστη".
δ) Μπορούμε να βγούμε με Έξοδος ή με ΠΡΟΣ ετικέτα. Δεν μπορούμε να ξαναγυρίσουμε με τη Προς και να συνεχίσει την επανάληψη το μπλοκ (γίνεται αλλιώς, θα το δούμε)
ε) το μπλοκ { } έχει όλες τις ιδιότητες ενός μπλοκ (μπορεί να γίνει μπλοκ επανάληψης, το πώς θα το δούμε)
στ) Είναι το πιο γρήγορο Για, σε σχέση με το επόμενο

Υπάρχει το γνωστό από την Basic Για, όμως και εδώ το ανά είναι θετικό (αυτό δεν αλλάζει).
Για ν=1 έως 100 ανά 2 : Τύπωσε ν : Επόμενο ν
α) Εδώ απουσιάζει το μπλοκ. Στο προγραμματισμό με νήματα τα μπλοκ εκτελούνται χωρίς διακοπές. Αυτή η Για χωρίς μπλοκ μπορεί να σπάσει, εντολή προς εντολή ενώ τρέχει ένα άλλο νήμα, όταν το έχουμε δηλώσει Σχέδιο.Νημάτων Ταυτόχρονο (εξ ορισμού είναι το Σχέδιο.Νημάτων Διαδοχικό).
β) Έξοδος από την Για γίνεται με την Έξοδος Για πάντα μετά το τελευταίο επόμενο

για ι=1 εως 20
      εξοδος για
επομενο ι
για ι=1 εως 10
      αν ι=8 τοτε εξοδος για \\ πάει πριν το τυπωσε "οκ"
      αν ι<5 τοτε τύπωσε 10 : επομενο ι
επομενο ι
      τυπωσε "οκ"  \\ θα το τυπώσει
για ι=1 εως 20
επομενο ι


γ) Μπορούμε να έχουμε πολλαπλά Επόμενο όπως φάνηκε και στο παραπάνω παράδειγμα

Άλλος τρόπος για επανάληψη από έως είναι να χρησιμοποιήσουμε το μπλοκ:

πίνακας β(10)=5
{
      αν β(3)<9 τότε κυκλικά
      β(3)++
      τυπωσε β(3)
}
β(3)=5
{
      β(3)++:αν β(3)<10 τότε κυκλικά
      τυπωσε β(3)
}


α) Και τα δυο μπλοκ δίνουν το ίδιο αποτέλεσμα.
β) Μπορούμε να κάνουμε έξοδο με την Έξοδος.
π.χ.       αν β(3)=8 τότε έξοδος 
γ) Η εντολή κυκλικά βάζει το μπλοκ σε κατάσταση επανάληψης για μια φορά όμως. Αν δεν την ξαναδώσουμε το μπλοκ θα τερματίσει.
δ) Και εδώ μπορούμε με μια ΠΡΟΣ (Goto) να αφήσουμε το μπλοκ ακόμα και αν το έχουμε σημάνει για επανάληψη
π.χ.       αν β(3)=8 τότε προς Εκει
Οι ετικέτες πρέπει να είναι μόνες στην γραμμή (μπορούν να έχουν κενά αριστερά) και θέλουν άνω και κάτω τελεία.
Εκει:   

Χωρίς καθόλου μπλοκ θα πρέπει να κάνουμε ότι και στη παλιά Basic
100 Πίνακας β(10)=5
110 Αν β(3)>9 τότε προς 150
120 β(3)++
130 Τύπωσε β(3)
140 Προς 110
150 

α) Η Μ2000 μπορεί να τρέξει και με αριθμούς γραμμών.
β) Αν στον διορθωτή ξεκινήσουμε με αριθμό τότε με το Enter γράφεται ο επόμενος αριθμός, ο οποίος θα είναι +10 ή +1 αν υπάρχει ο επόμενος +10. Εδώ με ετικέτες μόνο:
Πίνακας β(10)=5
αρχή_βρόχου:
      Αν β(3)>9 τότε προς τέλος_βρόχου
      β(3)++
      Τύπωσε β(3)
      Προς αρχή_βρόχου
τέλος_βρόχου


3. Μέτρηση Benchmark (αλλά εδώ τη λέμε μέτρηση φόρτου)
Μπορεί κανείς να μετρήσει ποιος τρόπος είναι πιο γρήγορος. Ξεκινάμε τον αναλυτή και τυπώνουμε τον φόρτο (το φορτίο που το δίνουμε σε χρόνο εκτέλεσης). Ο φόρτος αλλάζει αν τρέχει κάτι άλλο στον υπολογιστή. Δηλαδή ουσιαστικά μας λέει "στις υπάρχουσες συνθήκες αυτό ο κώδικας χρειάστηκε τόσο χρόνο". Αν άλλη φορά δούμε να χρειάζεται το διπλάσιο χρόνο σημαίνει ότι στον ίδιο χρόνο τρέχει κάτι άλλο με τον ίδιο φόρτο. Έτσι αν είχαμε στη σειρά μόνο το κώδικά μας θα είχαμε ακριβώς τον ίδιο χρόνο. Να γιατί το λέμε φόρτο,
μαθηματικά:
1. τρέχει μόνο του το πρόγραμμά μας Φόρτος =1000
2. τρέχει με κάτι άλλο και φέρνει Φόρτος =2000
3. το κάτι άλλο έχει Φόρτο 1000..
4. Απόδειξη:
5. Αν τρέξουμε δυο συνεχόμενες; φορές το πρόγραμμά μας, θα έχουμε 1000+1000=2000.
Στους υπολογιστές ο χρόνος εκτέλεσης μοιράζεται στις διεργασίες. Όταν η Μ2000 περιμένει να εισάγουμε εντολές δεν κάνει τίποτα, ο φόρτος είναι σχεδόν μηδενικός. Όταν ο υπολογιστής μας δεν κάνει τίποτα τότε τον αδιάθετο φόρτο τον έχει η Διαδικασία Αδράνειας Συστήματος..Εκτελεί το Noop, No Operation που σημαίνει φάε μόνο χρόνο! Δεν μπορεί ο υπολογιστής να μην κάνει τίποτα! Αλλά μπορεί να κάνει αυτό που είναι σαν τίποτα!

Πινακας β(10)
Αναλυτής   \\ εδώ είναι η εντολή εκκίνησης του μετρητή
για ι=1 έως 100 {
β(3)=5
αρχή_βρόχου:
      Αν β(3)>9 τότε προς τέλος_βρόχου
      β(3)++
      Τύπωσε β(3)
      Προς αρχή_βρόχου
τέλος_βρόχου:
}
Τύπωσε φόρτος 



Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.