μεταβλητή στο βήμα ή το από της Για

Ξεκίνησε από sstauross, 05 Νοε 2011, 04:38:22 ΜΜ

« προηγούμενο - επόμενο »

alkisg

Οι μη αρχικοποιημένες μεταβλητές είναι απλές στην υλοποίηση, με NULL variants. Όμως το να προστεθεί ξεχωριστό status bit "μετρητής σε ΓΙΑ" υπονοεί ότι από πίσω θα πρέπει π.χ. για κάθε πίνακα ακεραίων να υπάρχει και ένας παράλληλος πίνακας από status bits. Αλλά στις αναδρομικές κλήσεις ούτε αυτός δεν είναι αρκετός, και θα χρειαστεί στοίβα από παράλληλους πίνακες με status bits ώστε να μην καθαρίζονται από αναδρομικές κλήσεις υποπρογραμμάτων πριν τελειώσει η αρχική ΓΙΑ. Το copy-restore βέβαια βοηθάει εδώ.

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

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

bugman

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

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

Για τη μεταβολή του μετρητή μέσα στη δομη επανάληψης ΓΙΑ, έχω τον εξης προβληματισμό:

Αυτό είναι τελείως λάθος...
Για ι απο 1 μεχρι 10 
   Γραψε ι
   ι <-  ι +2
Τελος_επαναληψης


Αυτό είναι όμως;
Για ι απο 1 μεχρι 10
   Γραψε ι
   ι <-  ι
Τελος_επαναληψης


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

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


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

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

alkisg

Γιώργο ακριβώς αυτό εννοώ. Εγώ το "δεν επιτρέπεται αλλαγή" το καταλαβαίνω σαν "read only", θα πρέπει να βγάλει λάθος χρόνου εκτέλεσης ακόμα κι αν κάποιος πάει να γράψει την ίδια τιμή.

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

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

alkisg

Για λόγους πληρότητας και μόνο, να παραθέσω και το παρακάτω παράδειγμα:

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


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

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

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

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

evry

Δεν είναι πολύ σχετικό αλλά μετά από μια οδύσσεια σε διάφορες γλώσσες προγραμματισμού μάλλον βρήκα την τέλεια δομή επανάληψης στην R:
Κώδικας: javascript
i <- 0 ; S <- 0
repeat {
   if (i==10) 
      break
   A <- readline("A = ")
   if (A == "ΤΕΛΟΣ") 
      break
   N <- as.numeric(readline("N = "))
   S <- S + N
   if (S > 1000) 
      break
   print("keep going")
   i <- i + 1
}

και εμείς ασχολούμαστε με ένα κατασκεύασμα το οποίο έχει τόσες οδηγίες και μπαλώματα που αμφιβάλλω αν το αναγνωρίζουν αυτοί που αρχικά το όρισαν.
(δεν είχε R και επέλεξα javascript syntax highlighting)
What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr