Αποστολέας Θέμα: μεταβλητή στο βήμα ή το από της Για  (Αναγνώστηκε 6872 φορές)

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 5963
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: μεταβλητή στο βήμα ή το από της Για
« Απάντηση #15 στις: 05 Απρ 2020, 08:35:34 μμ »
Οι μη αρχικοποιημένες μεταβλητές είναι απλές στην υλοποίηση, με NULL variants. Όμως το να προστεθεί ξεχωριστό status bit "μετρητής σε ΓΙΑ" υπονοεί ότι από πίσω θα πρέπει π.χ. για κάθε πίνακα ακεραίων να υπάρχει και ένας παράλληλος πίνακας από status bits. Αλλά στις αναδρομικές κλήσεις ούτε αυτός δεν είναι αρκετός, και θα χρειαστεί στοίβα από παράλληλους πίνακες με status bits ώστε να μην καθαρίζονται από αναδρομικές κλήσεις υποπρογραμμάτων πριν τελειώσει η αρχική ΓΙΑ. Το copy-restore βέβαια βοηθάει εδώ.

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

Δεν νομίζω ότι το Υπουργείο είχε κατά νου όλα αυτές τις απίθανες καταστάσεις που δημιουργεί αυτό που πρότειναν. Θεωρώ ότι είναι σωστό απλά να το ανακαλέσουν.

bugman

  • Επισκέπτης
Απ: μεταβλητή στο βήμα ή το από της Για
« Απάντηση #16 στις: 05 Απρ 2020, 09:04:56 μμ »
Αφού είναι variants τότε σημαίνει ότι μπορείς να βάλεις τις μεταβλητές για το for ως αντικείμενα που έχουν μια ιδιότητα value. Έτσι μπορείς στις εκφράσεις να διαβάζεις την τιμή ενώ στις εκχωρήσεις να βγάζεις λάθος.
Εν τέλει η μεταβλητή πριν και μετά το For θα είναι κανονική, αρχικά null και μετά ο τύπος που πρέπει να έχει.
Η χρήση variants σου δίνει πλεονεκτήματα. Οποσδηποτε αν έχεις μια IsObject() και μετά μια typeof   να ελέγχεις το είδος αντικειμένου.
Βέβαια αν αφήσουν το θέμα ως καλή πρακτική τότε αφήνουν την περίπτωση της αλλαγής της μεταβλητής στη Για ως δυνατότητα αλλά μη επιθυμητή και γλιτώνεις δουλειά. Μακάρι να βρεις το κουράγιο να το φτιάξεις

Γιαννούλης Γιώργος

  • Βετεράνος
  • ****
  • Μηνύματα: 85
Απ: μεταβλητή στο βήμα ή το από της Για
« Απάντηση #17 στις: 06 Απρ 2020, 07:04:06 μμ »
Για τη μεταβολή του μετρητή μέσα στη δομη επανάληψης ΓΙΑ, έχω τον εξης προβληματισμό:

Αυτό είναι τελείως λάθος...
Κώδικας: [Επιλογή]
Για ι απο 1 μεχρι 10
   Γραψε ι
   ι <-  ι +2
Τελος_επαναληψης

Αυτό είναι όμως;
Κώδικας: [Επιλογή]
Για ι απο 1 μεχρι 10
   Γραψε ι
   ι <-  ι
Τελος_επαναληψης

Ή μήπως αύτο;
Κώδικας: [Επιλογή]
Για ι απο 1 μεχρι 10
   καλεσε Εμφανιζω(ι)  !όπου ουσιαστικά γίνεται εκχώρηση, στο ι της τελικής τιμής που είχε το α της διαδικασίας και ο μεταγλωττιστής προφανώς δεν ξέρει αν άλλαξε.
Τελος_επαναληψης

Διαδικασία Εμφανίζω(α)
Μεταβλητες
Ακέραιες:α
Αρχη
Γραψε α
Τελος_Διαδικασίας

Προσωπικά, προτείνω στους μαθητές να μην κάνουν κλήση διαδικασίας με παράμετρο τον μετρητή μέσα στην επανάληψη, αλλά να αποθηκεύουν την τιμή του μετρητή σε μια μεταβλητή και στη συνέχεια να την καλούν όπως φαίνεται παρακάτω.
Κώδικας: [Επιλογή]
Για ι απο 1 μεχρι 10
   τεμπ <- ι
   καλεσε Εμφανιζω(τεμπ)  !Η τεμπ δεν είναι μετρητής και δεν με ενδιαφέρει αν θα αλλάξει η τιμή της...
