METATΡΟΠΗ ΑΝ ΣΕ ΕΠΙΛΕΞΕ

Ξεκίνησε από droopy, 02 Ιαν 2009, 09:45:56 ΜΜ

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

droopy

ΚΑΛΗ ΧΡΟΝΙΑ ΣΕ ΟΛΟΥΣ.

Βρήκα σε ένα διαγώνισμα το παρακάτω θέμα:

Να ξαναγράψετε το παρακάτω τμήμα αλγορίθμου χρησιμοποιώντας την δομή Επίλεξε

Αν συνθήκη1 τοτε
     εντολες1
αλλιως
      αν συνθήκη2 τοτε
        εντολες2
      αλλιως
        εντολές3
      τελος_αν
τελος_αν

Αν η συνθήκη1 περιέχει διαφορετική μεταβλητή απο τη συνθηκη2, π.χ α>0 η συνθηκη1 και β>5 η συνθηκη2, πως θα μπορούσε να γίνει αυτή η μετατροπή?

Εκτος αν εννοείται ότι περιλαμβάνουν και οι δύο συνθήκες την ίδια έκφραση (δεν λέει κατι τετοιο βεβαια η εκφώνηση)

Επίσης, δίπλα στην επίλεξε τι θα βάλουμε???

Ευχαριστώ




sstergou

Το πρώτο πράγμα που μου ήρθε στο μυαλό είναι αυτό:

Κώδικας: Ψευδογλώσσα
Επίλεξε συνθήκη1
  περίπτωση Αληθής
    εντολές1
  περίπτωση αλλιώς
    Επίλεξε συνθήκη2
      περίπτωση Αληθής
        εντολές2
      περίπτωση αλλιώς
        εντολές3
    Τέλος_επιλογών
Τέλος_επιλογών

Καρκαμάνης Γεώργιος

Νομίζω droopy  πως κάτι δεν πάει καλά με την ερώτηση του διαγωνίσματος που βρήκες :
Ζητάει να γραφεί με μια εντολή Επίλεξε ή να γίνουν εμφωλευμένες Επίλεξε όπως απάντησε σωστά ο Στάθης;

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

Νομίζω υπάρχει μια ασάφεια στην διατύπωση.

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

Λίγα χρόνια καθυστερημένος  ;D υπάρχει σωστή απάντηση αλλά δεν θα την έβαζα σε Πανελλήνιες.
Βασίζεται στο ότι δεν επιτρέπεται να χρησιμοποίησουμε λογικούς τελεστές στο ΕΠΙΛΕΞΕ, αλλά μπορούμε να χρησιμοποιήσουμε = και <> για λογικές τιμές.

Οπότε το παράδειγμα :
Επίλεξε συνθήκη1
  περίπτωση Αληθής
    εντολές1
  περίπτωση αλλιώς
    Επίλεξε συνθήκη2
      περίπτωση Αληθής
        εντολές2
      περίπτωση αλλιώς
        εντολές3
    Τέλος_επιλογών
Τέλος_επιλογών


μπορεί να μετατραπεί σε μία μόνο επίλεξε ως εξής:
Επίλεξε συνθήκη1
  περίπτωση Αληθής
    εντολές1
  περίπτωση <> (συνθήκη2)
    εντολές2
  περίπτωση αλλιώς
    εντολές3
Τέλος_επιλογών


Η δυσκολία είναι στο να σκεφτείς ότι στην εντολή ΠΕΡΙΠΤΩΣΗ <> (συνθήκη2) ξέρεις ότι η συνθήκη1 είναι ψευδής οπότε για να σιγουρέψεις μια άλλη συνθήκη ότι είναι αληθής αρκεί να είναι διαφορή της συνθήκη1.

Γενικότερα μπορείς με τον παραπάνω τρόπο να μετατρέψεις οποιαδήποτε δομή πολλαπλής επιλογής σε δομή επίλεξε (καθιστόντας τες ισοδύναμες, αλλά όχι ισοδύναμη με εμφωλευμένα αν) όπως φαίνεται παρακάτω:

ΠΡΟΓΡΑΜΜΑ δοκιμη_επιλεξε
ΣΤΑΘΕΡΕΣ
  α = 2
  β = 3
  γ = 4
  δ = 5
  κ = 6
  λ = 7
ΑΡΧΗ
  ΑΝ α > β ΤΟΤΕ
    ΓΡΑΨΕ α + β
  ΑΛΛΙΩΣ_ΑΝ γ > δ ΤΟΤΕ
    ΓΡΑΨΕ γ*δ
  ΑΛΛΙΩΣ_ΑΝ κ > λ ΤΟΤΕ
    ΓΡΑΨΕ κ - λ
  ΑΛΛΙΩΣ
    ΓΡΑΨΕ α + δ + λ
  ΤΕΛΟΣ_ΑΝ

  ΕΠΙΛΕΞΕ α > β
    ΠΕΡΙΠΤΩΣΗ ΑΛΗΘΗΣ
      ΓΡΑΨΕ α + β
    ΠΕΡΙΠΤΩΣΗ <> (γ > δ) 
      ΓΡΑΨΕ γ*δ
    ΠΕΡΙΠΤΩΣΗ <> (κ > λ) 
      ΓΡΑΨΕ κ - λ
    ΠΕΡΙΠΤΩΣΗ ΑΛΛΙΩΣ
      ΓΡΑΨΕ α + δ + λ
  ΤΕΛΟΣ_ΕΠΙΛΟΓΩΝ

ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ δοκιμη_επιλεξε


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

epsilonXi

Γενικά δεν είμαι ούτε φανατικά κατά, ούτε φανατικά υπέρ της ΕΠΙΛΕΞΕ (είναι κανείς φανατικά υπέρ άραγε;  )... προσωπικά δε θα επέλεγα :P να τη χρησιμοποιήσω ποτέ, γιατί απλά βρίσκω ότι η ΑΝ μού επιτρέπει να εκφράσω ό,τι θελήσω να εκφράσω...

την ύπαρξή της μπορώ να τη δεχτώ ως μία «συντακτική διευκόλυνση» της γλώσσας, εφαρμόσιμη σε ειδικές περιπτώσεις, όπως ακριβώς θεωρώ και τη ΓΙΑ ως μία συντακτική διευκόλυνση (για πολύ πιο συχνές περιπτώσεις βέβαια)...

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

άπαπα

alkisg

Παράθεση από: Γιαννούλης Γιώργος στις 09 Νοε 2019, 10:20:40 ΠΜ
Χρησιμοποίησα σταθερές στο παραπάνω παράδειγμα γιατί στην υλοποίηση της γλώσσας στον διερμηνευτή της γλώσσας, δεν δέχεται να χρησιμοποιηθούν μεταβλητές, κάτι που (στο παρόν βιβλίο του 2019) δεν αναφέρεται στην ύλη.

Απ' όσο θυμάμαι, δεν είχα δει το συγκεκριμένο σημείο να ξεκαθαρίζεται στο βιβλίο και ακολούθησα την πεπατημένη της Pascal. Ο λόγος της απαγόρευσης μεταβλητών εκεί απ' όσο ξέρω είναι για ταχύτητα, οι compilers στην ΕΠΙΛΕΞΕ μπορούν να χρησιμοποιήσουν jump tables ή binary searches αντί για συνεχόμενες ΑΝ, επιταχύνοντας έτσι το παραγόμενο πρόγραμμα. Δηλαδή 100 ΑΝ θέλουν 100 χρονικές μονάδες εκτέλεσης ενώ μία ΕΠΙΛΕΞΕ με 100 περιπτώσεις πιθανώς μόνο 1 χρονική μονάδα.

https://en.wikipedia.org/wiki/Switch_statement#Compilation