Μερικές απορίες

Ξεκίνησε από Michael, 29 Αυγ 2007, 07:59:55 ΜΜ

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

Michael

(Οι περισσότερες δεν αφορούν σε θέματα ουσίας, αλλά στο «πώς πρέπει» να γράφονται κάποια πράγματα στις Πανελλαδικές):

1. Σε έναν «απλό» αλγόριθμο, αν κάποια εντολή δεν χωράει σε μία γραμμή και πρέπει να συνεχιστεί και στην επόμενη, το πρώτο σύμβολο πρέπει να είναι το “&” (ισχύει δηλαδή ό,τι και στη ΓΛΩΣΣΑ)?

2. Τις συναρτήσεις Α_Τ(χ), ΗΜ(χ), κτλ… της ΓΛΩΣΣΑΣ, έχουμε δικαίωμα να τις χρησιμοποιούμε και σε αλγόριθμους που δεν είναι σε ΓΛΩΣΣΑ? Στο Θέμα 4 στις επαναληπτικές 2004 υπήρχε η διευκρίνιση ότι μπορεί να γίνει χρήση της Α_Μ(χ). Αν στο μέλλον σε κάποιο θέμα χρειαστούμε μια συνάρτηση της ΓΛΩΣΣΑΣ και δεν υπάρχει ανάλογη διευκρίνιση, τι κάνουμε? Τη χρησιμοποιούμε "έτσι κι αλλιώς", ή ψάχνουμε για πλάγιους δρόμους?

3. Το “!” (έναρξη σχολίων), πρέπει να μπαίνει αναγκαστικά σε «δική του» γραμμή? Προσωπικά όταν τα σχόλια που θέλω να γράψω είναι πολλά, το “!” το βάζω στην αρχή- αρχή της γραμμής (δηλαδή χρησιμοποιώ για σχόλια ακόμη και το αριστερό περιθώριο του τετραδίου), έτσι ώστε η στοίχιση των σχολίων να είναι εντελώς διαφορετική από αυτή των εντολών και να είναι πιο ευανάγνωστος ο αλγόριθμος. Από την άλλη, όταν τα σχόλια είναι λίγα, προτιμώ να τα γράφω στην ίδια γραμμή με τη σχετική εντολή. Το γραπτό μου στο τέλος έχει μια τέτοια μορφή:

         Διάβασε χρ               ! χρόνος, ερώτημα β.
! Στη συνέχεια θα ταξινομήσουμε ………………………………………………………(μπλα-μπλα-μπλα)
! ………………….και προκύπτει το ζητούμενο.
         Για i από 2…

Υπάρχει πρόβλημα με κάτι τέτοιο (σε γραπτό Πανελλαδικών πάντα)? Λογικά όχι, ρωτάω όμως επειδή σε κάποιες περιπτώσεις έχω δει να χρησιμοποιείται αποκλειστικά η δομή:

        ! ερώτημα β.
        Διάβασε χρ
        ! (μπλα-μπλα)…
        Για i από…

4. Οι εντολές πρέπει να βρίσκονται σε διαδοχικές γραμμές, ή επιτρέπεται στο γραπτό μας να αφήνουμε και κενές γραμμές για να είναι πιο ευανάγνωστος ο αλγόριθμος (π.χ. ανάμεσα στο τμήμα δηλώσεων και στην ΑΡΧΗ, ή ανάμεσα στα διαφορετικά ερωτήματα ενός θέματος)? Μέχρι στιγμής, για να έχω το κεφάλι μου ήσυχο, όταν θέλω να αφήσω κενή γραμμή βάζω απλώς στην αρχή της ένα “!” χωρίς να γράψω τίποτε άλλο, αλλά μου φαίνεται λίγο «χαζό».

5. Επιτρέπεται (σε θέμα που ζητάει αλγόριθμο σε ΓΛΩΣΣΑ) να δημιουργούμε πίνακα με «κενά» κελιά? Π.χ. ξεκινάμε με πίνακα Π[ 100 ] και θέλουμε να δημιουργήσουμε άλλο πίνακα Ρ ο οποίος περιλαμβάνει ένα μέρος μόνο των στοιχείων του Π (το οποίο δεν γνωρίζουμε ακριβώς). Το παρακάτω τμήμα είναι σωστό σε ΓΛΩΣΣΑ?

        μ<-0
        ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 100
              ΑΝ Π[ i ]= `κάτι` ΤΟΤΕ
                   μ<-μ+1
                   Ρ[ μ ]<-Π[ i ]
              ΤΕΛΟΣ_ΑΝ
        ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Στο τέλος, ο Ρ θα έχει (100-μ) κενά κελιά καθώς θα έχει δηλωθεί ως Ρ[ 100 ]. Μήπως θα έπρεπε να έχουν αρχικοποιηθεί τα 100 κελιά του Ρ πριν το παραπάνω τμήμα?

6. Αν α, β άρτιοι, τότε η μεταβλητή μο (μέσος όρος των α, β) θα πρέπει να δηλωθεί στις ΑΚΕΡΑΙΕΣ ή στις ΠΡΑΓΜΑΤΙΚΕΣ? Νομίζω πως κάπου την πήρε το μάτι μου στις ΠΡΑΓΜΑΤΙΚΕΣ. Απ’ όσα έχω συμπεράνει μέχρι στιγμής, όταν μία μεταβλητή την δηλώνουμε στις ΠΡΑΓΜΑΤΙΚΕΣ, κατά βάθος δεν εννοούμε ότι "παίρνει τιμές στο R", αλλά ότι "εκτός του Ζ, μπορεί να παίρνει τιμές και στο R-Z". Έχω καταλάβει καλά? Αν ναι, τότε η προηγούμενη μεταβλητή μο, δεν θα έπρεπε να δηλωθεί στις ΑΚΕΡΑΙΕΣ? Αν όχι, (και αφού το Ζ είναι υποσύνολο του R) τότε γιατί είναι λάθος να τις δηλώνουμε όλες στις ΠΡΑΓΜΑΤΙΚΕΣ?

7. Αν σε έναν αλγόριθμο χρησιμοποιήσουμε μεγαλύτερο πλήθος μεταβλητών από το βέλτιστο, υπάρχει κάποια βαθμολογική συνέπεια?

Ευχαριστώ προκαταβολικά για οποιαδήποτε απάντηση.

Laertis

Φίλε Michael
απαντώ σύντομα στις δικαιολογημένες απορίες σου

1 & 2. Ναι μπορεί να γίνει χρήση συμβόλων ή συναρτήσεων που χρησιμοποιεί η ΓΛΩΣΣΑ και στους αλγορίθμους. Αν παρατηρήσεις στους αλγορίθμους γίνεται επίσης απο το βιβλίο  χρήση και "μαθηματικών" συμβόλων αντί συναρτήσεων της γλώσσας. Η ΓΛΩΣΣΑ είναι αλγόριθμος που θα αποτυπωθεί και θα τρέξει στον υπολογιστή, ενώ ένας απλός αλγόριθμος αποτυπώνεται στο χαρτί

3. Τα σχόλια (τεκμηρίωση) μπορούν να μπαίνουν όπου θέλεις και σε όποιο σημείο θέλεις (αν και δεν είναι υποχρεωτικό να βάζεις σχόλια). Το αποτέλεσμα είναι το ίδιο και περισσότερο αισθητικό παρά ουσιαστικό.

4. Δεν υπάρχει λόγος να αφήνεις κενές γραμμές αλλα κι αν γίνει δεν είναι λάθος.

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

6. Ο μέσος όρος 2 ή περισσότερων αριθμών και γενικότερα οποιαδήποτε μεταβλητή παίρνει τιμή απο μια έκφραση που περιέχει την πράξη της διαίρεσης  πρέπει να δηλώνεται πάντα στις ΠΡΑΓΜΑΤΙΚΕΣ μεταβλητές (νομίζω είναι αυτονόητο γιατί).

Παράθεση από: Michael στις 29 Αυγ 2007, 07:59:55 ΜΜ
Αν όχι, (και αφού το Ζ είναι υποσύνολο του R) τότε γιατί είναι λάθος να τις δηλώνουμε όλες στις ΠΡΑΓΜΑΤΙΚΕΣ?

