Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<cstring>
- #include<ctype.h>
- using namespace std;
- class Exception {
- protected:
- char msg[50];
- public:
- Exception(char * msg) {
- strcpy(this->msg, msg);
- }
- void showMessage() { //Сите класи кои се справуваат со исклучоци треба да
- cout<<msg;//го имаат имплементирано методот void message()
- }
- };
- class InvalidPassword : public Exception {
- public:
- InvalidPassword(char * msg) : Exception(msg) {}
- }; //така што за првите две класи ќе ја печати пораката којашто е испратена како параметар,
- class InvalidEmail : public Exception {
- public:
- InvalidEmail(char * msg) : Exception(msg) {}
- };
- class MaximumSizeLimit {
- private:
- int n;// а за последната класа ќе печати You cant add more than N users,
- public:
- MaximumSizeLimit(){
- this->n = 0;
- }
- MaximumSizeLimit(int n) {//каде што N е параметарот кој е пратен.
- this->n = n;
- }
- void showMessage() {
- cout<<"You can't add more than "<<n<<" users."<<endl;
- }
- };
- class User { //Да се дефинира апстрактна класа User
- protected://за која ќе се чуваат:
- char username[50];//username (char[50])
- char password[50];//password (char[50])
- char email[50];//email (char[50])
- bool checkpassword(char * pass) {
- int golema=0, mala=0, brojce=0;
- for(int i=0; i<strlen(pass);i++) {
- if(isdigit(pass[i]))
- brojce++;// Доколку лозинката на корисникот не содржи барем 1 голема буква,
- if(islower(pass[i]))
- mala++;//1 мала буква и 1 број
- if(isupper(pass[i]))
- golema++;// да се фрли исклучок од класа InvalidPassword
- }
- if(brojce<1 || mala<1 || golema<1)
- return false;
- else return true;
- }
- bool checkemail(char * mail) {
- int counter=0;//Доколку емаилот на корисникот не содржи точно еднаш @
- for(int i=0;i<strlen(mail);i++) {
- char znak = mail[i];
- if(znak == 64)
- counter++;
- }
- if(counter==1)
- return true;
- else return false;
- }
- public:
- User() {
- strcpy(this->username, "");
- strcpy(this->password, "");
- strcpy(this->email, "");
- }
- User(char * username, char * password, char * email) {
- if(checkpassword(password)==false)
- throw InvalidPassword("Password is too weak.\n");//како параметар ќе се прати пораката Password is too weak.
- if(checkemail(email)==false)//да се фрли исклучок од класа InvalidEmail
- throw InvalidEmail("Mail is not valid.\n");//како параметар ќе се прати пораката Mail is not valid.
- strcpy(this->username, username);
- strcpy(this->password, password);
- strcpy(this->email, email);
- }
- User(const User ©) {
- strcpy(this->username, copy.username);
- strcpy(this->password, copy.password);
- strcpy(this->email, copy.email);
- }
- virtual double popularity() = 0;
- };//Класата треба да содржи еден чист виртуелен метод double popularity().
- class FacebookUser : public User { //Од оваа класа да се изведат две класи и тоа FacebookUser
- private://За класата FacebookUser уште се чуваат и:
- int friends; //број на пријатели
- int likes; //број на лајкови и
- int comments; //број на коментари
- public:
- FacebookUser() {
- this-> friends = 0;
- this-> likes = 0;
- this-> comments = 0;
- }
- FacebookUser (char * username, char * password, char * email, int friends, int likes, int comments) : User(username, password, email) {
- this->friends = friends;
- this->likes = likes;
- this->comments = comments;
- }
- FacebookUser(const FacebookUser ©) : User(copy) {
- this->friends = copy.friends;
- this->likes = copy.likes;
- this->comments = copy.comments;
- }
- double popularity() { //Популарноста се пресметува така што се собираат бројот на пријатели,
- return (this->likes * 0.1 + this->comments * 0.5 + this->friends); //бројот на лајкови и бројот на коментари,
- }//но притоа бројот на лајкови се множи со коефициент на вредност на лајкот кој е ист за секој корисник и
- }; //изнесува 0.1, а исто така и бројот на коментари се множи со ист таков коефициент кој е 0.5.
- class TwitterUser : public User { //и TwitterUser.
- private: //За класата TwitterUser уште се чуваат и:
- int followers; //број на следачи и
- int tweets; //број на твитови
- public:
- TwitterUser() {
- this->followers = 0;
- this->tweets = 0;
- }
- TwitterUser(char * username, char * password, char * email, int followers, int tweets) : User(username, password, email) {
- this->followers = followers;
- this->tweets = tweets;
- }
- TwitterUser (const TwitterUser ©) : User (copy) {
- this->followers = copy.followers;
- this->tweets = copy.tweets;
- }
- double popularity() { //Популарноста се пресметува така што се собираат на следачи и бројот на твитови,
- return (this->tweets * 0.5 + this->followers); //но притоа бројот на твитови се множи со коефициент
- }//на вредност на твитот кој е ист за секој корисник и изнесува 0.5
- };
- class SocialNetwork { //Да се креира класа SocialNetwork
- private://која ќе содржи:
- User **niza; //динамичка низа од покажувачи од класата User
- int korisnici; //број на тековни корисници и
- static int max; //максимален број на корисници кој може да го содржи мрежата
- // и кој е ист за сите мрежи и иницијално е поставен на 5
- public:
- SocialNetwork() {
- this->niza = new User * [1];
- this->korisnici = 0;
- }
- SocialNetwork(User **niza, int korisnici) {
- this->korisnici = korisnici;
- this->niza = new User * [korisnici];
- }
- SocialNetwork(const SocialNetwork ©) {
- this->korisnici = copy.korisnici;
- this->niza = new User * [copy.korisnici];
- }
- SocialNetwork &operator=(const SocialNetwork ©) {
- if(this!=©) {
- this->korisnici = copy.korisnici;
- this->niza = new User * [copy.korisnici];
- }
- return *this;
- }
- SocialNetwork &operator+=(User * add) {
- if(max > korisnici) {//Доколку проба да се додаде корисник во социјалната мрежа,
- User ** tmp = new User * [korisnici+1]; // а веќе максималниот број на корисници
- for(int i=0; i<korisnici;i++)
- tmp[i] = niza[i];
- tmp[korisnici++] = add;
- delete [] niza;
- niza = tmp;
- }// е пополнет да се фрли исклучок од класа MaximumSizeLimit
- else throw MaximumSizeLimit(max);//така што како параметар ќе се прати
- return *this;// максималниот број на корисници во мрежата.
- }
- double avgPopularity() { //Да се дефинира метод avgPopularity()
- double total = 0.0;
- for(int i=0; i<this->korisnici; i++)
- total = total + niza[i]->popularity();
- return total/korisnici;
- }//кој ќе ја враќа просечната популарност на корисниците во мрежата.
- static void changeMaximumSize (int number) { //Исто така да се овозможи промена на максималната
- max = number; //големина на низата преку методот changeMaximumSize(int number).
- }
- ~SocialNetwork(){
- delete [] niza;
- }
- };
- int SocialNetwork::max = 5;
- int main() {
- SocialNetwork network = SocialNetwork();
- int n;
- cin >> n;
- char username[50];
- char password[50];
- char email[50];
- int userType;
- for (int i=0; i < n; ++i) {
- cin >> username;
- cin >> password;
- cin >> email;
- cin >> userType;
- if (userType == 1) {
- int friends;
- int likes;
- int comments;
- cin >> friends >> likes >> comments;
- // TODO: Try-catch
- try {
- User * u = new FacebookUser(username,password,email,friends,likes,comments);
- network += u;
- }
- catch (InvalidPassword &exc) {
- exc.showMessage();
- }
- catch (InvalidEmail &exc) {
- exc.showMessage();
- }
- catch (MaximumSizeLimit &exc) {
- exc.showMessage();
- }
- }
- else {
- int followers;
- int tweets;
- cin >> followers >> tweets;
- // TODO: Try-catch
- try {
- User * u= new TwitterUser(username,password,email,followers,tweets);
- network += u;
- }
- catch (InvalidPassword &exc) {
- exc.showMessage();
- }
- catch (InvalidEmail &exc) {
- exc.showMessage();
- }
- catch (MaximumSizeLimit &exc) {
- exc.showMessage();
- }
- }
- }
- network.changeMaximumSize(6);
- cin >> username;
- cin >> password;
- cin >> email;
- int followers;
- int tweets;
- cin >> followers >> tweets;
- // TODO: Try-catch
- try {
- User * u= new TwitterUser(username,password,email,followers,tweets);
- network += u;
- }
- catch (InvalidPassword &exc) {
- exc.showMessage();
- }
- catch (InvalidEmail &exc) {
- exc.showMessage();
- }
- catch (MaximumSizeLimit &exc) {
- exc.showMessage();
- }
- cout << network.avgPopularity();
- }
Add Comment
Please, Sign In to add comment