Задача о гостинице-2 (умные клиенты) . В гостинице 10 номеров с ценой 200 рублей, 10 номеров с ценой 400 рублей и 5 номеров с ценой 600 руб. Клиент, зашедший в гостиницу, обладает некоторой суммой и получает номер по своим финансовым возможностям, если тот свободен. Если среди доступных клиенту номеров нет свободных, клиент уходит искать ночлег в другое место. Создать многопоточное приложение, моделирующее работу гостиницы.
Необходимо использовать критические секции. А именно на ресурс - массив структур (номера отелей, каждая структура содержит 2 параметра - цена и флаг занято/пусто) . Потоки - клиенты. Причем их нужно сделать кого то победнее, кого то побогаче. И главное чтобы не ломились все вместе в номера. . Помогите... уж очень сложно мне всё это сформировать в код.
Исходник задачи:
http://ps.margtu.ru/wiki/index.php?wakka=HomePage/20082009/4kurs/RV/ZadanijaPS41/files&get=lab2.doc
Другие языки программирования и технологии
Великие программистские умы. Может поможет кто. Такая вот задача: Задача о гостинице. Многопоточность.
Интересная задача. Набросок на C#:
class Customer
{
int _balance;
readonly string _name;
public string Name
{
get { return _name; }
}
public Customer(int balance, string name)
{
_balance = balance;
_name = name;
}
public bool CanPay(int money)
{
return money <= _balance;
}
public void Pay(int money)
{
_balance -= money;
}
public void GetRoom(Room room, int time)
{
lock (room)
{
Thread.Sleep(time);
room.Free();
}
}
public void TryGetRoom(Hotel hotel)
{
var thread = new Thread(() => hotel.TryGetRoom(this));
thread.Start();
}
public void GoAway()
{
}
public override string ToString()
{
return "Client " + Name;
}
}
class Room
{
readonly int _cost;
Customer _client;
public Room(int cost)
{
_cost = cost;
}
public bool CanHireOut(Customer client)
{
return client.CanPay(_cost);
}
public void HireOut(Customer client, int time)
{
client.Pay(_cost);
_client = client;
client.GetRoom(this, time);
}
public void Free()
{
_client = null;
}
public bool IsFree
{
get{ return _client == null; }
}
public override string ToString()
{
return _cost.ToString() + "$ room";
}
}
class Hotel
{
readonly List<room> _rooms = new List<room>();
const int _day_lenght = 400;
public Hotel()
{
AddRooms(600, 5);
AddRooms(400, 10);
AddRooms(200, 10);
}
void AddRooms(int cost, int count)
{
for (var i = 0; i < count; i++)
{
var room = new Room(cost);
_rooms.Add(room);
}
}
static void LogEvent(string format, params object[] parameters)
{
var message = string.Format(format, parameters);
LogEvent(message);
}
static void LogEvent(string message)
{
var log_message =
string.Format("{0}: {1}", Environment.TickCount, message);
Console.WriteLine(log_message);
}
public void TryGetRoom(Customer client)
{
LogEvent("{0} has come", client);
lock (_rooms)
{
foreach (var room in _rooms)
{
if (room.IsFree)
{
if (room.CanHireOut(client))
{
LogEvent("{0} hiered {1}", client, room);
room.HireOut(client, _day_lenght);
return;
}
}
}
client.GoAway();
}
}
}
class CustomersFlow
{
static readonly Random _random = new Random(Environment.TickCount);
readonly Hotel _hotel;
readonly int _min_money;
readonly int _max_money;
public CustomersFlow(Hotel hotel, int min_money, int max_money)
{
_hotel = hotel;
_min_money = min_money;
_max_money = max_money;
}
public void Start(int count)
{
var thread = new Thread(() => DirectCustomers(count));
thread.Start();
}
void DirectCustomers(int count)
{
const int max_pause = 200;
for (var i = 0; i < count; i++)
{
var customer = CreateCustomer(i);
customer.TryGetRoom(_hotel);
int pause;
lock (_random)
pause = _random.Next(max_pause);
Thread.Sleep(pause);
}
}
Customer CreateCustomer(int index)
{
int balance;
lock (_random)
balance = _random.Next(_min_money, _max_money);
return new Customer(balance, index.ToString());
}
}
class Program
{
static void Main()
{
var hotel = new Hotel();
var flow = new CustomersFlow(hotel, 100, 1000);
flow.Start(100);
}
}
Оригинал дал на мыло.
class Customer
{
int _balance;
readonly string _name;
public string Name
{
get { return _name; }
}
public Customer(int balance, string name)
{
_balance = balance;
_name = name;
}
public bool CanPay(int money)
{
return money <= _balance;
}
public void Pay(int money)
{
_balance -= money;
}
public void GetRoom(Room room, int time)
{
lock (room)
{
Thread.Sleep(time);
room.Free();
}
}
public void TryGetRoom(Hotel hotel)
{
var thread = new Thread(() => hotel.TryGetRoom(this));
thread.Start();
}
public void GoAway()
{
}
public override string ToString()
{
return "Client " + Name;
}
}
class Room
{
readonly int _cost;
Customer _client;
public Room(int cost)
{
_cost = cost;
}
public bool CanHireOut(Customer client)
{
return client.CanPay(_cost);
}
public void HireOut(Customer client, int time)
{
client.Pay(_cost);
_client = client;
client.GetRoom(this, time);
}
public void Free()
{
_client = null;
}
public bool IsFree
{
get{ return _client == null; }
}
public override string ToString()
{
return _cost.ToString() + "$ room";
}
}
class Hotel
{
readonly List<room> _rooms = new List<room>();
const int _day_lenght = 400;
public Hotel()
{
AddRooms(600, 5);
AddRooms(400, 10);
AddRooms(200, 10);
}
void AddRooms(int cost, int count)
{
for (var i = 0; i < count; i++)
{
var room = new Room(cost);
_rooms.Add(room);
}
}
static void LogEvent(string format, params object[] parameters)
{
var message = string.Format(format, parameters);
LogEvent(message);
}
static void LogEvent(string message)
{
var log_message =
string.Format("{0}: {1}", Environment.TickCount, message);
Console.WriteLine(log_message);
}
public void TryGetRoom(Customer client)
{
LogEvent("{0} has come", client);
lock (_rooms)
{
foreach (var room in _rooms)
{
if (room.IsFree)
{
if (room.CanHireOut(client))
{
LogEvent("{0} hiered {1}", client, room);
room.HireOut(client, _day_lenght);
return;
}
}
}
client.GoAway();
}
}
}
class CustomersFlow
{
static readonly Random _random = new Random(Environment.TickCount);
readonly Hotel _hotel;
readonly int _min_money;
readonly int _max_money;
public CustomersFlow(Hotel hotel, int min_money, int max_money)
{
_hotel = hotel;
_min_money = min_money;
_max_money = max_money;
}
public void Start(int count)
{
var thread = new Thread(() => DirectCustomers(count));
thread.Start();
}
void DirectCustomers(int count)
{
const int max_pause = 200;
for (var i = 0; i < count; i++)
{
var customer = CreateCustomer(i);
customer.TryGetRoom(_hotel);
int pause;
lock (_random)
pause = _random.Next(max_pause);
Thread.Sleep(pause);
}
}
Customer CreateCustomer(int index)
{
int balance;
lock (_random)
balance = _random.Next(_min_money, _max_money);
return new Customer(balance, index.ToString());
}
}
class Program
{
static void Main()
{
var hotel = new Hotel();
var flow = new CustomersFlow(hotel, 100, 1000);
flow.Start(100);
}
}
Оригинал дал на мыло.
stuct Hotel
{
int Price;
BOOL Free;
Hotel() : Price(200), Free(TRUE) {}
};
Hotel g_Hotel[10+10+5];
CRITICAL_SECTION g_cs;
int main()
{
InitializeCriticalSection(&g_cs);
// TODO:
DeleteCriticalSection(&g_cs);
return 0;
}
BOOL ReserveHotel(int nIndex)
{
BOOL bRet = FALSE;
EnterCriticalSection(&g_cs);
// TODO:
if (g_Hote[nIndex].Free)
{
g_Hote[nIndex].Free = FALSE;
bRet = TRUE;
}
LeaveCriticalSection(&g_cs);
return bRet;
}
void FreeHotel(int nIndex)
{
EnterCriticalSection(&g_cs);
// TODO:
g_Hote[nIndex].Free = TRUE;
LeaveCriticalSection(&g_cs);
}
DWORD WINAPI ClientThread(LPVOID lpObj)
{
for (int i = 0; i < sizeof(g_Hotel)/sizeof(g_Hotel[0]; i++)
{
if (ReserveHotel(n))
{
Sleep(10000);
FreeHotel(n);
break;
}
}
return 0;
}
{
int Price;
BOOL Free;
Hotel() : Price(200), Free(TRUE) {}
};
Hotel g_Hotel[10+10+5];
CRITICAL_SECTION g_cs;
int main()
{
InitializeCriticalSection(&g_cs);
// TODO:
DeleteCriticalSection(&g_cs);
return 0;
}
BOOL ReserveHotel(int nIndex)
{
BOOL bRet = FALSE;
EnterCriticalSection(&g_cs);
// TODO:
if (g_Hote[nIndex].Free)
{
g_Hote[nIndex].Free = FALSE;
bRet = TRUE;
}
LeaveCriticalSection(&g_cs);
return bRet;
}
void FreeHotel(int nIndex)
{
EnterCriticalSection(&g_cs);
// TODO:
g_Hote[nIndex].Free = TRUE;
LeaveCriticalSection(&g_cs);
}
DWORD WINAPI ClientThread(LPVOID lpObj)
{
for (int i = 0; i < sizeof(g_Hotel)/sizeof(g_Hotel[0]; i++)
{
if (ReserveHotel(n))
{
Sleep(10000);
FreeHotel(n);
break;
}
}
return 0;
}
Первое что нужно сделать в решея задачи програмирования - создать алгоритм задачи
Могу помочь сделать его:
1. Создаем гостиницу - скажем это будет масив чисел
2. Создаем клиента - это будет случайное число, и проверям по условию больше меньше (беднее, богаче)
3. Создаем факт входа, проверки свободного номера, для этого наверно создать еще одним масив, и если новер занимается кемто, то заполням одну из его ячеек, и повторям процедуру.
Я думаю это уже проще подогнать под какойнибудь код
Могу помочь сделать его:
1. Создаем гостиницу - скажем это будет масив чисел
2. Создаем клиента - это будет случайное число, и проверям по условию больше меньше (беднее, богаче)
3. Создаем факт входа, проверки свободного номера, для этого наверно создать еще одним масив, и если новер занимается кемто, то заполням одну из его ячеек, и повторям процедуру.
Я думаю это уже проще подогнать под какойнибудь код
О :) хоть что-то интересное :) но си билдер мне ставить лень :Р
Вероник, ты что-то гонишь! Приходи, обсудим! =)
Похожие вопросы
- Помогите пожалуйста найти ошибку в задаче (Язык программирования Си)
- Помоги те решить эту задачу C++
- Помогите, пожалуйста, с решением задачи из задачника Абрамяна.
- Помогите с программированием на Си. Задача про треугольники
- Помогите пожалуйста оптимизировать решение задачи (Зайчик) на C++
- Помогите составить алгоритм решения задачи
- ЕГЭ по информатике. Помогите разобраться с данным типом задач.
- Помогите пожалуйста, решить данную задачу методом пузырька!!!
- Помогите! Завтра надо сдавать все задачи, а у меня не хватает еще пару задач))) Паскаль
- Pascal помогите пожалуйста найти ошибку в задаче.