Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Задача по программированию

Вды Вжды Ученик (152), на голосовании 5 месяцев назад
Bizzare Chat
У вас есть приложение, а в нем пользователи. У каждого пользователя есть свой уникальный id.
Приложение - обычный мессенджер, а ваш класс будет управлять чатом. Взаимодействие с классом
будет следующее, он извне получает запросы об изменении состояния чата(добавление
пользователя, новые сообщения, бан пользователей и т.п.). У каждого из этих запросов есть
отправитель, конкретный пользователь со своим id. Дело в том, что в чатах обычно есть роли
пользователей, поэтому, скажем, удалять сообщения других людей могут только модераторы, а
добавлять в чат новых людей могут только админы.
Список ролей у пользователей:
Роль Описание
ADMIN
Может регистрировать новых пользователей, давать роль админа или
модератора другим пользователям, а также полностью останавливать чат
MODERATOR
Может банить пользователей, создавать других модераторов, а также полностью
редактировать все сообщения
BANNED
Не может ничего, предполагается, что ни ADMIN, ни MODERATOR не станут
BANNED
USER Может писать сообщения, а также редактировать сообщения, но только свои
Более того, любые запросы к пользователю, котрого еще нет в чате, также невозможны(Например,
нельзя забанить того, кого нет в чате). Также нельзя повторять запросы, если они не имеют
смысла(например, остановить остановленный чат или же забанить того, кто уже забанен)
Как можете видеть, один и тот же пользователь в праве иметь несколько ролей сразу. Например,
ADMIN, MODERATOR, USER.
Итак, у каждого запроса есть отправитель.
Также на каждый запрос ваш класс должен возвращать ответ в следующем виде:
struct ResposeData {
bool Success;
std::string Response;
};
Где Success -- выполнил ли класс запрос. Response -- комментарий класса об ошибке, если Success
равен false
Итак, вас попросили написать класс со следующими методами. Везде sender, это отправитель
запроса. В конструкторе единственный аргумент, id самого первого админа.
class SystemBase {
public:
SystemBase(int admin);
ResposeData BanUser(int sender, int user);
ResposeData UnBanUser(int sender, int user);
ResposeData RegisterNewUser(int sender, int newUser);
ResposeData GrantModeratorRole(int sender, int user);
ResposeData GrantAdminRole(int sender, int user);
ResposeData StopChat(int sender);
ResposeData ResumeChat(int sender);
};
При этом, если запрос некорректен, например, метод GrantAdminRole вызван от sender, который
сам не является админом, то такой метод в ResponseData должен иметь Success = false,
комментарий не важен.
Можете помочь
Голосование за лучший ответ
GGG Просветленный (36232) 6 месяцев назад
 #include  
#include
#include
#include

// Структура ответа
struct ResponseData {
bool Success;
std::string Response;
};

// Класс управления чатом
class SystemBase {
private:
std::unordered_map> users; // Пользователи и их роли
bool chatActive; // Состояние чата

// Вспомогательные функции для проверки ролей
bool hasRole(int user, const std::string& role) {
return users.count(user) && users[user].count(role);
}

public:
// Конструктор
SystemBase(int admin) {
users[admin].insert("ADMIN");
chatActive = true;
}

// Метод для бана пользователя
ResponseData BanUser(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "MODERATOR")) return {false, "Sender is not a moderator"};
if (!users.count(user)) return {false, "User not found"};
if (hasRole(user, "BANNED")) return {false, "User is already banned"};

users[user].insert("BANNED");
return {true, "User banned"};
}

// Метод для разбана пользователя
ResponseData UnBanUser(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "MODERATOR")) return {false, "Sender is not a moderator"};
if (!users.count(user)) return {false, "User not found"};
if (!hasRole(user, "BANNED")) return {false, "User is not banned"};

users[user].erase("BANNED");
return {true, "User unbanned"};
}

// Метод для регистрации нового пользователя
ResponseData RegisterNewUser(int sender, int newUser) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (users.count(newUser)) return {false, "User already exists"};

users[newUser].insert("USER");
return {true, "User registered"};
}

// Метод для предоставления роли модератора
ResponseData GrantModeratorRole(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (!users.count(user)) return {false, "User not found"};

users[user].insert("MODERATOR");
return {true, "Moderator role granted"};
}

// Метод для предоставления роли админа
ResponseData GrantAdminRole(int sender, int user) {
if (!chatActive) return {false, "Chat is stopped"};
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (!users.count(user)) return {false, "User not found"};

users[user].insert("ADMIN");
return {true, "Admin role granted"};
}

// Метод для остановки чата
ResponseData StopChat(int sender) {
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (!chatActive) return {false, "Chat is already stopped"};

chatActive = false;
return {true, "Chat stopped"};
}

// Метод для возобновления чата
ResponseData ResumeChat(int sender) {
if (!hasRole(sender, "ADMIN")) return {false, "Sender is not an admin"};
if (chatActive) return {false, "Chat is already active"};

chatActive = true;
return {true, "Chat resumed"};
}
};
Maf MifЗнаток (473) 6 месяцев назад
stdout:


stderr:
__temp__.cpp:109:24: error: ‘ResposeData’ does not name a type; did you mean ‘ResponseData’?
void assertFalse(const ResposeData& response) {
^~~~~~~~~~~
ResponseData
__temp__.cpp: In function ‘void assertFalse(const int&)’:
__temp__.cpp:112:54: error: request for member ‘Success’ in ‘response’, which is of non-class type ‘const int’
std::cerr << "response status= " << arr[response.Success] << ". Response data= " << response.Response << std::endl;
^~~~~~~
Maf Mif Знаток (473) Maf Mif, и там еще куча куча ошибок пишет
Krab BarkИскусственный Интеллект (294838) 6 месяцев назад
Ну так было поручено обезьяне... тьфу, ChatGPT, написать код, он и написал, а чтобы он работал, никто и не требовал ;)
Похожие вопросы