Πέμπτη 1 Οκτωβρίου 2015

Ο Πέτρος, ο λύκος και το πρόβατο! (Μ2000)

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

Παρακάτω είναι η αυτόματη επίλυση του προβλήματος, όπου ο Πέτρος, ο λύκος και το πρόβατο πρέπει να περάσουν το ποτάμι, αλλά δεν πρέπει να μείνουν μόνα τους ο λύκος και το πρόβατο.
(υπάρχει και πιο δύσκολο, αλλά εδώ είναι το απλό πρόβλημα...)
Χρησιμοποιούμε αντικείμενα για να διευκολυνθούμε στην ανάπτυξη της λογικής. Το κυρίως πρόγραμμα είναι στο Επανάλαβε { } Πάντα, το οποίο τελειώνει με άλμα στο 10000

Ο αλγόριθμος θα τερματίσει χωρίς να χρειάζεται να προκαθορίσουμε τα βήματα!

φορμα 60,30
\\ Τύπωσε $(4)   \\ βγάλε τα πρώτα \\  και θα έχεις Αναλογική γραφή στη Τύπωσε
οθονη 1 : Πενα 14
γενικό ενέργεια$(3), ιδιότητα$(2)
ενέργεια$(0)="Τρώει","Τρώγεται","Αδιάφορο"
ιδιότητα$(0)="Οδηγός","Επιβάτης"
κλάση άτομο {
όνομα$, τύπος$, ιδιότητα$
      τμήμα άτομο {
                  αν ταύτιση("S") τότε διάβασε .όνομα$
                  αν ταύτιση("S") τότε διάβασε .τύπος$
                  αν ταύτιση("S") τότε διάβασε .ιδιότητα$
      }
}
κλάση μέρος {
      όνομα$, υπάρχουν_άτομα
      πινακας ατομο()
      τμημα βάλε.άτομο {
            Διάβασε άτομο
            .υπάρχουν_άτομα++
             πίνακας .άτομο( .υπάρχουν_άτομα)
            .άτομο(.υπάρχουν_άτομα-1)=άτομο
      }
      τμημα μέρος {
            αν ταύτιση("S") τότε διάβασε .όνομα$
            .υπάρχουν_άτομα <= μέγεθος.σωρού
            αν .υπάρχουν_άτομα τότε {
                  πίνακας .άτομο(.υπάρχουν_άτομα)
                  ι=0 : ενώ όχι κενό { διάβασε .άτομο(ι) : ι++}
            }
      }
      Συνάρτηση Θα.βγει { Διάβασε Ποιος
           καθαρο υπολογισε
             αν .υπάρχουν_άτομα>2 τότε {
                  πίνακας α(2)
                        καθαρο κ
                        για ι=0 εως 2 {
                              αν ποιος<>ι τότε α(κ)=ι : κ++
                        }
                        \\ Τρώει -1
                        \\ Τρώγεται 0
                        \\ Αδιάφορο 1
                        για ι=0 εως 1 {
                        αν .άτομο(α(ι)).τύπος$=ενέργεια$(0) τότε {υπολογισε-=1
                        } αλλιώς.αν .άτομο(α(ι)).τύπος$=ενέργεια$(2) τότε υπολογισε+=1
                        }
                 }
          =υπολογισε>=0
      }
     συνάρτηση Βγάλε.άτομο {
            διάβασε ποιος
            = .άτομο(ποιος)
            αν ποιος+1<.υπάρχουν_άτομα τότε {
                  άλλαξε .άτομο(.υπάρχουν_άτομα-1), .άτομο(ποιος)
            }
            .υπάρχουν_άτομα--
            Πίνακας .άτομο(.υπάρχουν_άτομα)
      }

}


Γενική Θέση_επιβατών(3)
Θέση_επιβατών(0)=μέρος("Όχθη Α", άτομο("Πέτρος","Αδιάφορο","Οδηγός"),άτομο("λύκος","Τρώει","Επιβάτης"), άτομο("πρόβατο","Τρώγεται","Επιβάτης"))
Θέση_επιβατών(1)=μέρος("Βάρκα")
Θέση_επιβατών(2)=μέρος("Όχθη Β")
Πίνακας Προορισμός$(4)
Προορισμός$(0)="Προς Όχθη Β","Άφιξη στην Όχθη Β","Προς Όχθη Α","Άφιξη στην Όχθη Α"
Θέση_βάρκας=0 \\ από 0 έως 3