Καλή ερώτηση που κάθε χρόνο γίνεται απο πολλούς μαθητές. Αυτό γίνεται κυρίως για λόγους εξοικονόμησης μνήμης (ΑΚΕΡΑΙΑ 1 ή 2 ή 4 bytes -ΠΡΑΓΜΑΤΙΚΗ 4 ή 8 bytes ανάλογα με το μέγεθος του αριθμού) αλλά και απο τη φύση των μεταβλητών που διαχειριζόμαστε π.χ. ο δείκτης ενός πίνακα δε μπορεί να είναι πραγματική μεταβλητή, η άθροιση-αφαίρεση-πολ/σμός  ακεραίων μεταβλητών μας δίνει πάντα ακέραιο αποτέλεσμα κλπ.

Αν χρειάζεσαι επιπλέον διευκρινίσεις είμαι πρόθυμος να σου απαντήσω
Ελπίζω να βοήθησα
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

Laertis

Οπς, ξέχασα το τελευταίο ....  :)

7. Όχι δεν υπάρχει επίπτωση στη βαθμολόγηση

;)
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

Michael

Χίλια ευχαριστώ, ήσουν κατατοπιστικότατος.
Το μόνο που είναι ακόμα θολό στο μυαλό μου είναι τα κριτήρια με βάση τα οποία δηλώνουμε μια μεταβλητή στις ΑΚΕΡΑΙΕΣ ή στις ΠΡΑΓΜΑΤΙΚΕΣ. Θα προσπαθήσω να εξηγήσω πιο αναλυτικά την απορία μου χρησιμοποιώντας ένα παράδειγμα που ανέφερες:

"ο δείκτης ενός πίνακα δε μπορεί να είναι πραγματική μεταβλητή"

Ένας τρόπος να το καταλάβουμε αυτό, είναι ο εξής: "Ο δείκτης ενός πίνακα, ναι μεν είναι πραγματικός αριθμός, όμως δεν μπορεί να είναι οποιοσδήποτε πραγματικός αριθμός (π.χ. δεν έχει νόημα δείκτης 1.5 ή Τ_Ρ(2))."
Αν όμως όντως έτσι έχουν τα πράγματα, τότε ο δείκτης ενός πίνακα δεν μπορεί να είναι ούτε ακέραια μεταβλητή, διότι π.χ. δεν έχει νόημα δείκτης -1 ή -7!

Τα ερωτήματα αυτά με έχουν απασχολήσει αρκετά και προσπαθώντας να βρω κάποια εξήγηση που ξεφεύγει από το αδιέξοδο κατέληξα στο ότι:
"Η ΓΛΩΣΣΑ "καταλαβαίνει" μόνο δύο σύνολα αριθμών, τα Ζ και R. Όταν λοιπόν έχουμε να κάνουμε με μία μεταβλητή που παίρνει τιμές είτε σε όλο το Ζ είτε σε κάποιο γνήσιο υποσύνολο του Ζ (π.χ. στο Ν), τότε τη δηλώνουμε στις ΑΚΕΡΑΙΕΣ. Αλλιώς, (αν δηλαδή μπορεί να πάρει τιμές και στο R-Z) τη δηλώνουμε στις ΠΡΑΓΜΑΤΙΚΕΣ."

Ακόμη και έτσι όμως, υπήρχε πρόβλημα. Συγκεκριμένα, δεν μου φαινόταν καθόλου αυτονόητο το ότι "οποιαδήποτε μεταβλητή παίρνει τιμή απο μια έκφραση που περιέχει την πράξη της διαίρεσης  πρέπει να δηλώνεται πάντα στις ΠΡΑΓΜΑΤΙΚΕΣ μεταβλητές". Ο μέσος όρος δύο οποιονδήποτε άρτιων αριθμών είναι πάντα ακέραιος! Γιατί θα πρέπει ακόμη και σ' αυτή την περίπτωση να τον δηλώνουμε στις ΠΡΑΓΜΑΤΙΚΕΣ?

Με λίγα λόγια, όπως κι αν το έβλεπα, όσο κι αν προσπαθούσα να ξεκαθαρίσω τα πράγματα, πάντα παρέμεναν ασάφειες στο μυαλό μου (και παραμένουν και τώρα).

Laertis, ειλικρινά σ' ευχαριστώ και πάλι.

Μιχάλης

alkisg

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

Από πλευράς υλοποίησης/hardware όμως υπάρχουν λόγοι:
  • Η ταχύτητα των πράξεων: το i <-- i + 1 είναι πιο γρήγορο με ακέραιο παρά με πραγματικό. Ειδικά σε παλιότερες αρχιτεκτονικές οι ακέραιοι ήταν δεκάδες φορές πιο γρήγοροι.
  • Το μέγεθος των ακεραίων από πλευράς μνήμης, που συνήθως είναι πιο μικρό από τους πραγματικούς (όπως είπε και ο Laertis).
  • Η περιορισμένη ακρίβεια των πραγματικών: π.χ. ένας 64bit θετικός μπορεί να μετρήσει όλα τα νούμερα μέχρι το 2^64-1. Όμως ο αντίστοιχος πραγματικός λόγω της οργάνωσής του (βάση/εκθέτης κτλ) δεν μπορεί. Μπορεί μεν να μετρήσει μέχρι πολύ μεγαλύτερα νούμερα, αλλά όχι ένα-ένα με τη σειρά. Π.χ. ο επόμενος πραγματικός μετά το 1.000.000.000.000.000 μπορεί να είναι ο 1.000.000.000.000.017. Αυτό σε άλλες περιπτώσεις βολεύει (π.χ. αποστάσεις μεταξύ αστεριών - δεν μας ενδιαφέρουν τα λιγότερο σημαντικά ψηφία) ενώ σε άλλες δεν βολεύει (π.χ. ένας download counter).
Για λόγους όπως οι παραπάνω είναι απαραίτητο να υπάρχει διαφοροποίηση μεταξύ ακεραίων/πραγματικών στις typed γλώσσες προγραμματισμού. Ε, και αφού υπάρχουν και οι δύο τύποι, στη συνέχεια οι καλοί προγραμματιστές υπακούν στον αυτονόητο κανόνα: αν το φυσικό μέγεθος που περιγράφεις με κάποια μεταβλητή αντιστοιχεί σε ακέραιο, τότε χρησιμοποίησε ακέραιο, αλλιώς πραγματικό.

Στο παράδειγμα με τον μέσο όρο δύο αρτίων αριθμών, εφόσον είναι ρητά δοσμένο έτσι από το πρόβλημα για κάποιον συγκεκριμένο λόγο, εγώ θα έβαζα ακέραιο. Απλά επειδή η ΓΛΩΣΣΑ δεν μπορεί για να ξέρει ότι το αποτέλεσμα της διαίρεσης θα είναι ακέραιος και για να παρακαμφθεί το συντακτικό πρόβλημα θα χρησιμοποιούσα τη συνάρτηση Α_Μ:
α <-- Α_Μ((β+γ)/2)

Michael

Νομίζω πως κατάλαβα. Υπάρχουν οι παρακάτω δύο περιπτώσεις:

1. Αν κάποια μεταβλητή παίρνει τιμή από μια έκφραση που περιέχει α) διαίρεση, ή β) τις συναρτήσεις της ΓΛΩΣΣΑΣ: ΗΜ(Χ), ΣΥΝ(Χ), ΕΦ(Χ), Τ_Ρ(Χ), ΛΟΓ(Χ), Ε(Χ), τότε αυτή η μεταβλητή δηλώνεται πάντα στις ΠΡΑΓΜΑΤΙΚΕΣ, ανεξαρτήτως αν "εμείς ξέρουμε" ότι μπορεί να παίρνει μόνο ακέραιες τιμές. Το θέμα είναι ότι εμείς μπορεί να το ξέρουμε, η ΓΛΩΣΣΑ όμως όχι. Ένα ακόμη πιο ακραίο παράδειγμα από το προηγούμενο με το μέσο όρο δύο άρτιων: Έστω Ν ακέραιος. Οι συναρτήσεις ΛΟΓ(Χ) και Ε(Χ) είναι αντίστροφες, δηλαδή η σύνθεσή τους είναι η ταυτοτική συνάρτηση. Ισχύει λοιπόν ΛΟΓ(Ε(Χ))=Χ. Παρόλα αυτά, αν στον αλγόριθμο υπάρχει η εντολή εκχώρησης τιμής Κ<-ΛΟΓ(Ε(Ν)), τότε το Κ πρέπει να δηλωθεί στις ΠΡΑΓΜΑΤΙΚΕΣ, ακόμη κι αν σ' αυτή την περίπτωση όχι απλώς γνωρίζουμε ότι είναι "κάποιος" ακέραιος, αλλά γνωρίζουμε συγκεκριμένα και ποιος είναι αυτός ο ακέραιος.
(Ερώτηση: Στις προηγούμενες συναρτήσεις άφησα απ' έξω την Α_Τ(Χ). Έκανα καλά? Μου φάνηκε πιο λογικό ότι αν π.χ. το Ν είναι ακέραιος, τότε και το Κ που παίρνει τιμή από την Κ<-Α_Τ(Ν) θα πρέπει να δηλωθεί επίσης στις ΑΚΕΡΑΙΕΣ)

2. Σε διαφορετική περίπτωση (αν π.χ. η μεταβλητή εισάγεται απ' το χρήστη ή αν παίρνει τιμή από έκφραση που δεν περιέχει διαίρεση ή τις προαναφερθείσες συναρτήσεις), τότε τα πράγματα έχουν όπως τα είχα καταλάβει στην αρχή: "Η ΓΛΩΣΣΑ "καταλαβαίνει" μόνο δύο σύνολα αριθμών, τα Ζ και R. Όταν λοιπόν έχουμε να κάνουμε με μία μεταβλητή που παίρνει τιμές είτε σε όλο το Ζ είτε σε κάποιο γνήσιο υποσύνολο του Ζ (π.χ. στο Ν), τότε τη δηλώνουμε στις ΑΚΕΡΑΙΕΣ. Αλλιώς, (αν δηλαδή μπορεί να πάρει τιμές και στο R-Z) τη δηλώνουμε στις ΠΡΑΓΜΑΤΙΚΕΣ."

Ουφ... αυτά. Αν εξακολουθεί να υπάρχει κάποια παρανόηση από μέρους μου, παρακαλώ ενημερώστε με.

Πάντως παιδιά (και αλλάζοντας λίγο θέμα) σας χρωστάω ένα μεγάλο ευχαριστώ (εννοώ όλους τους συμμετέχοντες στο forum). Πριν από λίγο καιρό είχα ένα τσουβάλι απορίες πολλές από τις οποίες τώρα μου φαίνονται χαζές (π.χ. μετά το Αλλιώς_αν, γίνεται να κλείσουμε με Τέλος_αν, ή θα πρέπει αναγκαστικά να γράψουμε κάτι τόσο περιττό όπως S<-S). Μετά όμως από κάποιες ώρες περιήγησης στο forum διαβάζοντας παλιές συζητήσεις, οι περισσότερες απορίες είχαν γίνει καπνός. Απλά, τώρα σας ταλαιπωρώ με τα "υπολείμματα" (υπάρχουν και μερικά ακόμα, αν δεν έχω εξαντλήσει εντελώς τα όρια της υπομονής σας 8)).

alkisg

Παράθεση από: Michael στις 30 Αυγ 2007, 07:29:21 ΜΜ
(Ερώτηση: Στις προηγούμενες συναρτήσεις άφησα απ' έξω την Α_Τ(Χ). Έκανα καλά? Μου φάνηκε πιο λογικό ότι αν π.χ. το Ν είναι ακέραιος, τότε και το Κ που παίρνει τιμή από την Κ<-Α_Τ(Ν) θα πρέπει να δηλωθεί επίσης στις ΑΚΕΡΑΙΕΣ)

Η Α_Τ ουσιαστικά θα πρέπει να θεωρηθεί σαν δύο διαφορετικές συναρτήσεις: μία που παίρνει παράμετρο πραγματικό και επιστρέφει πραγματικό, και μία που παίρνει ακέραιο και επιστρέφει ακέραιο. Είναι λίγο περίεργο να έχουμε δύο συναρτήσεις με το ίδιο όνομα (function overloading λέγεται αυτό) αλλά θα ήταν ακόμα πιο περίεργο αν ο χρήστης έπρεπε να γράφει
ι <- Α_Μ(Α_Τ(κ))
επειδή η Α_Τ θα επέστρεφε πάντα πραγματικό...

Για τα υπόλοιπα καλά τα έχεις καταλάβει, να προσθέσω μόνο κανά δυο περιπτώσεις ακόμα:
2^2 => ακέραιος
2^-2 => πραγματικός
2^ι => πραγματικός, ακόμα κι αν το ι είναι θετικός ακέραιος, επειδή ο συντακτικός έλεγχος δεν μπορεί να ξέρει ότι το ι δεν είναι αρνητικός.
2/2 => πραγματικός

Δες και το https://alkisg.mysch.gr/help/?p=Egxeiridio, έχω συγκεντρώσει εκεί κάμποσους αντίστοιχους "προβληματισμούς"...

Michael

Μερικά σημεία που μου έκαναν εντύπωση στο link:

1. «Μία συνάρτηση χωρίς παραμέτρους δηλώνεται και καλείται χωρίς παρενθέσεις.»

Είχα φανταστεί μια περίπτωση για το πώς θα μπορούσε να υπάρξει συνάρτηση χωρίς παραμέτρους:

ΣΥΝΑΡΤΗΣΗ Σταθερή_συνάρτηση( ): ΑΚΕΡΑΙΑ
ΑΡΧΗ
  Σταθερή_συνάρτηση<-5
ΤΕΛΟΣ_ΣΥΝΑΡΤΗΣΗΣ

Δεν μπήκα όμως στη διαδικασία να αναρωτηθώ αν θα έπρεπε να υπάρχουν οι παρενθέσεις ή όχι, διότι νόμιζα ότι έτσι κι αλλιώς, συναρτήσεις χωρίς παραμέτρους δεν επιτρέπονται (στις εξετάσεις τουλάχιστον)…


2. «Μία διαδικασία χωρίς παραμέτρους δηλώνεται και καλείται χωρίς παρενθέσεις.»

Από παλιότερες συζητήσεις στο forum, νόμιζα ότι οι παρενθέσεις πρέπει να υπάρχουν (αναφέρομαι πάλι στις Πανελλαδικές)…

3. «Στους χαρακτήρες προκαλεί συνένωση.» (το +)

Για το συγκεκριμένο ομολογώ πως δεν είχα ιδέα. Δεν έχω συναντήσει ούτε μία άσκηση που κάνει χρήση αυτής της ιδιότητας… Για παράδειγμα, αν σε πίνακα Π[ 3 ] έχουμε αποθηκευμένους τους χαρακτήρες “A”, “E”, “Π”, οι εντολές

                          λέξη<- Π[ 1 ]+Π[ 2 ]+Π[ 3 ]+“Π”
                          ΓΡΑΨΕ λέξη

εκτυπώνουν “ΑΕΠΠ” ? Έχουμε δικαίωμα να κάνουμε κάτι τέτοιο στις εξετάσεις?


Άλλα ξεκίνησα να ρωτήσω, άλλα ρώτησα τελικά... anyway, κάποια άλλη στιγμή :).
Μιχάλης

alkisg

Να ξεκαθαρίσω καταρχάς ότι τα περιεχόμενα του link μιλάνε για το Διερμηνευτή, και όχι ακριβώς για τη ΓΛΩΣΣΑ. Η ΓΛΩΣΣΑ έχει ασάφειες επειδή δεν είναι τυπικά ορισμένη, ο Διερμηνευτής αναγκαστικά δεν μπορεί να έχει ασάφειες αφού πρόκειται για υλοποιημένο πρόγραμμα. Επομένως υπάρχουν διαφορές, και όταν αυτές εντοπίζονται, διορθώνονται στην επόμενη έκδοση του Διερμηνευτή. Π.χ. σε παλιότερες εκδόσεις έχει διορθωθεί το σύμβολο ανάθεσης τιμής (<- αντί για <--) κτλ, ενώ σε επόμενη θα διορθωθεί π.χ. η παράμετρος των ΗΜ(), ΣΥΝ() κτλ ώστε να δέχονται μοίρες αντί για ακτίνια (αυτό προκύπτει από το τετράδιο μαθητή).

Για τα (1) και (2) νομίζω ότι κάπου είχα δει σχετικό παράδειγμα στο βιβλίο. Το (3) δεν προκύπτει άμεσα από το βιβλίο, είναι υπό δημοψήφισμα (!) εδώ στο στέκι, και αν κάποια στιγμή κριθεί ότι δεν αντιστοιχεί με το βιβλίο θα αφαιρεθεί.

Michael

Για το (3) προσωπικά θα μου άρεσε να υπάρχει αυτή η δυνατότητα (αν βέβαια μιλήσω σαν υποψήφιος, ομολογώ πως για το συγκεκριμένο θα με ενδιέφερε αποκλειστικά και μόνο η γνώμη του διορθωτή που θα έπαιρνε στα χέρια του το γραπτό μου... ;)).

