ΜΕΤΑΤΡΟΠΗ ΑΠΟ ΕΜΦΩΛΕΥΜΕΝΗ ΣΕ ΠΟΛΛΑΠΛΗ ΕΠΙΛΟΓΗ

Ξεκίνησε από droopy, 01 Νοε 2007, 09:13:58 ΜΜ

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

droopy

ΒΡΗΚΑ ΣΕ ΕΝΑ ΒΟΗΘΗΜΑ ΤΟ ΠΑΡΑΚΑΤΩ:

ΑΝ Χ>0 ΤΟΤΕ
    ΑΝ Χ>5 ΤΟΤΕ
         Υ <-- 1
    ΑΛΛΙΩΣ
         Υ <-- 18
     ΤΕΛΟΣ_ΑΝ
ΑΛΛΙΩΣ
     Χ <-- Χ - 1
     ΑΝ Χ>=-5 ΤΟΤΕ
          Υ <-- 3
     ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ

ΚΑΙ ΑΝΑΦΕΡΕΙ ΟΤΙ ΑΥΤΗ Η ΕΜΦΩΛΕΥΜΕΝΗ ΔΟΜΗ ΕΠΙΛΟΓΗΣ ΔΕΝ ΜΠΟΡΕΙ ΝΑ ΓΡΑΦΕΙ ΜΕ ΤΗ ΧΡΗΣΗ ΤΗΣ ΔΟΜΗΣ ΑΝ...ΤΟΤΕ...ΑΛΛΙΩΣ_ΑΝ

ΟΜΩΣ ΝΟΜΙΖΩ ΟΤΙ ΜΕΤΑΤΡΕΠΕΤΑΙ ΩΣ ΕΞΗΣ:

ΑΝ (Χ>0) ΚΑΙ (Χ>5) ΤΟΤΕ
     Υ<--1
ΑΛΛΙΩΣ_ΑΝ (Χ>0) ΚΑΙ (Χ<=5) ΤΟΤΕ
     Υ<-- 18
ΑΛΛΙΩΣ_ΑΝ (Χ<=0) ΚΑΙ (Χ>=-5)
     Χ<--Χ-1
     Υ<--3
ΑΛΛΙΩΣ
     Χ<--Χ-1
ΤΕΛΟΣ_ΑΝ

ΕΧΕΙ ΚΑΠΟΙΟ ΛΑΘΟΣ Η ΜΕΤΑΤΡΟΠΗ ΑΥΤΗ?

ΑΝ ΟΧΙ, ΥΠΑΡΧΕΙ ΕΜΦΩΛΕΥΜΕΝΗ ΔΟΜΗ ΤΗΣ ΑΝ ΠΟΥ ΔΕΝ ΜΠΟΡΕΙ ΝΑ ΜΕΤΑΤΡΑΠΕΙ ΣΕ ΠΟΛΛΑΠΛΗ ΕΠΙΛΟΓΗ?

ΕΥΧΑΡΙΣΤΩ


alkisg

#1
Droopy, αν σε βολεύει, καλύτερα να γράφεις με μικρά, είναι πιο ευανάγνωστα.

Δεν βλέπω κανένα λάθος στη μετατροπή, πέρα από τις επαναλήψεις συνθηκών και εντολών.

Να ένα κομμάτι κώδικα που δεν μετατρέπεται σε πολλαπλή επιλογή:
Κώδικας: ΓΛΩΣΣΑ
ΔΙΑΒΑΣΕ θέση, όνομα
ΑΝ θέση <= Ν ΤΟΤΕ
  ΑΝ όνομα = ονόματα[θέση] ΤΟΤΕ
    ΓΡΑΨΕ 'Βρέθηκε το όνομα στη θέση ', θέση
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ


Δεν επιτρέπεται να βάλεις και τις δύο συνθήκες σε μία γραμμή γιατί αν η θέση είναι μεγαλύτερη από το Ν θα προσπαθήσεις να συγκρίνεις στοιχείο εκτός των ορίων του πίνακα. Αυτό λέγεται range error.

droopy

Αν τις βάλουμε σε μία γραμμή τότε:

Διάβασε θέση, όνομα
Αν (θέση<=Ν) ΚΑΙ (όνομα = ονόματα [Ν]) τότε
  εμφάνισε "βρέθηκε στη θέση", θέση
Τέλος_αν

Αν η θέση > Ν τότε δεν θα μπει μέσα οπότε δίνουν το ίδιο αποτέλεσμα.

Εκτός αν είναι κάτι άλλο που δεν κατάλαβα.

alkisg

Σόρρυ, το έγραψα λάθος, εννοούσα ονόματα[θέση].

Έστω ότι ο πίνακας έχει 10 στοιχεία (Ν=10) και μας δίνουν θέση=20.
ΑΝ (θέση <= Ν) ΚΑΙ (όνομα = ονόματα[θέση]) ΤΟΤΕ
ισοδυναμεί τότε με
ΑΝ (20 <= 10) ΚΑΙ (όνομα = ονόματα[20]) ΤΟΤΕ

Ο υπολογιστής, τρέχοντας την τελευταία γραμμή, θα προσπαθήσει να διαβάσει την 20ή θέση του πίνακα ονόματα (ονόματα[20]), η οποία δεν υπάρχει, και επομένως το πρόγραμμα θα κολλήσει.

Αν χρησιμοποιούσαμε εμφωλευμένη ΑΝ, τότε δεν θα "έμπαινε" στην δεύτερη ΑΝ και επομένως δεν θα προσπαθούσε να διαβάσει το ονόματα[20].

Κάνε και μια δοκιμή, τρέξε το παρακάτω στο Διερμηνευτή:
Κώδικας: ΓΛΩΣΣΑ
ΠΡΟΓΡΑΜΜΑ Δοκιμή 
ΜΕΤΑΒΛΗΤΕΣ 
  ΑΚΕΡΑΙΕΣ: Ν, θέση 
  ΧΑΡΑΚΤΗΡΕΣ: ονόματα[10], όνομα 
ΑΡΧΗ 
  Ν <- 10 
  θέση <- 20 
  όνομα <- 'Droopy' 
!Με εμφωλευμένη, τρέχει κανονικά 
  ΑΝ θέση <= Ν ΤΟΤΕ 
    ΑΝ όνομα = ονόματα[θέση] ΤΟΤΕ 
      ΓΡΑΨΕ 'Βρέθηκε το όνομα στη θέση ', θέση 
    ΤΕΛΟΣ_ΑΝ 
  ΤΕΛΟΣ_ΑΝ 
!Με πολλαπλή, δεν τρέχει 
  ΑΝ θέση <= Ν ΚΑΙ όνομα = ονόματα[θέση] ΤΟΤΕ 
    ΓΡΑΨΕ 'Βρέθηκε το όνομα στη θέση ', θέση 
  ΤΕΛΟΣ_ΑΝ 
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


Θα εκτελεστεί κανονικά η εμφωλευμένη, και στην πολλαπλή θα βγάλει σφάλμα
«Ο 1ος δείκτης του πίνακα «ονόματα» έχει τιμή «20», δηλαδή είναι εκτός ορίων.»

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

Juan

Παράθεση από: droopy στις 01 Νοε 2007, 09:13:58 ΜΜ
ΒΡΗΚΑ ΣΕ ΕΝΑ ΒΟΗΘΗΜΑ ΤΟ ΠΑΡΑΚΑΤΩ:

ΑΝ Χ>0 ΤΟΤΕ
    ΑΝ Χ>5 ΤΟΤΕ
         Υ <-- 1
    ΑΛΛΙΩΣ
         Υ <-- 18
     ΤΕΛΟΣ_ΑΝ
ΑΛΛΙΩΣ
     Χ <-- Χ - 1
     ΑΝ Χ>=-5 ΤΟΤΕ
          Υ <-- 3
     ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ

ΚΑΙ ΑΝΑΦΕΡΕΙ ΟΤΙ ΑΥΤΗ Η ΕΜΦΩΛΕΥΜΕΝΗ ΔΟΜΗ ΕΠΙΛΟΓΗΣ ΔΕΝ ΜΠΟΡΕΙ ΝΑ ΓΡΑΦΕΙ ΜΕ ΤΗ ΧΡΗΣΗ ΤΗΣ ΔΟΜΗΣ ΑΝ...ΤΟΤΕ...ΑΛΛΙΩΣ_ΑΝ

ΟΜΩΣ ΝΟΜΙΖΩ ΟΤΙ ΜΕΤΑΤΡΕΠΕΤΑΙ ΩΣ ΕΞΗΣ:

ΑΝ (Χ>0) ΚΑΙ (Χ>5) ΤΟΤΕ
     Υ<--1
ΑΛΛΙΩΣ_ΑΝ (Χ>0) ΚΑΙ (Χ<=5) ΤΟΤΕ
     Υ<-- 18
ΑΛΛΙΩΣ_ΑΝ (Χ<=0) ΚΑΙ (Χ>=-5)
     Χ<--Χ-1
     Υ<--3
ΑΛΛΙΩΣ
     Χ<--Χ-1
ΤΕΛΟΣ_ΑΝ

ΕΧΕΙ ΚΑΠΟΙΟ ΛΑΘΟΣ Η ΜΕΤΑΤΡΟΠΗ ΑΥΤΗ?

ΑΝ ΟΧΙ, ΥΠΑΡΧΕΙ ΕΜΦΩΛΕΥΜΕΝΗ ΔΟΜΗ ΤΗΣ ΑΝ ΠΟΥ ΔΕΝ ΜΠΟΡΕΙ ΝΑ ΜΕΤΑΤΡΑΠΕΙ ΣΕ ΠΟΛΛΑΠΛΗ ΕΠΙΛΟΓΗ?

ΕΥΧΑΡΙΣΤΩ



Νομίζω η μετατροπή σου δεν είναι σωστή. Το λάθος βρίσκεται στην τελευταία ΑΛΛΙΩΣ_ΑΝ. Αν το x είναι -5 το y δεν πρέπει να πάρει την τιμή 3. Θα το διόρθωνα ως εξής λοιπόν:

ΑΝ (Χ>0) ΚΑΙ (Χ>5) ΤΟΤΕ
     Υ<--1
ΑΛΛΙΩΣ_ΑΝ (Χ>0) ΚΑΙ (Χ<=5) ΤΟΤΕ
     Υ<-- 18
ΑΛΛΙΩΣ_ΑΝ (Χ<=0) ΚΑΙ (Χ-1>=-5) TOTE
     Χ<--Χ-1
     Υ<--3
ΑΛΛΙΩΣ
     Χ<--Χ-1
ΤΕΛΟΣ_ΑΝ

droopy


tsakmaki

Αν το διατυπώσουμε έτσι; Τότε δεν μετατρέπεται. Σωστά;
ΑΝ Χ>0 ΤΟΤΕ
    ΑΝ Χ>5 ΤΟΤΕ
         Υ <-- 1
    ΑΛΛΙΩΣ
         Υ <-- 18
     ΤΕΛΟΣ_ΑΝ
ΑΛΛΙΩΣ
     ΔΙΑΒΑΣΕ Χ
     ΑΝ Χ>=-5 ΤΟΤΕ
          Υ <-- 3
     ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