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

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

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

sstauross

Για ι απο α μέχρι β με_βήμα γ

επιτρέπεται;; να έχουμε μεταβλητές στα α και γ ;

Ευχαριστώ πολυ!

P.Tsiotakis

ναι μπορεί η αρχική, η τελική τιμή και το το βήμα να είναι μεταβλητές
ΑΛΛΑ δεν μπορούν να τροποποιούνται εντός του βρόχου




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

sstauross

υπάρχει κάπου στο βιβλίο αυτό;;
διότι τρέχοντας το παρακάτω στο http://www.pseudoglossa.gr/

Αλγόριθμος πχ
α← 1
Για ι απο 1 μέχρι 10 με_βήμα α
Διάβασε α
Τέλος_επανάληψης

Τέλος πχ

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

Ευχαριστω..

sstergou

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

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

Όταν προγραμμάτιζα τον διερμηνευτή του pseudoglossa.gr δεν θεώρησα σκόπιμο να εισάγω τον περιορισμό της μη αλλαγής της τιμής του βήματος χωρίς αυτό να σημαίνει ότι αυτό είναι απαραίτητα συμβατό με το σχολικό βιβλίο.

Άσχετα με το αν είναι σωστό ή όχι η δομή Για πρέπει να χρησιμοποιείται για γνωστό αριθμό επαναλήψεων.


μ-Ziq


Καλησπέρα!

Αρχή_επανάληψης
Διάβασε i
Μέχρις_ότου i <= 10
Για i από i μέχρι 10
μπλαμπλα
Τέλος_επανάληψης

Σωστό ή Λάθος? (Αναφέρομαι προφανώς στο "Για i από i" κομμάτι.)

Ευχαριστώ!

Νίκος Αδαμόπουλος

Το ερώτημά σου βρίσκεται μέσα στις γκρίζες ζώνες του βιβλίου... Με λίγα λόγια, οι απόψεις διίστανται!