Συνεχίζω τη λίστα των αποριών μου με μια ερώτηση που αρχικά μπορεί να φανεί ελαφρώς παράξενη:
Έχουμε δικαίωμα να «βάζουμε» το χρήστη να αλληλεπιδράσει με τον αλγόριθμο μέσω ερωταπαντήσεων τύπου (Ναι/Όχι) ακόμη κι αν δεν ζητείται ρητά από την εκφώνηση? Για παράδειγμα:

Αλγόριθμος Θέμα
  Αρχή_Επανάληψης
    Εκτύπωσε “ Έτοιμος για την εισαγωγή των βαθμών?(Ναι/Όχι)”
    Διάβασε απ
  Μέχρις_ότου (απ=”Ναι”) ή (απ=”Όχι”)
  Αν απ=”Όχι” τότε
    Αρχή_επανάληψης
      Εκτύπωσε “ Εντάξει, θα περιμένω λίγο… μήπως τώρα είσαι έτοιμος?”
      Διάβασε απ
    Μέχρις_ότου απ=”Ναι”
  Τέλος_αν
……(κτλ)

Το παραπάνω ερώτημα προέκυψε όταν έλυνα το Θέμα 4, Εσπερινά 2005 (με τα 20 σχολεία που το καθένα αξιολογεί 5 άλλα):

Σε ένα πανελλήνιο σχολικό διαγωνισμό μετέχουν 20 σχολεία. Κάθε σχολείο αξιολογεί 5 άλλα σχολεία και δεν αυτοαξιολογείται. Η βαθμολογία κυμαίνεται από 1 έως και 10. Να γραφεί τμήμα αλγορίθμου που
α) να διαβάζει τα ονόματα των σχολείων και να τα αποθηκεύει σε μονοδιάστατο πίνακα Α 20 θέσεων, Μονάδες 2
β) να εισάγει αρχικά την τιμή 0 σε όλες τις θέσεις ενός δισδιάστατου πίνακα Β 20 γραμμών και 20 στηλών. Μονάδες 2
γ) Να καταχωρίζει στον πίνακα Β τη βαθμολογία που δίνει κάθε σχολείο για 5 άλλα σχολεία.
Σημείωση: Στη θέση i,j του πίνακα Β αποθηκεύεται ο βαθμός που το σχολείο i δίνει στο σχολείο j, όπως φαίνεται στο παράδειγμα που ακολουθεί. Μονάδες 6
δ) να υπολογίζει τη συνολική βαθμολογία του κάθε σχολείου και να την καταχωρίζει σε μονοδιάστατο πίνακα 20 θέσεων με όνομα SUM, Μονάδες 4
ε) να εμφανίζει τα ονόματα και τη συνολική βαθμολογία όλων των σχολείων κατά φθίνουσα σειρά της συνολικής βαθμολογίας. Μονάδες 6

Θα ασχοληθώ με το ερώτημα γ καθώς τα υπόλοιπα είναι μάλλον τετριμμένα. Φτάνοντας λοιπόν στο γ, ήρθα αντιμέτωπος με μια ασάφεια στην εκφώνηση (ή τουλάχιστον έτσι μου φάνηκε): Συγκεκριμένα, δεν διευκρινίζεται με ποια ακριβώς μορφή αναμένεται να εισαχθεί στον αλγόριθμο το κάθε «σχολείο-j» που αξιολογείται από το «σχολείο-i».
1) Μέσω του j (Διάβασε j)?
2) Μέσω «ολόκληρου» του «σχολείου-j», δηλ. του ονόματός του (Διάβασε σχολείο), οπότε θα έπρεπε να προηγηθεί και μία σειριακή στον Α[ 20 ]?
(Η Σημείωση της εκφώνησης όπως την καταλαβαίνω, δεν υποδεικνύει τίποτα από τα παραπάνω. Πρόκειται απλώς για μια απαραίτητη οδηγία-διευκρίνιση που θα έπρεπε να υπάρχει έτσι κι αλλιώς, ότι δηλαδή το «γέμισμα» των κελιών του Β[ 20,20 ] πρέπει να γίνει γραμμή προς γραμμή. Σε διαφορετική περίπτωση θα επιτρεπόταν αλγόριθμος ο οποίος π.χ. καταχωρεί τους βαθμούς που έδωσε το πρώτο σχολείο στην πρώτη γραμμή, ενώ τους βαθμούς που έδωσε το δεύτερο σχολείο τους καταχωρεί στη δεύτερη στήλη (κάτι που θα «έσπαγε» όλο το θέμα, ειδικά τα επόμενα ερωτήματα δ και ε θα έπαυαν να έχουν οποιοδήποτε νόημα).)

