![]() |
|
![]() ![]() ![]() |
|
iritschultz |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 26.11.2011 Репутация: нет Всего: нет |
Нужно создать симуляцию компании, которая нанимает программистов. Код содержит информацию о 7 компаниях, 7 программистах и 10 проектах. Вся она хранится в "array of hashes".
programmers = [ {"name" => "Martin", "speed" => 2.0, "daily_wage" => 2000}, {"name" => "Jarda", "speed" => 1.0, "daily_wage" => 1300}, # more programmers... ] companies = [ {"name" => "Alpha", "capacity" => 2, "daily_expenses" => 1000, "budget" => 100000}, {"name" => "Beta", "capacity" => 2, "daily_expenses" => 1500, "budget" => 150000}, # more companies... ] projects = [ {"name" => "Web", "man_days" => 5.0, "price" => 20000}, {"name" => "Portal", "man_days" => 15.0, "price" => 60000}, # more projects... Компания должна завершить 10 проектов. Чтобы работать над проектами компании нужно нанять программистов в соответствии с их employees capacity. Каждый проект различается по трудодням и цене, которую компания получает за его выполнение.У программистов разная продуктивность.Их продуктивность определена как "speed", это значит кол-во трудодней работы программист может сделать в один день. Каждый программист может работать только над одним проектом, но над одним проектом могуть работать несколько программистов. Симуляция должна идти последовательно, каждая компания работает с одним и тем же проектом и с одними и теми же программистами. Различие лишь в том, какое кол-во программистов может нанять компания.Симуляция может заканчиваться 3 способами: 1.Компания заканчивает все проекты и ставит статус " "finished" 2.Бюджет кончается и компания ставит статус "bankrupt" 3.Если кол-во дней превышает1000, симуляция заканчивается автоматически и компания ставит статус "idle". Но в нашей практике не было компании, которая превышала бы 200 дней, это правило нужно лишь для избежания бесконечных циклов. как оптимизировать выбор программистов для пректов - это ваше дело. Как мы знаем, даже такой глупый способ как нанять первых Х программистов (где X это capacity компании) и позволить им работать над продуктами тоже приводит к удовлетворительным результатам. Тут нет единого верного решения, ваше задание привести как можно больше компаний к удачным результатам. вы можете выбрать любой алгоритм.Незаконченный код в приложении уже содержит законченный классы Programmer и Project и почти законченный класс Company. компания может читать данные из arrays в objects, делать симуляцию для каждой компании и выдавать результаты. Код уже делает симуляции для всех компаний. company_objects = [] companies.each do |c| # Create all objects of Company type and assign them to company_objects company_objects << Company.new(c["name"],c["capacity"],c["daily_expenses"],c["budget"]) end # This cycle repeats for each company: company_objects.each do |c| # Hire programmers c.allocate_programmers(programmers) # Initialize projects c.allocate_projects(projects) # Run simulation c.run # Display result c.output_result end Ваша задача ввести индивидуальные методы в симуляцию, которые привязывают программистов к проектам, проверить закончены ли проекты и управлять денежными переводами между компаниями, программистами и проектами. метод check_projects уже введен чтобы показывать пример, который мы ожидаем, остальная часть на вас. Методы, которые вы должны ввести: check_programmers, assign_new_projects, programmers_work, check_company_state. Описание их функций в комментариях в коде. # Check what projects are already finished and move them to # an array @projects_done def check_projects @projects_current.each do |project| if (project.man_days_done >= project.man_days) project.state = 'done' @projects_done << project @projects_current.delete(project) @budget += project.price end end end # Unassign programmers who work on already finished projects. def check_programmers # IMPLEMENT THIS METHOD end # Assign new projects from @projects_waiting to programmmers who # are available. Move these projects to @projects_current def assign_new_projects # IMPLEMENT THIS METHOD end # Programmers work. Iterate all programmers and assign their daily work to # their assigned projects. At the same time, give programmers their wages # and process the daily expenses of the company. def programmers_work # IMPLEMENT THIS METHOD end # Check the state of the company. If the budget is < 0, set its state # to :bankrupt. If all projects are finished, set its state to :finished. def check_company_state # IMPLEMENT THIS METHOD end Этот метод будет вызван метедом, который управляет симуляцией # Run the simulation. The cycle ends when the state of the company is # either "bankrupt" or "finished", or if the simulation runs for longer # than 1000 days def run @state = "running" while @state != "bankrupt" and @state != "finished" and @days <= 1000 @days += 1 check_projects check_programmers assign_new_projects вы можете выбрать другой способ решения, не используя этот код. Или вы можете изменить дизайн. В таком случае знайте, что мы ожидаем объектный! код. Tрешение должно отвечать следующим требованиям: Должно содержать определение class для programmer, project, company. Вся информация должна храниться в разных объектах. Никаких больше независимых методов свободно определенных вне классов. Код: Data about programmers. Speed means how many man-days of work # the given programmer does in one day. Daily_wage is a one-day # salary of the programmer. programmers = [ {"name" => "Martin", "speed" => 2.0, "daily_wage" => 2000}, {"name" => "Jarda", "speed" => 1.0, "daily_wage" => 1300}, {"name" => "Lukas", "speed" => 0.5, "daily_wage" => 900}, {"name" => "Pepa", "speed" => 1.7, "daily_wage" => 2200}, {"name" => "Kamil", "speed" => 0.4, "daily_wage" => 1800}, {"name" => "Honza", "speed" => 1.2, "daily_wage" => 1500}, {"name" => "Filip", "speed" => 1.1, "daily_wage" => 1000} ] # Data about companies. The capacity says how many programmers can # the company hire. Daily_expenses are fixed expenses of the company # per one work day. companies = [ {"name" => "Alpha", "capacity" => 2, "daily_expenses" => 1000, "budget" => 100000}, {"name" => "Beta", "capacity" => 2, "daily_expenses" => 1500, "budget" => 150000}, {"name" => "Gamma", "capacity" => 3, "daily_expenses" => 3000, "budget" => 300000}, {"name" => "Delta", "capacity" => 5, "daily_expenses" => 6000, "budget" => 500000}, {"name" => "Epsilon", "capacity" => 6, "daily_expenses" => 8000, "budget" => 1000000}, {"name" => "Theta", "capacity" => 7, "daily_expenses" => 10000, "budget" => 1500000}, {"name" => "Omega", "capacity" => 7, "daily_expenses" => 20000, "budget" => 25000000} ] # Data about projects. Man-days is a number of man-days that must be done # on a particular project to finish it. Price is an amount of money the company # receives if the project is successfully finished. projects = [ {"name" => "Web", "man_days" => 5.0, "price" => 20000}, {"name" => "Portal", "man_days" => 15.0, "price" => 60000}, {"name" => "Email system", "man_days" => 25.0, "price" => 90000}, {"name" => "Eshop", "man_days" => 40.0, "price" => 150000}, {"name" => "CMS", "man_days" => 60.0, "price" => 250000}, {"name" => "Forum", "man_days" => 30.0, "price" => 35000}, {"name" => "B2B System", "man_days" => 120.0, "price" => 800000}, {"name" => "Multimedia Web", "man_days" => 7.0, "price" => 50000}, {"name" => "TODO List", "man_days" => 3.0, "price" => 10000}, {"name" => "CRM", "man_days" => 20.0, "price" => 80000} ] class Programmer attr_reader :name, :speed, :daily_wage attr_reader :project def initialize(name, speed, daily_wage) @name=name @speed=speed @daily_wage=daily_wage @project = nil end # Set which project the programmer works on def assign_project(project) @project = project end # Unassign the programmer from a project def clear_project @project = nil end # Work on a project def write_code @project.recieve_work(@speed) end end class Project attr_reader :name, :man_days, :price attr_reader :man_days_done attr_accessor :state # possibilities: "waiting", "current", "done" def initialize(name, man_days, price) @name = name @man_days = man_days @man_days_done = 0 @price = price @state = "waiting" end # A work that the programmer does on a project def recieve_work(man_days) @man_days_done += man_days end end class Company attr_reader :name, :capacity, :daily_expenses, :budget attr_reader :days, :programmers attr_reader :projects_waiting, :projects_current, :projects_done attr_reader :state # possibilities: "idle", "running" "finished", "bankrupt" def initialize(name, capacity, daily_expenses, budget) @name = name @capacity = capacity @daily_expenses = daily_expenses @budget = budget @state = "idle" @days = 0 @projects_waiting = [] @projects_current = [] @projects_done = [] end # Hire as many programmers as the company capacity allows def allocate_programmers(programmers_array) @programmers = [] @capacity.times do |i| prog = programmers_array[i] @programmers << Programmer.new(prog["name"], prog["speed"],prog["daily_wage"]) end end # Initialize all projects and store them in an array @projects_waiting def allocate_projects(projects_array) projects_array.each do |proj| @projects_waiting << Project.new(proj["name"], proj["man_days"], proj["price"]) end end # Check what projects are already finished and move them to # an array @projects_done def check_projects @projects_current.each do |project| if (project.man_days_done >= project.man_days) project.state = 'done' @projects_done << project @projects_current.delete(project) @budget += project.price end end end # Unassign programmers who work on already finished projects. def check_programmers # IMPLEMENT THIS METHOD end # Assign new projects from @projects_waiting to programmmers who # are available. Move these projects to @projects_current def assign_new_projects # IMPLEMENT THIS METHOD end # Programmers work. Iterate all programmers and assign their daily work to # their assigned projects. At the same time, give programmers their wages # and process the daily expenses of the company. def programmers_work # IMPLEMENT THIS METHOD end # Check the state of the company. If the budget is < 0, set its state # to :bankrupt. If all projects are finished, set its state to :finished. def check_company_state # IMPLEMENT THIS METHOD end # Run the simulation. The cycle ends when the state of the company is # either "bankrupt" or "finished", or if the simulation runs for longer # than 1000 days def run @state = "running" while @state != "bankrupt" and @state != "finished" and @days <= 1000 @days += 1 check_projects check_programmers assign_new_projects programmers_work check_company_state end @state = "idle" if @state == "running" end def output_result puts puts "Company name #{name}" puts "Days running #{@days}" puts "Final budget #{@budget}" puts "Final state #{@state}" puts "Number of projects done #{@projects_done.size}" end end company_objects = [] companies.each do |c| # Create all objects of Company type and assign them to company_objects company_objects << Company.new(c["name"],c["capacity"],c["daily_expenses"],c["budget"]) end # This cycle repeats for each company: company_objects.each do |c| # Hire programmers c.allocate_programmers(programmers) # Initialize projects c.allocate_projects(projects) # Run simulation c.run # Display result c.output_result end Выглядеть должно так: Company name Alpha Days running 176 Final budget 888200 Final state finished Number of projects done 10 Company name Beta Days running 176 Final budget 850200 Final state finished Number of projects done 10 Company name Gamma Days running 111 Final budget 1045800 Final state finished Number of projects done 10 Company name Delta Days running 71 Final budget -13200 Final state bankrupt Number of projects done 8 Company name Epsilon Days running 130 Final budget -6000 Final state bankrupt Number of projects done 9 Company name Theta Days running 97 Final budget -12900 Final state bankrupt Number of projects done 8 Company name Omega Days running 152 Final budget 21878600 Final state finished Number of projects done 10 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Ruby: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |