Άσκηση στη Δομή Επανάληψης

Ξεκίνησε από kiro, 08 Δεκ 2005, 02:07:47 ΠΜ

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

kiro

Γεια σας!

Να σας ρωτήσω τη γνώμη σας για μια ακόμα άσκηση. Στο βιβλίο του Λαζαρίνη υπάρχει η  παρακάτω άσκηση με την εξής εκφώνηση

Να γράφει ο αλγόριθμος ο οποίος θα διαβάζει το βάρος ενός πλήθους από αντικείμενα σε τόνους, κιλά και γραμμάρια και θα υπολογίζει και θα εμφανίζει το συνολικό βάρος σε τόνους. Ο αλγόριθμος θα τερματίζει όταν το βάρος ενός αντικειμένου ξεπερνά τους δέκα τόνους.

Για λύση δίνει την εξής

Αλγόριθμος Βάρη
Άθροισμα ί 0
Πλήθοςί 0
     Αρχή_Επανάληψης
     Διάβασε τόνοι, κιλά, γραμμάρια
        Βαρος_τονοι ί τονοι + κιλα/1000+γραμμαρια/1000000
     Εμφάνισε ΄΄Βαρος σε τονους είναι΄΄, Βαρος_τονοι
                  Μέχρις_ότου Βαρος_τονοι <10
 Τέλος Βάρη
Το άθροισμα και το πλήθος δεν τα χρησιμοποιεί πουθενά. Για τον υπολογισμό του  Βαρος_τονοι δε θα ήταν πιο σωστό στην αρχή αντί για άθροισμα και πλήθσς να δηλώσουμε βάροςί 0 και μετά το διάβασμα να πούμε

Βαρος_τονοι ί βάρος + (τόνοι + κιλα/1000+γραμμαρια/10^6)


Και κάτι ακόμα για μια άλλη άσκηση. Στην άσκηση από το τετράδιο μαθητή,  κεφαλαίο 2ασκησηΔΣ3 είναι απαραίτητο μετά την επανάληψη να πάρουμε την περίπτωση που το πόσο που ξοδέψαμε είναι μεγαλύτερο του 5000;

αν εξοδα>5000 τοτε
εξοδαί εξοδα- τιμη
τελος_αν


Συγνώμη που ρωτάω συνεχεία για ασκήσεις απλά δεν μπορώ να πάρω την ευθύνη να πω στα παιδία ότι είναι λάθος μια άσκηση αν δεν είμαι 100%

Σας ευχαριστώ πολύ!

kiro

μαι διευκρινηση....το βελος δεν μπορω να το πετυχω  ::) και ειναι βαρος >10 και οχι μικροτερο

Laertis

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

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

Φιλικά
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

EleniK

Η ακριβής διατύπωση της άσκησης από το βιβλίο είναι η εξής:

Ν.γ.α. ο οποίος θα διαβάζει το βάρος ενός πλήθους από αντικείμενα σε τόνους, κιλά και γραμμάρια και θα υπολογίζει και θα εμφανίζει το συνολικό βάρος σε τόνους. Ο αλγόριθμος θα τερματίζει όταν το βάρος ενός αντικειμένου ξεπερνά τους 10 τόνους.

Εγώ από τη συγκεκριμένη άσκηση καταλαβαίνω ότι ζητάει το συνολικό βάρος όλων των αντικειμένων, αλλά ο αλγόριθμος τερματίζει όταν το βάρος ενός αντικειμένου ξεπερνα τους 10 τόνους. Έτσι θα την έκανα:

Αλγόριθμος Ασκηση
Sum <- 0
Αρχή_επανάληψης
Διάβασε τόνους, κιλά, γραμ
βάρος <- τόνους + κιλά/1000 + γραμ/10^6
Αν βάρος <= 10 τότε
Sum <- Sum + βάρος
τέλος_αν
μέχρις_ότου βάρος>10
Εμφάνισε Sum
Τέλος Άσκηση

Το πλήθος μπορεί να το υπολογίζει σε περίπτωση που θα ήθελε να εμφανίσει μήνυμα του τύπου:
Εμφάνισε 'Το συνολικό βάρος των', πλήθος, 'αντικειμένων είναι', Sum

Ελπίζω να βοήθησα.

Ελένη
Ελένη Κοκκίνου
Καθηγήτρια Πληροφορικής, ΠΕ19

P.Tsiotakis

Μια άλλη προσέγγιση με την χρήση της ισχυρότερης δομής επανάληψης Όσο, είναι η εξής:

Αλγόριθμος Ασκηση
  Sum <- 0
  βάρος <- 0
  Όσο βάρος <= 10 επανάλαβε
     Sum <- Sum + βάρος
     Διάβασε τόνους, κιλά, γραμ
     βάρος <- τόνους + κιλά/1000 + γραμ/10^6
  Τέλος_επανάληψης
  Εμφάνισε Sum
Τέλος Άσκηση

P.Tsiotakis

Για την ΔΣ3 Κεφ.2, στο βιβλίο μου παρουσιάζω την εξής προσέγγιση για την επίλυση τέτοιου είδους ασκήσεων:

Αλγόριθμος Πολυκατάστημα
  προϋπολογισμός <- 5000
  κόστος <- 0
  Διάβασε τιμή_προϊόντος
  Όσο κόστος + τιμή_προϊόντος <= προϋπολογισμός επανάλαβε
    κόστος <- κόστος + τιμή_προϊόντος
    Διάβασε τιμή_προϊόντος
  Τέλος_επανάληψης
  ρέστα <- προϋπολογισμός - κόστος
  Αποτελέσματα // κόστος, ρέστα //
Τέλος Πολυκατάστημα

Με ελεύθερο κείμενο: Όσο το συνολικό ποσό και η αξία του επόμενου προϊόντος δεν ξεπερνούν τον προϋπολογισμό, συνεχίζουμε την επανάληψη. Έτσι, δεν θα ξεπεραστεί η τιμή των 5000 !!

Η υλοποίηση με Μέχρις_ότου στην ιστοσελίδα
http://users.kor.sch.gr/ptsiotakis/aepp/aepp_tm_2.htm

Με εκτίμηση,

kiro

Η εκφώνηση της άσκησης είναι ακριβως :

Να γράφει ο αλγόριθμος ο οποίος θα διαβάζει το βάρος ενός πλήθους από αντικείμενα σε τόνους, κιλά και γραμμάρια και θα υπολογίζει και θα εμφανίζει το συνολικό βάρος σε τόνους. Ο αλγόριθμος θα τερματίζει όταν το βάρος ενός αντικειμένου ξεπερνά τους δέκα τόνους.  

Και η λύση που δίνει είναι

Αλγόριθμος Βάρη
Άθροισμα <- 0
Πλήθος <-0
     Αρχή_Επανάληψης
        Διάβασε τόνοι, κιλά, γραμμάρια
        Βαρος_τονοι <- τονοι + κιλα/1000+γραμμαρια/1000000
        Εμφάνισε ΄΄Βαρος σε τονους είναι΄΄, Βαρος_τονοι
   Μέχρις_ότου Βαρος_τονοι >10
 Τέλος Βάρη

Άρα η λύση όπως τη δίνει είναι λάθος; Εγώ πιστεύω πως ναι&#8230; τα δηλώνει να δεν τα χρησιμοποιεί πουθενά και δεν υπολογίζει και το συνολικό βάρος.

P.Tsiotakis


Προσωπικά, αντιλαμβάνομαι οτι αν βρεθεί βάρος φορτίου μεγαλύτερο από 10 τόνους πρέπει να τερματιστεί η επανάληψη και να μην προστεθεί αυτό. Σε αυτήν την περίπτωση η άσκηση είναι λυμένη λάθος.

Αν πρέπει να προστεθεί ως τελευταίο φορτίο τότε η άσκηση είναι σωστά λυμένη

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

Άλλη λάθος άσκηση έχεις ? Θα ήθελα να βάλουμε και κάποια από το βιβλίο μου, π.χ. την άσκηση με τις αμοιβάδες

Με εκτίμηση,

Sergio

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

Εκτιμώ ότι μία εναλλακτική διατύπωση της εκφώνησης θα μπορούσε να είναι:

Να γράφει ο αλγόριθμος ο οποίος θα διαβάζει το βάρος ενός πλήθους από αντικείμενα σε τόνους, κιλά και γραμμάρια, θα υπολογίζει το βάρος του κάθε αντικειμένου σε τόνους και θα το εμφανίζει. Ο αλγόριθμος θα τερματίζει όταν το βάρος του αντικειμένου που δίνεται ξεπερνά τους δέκα τόνους.

Ένα δεύτερο στοιχείο αναφορικά με τη συγκεκριμένη άσκηση που προβλημάτισε εμένα όταν τη διάβασα ήταν κατά πόσο το «αντικείμενο τερματισμού» (ή «φρουρός» αν μπορούμε να το ονομάσουμε έτσι) πρέπει:
1. να «πάρει μέρος» στην επεξεργασία ή
2. απλά να «δηλώσει το τέλος» της άσκησης

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

Στη δεύτερη περίπτωση όμως, θα πρέπει να χρησιμοποιήσει υποχρεωτικά τη δομή ΟΣΟ αφού η ΜΕΧΡΙΣ_ΟΤΟΥ θα εκτελέσει (εσφαλμένα) μία επανάληψη, ακόμη και αν δοθεί η τιμή που απλά σηματοδοτεί το τέλος της επανάληψης και άρα δεν πρέπει να υποστεί επεξεργασία.

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

Αν όμως δε βάλουμε περιορισμό στη «λογική» της εισόδου των στοιχείων, τότε ίσως υπονοείται η 1η περίπτωση αφού θα μπορούσε ο χρήστης να δώσει τιμές 9 (τόνοι), 2350 (κιλά), 1140 (γραμμάρια) οπότε, μόνο ο έλεγχος του πρώτου δεδομένου (τόνοι) δεν αρκεί αλλά θα πρέπει να γίνει η επεξεργασία τους που θα δώσει ως αποτέλεσμα 11,351140 πριν να είμαστε σε θέση να αποφασίσουμε ότι η επανάληψη πρέπει να τερματίσει.
Απ τη μια η θητεία μου σε σχολικές αίθουσες: να φλυαρώ - να ελπίζω πως κατι κατάλαβαν - να εξερευνώ - να μαθαίνω. Απ την άλλη, σχεδόν συνομήλικη, η Διδακτική της Πληροφορικής: ερευνά διαδικασίες μάθησης - φλερτάρει με την Ψυχολογία - με καλεί να αφήσω το βλέμμα του Πληροφορικού και να δω με τα μάτια του δασκάλου. Τέκνα των 2, οι απόψεις μου.. (προσαρμοσμένο από τον πρόλογο του βιβλίου "Το μακρόν Φυσική προ του βραχέως διδάσκω" του Ανδρέα Κασσέτα)

amanou

Γειά σας και από εμένα,

σχετικά με το αν μια τιμή τερματισμού επανάληψης πρέπει να συμμετέχει η όχι στους υπολογισμούς , το βιβλίο κάνει μια αναφορά στο Κεφάλαιο 8 όπου και αναφέρετε στην τιμή φρουρός. Σύμφωνα με το βιβλίο η τιμή αυτή πρέπει να είναι τέτοια που δεν πρέπει να υπολογίζεται στα αποτελέσματα. Οπότε θεωρώ ότι αν μια τιμή τερματίζει την επαναληπτική διαδικασία δεν θα πρέπει να συμμετέχει στους υπολογισμούς οπότε και θα πρέπει να υλοποιείται με την δομή Όσο , σε διαφορετική περίπτωση πρέπει η άσκηση να το αναφέρει ξεκαθαρα οπότε και να χρησιμοποιείται η Δομή Αρχή_επανάληψης. Πάντως πρέπει η άσκηση να αναφέρει ξεκάθαρα αν θα πρέπει η τιμή τερματισμού να συμμετέχει ή όχι, για να μην υπάρχουν διαφορετικές ερμηνείες.

Φιλικά,

Μανουσάκης Αντώνης
Ηλεκτρονικός Μηχ.
& Μηχανικός Υπολογιστών
Αντώνης Μανουσάκης

Ηλεκτρονικός και Μηχανικός Η/Υ

EleniK

Αγαπητέ συνάδελφε Αντώνη,

νομίζω ότι μπορείς να χρησιμοποιήσεις και τις δυο δομές επανάληψης είτε συμμετέχει η τιμή φρουρός είτε όχι. Ακόμα και στην Αρχή_επανάληψης χρησιμοποιώντας ένα Αν μπορείς να αποκλείσεις την τιμή τερματισμού (βλέπε απάντηση που έδωσα παραπάνω). Το θέμα είναι αν σου εξασφαλίζει η εκφώνηση ότι η ομάδα εντολών γίνεται τουλάχιστον μία φορά ή όχι. Και πάλι όμως υπάρχει τρόπος με το Αν. Απλά καλύτερη τακτική είναι όταν δεν συμμετέχει η τιμή -φρουρός να χρησιμοποιείς την Οσο.. επανάλαβε.

Ελένη
Ελένη Κοκκίνου
Καθηγήτρια Πληροφορικής, ΠΕ19

επισκέπτης

θέλω να ρωτήσω αν το παρακάτω τμήμα αλγορίθμου είναι εφικτό στην ΓΛΩΣΣΑ

για ι από 1 μέχρι 10
 γράψε ι
αν ι>5 τότε
ι<-- 11
τέλος_αν
τέλος_επανάληψης

EleniK

Νομίζω ότι το παραπάνω τμήμα είτε είναι σαν αλγόριθμος είτε είναι στη Γλώσσα είναι εφικτό.

Αυτό που θα κάνει είναι το ι να πάρει την αρχική τιμή 1. Στη συνέχεια θα το εμφανίσει και και αφού ι>5 είναι ψευδής το ι θα γίνει 2 κ.ο.κ. μέχρι το ι να γίνει 6. Τότε η συνθήκη είναι αληθής και το ι θα πάρει την τιμή 11 και μετά θα κάνει το βήμα ι <-- ι+1, οπότε το ι θα γίνει 12. Ελέγχοντας 12<=10 (δηλ. τη συνθήκη της επανάληψης) θα βγει ψευδής οπότε και θα σταματήσει.

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

Ελένη
Ελένη Κοκκίνου
Καθηγήτρια Πληροφορικής, ΠΕ19

επισκέπτης

Γνωρίζω ότι το συγκεκριμένο τμήμα αλγορίθμου πρόκειται για κακό προγραμματισμό και ότι σε τέτοιες περιπτώσεις πρέπει να χρησιμοποιούμε την (όσο) απλά είχα μια αντιπαράθεση με κάποιον που πιστεύει ότι το συγκεκριμένο δεν δουλεύει στον προγραμματισμό γενικά (σε κάποια άλλη γλώσσα προγραμματισμού δηλαδή) και άρα δεν δουλεύει και στην ΓΛΩΣΣΑ και αναρωτιέμαι αν κάτι τέτοιο τελικά ισχύει.

P.Tsiotakis


Στο διδακτικό πακέτο αναφέρεται ρητά οτι σε έναν βρόχο Για δεν πρέπει να αλλάζει η τιμή του μετρητή, η αρχική τιμή, η τελική τιμή, και το βήμα εντός του βρόχου...    (μεταξύ άλλων σελ 77 τετράδιο μαθητή)

Την τιμή του μετρητή την διαχειρίζεται η δομή Για

Αν θέλουμε κάτι άλλο δεν χρησιμοποιούμε την δομή αυτή, αλλά προτιμούμε άλλη