\\Διαμέσου Τύπωσε.Θέσεις()



επανάλαβε {


Αν θέση_βάρκας υπολοιπο 2 =1 τότε {
      τύπωσε "κατεβάζω από βάρκα"
      για Θέση_επιβατών(1) {
      τοπικη όχθη=0
      αν θέση_βάρκας =1 τότε όχθη=2
      τοπικη κ =.υπάρχουν_άτομα -1
       ενω κ>=0 {
            Θέση_επιβατών(όχθη).βαλε.άτομο .βγάλε.άτομο(κ)
            κ--
      }
                               θέση_βάρκας++ : αν θέση_βάρκας>3 τότε θέση_βάρκας=0
      }
}
Διαμέσου Τύπωσε.Θέσεις()
            Αν θέση_βάρκας=0 τότε {
                  πένα 12 {Τύπωσε "Χρειάζομαι Επιβάτη" }
                        \\όχθη=0
                        για Θέση_επιβατών(0) {
                              τοπικη κ
                              ενω κ<.υπάρχουν_άτομα {
                                    Αν .άτομο(κ).ιδιότητα$=ιδιότητα$(0) τότε { κ++ } αλλιώς έξοδος
                              }
                              Αν κ<.υπάρχουν_άτομα Τότε {
                              Τύπωσε "βρήκα επιβάτη! ";.άτομο(κ).όνομα$
                                     Θέση_επιβατών(1).βαλε.άτομο .βγάλε.άτομο(κ)
                              }
                        }
                  }


                  όχθη=0
                  αν θέση_βάρκας>1 τότε όχθη=2

                  για Θέση_επιβατών(όχθη) {
               αν όχθη=2 και .υπάρχουν_άτομα=3 τότε 10000
                        πένα 12 {Τύπωσε "Χρειάζομαι οδηγό" }
                        τοπικη κ
                        ενω κ<.υπάρχουν_άτομα {
                              Αν .άτομο(κ).ιδιότητα$=ιδιότητα$(1) τότε { κ++ } αλλιώς έξοδος
                        }
                        Αν κ<.υπάρχουν_άτομα Τότε {
                        Τύπωσε "βρήκα οδηγό, ο γνωστός ";.άτομο(κ).όνομα$
                               Θέση_επιβατών(1).βαλε.άτομο .βγάλε.άτομο(κ)
                               θέση_βάρκας++ : αν θέση_βάρκας>3 τότε θέση_βάρκας=0
                        }
                  }
Διαμέσου Τύπωσε.Θέσεις()
     Πλάγια 1: Τύπωσε "Πάτα ένα πλήκτρο" : Πλάγια 0
     α$=κομ$
     οθονη
} πάντα
10000 Τύπωσε "Όλοι έφθασαν σώοι!"
\\ εδώ κάνει έξοδο το πρόγραμμα..(με το που δει την Ρουτίνα.τερματίζει)


Ρουτινα Τύπωσε.Θέσεις()
\\ η λέξη ρουτινα εδώ δεν θέλει τόνο...γιατί την ψάχνει ο διερμηνευτής χωρίς τόνο
\\ οι τόνοι στο όνομα πρέπει να συμφωνούν με το όνομα στην ΔΙΑΜΕΣΟΥ
τοπικη κ
Για ι=0 έως 2 {
      για Θέση_επιβατών(ι) {
    πενα 7 { Τύπωσε "Θέση:"; .όνομα$}
            αν .υπάρχουν_άτομα τότε {
                  για κ=0 έως .υπάρχουν_άτομα-1 {τύπωσε .άτομο(κ).όνομα$;" ";}
                  τύπωσε
            } αλλιώς {
            Τύπωσε "Κανένας"
            }
         αν ι=1 τότε τύπωσε "Προορισμός:", Προορισμός$(θέση_βάρκας)
      }
}
Τελος Ρουτινας





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

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

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