Η επιλογή μου ήταν να προσπαθήσω να ακολουθήσω μία όσο γίνεται πιο έμμεση και «διπλωματική» προσέγγιση. Συγκεκριμένα, ο χρήστης «σχολείο-i» δεν θα εισήγαγε ούτε όνομα ούτε αριθμό, αλλά ο ίδιος ο αλγόριθμος θα φρόντιζε σχεδόν για όλα, παρουσιάζοντάς του μόνο «νόμιμες» επιλογές. Η λύση μου (για την οποία ζητάω τη γνώμη σας) ήταν:

Για i από 1 μέχρι 20     ! ερώτημα γ.
  Εμφάνισε “Αρχή αξιολογήσεων από το σχολείο”, A[ i ]
  μ<-0
  Όσο μ<5 επανάλαβε
    j<-1
    Όσο (μ<5) και (j<=20) επανάλαβε
! Όταν το μ πάρει την τιμή 5 σταματάνε και οι δύο Όσο, ενώ αν μ<5 και το j πάρει την τιμή 21 η πρώτη Όσο συνεχίζει.
      Αν (i<>j) και (Β[i,j]=0) τότε
! i<>j ώστε να μην επιτραπεί αυτοαξιολόγηση. B[i,j]=0 ώστε να μην επιτραπεί και δεύτερη αξιολόγηση του ίδιου σχολείου.
        Αρχή_επανάληψης
          Εμφάνισε “Το σχολείο”, A[ j ], “είναι μεταξύ των 5 που θα αξιολογήσετε?(Ναι/Όχι)”
          Διάβασε απ
        Μέχρις_ότου απ=”Ναι” ή απ=”Όχι”
        Αν απ=”Ναι” τότε
          Αρχή_επανάληψης
            Εμφάνισε “Δώσε βαθμό”
            Διάβασε βαθ
          Μέχρις_ότου (βαθ>=1) και (βαθ<=10)
          B[i,j]<-βαθ
          μ<μ+1              ! έγινε αξιολόγηση
        Τέλος_αν
      Τέλος_αν
      j<-j+1
! Στη συνέχεια πήγαινε στην αρχή του εσωτερικού Όσο και ρώτα για το επόμενο σχολείο-j μέχρι να γίνουν 5 αξιολογήσεις ή μέχρι να
! εξαντληθούν τα 20 σχολεία.
    Τέλος_επανάληψης
! Τώρα, πήγαινε στην αρχή του εξωτερικού Όσο και έλεγξε την τιμή του μ. Αν μ=5 τότε το σχολείο-i έχει ολοκληρώσει τις αξιολογήσεις του
! οπότε σταμάτα. Αν μ<5, πάρε τον πίνακα των σχολείων από την αρχή και συνέχισε να ρωτάς μέχρι το (αναποφάσιστο) σχολείο-i να δώσει
! επιτέλους και την 5η και τελευταία αξιολόγησή του.
Τέλος_επανάληψης
! Και τώρα που ξεμπέρδεψες με το συγκεκριμένο σχολείο, πήγαινε στο επόμενο σχολείο-i.
Τέλος_επανάληψης

Ελπίζω να μην τα είπα πολύ μπερδεμένα…  έχω φτιάξει και μία παραλλαγή της λύσης με χρήση λογικής μεταβλητής, το «ζουμί» όμως παραμένει το ίδιο. Το θέμα είναι: Είχα δικαίωμα να το κάνω αυτό με τις ερωταπαντήσεις (Ναι/Όχι)?