Advertisement
Guest User

Untitled

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