ΕΡΩΤΗΣΗ ΣΤΗ ΣΤΟΙΒΑ

Ξεκίνησε από maryangel, 27 Φεβ 2022, 01:57:52 ΜΜ

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

maryangel

Καλησπέρα στην ομάδα,

μελετώντας τις λυμένες ασκήσεις στη στοίβα έχω μπερδευτεί: για ποιο λόγο χρησιμοποιείται μόνο η δομή επανάληψης ΑΡΧΗ_ΕΠΑΝΑΛΗΨΗΣ και ποτέ η ΓΙΑ; 
π.χ. Στη στοίβα Θ[50] υπάρχουν αποθηκευμένες οι θερμοκρασίες μιας ή περισσότερων ημερών του μήνα Ιουνίου, μία θερμοκρασία για κάθε ημέρα (...). Να αναπτύξετε τμήμα προγράμματος σε ΓΛΩΣΣΑ (...) εξετάζει (α) αν έχουν καταγραφεί θερμοκρασίες για όλες τις ημέρες του μήνα, οπότε υπολογίζει και εμφανίζει τη μέση θερμοκρασία του μηνός Ιουνίου (...)

Εγώ θα το έλυνα ως εξής: 
Αν top=30 τοτε 
   sum<--0
   για ι απο 1 μέχρι 30 
      sum<--sum+Θ[ι]
   τέλος_επανάληψης
   μο<--sum/30
   εμφάνισε μο
αλλιώς ....

Αντί αυτού στις λύσεις γράφει:
sum<--0
αν top=30 τότε
αρχή_επανάληψης
    αν top>=1 τότε
         χ<--Σ[top]
         sum<--sum+x
         top<--top-1
    τέλος_αν
μέχρις_ότου top=0
γραψε sum/30
αλλιώς ....

1. γιατί κάνει απώθηση ενώ δεν το ζητάει η εκφώνηση;
2. γιατί ελέγχει το top >=1 αφού είναι περιττός έλεγχος (δεδομένων των στοιχείων της άσκησης)
3. γιατί δεν χρησιμοποιείται η ΓΙΑ που είναι πολύ ευκολότερη; 

Ευχαριστώ πολύ εκ των προτέρων :) 


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

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

γράφω τι έχω καταλάβει στο πλαίσιο του μαθήματος ... στη δομή της στοίβας οι λειτουργίες που υποστηρίζονται είναι η ώθηση και η απώθηση ... η προσπέλαση όλων των στοιχείων (πρακτικά προσπαθώ να το γράψω) είναι "λειτουργία πίνακα" και όχι "λειτουργία στοίβας" ... άρα  (ξανά πρακτικά) για να χρησιμοποιοήσουμε ένα στοιχείο θα πρέπει να το κάνουμε όταν ωθείται ή απωθείται ... "διαθέσιμο στοιχείο"  είναι το Α[top] ανά πάσα στιγμή και όχι όλα τα στοιχεία 

maryangel

Ευχαριστώ πολύ για την άμεση απάντηση.

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

Επίσης, σύμφωνα με αυτά που λέτε, καταλαβαίνω το γιατί να κάνω απώθηση. Δεν μπορώ όμως να το κάνω με τη χρήση της ΓΙΑ;


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

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

gpapargi

Παράθεση από: maryangel στις 27 Φεβ 2022, 04:15:01 ΜΜΕυχαριστώ πολύ για την άμεση απάντηση.

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

Επίσης, σύμφωνα με αυτά που λέτε, καταλαβαίνω το γιατί να κάνω απώθηση. Δεν μπορώ όμως να το κάνω με τη χρήση της ΓΙΑ;


Καλημέρα

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

Αν κάνεις στατική υλοποίηση χρησιμοποιείς πίνακα, αλλά δεν κάνει να βλέπεις τον πίνακα γιατί τότε παύει να είναι στοίβα. Πχ αν η στοίβα υλοποιείται με τον πίνακα α[100], έχεις μέσα 50 στοιχεία και κάνεις προσπέλαση στο α[10] τότε δεν είναι ποια στοίβα. Για αυτό κανονικά ότι κάνεις στη στοίβα, πρέπει να το κάνεις με υποπρογράμματα (διαδικασίες) για ώθηση και απώθηση. Δυστυχώς η υλοποίηση στο βιβλίο έχει τις πράξεις χύμα μέσα στον κώδικα και δημιουργεί μπέρδεμα. Κανονικά θα έπρεπε να αγγίζει τη στοίβα μόνο με διαδικασίες. Δυστυχώς αυτοί που έγραψαν το συμπληρωματικό υλικό ήταν κατώτεροι της περίστασης (ειδικά στην υλοποίηση της ουράς που μπορεί να θεωρείται άδεια με ένα στοιχείο μέσα). Και έτσι γενννιώνται ερωτήματα της μορφής "να τα βγάλω όλα από τη στοίβα και μετά να κάνω μια και καλή top=0;". 
Η απάντηση που είναι πιο κοντά στο σωστό είναι να φανταστείς ότι τα βγάζεις με διαδικασία απώθησης. Και προσπάθησε να κάνεις το ίδιο στο κυρίως πρόγραμμα. Δεν "βλέπεις" τον πίνακα που φιλοξενεί τη στοίβα.

pgrontas

Παράθεση από: gpapargi στις 01 Μαρ 2022, 09:47:11 ΠΜΚανονικά θα έπρεπε να αγγίζει τη στοίβα μόνο με διαδικασίες. Δυστυχώς αυτοί που έγραψαν το συμπληρωματικό υλικό ήταν κατώτεροι της περίστασης (ειδικά στην υλοποίηση της ουράς που μπορεί να θεωρείται άδεια με ένα στοιχείο μέσα). Και έτσι γενννιώνται ερωτήματα της μορφής "να τα βγάλω όλα από τη στοίβα και μετά να κάνω μια και καλή top=0;".

Πολύ σωστά και για να το πάω ένα βήμα παρακάτω: τη στοίβα και την ουρά θα έπρεπε να την βλέπεις ως αντικείμενο, όπου είναι κρυμμένος εντελώς ο πίνακας και το top (ή τα front/rear στην ουρά) οπότε έτσι κι αλλιώς δεν θα μπορούσες να τα πειράξεις. Θα είχες μόνο μεθόδους ώθηση, απώθηση, είναι_άδεια κλπ.
Από εκεί θα έπρεπε να ξεκινούσε ο αντικειμενοστρεφής προγραμματισμός και όχι από θεωρητικά παραδείγματα που 'δήθεν' αξιοποιούν βιώματα των μαθητών.
Βέβαια πώς να το κάνεις αυτό με ψευδογλώσσα/ΓΛΩΣΣΑ;
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gpapargi

Παράθεση από: pgrontas στις 01 Μαρ 2022, 02:11:54 ΜΜΠολύ σωστά και για να το πάω ένα βήμα παρακάτω: τη στοίβα και την ουρά θα έπρεπε να την βλέπεις ως αντικείμενο, όπου είναι κρυμμένος εντελώς ο πίνακας και το top (ή τα front/rear στην ουρά) οπότε έτσι κι αλλιώς δεν θα μπορούσες να τα πειράξεις. Θα είχες μόνο μεθόδους ώθηση, απώθηση, είναι_άδεια κλπ.
Από εκεί θα έπρεπε να ξεκινούσε ο αντικειμενοστρεφής προγραμματισμός και όχι από θεωρητικά παραδείγματα που 'δήθεν' αξιοποιούν βιώματα των μαθητών.
Βέβαια πώς να το κάνεις αυτό με ψευδογλώσσα/ΓΛΩΣΣΑ;
Ναι Παναγιώτη. Λόγω  ΓΛΩΣΣΑΣ δε μίλησα για πλήρες κρύψιμο. Πάντως γίνεται και χωρίς αντικειμενοστραφή, αλλά μόνο με διαδικασιακό, αρκεί να έχεις δείκτες. Να βλέπεις το δείκτη στην πάνω θέση μόνο και τίποτε άλλο. Όχι στη ΓΛΩΣΣΑ όμως που έχει πίνακες. Κανονικά δεν έπρεπε να ξέρεις ούτε πόσα στοιχεία έχεις μέσα.

ApoAntonis

Νομίζω ότι καλύφθηκε, δεν θέλω να μπερδέψω κανέναν αλλά αν συναντήσουμε το παρακάτω, περνάει για στοίβα;

Κώδικας: ΓΛΩΣΣΑ
i <- top
ΓΙΑ top ΑΠΟ i ΜΕΧΡΙ 1 ΜΕ_ΒΗΜΑ -1  
  ΓΡΑΨΕ Α[top]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