Τελος_επαναληψης

Διαδικασία Εμφανίζω(α)
Μεταβλητες
Ακέραιες:α
Αρχη
Γραψε α
Τελος_Διαδικασίας

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 5963
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: μεταβλητή στο βήμα ή το από της Για
« Απάντηση #18 στις: 07 Απρ 2020, 07:34:29 πμ »
Γιώργο ακριβώς αυτό εννοώ. Εγώ το "δεν επιτρέπεται αλλαγή" το καταλαβαίνω σαν "read only", θα πρέπει να βγάλει λάθος χρόνου εκτέλεσης ακόμα κι αν κάποιος πάει να γράψει την ίδια τιμή.

Έτσι βγαίνουν λάθος όλα τα παραδείγματα του βιβλίου και των Πανελλαδικών που περνάνε τον μετρητή της ΓΙΑ ως παράμετρο σε υποπρόγραμμα, και θα πρέπει να διορθωθούν ώστε να χρησιμοποιούν temp όπως έκανες κι εσύ.

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

alkisg

  • Τεχνικός / καθαρίστρια
  • *****
  • Μηνύματα: 5963
    • Ο Διερμηνευτής της ΓΛΩΣΣΑΣ
Απ: μεταβλητή στο βήμα ή το από της Για
« Απάντηση #19 στις: 12 Απρ 2020, 06:25:50 μμ »
Για λόγους πληρότητας και μόνο, να παραθέσω και το παρακάτω παράδειγμα:

Κώδικας: ΓΛΩΣΣΑ
  1. ΓΙΑ μ ΑΠΟ -1 ΜΕΧΡΙ 10 ΜΕ_ΒΗΜΑ -3*μ
  2.     ΓΡΑΨΕ μ
  3.   ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Σε αυτό, το βήμα έχει εναλλασσόμενο πρόσημο, οπότε δυσκολεύει ακόμα περισσότερο την εύρεση ισοδύναμης ΟΣΟ, αφού δεν αρκούν "μια εξωτερική ΑΝ και δύο ΟΣΟ" που βάζουμε συνήθως όταν δεν ξέρουμε το πρόσημο του βήματος.

Αυτό θα μπορούσε να εμφανίζει τις δυνάμεις του δύο με εναλλασσόμενο πρόσημο, -1, 2, -4, 8, -16, και να σταματάει στο 32 επειδή είναι > 10.
Ή θα μπορούσε να εμφανίζει -1, 2 και να σταματάει στο -4 επειδή είναι < -1.
Ή αν ακολουθούσαμε την τακτική της Pascal, θα λέγαμε "το αρχικό βήμα ήταν 3 και η επανάληψη θα γίνει με το βήμα αμετάβλητο", οπότε θα έδειχνε -1, 2, 5, 8.

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

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

evry

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 3606
  • to Iterate is human to Recurse divine
Απ: μεταβλητή στο βήμα ή το από της Για
« Απάντηση #20 στις: 12 Απρ 2020, 06:49:22 μμ »
Δεν είναι πολύ σχετικό αλλά μετά από μια οδύσσεια σε διάφορες γλώσσες προγραμματισμού μάλλον βρήκα την τέλεια δομή επανάληψης στην R:
Κώδικας: Javascript
  1. i <- 0 ; S <- 0
  2. repeat {
  3.    if (i==10)
  4.       break
  5.    A <- readline("A = ")
  6.    if (A == "ΤΕΛΟΣ")
  7.       break
  8.    N <- as.numeric(readline("N = "))
  9.    S <- S + N
  10.    if (S > 1000)
  11.       break
  12.    print("keep going")
  13.    i <- i + 1
  14. }
και εμείς ασχολούμαστε με ένα κατασκεύασμα το οποίο έχει τόσες οδηγίες και μπαλώματα που αμφιβάλλω αν το αναγνωρίζουν αυτοί που αρχικά το όρισαν.
(δεν είχε R και επέλεξα javascript syntax highlighting)
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr