Άσκηση Ουρές

Ξεκίνησε από akalest0s, 13 Φεβ 2020, 04:08:03 ΠΜ

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

akalest0s

1. Να γραφεί πρόγραμμα σε Γλώσσα, το οποίο θα δέχεται ως είσοδο μία ακολουθία χαρακτήρων από το χρήστη, ένα γράμμα κάθε φορά. Το πρόγραμμα θα χειρίζεται μια ουρά 10 θέσεων. Για κάθε χαρακτήρα '*' που διαβάζεται, θα πραγματοποιείται μία εξαγωγή, ενώ για κάθε άλλο χαρακτήρα, θα πραγματοποιείται η εισαγωγή του. Το πρόγραμμα θα σταματάει μόλις δοθεί ο χαρακτήρας του κενού από το χρήστη, οπότε και θα τυπώνει τα περιεχόμενα της ουράς, αδειάζοντάς την.
2. Έστω η ακολουθία χαρακτήρων:
FIRS*T*IN***FI*RS***T*OUT***** .
i) Ποια έξοδο θα πάρουμε, στο τέλος του προγράμματος, χωρίς ολίσθηση;
ii) Ομοίως, αν η ουρά υλοποιεί ολίσθηση;


Σαν πιο εξεζητημένο ερώτημα, εκτός λογικής διδακτικού πακέτου, μπορεί να μπει το:
iii) Ομοίως, αν η ουρά υλοποιεί αναδίπλωση στο τέλος του πίνακα (ή "χρησιμοποιεί κυκλική ουρά");


(Εμπνεύστηκα την άσκηση από την συνημμένη εικόνα, στο βιβλίο "Αλγόριθμοι σε C", R. Sedgewick.)
(υγ> φανταστικοί moderators... ένα υποφόρουμ για στοίβες/ουρές;)
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

akalest0s

και μια λύση..

Κώδικας: javascript
ΠΡΟΓΡΑΜΜΑ μο_ουρά_ακολουθία_χαρακτήρων
ΣΤΑΘΕΡΕΣ
  Ν = 10
ΜΕΤΑΒΛΗΤΕΣ
  ΧΑΡΑΚΤΗΡΕΣ: Q[Ν], input
  ΑΚΕΡΑΙΕΣ: f, r, i
ΑΡΧΗ
  f <- 0
  r <- 0
  ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ
    ΔΙΑΒΑΣΕ input
    ΑΝ input = '*' ΤΟΤΕ
      ΚΑΛΕΣΕ deq(Q, f, r) 
    ΑΛΛΙΩΣ_ΑΝ input <> ' ' ΤΟΤΕ !μην καλείς την enq για " "
      ΚΑΛΕΣΕ enq(Q, f, r, input) 
    ΤΕΛΟΣ_ΑΝ
  ΜΕΧΡΙΣ_ΟΤΟΥ input = " "

  ΑΝ f = 0 ΤΟΤΕ
    ΓΡΑΨΕ 'ουρά ήδη άδεια, δεν υπάρχουν στοιχεία να εξαχθούν'
  ΑΛΛΙΩΣ
    i <- f
    ΟΣΟ i <= r ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ Q[i] 
      ΚΑΛΕΣΕ deq(Q, f, r) 
      i <- i + 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    ΓΡΑΨΕ 'η ουρά άδειασε από όλα τα στοιχεία'
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΠΡΟΓΡΑΜΜΑΤΟΣ


!=================
ΔΙΑΔΙΚΑΣΙΑ enq(Π, f, r, input) 
ΣΤΑΘΕΡΕΣ
  Ν = 10
ΜΕΤΑΒΛΗΤΕΣ
  ΧΑΡΑΚΤΗΡΕΣ: Π[Ν], input
  ΑΚΕΡΑΙΕΣ: f, r, k, i
  ΛΟΓΙΚΕΣ: done
ΑΡΧΗ
  ΑΝ r = Ν ΤΟΤΕ
    ΑΝ f > 1 ΤΟΤΕ ! ΟΛΙΣΘΗΣΗ (μόνο για ερώτημα 2ιι)
      k <- 1
      ΓΙΑ i ΑΠΟ f ΜΕΧΡΙ r
        Π[k] <- Π[i] 
        k <- k + 1
      ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
      f <- 1
      r <- k
      ΚΑΛΕΣΕ enq(Π, f, r, input) 
 !  αναδρομή, ή αλλιώς:
 !   61.  r <- r + 1
 !   62.  Π[r] <- input
      done <- ΑΛΗΘΗΣ
    ΑΛΛΙΩΣ
      ΓΡΑΨΕ 'Ουρά γεμάτη' ! μ2θητή
      done <- ΨΕΥΔΗΣ
    ΤΕΛΟΣ_ΑΝ
  ΑΛΛΙΩΣ
    ΑΝ f = 0 ΤΟΤΕ
      f <- 1
    ΤΕΛΟΣ_ΑΝ
    r <- r + 1
    Π[r] <- input
    done <- ΑΛΗΘΗΣ
  ΤΕΛΟΣ_ΑΝ
  ΓΡΑΨΕ 'έγινε εισαγωγή: ', done
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
!=================
ΔΙΑΔΙΚΑΣΙΑ deq(Π, f, r) 
ΣΤΑΘΕΡΕΣ
  Ν = 10
ΜΕΤΑΒΛΗΤΕΣ
  ΧΑΡΑΚΤΗΡΕΣ: Π[Ν] 
  ΑΚΕΡΑΙΕΣ: f, r
  ΛΟΓΙΚΕΣ: done
ΑΡΧΗ
  ΑΝ f < r ΤΟΤΕ
    f <- f + 1
    done <- ΑΛΗΘΗΣ
  ΑΛΛΙΩΣ_ΑΝ f = r ΤΟΤΕ
    ΑΝ r = 0 ΤΟΤΕ
      ΓΡΑΨΕ 'ουρά ήδη άδεια'
      done <- ΨΕΥΔΗΣ
    ΑΛΛΙΩΣ
      f <- 0
      r <- 0
      done <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΑΝ
  ΓΡΑΨΕ 'έγινε εξαγωγή: ', done
ΤΕΛΟΣ_ΔΙΑΔΙΚΑΣΙΑΣ
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

gthal

Καλημέρα,
κάτι δεν κατάλαβα... η έξοδος που θα πάρουμε εξαρτάται από την υλοποίηση;
Φιλικά,
Γιώργος Θαλασσινός

Λαμπράκης Μανώλης

Καλημέρα σε όλους

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

Αν επιλογή = 'εξαγωγή' τότε
   αν πίσω=0 και εμπρός = 0  τότε
        γράψε 'άδεια'
   αλλιώς_αν εμπρός=πίσω τότε ! εδώ και το σχολικό μεταφέρει μπροστά τους δείκτες μιας που έχουμε ένα στοιχείο και θα αδειάσει η ουρά
         εμπρός<--0
         πίσω<--0
  Αλλιώς
        Για κ από εμπρός+1 μέχρι πίσω
           ουρά[κ-1]<--ουρά[κ]
        τέλος_επανάληψης
        εμπρός<--1
        πίσω<--πίσω-1
   Τέλος_αν
Τέλος_αν







Γιάννης Αναγνωστάκης

Παράθεση από: Λαμπράκης Μανώλης στις 13 Φεβ 2020, 09:27:27 ΠΜ
Καλημέρα σε όλους

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

Αν επιλογή = 'εξαγωγή' τότε
   αν πίσω=0 και εμπρός = 0  τότε
        γράψε 'άδεια'
   αλλιώς_αν εμπρός=πίσω τότε ! εδώ και το σχολικό μεταφέρει μπροστά τους δείκτες μιας που έχουμε ένα στοιχείο και θα αδειάσει η ουρά
         εμπρός<--0
         πίσω<--0
  Αλλιώς
        Για κ από εμπρός+1 μέχρι πίσω
           ουρά[κ-1]<--ουρά[κ]
        τέλος_επανάληψης
        εμπρός<--1
        πίσω<--πίσω-1
   Τέλος_αν
Τέλος_αν

Για μένα φίλε, πρέπει,να το ζητάει ακριβώς η εκφώνηση  ξεκάθαρα.



Λαμπράκης Μανώλης

Γιάννη ας ελπίσουμε ... γιατί αλλιώς θα δημιουργηθούν προβληματα .. πάντως πιστεύω πως σε όλες αυτές τι υλοποιήσεις δεν τίθεται θέμα "λάθους", τώρα δε βάζω και το χέρι μου στη φωτιά  >:D :police:

akalest0s

Παράθεση από: gthal στις 13 Φεβ 2020, 09:11:40 ΠΜ
Καλημέρα,
κάτι δεν κατάλαβα... η έξοδος που θα πάρουμε εξαρτάται από την υλοποίηση;
Αν η ουρά φτάσει στο τέλος του πίνακα, και δεν προβλέπεται ολίσθηση (ή άλλη ενέργεια), αυτό σημαίνει ότι όλες οι επόμενες εισαγωγές δεν θα γίνουν.
Αν η ουρά φτάσει στο τέλος του πίνακα, και προβλέπεται ολίσθηση, τότε, αν υπάρχει χώρος στο μπροστά μέρος, θα μπορέσουν τελικά να υπάρξουν εισαγωγές, που δεν μπορούσαν στην προηγούμενη περίπτωση.
Υπό αυτή την έννοια, ναι, μπορεί να υπάρξει διαφορετική έξοδος, εφόσον έχουμε διαφορετική υλοποίηση.

@Λαμπράκης Μανώλης και Γιάννης Αναγνωστάκης
Όπως ξέρετε καλά, οι χειρισμοί της κατάστασης, από πλευράς υπουργείου, είναι λανθασμένοι. Απλά λανθασμένοι. Λάθος χειρισμοί, δημιουργούν νέα λάθη με τη σειρά τους.
Φερειπείν, πολλοί λέμε να μπει η Python. Ξαναλέω, αν μπει με τον ίδιο τρόπο που μπήκε η Γλώσσα, δηλαδή κακώς ορισμένα, τότε μια τρύπα στο νερό θα πετύχουμε. Μόνο το ψώνιο ότι κάνουμε python θα μας μείνει. Και αυτό θα γίνει 20 χρόνια μετά την εισαγωγή του μαθήματος... τα σχόλια περιττεύουν.

Προφανώς, μια επίσημη εκφώνηση, θα έπρεπε να περιγράφει τι ακριβώς θέλει. Ωστόσο, όπως έχω ήδη θίξει, το διδακτικό πακέτο, out of nowhere, σε μια ξεκάρφωτη άσκηση (Ε6/34), παραθέτει μια υλοποίηση ολίσθησης, και μάλιστα ούτε καν στο αρχικό "συμπληρωματικό" βιβλίο, αλλά στις προτεινόμενες λύσεις, που "κάποια στιγμή" εστάλησαν. Είναι στον ορισμό/θεωρία των ουρών; όχι. Περιλαμβάνεται στο διδακτικό πακέτο; Ναι. Είναι αυτό αρκετό, για να το πάρουμε ως δεδομένο για μια εκφώνηση άσκησης; Take your chances...

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

Ακόμη και η κωδικοποίηση εισαγωγής και εξαγωγής, από τη στιγμή που περιγράφονται σε "Παραδείγματα" και όχι ορισμούς στο βιβλίο, (θα έπρεπε να) θεωρούνται υλοποιήσιμοι με πολλούς και διαφορετικούς τρόπους. Πολυπλοκότητα/απόδοση; εκτός. Άρα τι θα σου απαγορεύσει να τα λύσεις αλλιώς;
Μπορείς να είσαι σίγουρος, ωστόσο; Νομίζω τα δικά μου μάτια αρκετά έχουν δει ως τώρα, για να φυλάω τα ρούχα μου.. Εσείς, ως εμπειρότεροι, τι λέτε στους μαθητές σας;
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

tsak

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

Λαμπράκης Μανώλης

Ολίσθηση πραγματοποιεί στην προτεινόμενη λύση της άσκηση Ε.6 του συμπληρωματικού υλικού, δίχως να το αναφέρει κάπου στην εκφώνηση, κάτι που γενικά δημιουργεί ερωτηματικά ..

tsak

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

akalest0s

Παράθεση από: tsak στις 15 Φεβ 2020, 12:03:36 ΠΜ
Δεν έχω δει την Ε6
Όταν την δεις, θα καταλάβεις ότι το πρόβλημα εκεί βρίσκεται: ενώ παντού αποσιωπάται η λογική ολίσθησης, ξαφνικά στην Ε6 λύνει με αυτό το τρόπο, λες και είναι το πιο αναμενόμενο πράγμα. Και μάλιστα χωρίς να το ζητά στην εκφώνηση. Άρα, οι οδηγίες που παραθέτεις, είναι ικανές ή θα μας εκθέσουν στο τέλος;

Ιδού το κείμενο που συνοδεύει τη λύση της Ε6:
ΠαράθεσηΣημειώνεται ότι, κατά την επίλυση της άσκησης και δεδομένου ότι:
(α) εισέρχονται στην ουρά πολλοί πελάτες προς εξυπηρέτηση και
(β) εξέρχονται από την ουρά πολλοί πελάτες που εξυπηρετήθηκαν,
για να μην υπάρξουν κενές, μη αξιοποιήσιμες, θέσεις στην αρχή της ουράς, υλοποιείται ολίσθηση (shift) των περιεχομένων της ουράς (του πίνακα), ώστε οι κενές θέσεις προς εισαγωγή νέων πελατών να βρίσκονται στο πίσω μέρος της ουράς. Για την περίπτωση αυτή, ελέγχεται αν η τελευταία θέση της ουράς είναι γεμάτη και ταυτόχρονα υπάρχει διαθέσιμη (από προηγούμενη εξαγωγή στοιχείων) τουλάχιστον μία κενή θέση στην αρχή της ουράς. Τότε πραγματοποιείται ολίσθηση.
"Abstraction is not the first stage, but the last stage, in a mathematical development." MK
"I don't want to write about a high level thing, unless I fully understand about a low level thing" DK

tsak

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

Λαμπράκης Μανώλης

Παράθεση από: akalest0s στις 15 Φεβ 2020, 02:24:47 ΠΜ
Όταν την δεις, θα καταλάβεις ότι το πρόβλημα εκεί βρίσκεται: ενώ παντού αποσιωπάται η λογική ολίσθησης, ξαφνικά στην Ε6 λύνει με αυτό το τρόπο, λες και είναι το πιο αναμενόμενο πράγμα. Και μάλιστα χωρίς να το ζητά στην εκφώνηση. Άρα, οι οδηγίες που παραθέτεις, είναι ικανές ή θα μας εκθέσουν στο τέλος;

Καλημέρα σε όλους

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

pgrontas

#13
Παράθεση από: tsak στις 14 Φεβ 2020, 11:21:06 ΜΜ
Δεν καταλαβαίνω (διορθώσετε με αν κάνω λάθος) γιατί τόση κουβέντα περί ολίσθησης στην ουρά κλπ. Αφού και στην προτεινόμενη κωδικοποίηση και στο λυμένο παράδειγμα του συμπληρωματικού βιβλίου δεν δίνεται κάτι τέτοιο. Όντως η υλοποίηση που προτείνεται δεν είναι η ιδανική, αλλά νομίζω σπέρνουμε λίγο πανικό στην ήδη αινιγματική ας πούμε φετινή ατμόσφαιρα με την αυξημένη ύλη.

Θα συμφωνήσω. Προσωπικά θεωρώ την ολίσθηση στην επίλυση της περιβόητης άσκησης, ως τροφή για σκέψη, αφορμή για κάτι παραπάνω, ειδικά επειδή δεν ζητείται στην εκφώνηση, και επειδή δεν γίνεται κάθε φορά αλλά μόνο όταν η ουρά γεμίσει.
Και μάλιστα με αυτό το σκεπτικό δεν το θεωρώ άσχημη ιδέα που μπήκε. Για μένα χειρότεροι είναι οι τόσοι έλεγχοι εγκυρότητας που απομακρύνουν από τον στόχο μιας άσκησης, παρά μία διαφορετική προσέγγιση.
Ας μην είμαστε με το όπλο στο χέρι κάθε φορά που βλέπουμε κάτι διαφορετικό και ας μην θεωρούμε τα διδακτικά πακέτα (και τις λύσεις τους) ως ευαγγέλια...
Η 'επίσημη' υλοποίηση της ουράς παραμενει αυτή του βιβλίου Πληροφορικής (με όλα τα προβλήματα που έχει).
Ο κάθε ένας μας μπορεί να κάνει όποιες παραλλαγές θέλει για να προετοιμάσει καλύτερα, κατά τη γνωμη του, τους μαθητές του (ολίσθηση, κυκλική ουρά), αλλά αν οι θεματοδότες θέλουν κάτι διαφορετικό από την επίσημη υλοποίηση θα πρέπει να το περιγράψουν ρητά, μετατρέποντας έτσι το συγκεκριμένο ερώτημα σε μετατροπή αλγορίθμου από φυσική γλώσσα σε κωδικοποίηση.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

P.Tsiotakis

Παράθεση από: tsak στις 15 Φεβ 2020, 05:03:24 ΠΜ
Θα μπορούσε κάλλιστα να γίνει ένα ερώτημα στο Υπουργείο για το αν απαιτείται η γνώση της κυκλικής υλοποίησης τώρα που είναι νωρίς. Αν κάποιος έχει προσβάσεις ή ξέρει πού να αποταθεί, ας βοηθήσει.
δεν χρειάζεται να ερωτηθεί το υπουργείο, η υλοποίηση της κυκλικής ουράς δεν είναι γνώση που απαιτείται να γνωρίζουν οι μαθητές.

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