VB и коровы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

VB и коровы

Сообщение Георгий2 » 23.03.2006 (Чт) 21:40

Уважаемые, помогите пожалуйста начинающему фермеру!

Позарез требуется расчитывать поголовье стада через N лет по параметрам:
всего голов, количество сеголеток, количество двухлеток, количество трехлеток, количество лактирующих коров - можно считать что первый раз корова начинает давать молоко в: возраст первой случки (540 дней)+ продолжительность беременности(280 дней), то есть все коровы старше 820 дней считаются лактирующими.

Я немного разбираюсь в VB, во всяком случае настолько что по приведённой формуле-алгоритму смогу сам написать програмку, но вот сообразить алгоритм чего-то клинит, путаюсь в мешанине всех разновозрастных поколений.

Нкол – начальное количество коров
Пбер – продолжительность беременности(280 дней)
Всл – возраст первой случки (540 дней)
Кпот – количество потомства (для коров – 1телёнок)

Заранее всем благодарен!

Георгий

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 23.03.2006 (Чт) 22:18

Не достаточно данных. Какой возраст у исходных коров? Как часто их покрывают быки? Рождаются только тёлки или бычки тоже? Коровы живут вечно? Беременеют сразу же после родов?

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

VB и коровы

Сообщение Георгий2 » 23.03.2006 (Чт) 22:25

Спасибо за быстрый ответ!

Возраст исходного стада > 820 дней, то есть все лактирующие. Условно считаем что что покрываются и беременнеют все коровы, рождаются только телки, живут неважно сколько, я хочу объяснить что все эти подробности я доработаю сам если ухвачу основную идею алгоритма.
Я заканчиваю сегодня бизнес-план для спонсора, неделю можно сказать не спал, в голове как бетоном залили, в обычной ситуации я бы не беспокоил, сам бы сообразил, но завтра в 18:00 встреча с о спонсором, сегодня ночью должен закончить но отупление полное!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.03.2006 (Чт) 22:44

Я бы посоветовал не постигать VB за один вечер, а решить задачу в Excel.
Lasciate ogni speranza, voi ch'entrate.

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 23.03.2006 (Чт) 23:01

Так, уважаемый alibek, проблема не в знании/незнании языка VB, а в неспособности сообразить алгоритм, а в VB я хоть и ламер, но не настолько чтоб подобный алгоритм не смочь реализовать. Так что как говорят, не учите меня жить, лучше помогите материально :). Вы не обижайтесь, но ваш совет похож на совет хорошенько изучить английский когда кому-то понадобилось перевести 1 слово и он вас спрашивает как перевести это слово.

Так что при моей сегодняшней тупости и Excel мне не поможет! :oops:

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 23.03.2006 (Чт) 23:22

Я оправдывая своё звание порассуждаю немного. Т.к. я не математик, то мои рассуждения будут дилетанскими, пространными и не формализованными. Подтянутся математики и причешут. Итак,

Пусть возраст всех коров исходного стада Висх известен и одинаков, следующая беременность наступает сразу же после родов, рождается ровно одна тёлка и первый раз беременеет через 540 дней, а продолжительность беременности 280 дней. Тогда:
Одна исходная корова за период П родит всего Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) тёлок (Вкон - возраст коровы на конец периода). Потомство каждой рождённой тёлки будет рассчитываться так же, но т.к. Висх всегда для них равен 0, то вычитаемое тоже равно 0.

ЗЫ: Вроде бы рекурсия напрашивается. Дорассуждаю позже (сейчас надо отвлечся на другое), где-то через час-полтора. А, быть может, и не потребуется, если уже данный топик наведёт автора на правильные мысли.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 24.03.2006 (Пт) 2:21

И, вроде бы, на этом всё.

Далее в цикле по кол-ву вновь родившихся тёлок вызываем ту же функцию, но с новым, более молодым, стадом и т.д. до полной победы. Нужно только переопределить на для нового стада возраст на конец периода. В итоге должны получить общее стадо на конец периода. Если возраст всех коров заносить в массив, то после выполнения функции можем легко узнать и кол-во малышни, подростков и старух :). В т.ч. и лактирующих, т.к. по условию это свойство зависит только от возраста.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 24.03.2006 (Пт) 3:57

Примеры.

Константы:
Пбер = 280 дней
Всл = 540 дней
Кпот = 1 тёлка

Пример 1.
Переменные:
Нкол = 2 шт.
Висх = 540 дней
П = 100 дней

Примечания:
Очевидно, что за 100 дней стадо не увеличится

Решение:
Вкон = Висх + П = 540 + 100 = 640
Ст1 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((640-540)/280) - IIf(540>540,Int((540-540)/280),0) = Int(100/280) = 0


Пример 2.


Переменные
Нкол = 2 шт.
Висх = 540 дней
П = 1000 дней

Решение:
Вкон = Висх + П = 540 + 1000 = 1540
Ст1 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((1540-540)/280) - IIf(540>540,Int((540-540)/280),0) = Int(1000/280) = Int(3.57) = 3
т.к. коров две, то рождённых первым стадом всего стало быть 6.

Берём первый отёл. Он произошёл на 280 день после начала периода, следовательно возраст коров первого отёла к концу периода равен
Вкон = П - 280 = 1000 - 280 = 720 (вот это надо как-то формализовать)
Вызываем ту же функцию с новыми данными
Ст2 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((720-540)/280)-IIf(0>540,Int((0-540)/280),0) = Int(180/280) = Int(0.64) = 0

