Другие языки программирования и технологии

Великие программистские умы. Может поможет кто. Такая вот задача: Задача о гостинице. Многопоточность.

Задача о гостинице-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);
}
}

Оригинал дал на мыло.
Павел Андреевич
Павел Андреевич
9 617
Лучший ответ
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;
}
C*
Crэsh-[99]Rus *********
21 360
Первое что нужно сделать в решея задачи програмирования - создать алгоритм задачи
Могу помочь сделать его:
1. Создаем гостиницу - скажем это будет масив чисел
2. Создаем клиента - это будет случайное число, и проверям по условию больше меньше (беднее, богаче)
3. Создаем факт входа, проверки свободного номера, для этого наверно создать еще одним масив, и если новер занимается кемто, то заполням одну из его ячеек, и повторям процедуру.
Я думаю это уже проще подогнать под какойнибудь код
О :) хоть что-то интересное :) но си билдер мне ставить лень :Р
Вероник, ты что-то гонишь! Приходи, обсудим! =)