και η βασική ερώτηση, ας πούμε ότι έχουμε υποερώτημα όπου ζητείται εμφάνιση και άδειασμα στοίβας, 3 μονάδες.
Παίρνει 3/3;

Λάμπρος Παπαδόπουλος

Δεν βρίσκω τον λόγο να κοπεί κάτι. 3/3

bagelis

Θα έλεγα παίρνει όλα τα μόρια αλλά συμφωνούμε όλοι ότι με το τέλος της ΓΙΑ η τιμή του μετρητή top είναι 0;

pgrontas

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

Από την άλλη δεν θα ήθελα να δω το ανάποδο

Για ι από 1 μεχρι 10
  στοιβα[ι] < - 0
Τέλος_επανάληψης

γιατί στην ώθηση πρώτα αυξάνεις μετρητή και μετά τοποθετείς.





Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

epsilonXi

καλά όλα αυτά που λέμε, αλλά:
ενδεικτικές λύσεις ασκήσεων, σελίδα 19, παράδειγμα με ουρά:

38 ΑΝ (αρχ > 1) ΚΑΙ (τελος = 30) ΤΟΤΕ
39    ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ αθρ
40       πινακας_επιθετων[i] <- πινακας_επιθετων[αρχ - 1 + i]
41    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
42    ΓΙΑ i ΑΠΟ αθρ + 1 ΜΕΧΡΙ τελος
43       πινακας_επιθετων[i] <- ""
44    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
45    αρχ <- 1
46    τελος <- αθρ
47 ΤΕΛΟΣ_ΑΝ

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

epsilonXi

πχ κάτι τέτοιο... (βιαστικά γιατί πρέπει να φύγω)
front <- 1
rear <- 0
όσο αρχ <= τελος επανάλαβε
  rear <- rear + 1
  oyra2[rear] <- πινακας_επιθετων[αρχ]
  αρχ <- αρχ + 1
τέλος_επανάληψης
αρχ <- 1
τελος <- 0
οσο front <= rear επαναλαβε
  τελος <- τελος + 1
  πινακας_επιθετων[τελος] <- oyra2[front]
  front <- front + 1
τέλος_επανάληψης
front <- 0
rear <- 0

gpapargi

Παράθεση από: ApoAntonis στις 03 Μαρ 2022, 10:07:44 ΠΜΝομίζω ότι καλύφθηκε, δεν θέλω να μπερδέψω κανέναν αλλά αν συναντήσουμε το παρακάτω, περνάει για στοίβα;

Κώδικας: ΓΛΩΣΣΑ
i <- top
ΓΙΑ top ΑΠΟ i ΜΕΧΡΙ 1 ΜΕ_ΒΗΜΑ -1  
  ΓΡΑΨΕ Α[top]
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

και η βασική ερώτηση, ας πούμε ότι έχουμε υποερώτημα όπου ζητείται εμφάνιση και άδειασμα στοίβας, 3 μονάδες.
Παίρνει 3/3;


Με αυτά που γράφει το βιβλίο δε νομίζω ότι μπορεί κανείς να κόψει τίποτα από πουθενά. Όλα πρέπει να τα δεχτούμε.
Τώρα ως προς την ουσία... ξέρεις πόσα στοιχεία έχεις μέσα (γι αυτό πας με ΓΙΑ). Σε μια δυναμική υλοποίηση κάποια στιγμή, ο top που είναι δείκτης και όχι ακέραιος, θα δείξει NULL και θα καταλάβεις ότι η ουρά άδειασε. ΕΔώ στηρίζεσαι στο ότι ξέρεις πόσα στοιχεία έχεις μέσα.
Τέλος πάντων, δεν είναι η πρώτη φορά που μια κακή παρουσίαση από το βιβλίο οδηγεί σε ατελείωτες ανούσιες συζητήσεις. Μετά από τόσο κόπο που έχει καταβληθεί στο παρελθόν για το μάθημα, θα έπρεπε να είνα πιο προσεκτικοί στο να μην εισάγονται νέες ασάφειες και κακογραμμένα σημεία στο συμπληρωματικό υλικό που υποτίθεται ήρθε μεταξύ άλλων και για να διορθώσει το υπάρχον βιβλίο.
Πόσο πιο σοβαρό θα ήταν το μάθημα αν υλοποιούσε κυκλική ουρά με rear<-rear mod size +1 και υλοποιούσε τις πράξεις με διαδικασίες!!!
Και πόσο λιγότερο κόπο θα καταβάλαμε!