Ο υπναράς μπαρμπέρης!

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Πήγαινε κάτω

Ο υπναράς μπαρμπέρης!

Δημοσίευση από m2000 Την / Το Κυρ Ιουν 12, 2016 2:51 am

\\ Sleeping barber problem
\\ Μ2000 code using green threads
\\ Το πρόβλημα του Κοιμώμενου Μπαρμπέρη!
\\ Στη Μ2000  μπορούμε να γράφουμε σε στατικές σε νήματα
\\ απ έξω ή από άλλο νήμα, αρκεί να ξέρουμε τον αριθμό του
\\ Επίσης τα νήματα σε ένα τμήμα βλέπουν ότι και το τμήμα όπου δημιουργήθηκαν (εκτός από τις στατικές)
Κατάσταση Θέσεις_Κουρείου
Πελάτες=0
Πελάτες_που_εξυπηρετήθηκαν=0
ΑΑ=0
ΑΑ_διακοπή=0
\\ νήμα του μπαρμπέρη:
\\ Δεν τις θέλουμε στατικές στο νήμα για να τις διαβάζουμε.
Ύπνος=Αληθές
Κουρεύει=0
Δουλειά=0
Δ_μεγιστο=0
\\ κεντρική επανάληψη
Κάθε 30 {
      ενημέρωσε_οθόνη()
      Αν Ύπνος Τότε {
            Αν Μήκος(Θέσεις_Κουρείου)>0 Τότε {
                  \\ βρες μικρότερο νούμερο
                  ΜΜ=ΑΑ+1
                  Που=0
                  Για ι=0 έως Μήκος(Θέσεις_Κουρείου)-1 {
                      Αν Θέσεις_Κουρείου(ι!)<ΜΜ Τότε που=ι : ΜΜ=Θέσεις_Κουρείου(ι!)
                  }
                  \\ Αφαιρούμε από την λίστα τον πελάτη
                  Αρ_Νήματος=Τιμή(Εκφρ$(Θέσεις_Κουρείου, που))
                  \\ και του στέλνουμε την αλλαγή κατάσταση
                  Αφαίρεση Θέσεις_Κουρείου, Αρ_Νήματος
                  Δες {
                        Νήμα Αρ_Νήματος Εκτέλεση Θέση_Αναμονής=-1
                  }
                  Αν λάθος=0 Τότε Ύπνος=Ψευδές : Κουρεύει=Αρ_Νήματος : Δουλειά=Τυχαίος(5,10)*10 : Δ_μεγιστο=Δουλειά
             }
      } Αλλιώς {
            Δουλειά--
            Αν δουλειά<0 Τότε {
                  Δες {
                        Νήμα Κουρεύει Εκτέλεση Κουρεμένος=Αληθές
                  }
                  Υπνος=Αληθές
            }
      }
      Αν πατημένο(49) Τότε έξοδος
      \\ με διάστημα βάζουμε νέο νήμα πελάτη
      Αν πατημένο(32) Τότε Πελάτης()
}
Νήματα Σβήσε
\\ βρίσκουμε πόσοι δεν εξυπηρετήθηκαν εντός κουρείου
ΑΑ_διακοπή+=Μήκος(Θέσεις_Κουρείου)
Μέθοδος Θέσεις_Κουρείου,"Garbagejob"
\\ βάζουμε και αυτόν που μισοκούρεψε
Αν Όχι ύπνος Τότε ΑΑ_διακοπή++
ύπνος=Αληθές
ενημέρωσε_οθόνη()
Τύπωσε "Τέλος"
Τέλος
Ρουτίνα Πελάτης()
      Νήμα {
      {
            Στατική Κουρεμένος=Ψευδές, Θέση_Αναμονής=0
            \\ 0 - περιμένει να πάρει ΑΑ
            \\ -1 - είναι για κούρεμα
            Αν Κουρεμένος Τότε {
                  Πελάτες_που_εξυπηρετήθηκαν++
                  Νήμα Αυτό Σβήσε
            } Αλλιώς.Αν Θέση_Αναμονής=0 Τότε {
                  Αν Μήκος(Θέσεις_Κουρείου)<3 Τότε {
                        \\ μπαίνει στην λίστα
                        Αν Δεν Υπάρχει(Θέσεις_Κουρείου, Ποιος_Είμαι) Τότε {
                                ΑΑ++ '' βγάζει νέο εισιτήριο
                               Προσθήκη Θέσεις_Κουρείου, Ποιος_Είμαι:=ΑΑ
                               Θέση_Αναμονής=ΑΑ
                         }
                  } Αλλιώς {
                        Νήμα Αυτό Σβήσε
                  }
            }
            }
      } Ως Κ Εκτέλεση Στατική Ποιος_Είμαι=Κ
      Πελάτες++
      Νήμα Κ Κάθε 300
Τέλος Ρουτίνας
Ρουτίνα ενημέρωσε_οθόνη()
      Οθόνη
      Πένα 15 {
      Τύπωσε "Μπαρμπέρης:";
      Αν Όχι Ύπνος Τότε {Τύπωσε μορφή$("Κουρεύει:{0:0}%", Δουλειά/Δ_μεγιστο*100)} Αλλιώς Τύπωσε "Κοιμάται"
      }
      Τύπωσε "Περιμένουν στο χωλ:";Μήκος(Θέσεις_Κουρείου)
      Τύπωσε "Πελάτες που έφυγαν:"; Πελάτες-ΑΑ+ΑΑ_διακοπή
      Τύπωσε "Πελάτες που εξυπηρετήθηκαν:";Πελάτες_που_εξυπηρετήθηκαν
      Τύπωσε "Συνολικά Εισιτήρια:";ΑΑ
      Τύπωσε "Εισιτήρια Επιστροφή:";ΑΑ_διακοπή
      Πένα 12 {
      Τύπωσε "Πάτα 1 για έξοδο ή Διάστημα για πελάτη"
      }
      Νηματα
      \\ ανανεώνουμε την οθόνη και ρυθμίζουμε την επόμενη σε 1 δευτερόλεπτο
      \\ αυτός ο χρόνος δεν θα περάσει ποτέ για να έρθει η ανανέωση
      \\ επειδή θα ξαναγίνει πιο γρήγορα. Απλά μεταθέτουμε την ανανέωση
      \\ για να μην συμβεί στο επόμενο ένα δευτερόλεπτο αν δεν θέλουμε!
      Ανανέωση 1000
Τέλος Ρουτίνας
avatar
m2000
Admin

Posts : 26
Join date : 10/06/2016
Age : 51
Location : Kanallaki Greece

http://m2000.forumgreek.com

Επιστροφή στην κορυφή Πήγαινε κάτω

Επισκόπηση προηγούμενης Θ.Ενότητας Επισκόπηση επόμενης Θ.Ενότητας Επιστροφή στην κορυφή


 
Δικαιώματα σας στην κατηγορία αυτή
Δεν μπορείτε να απαντήσετε στα Θέματα αυτής της Δ.Συζήτησης