196040

OOP labs 9 SocialNetwork

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