Возвращаем рез-т в первую функцию и анализируем.
Второе стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют.

Конечный результат: 6 новых + 2 исходных. Итого 8 шт.


Пример 3.

Переменные
Нкол = 2 шт.
Висх = 540 дней
П = 2000 дней

Решение:
|Вкон0 = Висх + П = 540 + 2000 = 2540
|Ст0 = Int((Вкон - Всл)/Пбер) - IIf(Висх > Всл, Int((Висх - Всл)/Пбер, 0)) = Int((2540-540)/280) - IIf(540>540,Int((540-540)/280),0) = Int(2000/280) = Int(7.14) = 7
|т.к. коров две, то рождённых первым стадом всего стало быть 14.
|
|--|Берём первый отёл. Он произошёл на 280 день после начала периода, следовательно возраст коров первого отёла к концу периода равен
|--|Вкон1.0 = П - 280 = 2000 - 280 = 1720
|--|--|Вызываем ту же функцию с новыми данными. (Т.к. Висх всегда равен 0 и заведомо меньше Всл, то вычитаемое в дальнейшем можно опустить)
|--|--|Ст1 = Int((Вкон1.0 - Всл)/Пбер) = Int((1720-540)/280) = Int(1180/280) = Int(4.21) = 4

|--|--|--|Результат не нулевой, тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280=820 дней.
|--|--|--|Кол-во коров не меняется, т.к. каждая корова по условию приносит только одну тёлку.
|--|--|--|Вкон1.1 = Вкон1.0 - 820 = 1720 - 820 = 900
|--|--|--|Ст1.1 = Int((Вкон1.1 - Всл)/Пбер) = Int((900-540)/280) = Int(360/280) = Int(1.2) = 1

|--|--|--|--|Результат не нулевой, тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280=820 дней.
|--|--|--|--|Вкон1.1.1 = Вкон1.1 - 820 = 900 - 820 = 80
|--|--|--|--|Ст1.1.1 = Int((Вкон1.1.1 - Всл)/Пбер) = Int((80-540)/280) = 0 (ага, здесь нужно условие проверки достижения возраста первой случки!)

|--|--|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|--|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют. Тем более, что и потомств больше нет.
|--|--|--|В итоге Ст1.1, т.е. потомки первого потомства = 2, т.к. исходных коров было 2 шт.

|--|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|--|Результат не нулевой и есть ещё помства.

|--|--|--|Тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280+280=1100 дней.
|--|--|--|Вкон1.2 = Вкон1.0 - 1100 = 1720 - 1100 = 620
|--|--|--|Ст1.2 = Int((Вкон1.2 - Всл)/Пбер) = Int((620-540)/280) = Int(80/280) = Int(0.2) = 0

|--|--|Возвращаем рез-т в первую функцию и анализируем.
|--|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют.
|--|--|В итоге Ст1, т.е. все потомки первого потомства = 4*2 собственного потомства + 2 потомков их потомков. Игого: 10 шт.

|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|Результат не нулевой и есть ещё помства.

|--|--|Тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280+280=1100 дней.
|--|--|Вкон2.0 = П - 1100 = 2000 - 1100 = 900
|--|--|Ст2 = Int((Вкон2.0 - Всл)/Пбер) = Int((900-540)/280) = Int(360/280) = Int(1.2) = 1

|--|--|--|Результат не нулевой, тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280=820 дней.
|--|--|--|Вкон2.1 = Вкон2.0 - 820 = 900 - 820 = 80
|--|--|--|Ст2.1 = Int((Вкон1.1.1 - Всл)/Пбер) = Int((80-540)/280) = 0

|--|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют. Тем более, что и потомств больше нет.
|--|--|В итоге Ст2, т.е. все потомки второго потомства = 1*2, т.к. исходных коров было 2 шт. Итого 2 шт.

|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|Результат не нулевой и есть ещё помства.

|--|--|Тогда снова рекурсивно вызываем функцию с новым стадом моложе прежнего на 540+280+280+280=1380 дней.
|--|--|Вкон3.0 = П - 1100 = 2000 - 1380 = 620
|--|--|Ст3 = Int((Вкон3.0 - Всл)/Пбер) = Int((620-540)/280) = Int(80/280) = Int(0.2) = 0

|--|Возвращаем рез-т в вызывающую функцию и анализируем.
|--|Последнее стадо на конец периода ещё не дало потомства. Цикл можно прекращать, т.к. более молодые тем более не успеют.
|--|В итоге Ст0, т.е. все потомки исходного стада = 7*2 собственного потомства + 10 шт. потомков первого потомства + 2 шт. потомков второго потомства.
|--|Итого 26 шт.

|Конечный результат: 26 новых + 2 исходных. Итого 28 шт.



Если при всех этих вызовах записывать возраст или дату рождения каждого потомства в массив, то в результате сможем выложить любую статистику.

Георгий2
Обычный пользователь
Обычный пользователь
 
Сообщения: 64
Зарегистрирован: 23.03.2006 (Чт) 21:29
Откуда: Тбилиси, Грузия

Сообщение Георгий2 » 24.03.2006 (Пт) 8:46

skiperski !
Так я и подозревал что будет рекурсия! Разжёвано более чем достаточно! Огромное вам спасибо! Молоко от рекурсивно рожденных коров и шкура пока не убитого медведя (спонсора)-за мной :lol: :lol: :lol:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 114

    TopList