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

Ξεκίνησε από 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
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