Από τον παραπάνω σύνδεσμο ( http://dide.ilei.sch.gr/keplinet/education/docs/aepp_yp_2010.pdf ) αντιγράφω το εξής:

Όσον αφορά τη μεταβολή του μετρητή μιας ΓΙΑ μέσα στο βρόχο του,  δεύτερη υπόδειξη της σελίδας 78  του Τετραδίου Μαθητή αναφέρεται:  «Ποτέ μην χρησιμοποιείς εντολές που αλλάζουν την αρχική τιμή, την τελική τιμή, το βήμα ή τη μεταβλητή που ελέγχει την επανάληψη μέσα σε ένα βρόχο ΓΙΑ.  Αν και μερικές γλώσσες προγραμματισμού επιτρέπουν αυτές τις αλλαγές,  να τις αποφεύγεις,  γιατί οδηγούν σε προγράμματα δυσνόητα και συνήθως λανθασμένα». Από το απόσπασμα αυτό προκύπτει ότι η ΓΛΩΣΣΑ δεν περιλαμβάνεται στις «μερικές γλώσσες προγραμματισμού».  Επίσης,  στο Βιβλίο Μαθητή στην ενότητα 8.2.3,  σελ. 179,  για τη λειτουργία της ΓΙΑ ... ΑΠΟ ... ΜΕΧΡΙ αναφέρεται: «ΛΕΙΤΟΥΡΓΙΑ Οι εντολές του βρόχου εκτελούνται για όλες τις τιμές της μεταβλητής από την αρχική τιμή μέχρι την τελική τιμή,  αυξανόμενες με την τιμή του βήματος. Αν το βήμα είναι ίσο με 1, τότε παραλείπεται». 
Από τα προαναφερθέντα προκύπτει ότι η ΓΛΩΣΣΑ αποκλείει τη μεταβολή του μετρητή.


Με βάση λοιπόν το παραπάνω "σκεπτικό" θα συμπεράναμε ομοίως ότι "δεν πρέπει να αλλάζουμε την αρχική τιμή" της ΓΙΑ, επομένως το παράδειγμά σου θα έλεγα ότι: "δεν είναι σωστό", ή καλύτερα δεν είναι: "πολιτικώς ορθό" (!!!)

Υ.Γ.
Όλα τα παραπάνω βέβαια τα γράφω έχοντας την επίγνωση ότι θα υπάρχουν και αντίθετες απόψεις! Πιστεύω ότι το πιο σημαντικό για διάφορα τέτοια σημεία του βιβλίου είναι ακριβώς αυτό: "να έχουμε την επίγνωση ότι υπάρχουν και αντίθετες απόψεις" οπότε και να τα αντιμετωπίζουμε με την δέουσα προσοχή...

petrosp13

Σωστό, γιατί το i έχει συγκεκριμένη τιμή πριν την επανάληψη
Η μετατροπή του σε Όσο θα είχε την εξής μορφή

i <-- i
Όσο (i <= 10) επανάλαβε
    μπλαμπλα
    i <-- i + 1
Τέλος_Επανάληψης

Δεν υπάρχει λάθος
Παπαδόπουλος Πέτρος
Καθηγητής Πληροφορικής

alkisg

Με αφορμή την οδηγία του Υπουργείου που γράφει ο Νίκος παραπάνω, να ζητήσω λίγο πάλι τη γνώμη σας για την υλοποίηση της ΓΙΑ στον Διερμηνευτή.

Από τα σημεία του βιβλίου τα οποία παραθέτει η οδηγία, εγώ είχα φτάσει σε διαφορετικό συμπέρασμα και υλοποίησα τη ΓΙΑ όπως κάνει η Pascal: ο Διερμηνευτής αποτιμά μόνο μια φορά την τελική τιμή και το βήμα, τα θυμάται, και έτσι δεν επηρεάζονται από τυχόν αλλαγές σε μεταβλητές εντός του βρόχου. Δηλαδή απλά "κακή πρακτική".

Το Υπουργείο λέει "η ΓΛΩΣΣΑ αποκλείει...", με βαρύ ύφος, που υποθέτω ότι σημαίνει ότι ο Διερμηνευτής θα πρέπει να αρνηθεί να το εκτελέσει.
Πρώτη ερώτηση: δηλαδή τι να βγάλει; Συντακτικό λάθος ή χρόνου εκτέλεσης;

Παρακάτω. Ας δούμε ένα πολύ συνηθισμένο παράδειγμα:

Κώδικας: ΓΛΩΣΣΑ
ΓΙΑ μ ΑΠΟ 1 ΜΕΧΡΙ 10
  ΚΑΛΕΣΕ ΚάποιαΔιαδικασία(μ)
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ


Με βάση λοιπόν την οδηγία του Υπουργείου, αυτό το πρόγραμμα (και ένα σωρό άλλα που διδάσκουμε) είναι λάθος! Ή ΚάποιαΔιαδικασία παίρνει σαν παράμετρο τον μετρητή μ με "αναφορά" (copy-restore), οπότε συντακτικά ισοδυναμεί με αλλαγή τιμής, είτε αλλάξει το μ εντός της διαδικασίας είτε όχι. Είναι ισοδύναμο με το να κάναμε μ <- μ, που γράφει στο μ κι ας μην το μεταβάλλει.

Άρα είτε θα πρέπει να εξηγήσουμε ότι έχουμε ένα σούπερ περίεργο interpreter/runtime-system που ελέγχει αν η τιμή που γράφεται είναι ίδια ή όχι, πριν βγάλει λάθος,
είτε η οδηγία του Υπουργείου είναι λάθος και πρέπει να αλλαχθεί σε "κακή πρακτική".

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

Οπότε, δεύτερη ερώτηση: να αλλάξει η υλοποίηση της ΓΙΑ του Διερμηνευτή, και πώς ακριβώς να γίνει;

Ως τρίτη ερώτηση, με την τρέχουσα υλοποίηση του Διερμηνευτή και της Pascal (προσωρινές μεταβλητές), η αρχική τιμή δεν μπορεί να αλλάξει εντός της επανάληψης, οποιεσδήποτε μεταβλητές κι αν πειράξει ο προγραμματιστής.
Η οδηγία του Υπουργείου έβαλε έναν επιπρόσθετο περιορισμό, ότι δεν μπορούμε να πειράζουμε την μεταβλητή της αρχικής τιμής, χωρίς αυτός ο περιορισμός να έχει νόημα ούτε στη ΓΙΑ ούτε κατά τη μετατροπή της σε ΟΣΟ... δηλαδή δημιούργησε κι άλλο πρόβλημα εκεί που δεν υπήρχε.

George Eco

Απαντώ.
Κατά τη γνώμη μου μάλλον χρόνου εκτέλεσης θα είναι.
Τώρα για το πώς να αλλάξει ο Διερμηνευτής, η θέση μου είναι έτσι ώστε να ακολουθεί τις οδηγίες του Υπουργείο.
Βέβαια προτιμώ να αλλάξει η γλώσσα προγραμματισμού, το έχω ξαναπει.

Η ΓΙΑ μπορεί να έχει μεταβλητές ως μετρητή, τιμή από, τιμή μέχρι, τιμή βήματος αρκεί το βήμα να μη πάρει τιμή 0 αν θυμάμαι καλά. Το θεωρεί βάσει ντιρεκτίβας μη αποδεκτό.


alkisg

Παράθεση από: George Eco στις 05 Απρ 2020, 11:01:55 ΠΜ
Τώρα για το πώς να αλλάξει ο Διερμηνευτής, η θέση μου είναι έτσι ώστε να ακολουθεί τις οδηγίες του Υπουργείου.

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

Αν το Υπουργείο πει ότι η ταξινόμηση γίνεται σε Ο(1), δεν σημαίνει ότι μπορεί και να υλοποιηθεί, θα πρέπει να αλλάξει η οδηγία... και ρωτάω μήπως έχω παραβλέψει κάτι, γιατί απ' όσο μπορώ να δω αυτό που ζητάνε είναι σχεδόν αδύνατο.

evry

Το λάθος εκτέλεσης είναι στις οδηγίες του υπουργείου.
Με τόσες αντικρουόμενες οδηγίες και συνεχή μπαλώματα τα οποία αρχικά είναι προσωρινά αλλά στη συνέχεια γίνονται μόνιμα, έχουν καταλήξει σε μια φανταστική γλώσσα προγραμματισμού η οποία δεν μπορεί να υλοποιηθεί. Φαντάζομαι ότι αυτό δεν έχει μεγάλη σημασία αφού κάνουμε .......... Αλγοριθμική σωστά?
Τέλος πάντων, αυτό που ζητάνε εδώ δεν είναι δυνατόν να ελεγχθεί όπως έχουμε πει και άλλες φορές. Ο έλεγχος αυτός μπορεί να γίνει μόνο σε χρόνο εκτέλεσης, άρα σίγουρα δεν μπορεί να θεωρηθεί συντακτικό λάθος. Από την άλλη όμως είναι μέρος του (ανύπαρκτου αλλά έμμεσου) ορισμού της..... ΓΛΩΣΣΑΣ. Καλό ε;
Αυτό με την αρχική τιμή που αναφέρεις Άλκη είναι κλασικό παράδειγμα του παραλογισμού του πνεύματος των οδηγιών. Πραγματικά τι πειράζει δηλαδή να μεταβάλλεται η αρχική τιμή? Αφού είναι ουσιαστικά έξω από την επανάληψη.

Άλκη δε νομίζω ότι έχει νόημα να κάνεις τίποτα, διότι αύριο μπορεί να έρθει μια άλλη οδηγία που να λέει άλλα.
Κανονικά κατά τη γνώμη μου είναι υποχρεωμένοι όσοι δίνουν αυτές τις οδηγίες να μας δίνουν και έναν διερμηνευτή της ΓΛΩΣΣΑΣ που να υλοποιεί τις οδηγίες αυτές.

What I cannot create I do not understand -- Richard Feynman
http://evripides.mysch.gr

bugman

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

Στη δική μου γλώσσα, η οποία εκτελείται με ένα πέρασμα, άρα δεν μπορεί να δει ο διερμηνευτής μπροστά τη χρήση της μεταβλητής της ΓΙΑ, γίνεται κάτι άλλο. Η πραγματική μεταβλητή είναι άλλη, και η φανερή μεταβλητή φορτώνει τιμή σε κάθε επανάληψη. Αυτό όμως αφήνει την περίπτωση εντός της ΓΙΑ να αλλάξει η φανερή τιμή στην μεταβλητή, χωρίς να αλλάξει ο αριθμός επαναλήψεων καθώς και η τιμή της φανερής μεταβλητής στην αρχή του επαναλαμβανόμενου κώδικα της ΓΙΑ. Αυτή η προσέγγιση δεν μπορεί να γίνει στη ΓΛΩΣΣΑ γιατί όπως αναφέρω η μεταβλητή πρέπει να θεωρηθεί μόνο για ανάγνωση.

alkisg

Γιώργο υπάρχουν δύο θεματάκια. Ένα, στη ΓΛΩΣΣΑ οι παράμετροι μεταβιβάζονται με αντιγραφή, copy-restore, όχι με αναφορά.

Δύο:

Κώδικας: ΓΛΩΣΣΑ
ΔΙΑΔΙΚΑΣΙΑ ΚάποιαΔιαδικασία(Ν)
ΑΡΧΗ
  ΆλλεςΕντολέςΠουΔενΠειράζουνΤοΝ
  ΑΝ ΚάποιαΣυνθήκη ΤΟΤΕ
    Ν <- Κάτι
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ


Η ΚάποιαΣυνθήκη μπορεί να είναι πάντα ΨΕΥΔΗΣ όταν αυτή η διαδικασία καλείται με παράμετρο μετρητή της ΓΙΑ, και να είναι ΑΛΗΘΗΣ μόνο όταν καλείται από άλλα σημεία του προγράμματος. Θα το καταλάβεις στο runtime, όχι στο compile time.

Αλλά ακόμα και ως runtime error αν υλοποιηθεί, παραβιάζει το copy-restore, που δεν νομίζω ότι ήταν στους στόχους της οδηγίας του Υπουργείου. Απλά δεν σκέφτηκαν τις παρενέργειες αυτού που αποφάσισαν.

bugman

#14
Ναι υπάρχει αυτό που λες. Οπότε καλύτερα θα ήταν να γίνει λάθος κατά την εκτέλεση.
Τσέκαρα τον έλεγχο μη αρχικοποίησης σε τυπική μεταβλητή διαδικασίας. Ο έλεγχος γίνεται στη χρήση. Δηλαδή έχει προηγηθεί το copy in. Ο Διερμηνευτής κρατάει σημαία για μη αρχικοποίηση. Μάλιστα αν αρχικοποιήσουμε τη μεταβλητή εντός της διαδικασίας τότε στο copy out μεταβιβάζεται και η σημαία...που λέει ότι έχει αρχικοποιηθεί. Άρα μπορεί να μπει και μια δεύτερη σημαία που να λέει..μόνο για ανάγνωση . Το οποίο ομοίως θα μεταβιβάζεται και δεν θα αφήνει εκχωρήσεις τιμών. Αυτό θα το παραβλέπει μόνο η Για που θα το έχει δεσμεύσει  προσωρινά. Μετά το τέλος της Για θα σβήνει η σημαία μόνο για ανάγνωση.
Επίσης η Για θα ελέγχει αν η μεταβλητή είναι ήδη μόνο για ανάγνωση την πρώτη φορά πριν την εκχώρηση της πρώτης τιμής.

Παρακάτω είναι το πρόγραμμα ελέγχου. Δείχνει ότι η ΑΛΦΑ1 έχει αρχικοποιηθεί στην διαδικασία, και επίσης δείχει στη ΓΙΑ ότι τώρα δεν γίνεται έλεγχος και ότι η τιμή της Ι αλλάζει με συνέπεια να μην σταματάει η ΓΙΑ.

Αν φτιαχτεί σωστά η τελευταία ΚΑΛΕΣΕ θα βγάλει λάθος κατά την εκτέλεση.

ΠΡΟΓΡΑΜΜΑ ΑΛΦΑ
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ΑΛΦΑ1, Ι
ΑΡΧΗ
  ΚΑΛΕΣΕ ΒΗΤΑ(2.0) 
  ΚΑΛΕΣΕ ΒΗΤΑ(ΑΛΦΑ1) 
  ΓΡΑΨΕ ΑΛΦΑ1
  ΓΙΑ Ι ΑΠΟ 300.0 ΜΕΧΡΙ 300.0 ΜΕ ΒΗΜΑ 1.0
    ΚΑΛΕΣΕ ΒΗΤΑ(Ι) 
    ΓΡΑΨΕ Ι
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ
ΔΙΑΔΙΚΑΣΙΑ ΒΗΤΑ(ΑΛΦΑ1) 
ΜΕΤΑΒΛΗΤΕΣ
  ΠΡΑΓΜΑΤΙΚΕΣ: ΑΛΦΑ1
ΑΡΧΗ
  ΓΡΑΨΕ "ΟΚ"
  ΑΛΦΑ1 <- 100
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ

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