Maikl Korleone Posted September 30, 2006 Report Share Posted September 30, 2006 мне задали задание по ООП, вот такое: Разработать программу, имитирующую жизнь пчелиной семьи. Пчелиная семья состоит из матки (пчелы, производящей женские яйцеклетки), трутней (производящих мужские яйцеклетки) и рабочих пчел. Каждая из пчел описывается индивидуальным номером, весом и возрастом. Каждая из пчел регулярно потребляет в пищу из общего хранилища запас меда, пропорциональный ее весу. Длительность жизни пчелы не превосходит некоторой максимальной величины. Умереть раньше этого срока пчела может от голода. Продуктивность матки зависит от количества общего запаса меда в улье. Продуктивность трутней колеблется случайным образом вокруг некоторой средней величины также в зависимости от общего запаса меда. Рабочие пчелы выполняют два типа работ – добычу меда и уборку улья от трупов мертвых пчел и переходят от одного вида работы к другому случайным образом. Количество добываемого и приносимого в общее хранилище каждой пчелой меда – случайно колеблющийся параметр. При уборке пчела способна вымести очередной труп, если его масса меньше массы выметающей пчелы. В противном случае пчела надрывается и умирает. Матка регулярно производит засев, который оплодотворяется трутнями. Маленькие пчелки появляются на свет через некоторый промежуток времени и сразу же способны выполнять свою работу в зависимости от того, кем они родились. Вероятности рождения матки, трутня и рабочей пчелы соотносятся как 1:5:20. Если рождается новая матка, то она вступает в схватку за лидерство со старой маткой. Побеждает та из них, у которой произведение массы на остаток времени жизни больше. Жизнь в улье прекращается, если вымерли все пчелы или при исчерпании объема улья для хранения накопленного меда семья улетает в поисках нового улья. к первой лабе надо написать основной класс, и я не долго думая решил написать класс пчелы: class Bee{protected:int number,weight,age; bool alive;public:Bee(int num);int getnumber(){return number;}; int getweight(){return weight;}; int getage(){return age;}; void Eat(int &hran); void die(){alive=false;}; virtual ~Bee(){};};//----------------------------------------------------------------------------Bee::Bee(int num){number=num;weight=random(11)+20;age=0;alive=true;};void Bee::Eat(int &hran){hran=hran-weight/4;}; только вот я не знаю как сделать чтобы пчела РЕГУЛЯРНО ела, и умрала через определенное время я поискал какие нибуть функции работы со временем, нашел только как получить текушее время, а тут я думаю надо что-то вроде таймера Link to comment Share on other sites More sharing options...
Shurr Posted September 30, 2006 Report Share Posted September 30, 2006 Для реализации периодических событий, зависящих от времени, обычно используется функция sleep(). Но ИМХО этим должен заниматься совсем не класс пчелы. Пчела должна уметь делать все, что описано в задании: рождаться (конструктор), есть, добывать мед, убирать других пчел и пр. - но все это должно быть в статике. Должны быть предоставлены соответствующие интерфейсы для управления пчелой. А управлять должен планировщик, который будет "дергать за ниточки" (вызывать соответствующие методы) один раз за один такт пчелиного времени. Изначально не стоит ориентироваться на реальное время - это совесем не константный параметр задачи. Ты пишешь модель, и для этого должен выбрать соответствующий уровень абстракции. Т.е. объекты-пчелы живут в своем абстрактном дискретном времени, единицей которого является один такт. А как будут соотноситься эти такты с реальным временем - решит планировщик. Если тебе нужно будет показать жизнь улья в реальном времени - значит он будет дергать методы жизнедеятельности улья раз в секунду, или еще как-нибудь, в зависимости от выбранного коэффициента ускорения. А если тебе нужно будет собрать статистику за сто тысяч тактов - можно будет просто прогнать их в цикле, без внедрения временных задержек. Link to comment Share on other sites More sharing options...
Maikl Korleone Posted October 1, 2006 Author Report Share Posted October 1, 2006 ну спасибо за подробный ответ Но ИМХО этим должен заниматься совсем не класс пчелы. а я вот сомневался по этому поводу, значит управление буду писать в планировщике, только вот мне еще не совсем понятно, как писать этот планирощик? Link to comment Share on other sites More sharing options...
Shurr Posted October 1, 2006 Report Share Posted October 1, 2006 Смотри. Есть класс пчелы. У него есть базовые методы: рождение, кормежка, смерть. Есть три наследника: рабочая пчела, трутень и матка. У каждого из них есть свои методы, описывающие присущие только им аспекты жизнедеятельности: рабочая пчела может добывать мед и убирать трупы, матка - проводить засев и проводить схватку с соперницей, трутни - оплодотворять. Это все - методы этих классов. Дальше. Есть класс улей, который описывает состояние улья: количество запасенного меда, текущая пчела-матка, список неубранных трупов пчел, список отложенных и оплодотворенных яиц и пр. Пчелы знают об улье, в котором они живут, и могут с ним взаимодействовать, т.е. вызывать его методы. Я бы еще выделил в отдельный класс пчелиную семью. Он бы хранил список всех пчел в семье и отвечал бы за их жизнедеятельность. Также можно сделать класс яйца, котое может быть оплодотворенным либо нет. Рассмотрим подробнее взаимодействие объектов. Что делает пчела, когда она ест? Она вызывает метод улья, запрашивая определенное количество меда. Если улей выдает ей необходимое количество - голод утолен. Если нет - пчела умирает, устанавливая у себя соответствующий флаг. Как рабочая пчела выполняет работу? Если работа - добыча меда, то определяется количество принесенного меда, и затем пчела вызывает метод улья, добавляя в него соответствующее количество меда. Если работа - уборка трупов, то пчела запрашивает у улья один из трупов. Проверяет необходимые условия, и либо убирает труп, сообщая улью о том, что данный труп убран, либо умирает. Как матка кладет яйца? Она порождает классы яиц и добавляет их в улей. Также у в конструкторе матки определено соперничество с существующей маткой: при рождении она запрашивает у улья текущую матку, производит расчет "схватки", и либо умирает, либо сообщает текущей матке о ее смерти, а улью - о том, что в нем новая матка. Как трутень оплодотворяет яйца? Запрашивает у улья неоплодотворенные яйца в количестве, которое он может оплодотворить, и устанавливает у них флаг оплодотворенности. Дадим каждому из активных объектов метод nextTact(), который будет обозначать один такт жизни объекта. Рассмотрим один такт жизни абстрактной пчелы, без специализации. Что делает ее метод nextTact()? 1. Пчела должна поесть. 2. Проверяется возраст пчелы. Если он достиг критической отметки - пчела умирает. Теперь рассмотрим дополнительные действия, которые делают пчелы. Рабочая пчела должна выполнить работу. Работа выбирается случайным образом из двух вариантов: сбор меда, улу уборка трупов. Дополнительные действия, совершаемые маткой состоят в том, что она кладет яйца, т.е. порождает классы яиц и добавляет их в улей. Трутень - запрашивает у улья определенное количество яиц и оплодотворяет их, т.е. устанавливает у них признак оплодотворенности. Что делает улей. Каждый такт он смотрит список яиц, выбирает оплодотворенные яйца и "вылупливает" из них пчел, т.е. создает соответствующие классы. Семья. Каждый такт класс семьи пробегает по списку всех пчел, и вызывает их метод nextTact(). Пчела, соответственно ест, работает, проводит засев или что там она делает, короче проживает один такт. Дальше класс семьи вызывает метод nextTact() улья. Рожаются новые пчелы, добавляются с общий список пчел. Если количество пчел превышает вместимость улья - жизнедеятельность прекращается. Если количество пчел равно нулю - тоже. Все. Модель готова. Что остается сделать планировщику? 1. Начальная инициализация. Создается семья, улей, начальные пчелы, задается количество меда в улье и пр. 2. Начинается жизнь. Планировщик раз за разом вызывает метод nextTact() класса-семьи, и наблюдает за результатами. Если тебе надо показать жизнь пчелиной семьи визуально - после каждого вызова ты отображаешь мгновенную сатистику: сколько меда в улье, сколько каких пчел, кто чем занимается в данный момент и пр. Дальше делаешь sleep() на полсекунды, снова дергаешь метод nextTact(), отображаешь статистику и пр. Если же тебе надо собрать статистику за определенный промежуток времени - ты в прогоняешь цикл, дергая метод nextTact() нужное количество раз. Затем можно вывести статистику за указанный промежуток времени: количество пчел, рожденных в улье, среднее время жизни пчелы в зависимости от типа пчелы, среднее количество приносимого меда, оплодотворяемых яиц, процент пчел, умерших от голода, надорвавшихся на работе... Короче все, что попросит буйная фантазия преподавателя и твоя, если тебе это будет интересно. P.S. Я руководствовался предположением, что все описанные действия происходят каждый такт времени. Если какое-то из действий занимает больше одного такта - надо ввести соответствующие счетчики тактов. Например, полет за медом может отбирать у пчелы три такта, а засев - пять тактов и пр. Link to comment Share on other sites More sharing options...
Maikl Korleone Posted October 3, 2006 Author Report Share Posted October 3, 2006 спасибо тебе Shurr огомное, сегодня сдал две лабы не без помощи твоих ответов. Сейчас вроде вопросов пока нет, работаю над реализацией. Спасибо еще раз! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now