metalni

OOP Labs 9 SocialNetwork

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