Γενικό Λύκειο > Δομές δεδομένων

Λάθη στις εκφωνήσεις και λύσεις των ασκήσεων στην ουρά και στην στοίβα

<< < (2/4) > >>

geprgia:
Στην άσκηση Ε5 του βιβλίου των Λύσεων:

Επαναλαμβάνεται 4 φορές το ίδιο κομμάτι κώδικα για καθένα από το 4 ταμεία.  Ωστόσο η εξυπηρέτηση του πελάτη δεν διαφοροποιείται από το ποιος τον εξυπηρέτησε ο 1ή ο 2 κτλ.  Περίπου 40 γραμμές κώδικα τσάμπα...

 
Η επιλεξε για την αύξηση των αντίστοιχων τιμών του πίνακα μετρητων έπρεπε να γίνει ως εξης:


 ΑΝ αρχ <> 0 ΚΑΙ τελος <> 0 ΤΟΤΕ
     ΑΝ αρχ = τελος ΤΟΤΕ
         ΓΡΑΨΕ 'Καλείται ο πελάτης με το νούμερο:', πελατες[αρχ]
         πελατες[αρχ] <- 0
        αρχ <- 0
        τελος <- 0
     ΑΛΛΙΩΣ
         ΓΡΑΨΕ 'Καλείται ο πελάτης με το νούμερο:', πελατες[αρχ]
         πελατες[αρχ] <- 0
        αρχ <- αρχ + 1
    ΤΕΛΟΣ_ΑΝ
        ΕΠΙΛΕΞΕ τ
          ΠΕΡΙΠΤΩΣΗ 1
                ταμεια[1] <- ταμεια[1] + 1
          ΠΕΡΙΠΤΩΣΗ 2
                 ταμεια[2] <- ταμεια[2] + 1
             .....
           ΤΕΛΟΣ_ΕΠΙΛΟΓΩΝ
 ΑΛΛΙΩΣ
 ΓΡΑΨΕ ' Δεν υπάρχει πελάτης να εξυπηρετηθεί...'
 ΤΕΛΟΣ_ΑΝ

geprgia:
Σε πολλές ασκήσεις που υλοποιούνται με ουρά και ζητείται πλήθος στοιχείων που εξάγονται-εξυπηρετούνται μέχρι να αδειάσει η ουρα, χρησιμοποιεί μετρητή ενώ θα μπορούσε καλύτερα να χρησιμοποιήσει τους δείκτες front και rear:

ΓΡΑΨΕ REAR-FRONT+1

Ομοίως και στις ασκήσεις με στοίβα  να τυπώσει απλά την τιμή της μεταβλητής top και όχι να βάζει μετρητη....

bugman:
Από την εμπειρία μου δίνω την παρακάτω συμβουλή:
Δεν χρειάζεται να γνωρίζει κάποιος πόσα στοιχεία έχει μια ουρά, απλά τις καταστάσεις: άδεια και γεμάτη (αυτή θεωρητικά μπορεί να μην μας νοιάζει, αλλά με πίνακες έχουμε όριο εισαγωγών). Παίζει ρόλο η συνθήκη που δείχνει πότε είναι άδεια μια ουρά, και πότε αυτή η συνθήκη είναι έγκυρη για να πάρουμε το αποτέλεσμά της.
Λογικά απομονώνουμε τις διαδικάσίες που χρησιμοποιούμε την ουρά, από το κώδικα του ζητήματος που χρησιμοποιεί την ουρά. Για το λόγο αυτό αν μας ενδιαφέρει ο αριθμός στοιχείων, χρησιμοποιούμε μεταβλητή ξεχωριστή, η οποία ανήκει στο κεντρικό πρόβλημα και όχι στο κώδικα της ουράς. Δηλαδή χρησιμοποιούμε μεταβλητή στο επίπεδο του ενδιαφέροντος. Αν το ζήτημα μας λέει κάπου να μετρήσουμε τα στοιχεία δεν θα μπούμε στην λογική υλοποίησης της ουράς για να εξάγουμε το αποτέλεσμα. Φυσικά θα μπορούσαμε να το κάνουμε αλλά η λύση του προβλήματος δεν θα έχει μια γενική μορφή αλλά θα εξειδικεύεται για τη συγκεκριμένη ουρά. Εδώ συμπίπετει η λογική αυτή με την απαίτηση της μη χρήσης γενικών μεταβλητών

Λόγω κακού σχεδιασμού της ΓΛΩΣΣΑΣ δεν υπάρχουν αντικείμενα τα οποία θα κρατούσαν τα rear και front ως ιδιωτικές μεταβλητές. Οπότε από εκεί προκύπτουν και οι λάθος "πονηρές" ιδέες.

geprgia:
Κατά την αποψη μου είναι μεγάλο λάθος να δίνεται ένας υποδειγματικος αλγόριθμος στο βιβλίο 2 και στις λύσεις να μην χρησιμοποιείται σχεδόν ποτέ!

Για την έξοδο στοιχείου από την ουρά το βιβλίο 2 ελέγχεται αν η ουρά είναι άδεια με την συνθήκη εμπρός=0 ΚΑΙ πίσω =0 .


Στις λύσεις όμως όταν ζητείται έξοδος όλων των στοιχείων ενω θα μπορούσε να ακολουθήσει την ίδια λογική, αλλάζει την συνθήκη τερματισμού με την εμπρός > πίσω βἀζοντας την επανάληψη εντός της ΑΝ όταν τα στοιχεία είναι πάνω από ένα. Σε αυτήν την παραλλαγή , οι δείκτες front και rear δεν μηδενίζονται μετα την εξαγωγή του τελευταιου στοιχείου όταν τα στοιχεία που εξάγονται είναι πάνω από 1, και έτσι  δεν μπορεί να χρησιμοποιήσει  για τερματισμό την συνθήκη  εμπρός=0 ΚΑΙ πίσω =0 .

Για να συμβάδιζε με το βιβλίο 2 , στο οποίο λογικά πρέπει να επικεντρωθουν οι μαθητές, θα μπορουσε απλά να έβαζε ένα loop με την συνθηκη του βιβλιου 2:

ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
AN εμπρός=0 ΚΑΙ πίσω =0 ΤΟΤΕ
   ΓΡΑΨΕ 'Άδεια ουρά'
ΑΛΛΙΩΣ
    ΓΡΑΨΕ ΟΥΡΑ[εμπρός]
     ΑΝ εμπρός=πίσω ΤΟΤΕ
         !υπάρχει μόνο ένα στοιχείο
         εμπρός<- 0
          πίσω<-0
    ΑΛΛΙΩΣ
        εμπρός<-εμπρός +1
   ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΑΝ

ΜΕΧΡΙΣ_ΟΤΟΥ (εμπρός=0 ΚΑΙ πίσω=0)

geprgia:

--- Παράθεση από: petrosp13 στις 18 Φεβ 2021, 03:21:29 μμ ---Η διαδρομή είναι μια, απλά επιβιβάζονται πολλά αυτοκίνητα και αυτό μετράει το πλήθος
Το μενού είναι για να επιλέξει ο χρήστης αν θα γίνει επιβίβαση ή αποβίβαση
Αν επιλέξει επιβίβαση, τότε υπάρχουν 2 περιπτώσεις για να ολοκληρωθεί
-Να μην υπάρχει άλλο αυτοκίνητο (γι'αυτό και η εμφωλευμένη ερώτηση)
-Να γεμίσει το πλοίο

--- Τέλος παράθεσης ---
Αν ηταν μια διαρδομή γιατι βάζει επαναληπτική δομή και όχι απλά μια επίλεξε ή μια πολλαπλή αν για να ελέγξει τις 2 περιπτώσεις;Δηλ θα μπουν τα αυτοκινητα στον πειραια , άρα  θα πατησει 1 , μετα Αίγινα προορισμος, έξοδος για όλα  θα πατήσει 2 και μετά 3 για έξοδο απ το πρόγραμμα. δηλ ακριβως μια φορά την καθε επιλογη με συγκεκριμενη σειρά 1>2>3. Αυτό δεν δικαιολογει την επανάληψη.

Η επανάληψη διακαιολογειται μονο όταν το δρομολόγιο εκτελείται πολλές φορές ...

Πλοήγηση

[0] Λίστα μηνυμάτων

[#] Επόμενη σελίδα

[*] Προηγούμενη σελίδα

Μετάβαση στην πλήρη έκδοση