Σάββατο 29 Αυγούστου 2020

Πρόγραμμα Εκμάθησης Προγραμματισμού: Μοίρασε τα Μήλα

 Η άσκηση:



Έχουμε 10 παιδιά σε έναν κύκλο, και θέλουμε να μοιράσουμε ένα καλάθι μήλα. Το καλάθι μπορεί να έχει από 7 έως 50 μήλα. Δίνουμε σε ένα οποιοδήποτε παιδί το καλάθι. Κάθε παιδί που παίρνει το καλάθι κρατάει ένα μήλο και δίνει το καλάθι στο επόμενο παιδί με μια φορά για όλα τα παιδιά. Μόλις τελειώσουν τα μήλα από το καλάθι πρέπει να μετρήσουμε πόσα μήλα πήραν τα παιδιά φτιάχνοντας μια ή δυο ομάδες. Μια ομάδα αν έχουν μοιραστεί δίκαια τα μήλα, δηλαδή κάθε παιδί πήρε ίδιο αριθμό μήλων, ή αν μερικά παιδά δεν πήραν καθόλου μήλα. Δυο ομάδες αν έχουν μοιραστεί σε μερικά παιδιά που πήραν λιγότερα μήλα από άλλα.

Θα εμφανίζουμε στην αρχή ένα λεκτικό "Υπολογισμός" στο κέντρο της γραμμής της κονσόλας της Μ2000.

Πρέπει να δείξουμε ένα πίνακα που θα λέει για κάθε ομάδα πόσα παιδιά πήραν πόσα μήλα και συνολικά πόσα μήλα πήραν.

Ως επικεφαλίδες ο πίνακας θα έχει κενό “”, “Παιδιά”, “Μήλα”, “Σύνολο”. Σε κάθε γραμμή του πίνακα θα εμφανίζουμε τα “Ομάδα1:” και “Ομάδα2:” (αν έχουμε παιδιά στην Ομάδα 2 αν όχι δεν θα εμφανίζουμε τη γραμμή αυτή).

Θα βρούμε και θα δείξουμε το σύνολο των μήλων στο καλάθι, από τα υπολογιζόμενα και θα δείξουμε αν επαληθεύεται το νούμερο με το αρχικό νούμερο του καλαθιού με το λεκτικό “Επαλήθευση:Σωστή”.

Τέλος αν έχουμε δίκαιη μοιρασιά θα το δείξουμε και αυτό με εμφάνιση του λεκτικού “Δίκαιη Μοιρασιά”.


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

Για το καλάθι θα χρησιμοποιήσουμε την Τυχαίος(7, 50) που δίνει έναν ακέραιο αριθμό από 7 έως 50.

Για τον πρώτο παιδί που θα πάρει το καλάθι θα χρησιμοποιήσουμε το Τυχαίος(1, 10) που δίνει έναν ακέραιο από 1 έως 10.

Για να προχωράμε το καλάθι στο επόμενο παιδί θα αυξάνουμε μια μεταβλητή Παιδί που χρησιμοποιούμε ως δείκτη στον πίνακα Μήλα() και αν η αύξηση γίνει μεγαλύτερη του 10 τότε θα βάζουμε την τιμή 1 για να γίνεται ο κύκλος όπως λέει η άσκηση.

Χρησιμοποιούμε μεταβλητές τύπου Διπλός (δηλαδή πραγματικός αν το δούμε στη ΓΛΩΣΣΑ του σχολείου).

Χρησιμοποιούμε για την εμφάνιση στη κονσόλα της Μ2000 την $(Κέντρο) που αλλάζει την εμφάνιση στην στήλη με οριζόντια στοίχιση στο κέντρο της στήλης. Η Τύπωσε Πάνω αφενός καθαρίζει όλη την γραμμή, και αφετέρου την χρησιμοποιεί ως μια στήλη. Έτσι η $(Κέντρο) βάζει το λεκτικό "Υπολογισμός". Επειδή η Τύπωσε Πάνω όπως και η Τύπωσε Μέρος δεν αλλάζουν γραμμή, θα βάζουμε μια Τύπωσε για αλλαγή γραμμής.

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

Μετά με μια επανάληψη για κάθε παιδί, βρίσκουμε το μικρότερο και το μεγαλύτερο στο πίνακα Μήλα().

Υπάρχουν τρεις περιπτώσεις.

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

Στην περίπτωση 2, θα χρησιμοποιήσουμε την πρώτη ομάδα, έτσι θα αντιγράψουμε το μεγαλύτερο στο μικρότερο. Επειδή το Ομάδα2 θα έχει τιμή 0, στο λογαριασμό που κάνουμε το δεύτερο μέρος θα είναι μηδέν: Ομάδα1*Μικρότερο+Ομάδα2*Μεγαλύτερο

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

Η περίπτωση 2 συμβαίνει όταν έχουμε Καλάθι με λιγότερα μήλα από 10.

Για την περίπτωση 3 το να δώσουμε πάλι το Μικρότερο=Μεγαλύτερο δεν μας χαλάει (αφού είναι ήδη ίσα). Η περίπτωση 3 συμβαίνει όταν έχουμε Καλάθι πολλαπλάσιο του 10 (από το 10).

Η περίπτωση 1 είναι η πιο συχνή περίπτωση όπου η ομάδα 1 έχει παιδιά με ένα μήλο λιγότερο από αυτά της ομάδας 2.

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

Κρατάμε την ΚαλάθιΑρχικό για να κάνουμε την επαλήθευση.




Τμήμα ΜοίρασεΜήλα {
      Σταθερη Κέντρο=2
      Πίνακας Μήλα(1 έως 10)
      Μικρότερο=Απειρο
      Μεγαλύτερο=0
      Ομάδα1=0
      Ομάδα2=0
      Καλάθι=Τυχαίος(7, 50)
      ΚαλάθιΑρχικό=Καλάθι
      Παιδί=Τυχαίος(1, 10)
      ΔίκαιηΜοιρασιά=Ψευδές
      Ενώ Καλάθι>0
            Μήλα(Παιδί)++ ' δίνω ένα μήλο
            Καλάθι-- ' αφαιρώ από το καλάθι
            Παιδί++ ' επόμενο παιδί
            Αν Παιδί>10 Τότε Παιδί=1 ' γυρνάμε στο πρώτο
      Τέλος Ενώ
      Τύπωσε Πάνω $(Κέντρο), "Υπολογισμός"
      Τύπωσε
      Για ι=1 έως 10
            Αν Μήλα(ι)<Μικρότερο Τότε Μικρότερο=Μήλα(ι)
            Αν Μήλα(ι)>Μεγαλύτερο Τότε Μεγαλύτερο=Μήλα(ι)
      Επόμενο
      ΔίκαιηΜοιρασιά=Μικρότερο=Μεγαλύτερο
      Αν Μικρότερο=Μεγαλύτερο ή Μικρότερο=0 Τότε
            Για ι=1 έως 10
                  Αν Μήλα(ι)=Μεγαλύτερο Τότε Ομάδα1++
            Επόμενο
            Μικρότερο=Μεγαλύτερο
      Αλλιώς
            Για ι=1 έως 10
                  Αν Μήλα(ι)=Μικρότερο Τότε Ομάδα1++
                  Αν Μήλα(ι)=Μεγαλύτερο Τότε Ομάδα2++
            Επόμενο
      Τέλος Αν
      Τύπωσε Μέρος $(Κέντρο),"","Παιδιά", "Μήλα", "Σύνολο"
      Τύπωσε
      Τύπωσε "Ομάδα 1:", Ομάδα1, Μικρότερο, Ομάδα1*Μικρότερο
      Αν Ομάδα2<>0 Τότε
            Τύπωσε "Ομάδα 2:",Ομάδα2, Μεγαλύτερο, Ομάδα2*Μεγαλύτερο
      Τέλος Αν
      Τύπωσε "Καλάθι:";Ομάδα1*Μικρότερο+Ομάδα2*Μεγαλύτερο
      Αν Ομάδα1*Μικρότερο+Ομάδα2*Μεγαλύτερο=ΚαλάθιΑρχικό Τότε
            Τύπωσε "Επαλήθευση:Σωστό"
      Τέλος Αν
      Αν ΔίκαιηΜοιρασιά Τότε Τύπωσε "Δίκαιη Μοιρασιά"
}
ΜοίρασεΜήλα


Γιώργος Καρράς


Υ.Γ.

Η άσκηση αυτή μπορεί να αντιγραφεί σε οποιαδήποτε γλώσσα από οποιονδήποτε, ελεύθερα!






Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.