Advertisement
Jana007

SocialNetwork

May 15th, 2019
2,230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.32 KB | None | 0 0
  1. Да се дефинира апстрактна класа User за која ќе се чуваат:
  2.  
  3. username (char[50])
  4. password (char[50])
  5. email (char[50])
  6. Класата треба да содржи еден чист виртуелен метод double popularity().
  7.  
  8. Од оваа класа да се изведат две класи и тоа FacebookUser и TwitterUser.
  9.  
  10. За класата FacebookUser уште се чуваат и:
  11.  
  12. број на пријатели
  13. број на лајкови и
  14. број на коментари
  15. Популарноста се пресметува така што се собираат бројот на пријатели, бројот на лајкови и бројот на коментари, но притоа бројот на лајкови се множи со коефициент на вредност на лајкот кој е ист за секој корисник и изнесува 0.1, а исто така и бројот на коментари се множи со ист таков коефициент кој е 0.5.
  16.  
  17. За класата TwitterUser уште се чуваат и:
  18.  
  19. број на следачи и
  20. број на твитови
  21. Популарноста се пресметува така што се собираат бројот на следачи и бројот на твитови, но притоа бројот на твитови се множи со коефициент на вредност на твитот кој е ист за секој корисник и изнесува 0.5.
  22.  
  23. Да се креира класа SocialNetwork која ќе содржи:
  24.  
  25. динамичка низа од покажувачи од класата User
  26. број на тековни корисници и
  27. максимален број на корисници кој може да го содржи мрежата и кој е ист за сите мрежи и иницијално е поставен на 5
  28. Да се преоптовари операторот += со кој ќе се додава нов корисник.
  29.  
  30. Да се дефинира метод avgPopularity() кој ќе ја враќа просечната популарност на корисниците во мрежата.
  31.  
  32. Исто така да се овозможи промена на максималната големина на низата преку методот changeMaximumSize(int number).
  33.  
  34. Потребно е да се справите со следните исклучоци:
  35.  
  36. Доколку лозинката на корисникот не содржи барем 1 голема буква, 1 мала буква и 1 број да се фрли исклучок од класа InvalidPassword така што како параметар ќе се прати пораката Password is too weak.
  37. Доколку емаилот на корисникот не содржи точно еднаш @ да се фрли исклучок од класа InvalidEmail така што како параметар ќе се прати пораката Mail is not valid.
  38. Доколку проба да се додаде корисник во социјалната мрежа, а веќе максималниот број на корисници е пополнет да се фрли исклучок од класа MaximumSizeLimit така што како параметар ќе се прати максималниот број на корисници во мрежата.
  39. Сите класи кои се справуваат со исклучоци треба да го имаат имплементирано методот void message() така што за првите две класи ќе ја печати пораката којашто е испратена како параметар, а за последната класа ќе печати You can't add more than N users, каде што N е параметарот кој е пратен. Исто така со try-catch блокови справете се со исклучоците на соодветните места во main(), каде што во catch ќе го повикате методот message() од соодветниот исклучок.
  40.  
  41. #include<iostream>
  42. #include<cstring>
  43. using namespace std;
  44.  
  45. class InvalidPassword {
  46. private:
  47. char error[50];
  48. public:
  49. InvalidPassword(const char * er) {
  50. strcpy(error,er);
  51. }
  52. void message() {
  53. cout << error << endl;
  54. }
  55. };
  56.  
  57. class InvalidEmail {
  58. private:
  59. char error[50];
  60. public:
  61. InvalidEmail(const char * er) {
  62. strcpy(error,er);
  63. }
  64. void message() {
  65. cout << error << endl;
  66. }
  67. };
  68.  
  69. class MaximumSizeLimit {
  70. private:
  71. int n;
  72. public:
  73. MaximumSizeLimit(int num) {
  74. n = num;
  75. }
  76.  
  77. void message() {
  78. cout << "You can't add more than " << n << " users." << endl;
  79. }
  80. };
  81.  
  82. class User {
  83. private:
  84. char username[30];
  85. char password[30];
  86. char email[30];
  87. public:
  88. User(const char* _username="", const char * _password="", const char * _email="") {
  89. strcpy(username,_username);
  90. setPassword(_password);
  91. setEmail(_email);
  92. }
  93.  
  94. void setPassword(const char * _password) {
  95. int upper = 0;
  96. int lower = 0;
  97. int number = 0;
  98. for (int i=0; i < strlen(_password); ++i) {
  99. if (isupper(_password[i]))
  100. upper++;
  101. else if (islower(_password[i]))
  102. lower++;
  103. else if (isdigit(_password[i]))
  104. number++;
  105. }
  106. if (!upper || !lower || !number)
  107. throw InvalidPassword("Password is too weak.");
  108. strcpy(password,_password);
  109. }
  110.  
  111. void setEmail(const char * mail) {
  112. int contains = 0;
  113. for (int i=0; i < strlen(mail); ++i) {
  114. if (mail[i] == '@')
  115. contains++;
  116. }
  117. if (contains != 1)
  118. throw InvalidEmail("Mail is not valid.");
  119. strcpy(email,mail);
  120. }
  121.  
  122. virtual double popularity() = 0;
  123. };
  124.  
  125. class FacebookUser : public User {
  126. private:
  127. int friends;
  128. int likes;
  129. int comments;
  130. public:
  131. FacebookUser(const char* _username="", const char * _password="", const char * _email="",
  132. const int fr = 0, const int l = 0, const int comm = 0) : User(_username,_password,_email) {
  133. friends = fr;
  134. likes = l;
  135. comments = comm;
  136. }
  137. double popularity() {
  138. return friends + 0.1 * likes + 0.5 * comments;
  139. }
  140. };
  141.  
  142. class TwitterUser : public User {
  143. private:
  144. int followers;
  145. int tweets;
  146. static double TWEET_VALUE;
  147. public:
  148. TwitterUser(const char* _username="", const char * _password="", const char * _email="",
  149. const int fl = 0, const int tw = 0) : User(_username,_password,_email) {
  150. followers = fl;
  151. tweets = tw;
  152. }
  153. double popularity() {
  154. return followers + tweets * TWEET_VALUE;
  155. }
  156.  
  157. };
  158.  
  159. double TwitterUser::TWEET_VALUE = 0.5;
  160.  
  161. class SocialNetwork {
  162.  
  163. private:
  164. static int MAXIMUM_SIZE;
  165. User ** users;
  166. int currentUsers;
  167. public:
  168. SocialNetwork(){
  169. users = new User*[0];
  170. currentUsers = 0;
  171. }
  172.  
  173. SocialNetwork& operator += (User * u) {
  174. if (currentUsers == MAXIMUM_SIZE)
  175. throw MaximumSizeLimit(MAXIMUM_SIZE);
  176. User ** tmp = new User*[currentUsers + 1];
  177. for (int i=0; i < currentUsers; ++i) {
  178. tmp[i] = users[i];
  179. }
  180. tmp[currentUsers++] = u;
  181. delete [] users;
  182. users = tmp;
  183. return *this;
  184. }
  185.  
  186. static void changeMaximumSize(int number) {
  187. MAXIMUM_SIZE = number;
  188. }
  189.  
  190. double avgPopularity() {
  191. double pop = 0;
  192. for (int i=0; i < currentUsers; ++i) {
  193. pop += users[i] -> popularity();
  194. //cout << users[i] -> popularity() << endl;
  195. }
  196. return pop / currentUsers;
  197. }
  198.  
  199. ~SocialNetwork() {
  200. delete [] users;
  201. }
  202.  
  203. };
  204.  
  205. int SocialNetwork::MAXIMUM_SIZE = 5;
  206.  
  207. int main() {
  208.  
  209. SocialNetwork network = SocialNetwork();
  210. int n;
  211. cin >> n;
  212. char username[50];
  213. char password[50];
  214. char email[50];
  215. int userType;
  216. for (int i=0; i < n; ++i) {
  217. cin >> username;
  218. cin >> password;
  219. cin >> email;
  220. cin >> userType;
  221. if (userType == 1) {
  222. int friends;
  223. int likes;
  224. int comments;
  225. cin >> friends >> likes >> comments;
  226. try {
  227. User * u = new FacebookUser(username,password,email,friends,likes,comments);
  228. network += u;
  229. } catch(InvalidPassword & e) {
  230. e.message();
  231. }
  232. catch (InvalidEmail &e) {
  233. e.message();
  234. }
  235. catch(MaximumSizeLimit &e) {
  236. e.message();
  237. }
  238. }
  239. else {
  240. int followers;
  241. int tweets;
  242. cin >> followers >> tweets;
  243. try {
  244. User * u= new TwitterUser(username,password,email,followers,tweets);
  245. network += u;
  246. }catch(InvalidPassword & e) {
  247. e.message();
  248. }
  249. catch (InvalidEmail &e) {
  250. e.message();
  251. }
  252. catch(MaximumSizeLimit &e) {
  253. e.message();
  254. }
  255. }
  256.  
  257. }
  258. network.changeMaximumSize(6);
  259. cin >> username;
  260. cin >> password;
  261. cin >> email;
  262. int followers;
  263. int tweets;
  264. cin >> followers >> tweets;
  265. try {
  266. User * u= new TwitterUser(username,password,email,followers,tweets);
  267. network += u;
  268. }catch(InvalidPassword & e) {
  269. e.message();
  270. }
  271. catch (InvalidEmail &e) {
  272. e.message();
  273. }
  274. catch(MaximumSizeLimit &e) {
  275. e.message();
  276. }
  277. cout << network.avgPopularity();
  278.  
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement