Guest User

Untitled

a guest
May 16th, 2019
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. enum { STR_LEN = 50 };
  7.  
  8. class InvalidPassword {
  9. char text[32];
  10. public:
  11. InvalidPassword(const char* text = "") {
  12. strcpy(this->text, text);
  13. }
  14.  
  15. char *getMessage() {
  16. return text;
  17. }
  18. };
  19.  
  20. class InvalidEmail {
  21. char text[32];
  22. public:
  23. InvalidEmail(const char* text = "") {
  24. strcpy(this->text, text);
  25. }
  26.  
  27. char *getMessage() {
  28. return text;
  29. }
  30. };
  31.  
  32. class MaximumSizeLimit {
  33. int size;
  34. public:
  35. MaximumSizeLimit(int size = 0) {
  36. this->size = size;
  37. }
  38.  
  39. void message() {
  40. cout << "You can't add more than " << size << " users." << endl;
  41. }
  42. };
  43.  
  44. bool isValidEmail(const char *email) {
  45. int n = strlen(email);
  46. bool valid = false;
  47. for(int i=0; i<n; i++) {
  48. if(email[i] == '@') {
  49. if(valid) {
  50. return false;
  51. } else valid = true;
  52. }
  53. }
  54. return valid;
  55. }
  56.  
  57. bool isValidPassword(const char *pass) {
  58. int n = strlen(pass);
  59. bool upper = false, lower = false, digit = false;
  60. for(int i=0; i<n; i++) {
  61. if(isupper(pass[i])) upper = true;
  62. else if(islower(pass[i])) lower = true;
  63. else if(isdigit(pass[i])) digit = true;
  64. }
  65. return upper&&lower&&digit;
  66. }
  67.  
  68. class User {
  69. protected:
  70. char username[STR_LEN], password[STR_LEN], email[STR_LEN];
  71. public:
  72. User(const char* username = "", const char* password = "", const char* email = "") {
  73. if(!isValidPassword(password))
  74. throw InvalidPassword("Password is too weak.");
  75. if(!isValidEmail(email))
  76. throw InvalidEmail("Mail is not valid.");
  77. strcpy(this->username, username);
  78. strcpy(this->password, password);
  79. strcpy(this->email, email);
  80. }
  81.  
  82. virtual ~User() { }
  83.  
  84. virtual double popularity() = 0;
  85. };
  86.  
  87. class FacebookUser : public User {
  88. int friends, likes, comments;
  89. const static double likeKoef, commentKoef;
  90. public:
  91. FacebookUser(const char* username = "", const char* password = "", const char* email = "",
  92. int friends = 0, int likes = 0, int comments = 0) : User(username, password, email) {
  93. this->friends = friends;
  94. this->likes = likes;
  95. this->comments = comments;
  96. }
  97.  
  98. double popularity() {
  99. return (friends + (likes*likeKoef) + (comments*commentKoef));
  100. }
  101. };
  102.  
  103. class TwitterUser : public User {
  104. int followers, tweets;
  105. const static double tweetKoef;
  106. public:
  107. TwitterUser(const char* username = "", const char* password = "", const char* email = "",
  108. int followers = 0, int tweets = 0) : User(username, password, email) {
  109. this->followers = followers;
  110. this->tweets = tweets;
  111. }
  112.  
  113. double popularity() {
  114. return (followers + (tweets*tweetKoef));
  115. }
  116. };
  117.  
  118. const double FacebookUser::likeKoef = 0.1;
  119. const double FacebookUser::commentKoef = 0.5;
  120. const double TwitterUser::tweetKoef = 0.5;
  121.  
  122. class SocialNetwork {
  123. User **users;
  124. int n;
  125. void copy(const SocialNetwork &sn) {
  126. n = sn.n;
  127. for(int i=0; i<n; i++) {
  128. users[i] = sn.users[i];
  129. }
  130. }
  131. public:
  132. static int maxUsers;
  133. SocialNetwork() {
  134. n = 0;
  135. users = new User*[n];
  136. }
  137.  
  138. SocialNetwork(const SocialNetwork &sn) {
  139. copy(sn);
  140. }
  141.  
  142. SocialNetwork &operator=(const SocialNetwork &sn) {
  143. if(this == &sn) return *this;
  144. for(int i=0; i<n; i++)
  145. delete users[i];
  146. delete [] users;
  147. copy(sn);
  148. return *this;
  149. }
  150.  
  151. SocialNetwork &operator+=(User *newUser) {
  152. if(n >= maxUsers)
  153. throw MaximumSizeLimit(maxUsers);
  154. User **temp = new User*[n+1];
  155. for(int i=0; i<n; i++) {
  156. temp[i] = users[i];
  157. }
  158. temp[n++] = newUser;
  159. delete [] users;
  160. users = temp;
  161. return *this;
  162. }
  163.  
  164. double avgPopularity() {
  165. double sum = 0;
  166. for(int i=0; i<n; i++) {
  167. sum += users[i]->popularity();
  168. }
  169. return sum/n;
  170. }
  171.  
  172. static void changeMaximumSize(int number) {
  173. maxUsers = number;
  174. }
  175.  
  176. static int getMaxUsers() {
  177. return maxUsers;
  178. }
  179. };
  180.  
  181. int SocialNetwork::maxUsers = 5;
  182.  
  183. int main() {
  184.  
  185.  
  186. SocialNetwork network = SocialNetwork();
  187. int n;
  188. cin >> n;
  189. char username[50];
  190. char password[50];
  191. char email[50];
  192. int userType;
  193. for (int i=0; i < n; ++i) {
  194. cin >> username;
  195. cin >> password;
  196. cin >> email;
  197. cin >> userType;
  198. if (userType == 1) {
  199. int friends;
  200. int likes;
  201. int comments;
  202. cin >> friends >> likes >> comments;
  203.  
  204. // TODO: Try-catch
  205. try {
  206. User * u = new FacebookUser(username,password,email,friends,likes,comments);
  207. network += u;
  208. } catch(InvalidEmail &er) {
  209. cout << er.getMessage() << endl;
  210. } catch(InvalidPassword &er) {
  211. cout << er.getMessage() << endl;
  212. } catch(MaximumSizeLimit &er) {
  213. er.message();
  214. }
  215. } else {
  216. int followers;
  217. int tweets;
  218. cin >> followers >> tweets;
  219.  
  220. // TODO: Try-catch
  221. try {
  222. User * u= new TwitterUser(username,password,email,followers,tweets);
  223. network += u;
  224. } catch(InvalidEmail &er) {
  225. cout << er.getMessage() << endl;
  226. } catch(InvalidPassword &er) {
  227. cout << er.getMessage() << endl;
  228. } catch(MaximumSizeLimit &er) {
  229. er.message();
  230. }
  231. }
  232.  
  233. }
  234.  
  235. network.changeMaximumSize(6);
  236. cin >> username;
  237. cin >> password;
  238. cin >> email;
  239. int followers;
  240. int tweets;
  241. cin >> followers >> tweets;
  242.  
  243. // TODO: Try-catch
  244. try {
  245. User * u= new TwitterUser(username,password,email,followers,tweets);
  246. network += u;
  247. } catch(InvalidEmail &er) {
  248. cout << er.getMessage() << endl;
  249. } catch(InvalidPassword &er) {
  250. cout << er.getMessage() << endl;
  251. } catch(MaximumSizeLimit &er) {
  252. er.message();
  253. }
  254.  
  255. cout << network.avgPopularity();
  256. }
Add Comment
Please, Sign In to add comment