Advertisement
196040

OOP ispitni zadaci SMS Poraki

Jul 1st, 2020
1,138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.80 KB | None | 0 0
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. class SMS { //Во рамките на еден телекомуникациски оператор, СМС пораките се делат на регуларни и специјални.
  5. protected: //За секојa СМС порака се знае:
  6.     double cena; //основна цена за една порака до 160 знаци (реален број)
  7.     char pretplatnik[15]; //претплатнички број на кој е испратена (низа од знаци со должина 12) //dolzina 12 my ass
  8. public://Класата за опишување на СМС пораки е апстрактна (5 поени).
  9.     SMS() {
  10.     strcpy(this->pretplatnik, "");
  11.     this->cena = 0.0;
  12.     }
  13.     SMS(char * pretplatnik, double cena) {
  14.         this->cena = cena;
  15.         strcpy(this->pretplatnik, pretplatnik);
  16.     }
  17.     SMS(const SMS &copy) {
  18.         this->cena = copy.cena;
  19.         strcpy(this->pretplatnik, copy.pretplatnik);
  20.     }
  21.     virtual double SMS_cena() {
  22.     return cena;
  23.     }
  24.     friend ostream &operator<<(ostream &o, SMS &print) {//Преоптоварен оператор <<
  25.         o<<"Tel: "<<print.pretplatnik<<" - cena: "<<print.SMS_cena()<<"den."<<endl;  //за печатење на податоците за СМС пораките во формат:
  26.     return o;
  27.     }//Тел.број: цена
  28. };
  29. //EEEEEEEEEEEEEEEEEEEEEEEEEEEBITE SE EBITE SE ZNAEV DEKA 12 E MALCE ZA EDEN BROJ SI REKOV
  30. //DALI POJSE DA STAAM AMA NEEEEEEEEEEE DA NE TROSAM MEMORIJA DEMEK EPA MALCE SE 12 INACE
  31. //MI ZAZIMASE MESTO U DRUGIOT STRING E B I T E SE
  32. class RegularSMS : public SMS {
  33. private://За секоја Регуларна СМС дополнително се чуваат податоци за текстот на пораката
  34.     bool roaming; // и тоа дали е користена роаминг услуга (bool променлива).
  35.     char tekst[1000];
  36.     static int rprocent;
  37. public:
  38.     RegularSMS() {
  39.     strcpy(this->tekst, "");
  40.     this->roaming = false;
  41.     }
  42.     RegularSMS(char * pretplatnik, double cena, char * tekst, bool roaming) : SMS (pretplatnik, cena) {
  43.         strcpy(this->tekst, tekst);
  44.         this->roaming = roaming;
  45.     }
  46.     RegularSMS(const RegularSMS &copy) : SMS(copy) {
  47.         strcpy(this->tekst, copy.tekst);
  48.         this->roaming = copy.roaming;
  49.     }
  50.     static void set_rProcent(int p) {
  51.         rprocent = p;
  52.     }
  53.     int calc() {
  54.         int counter=0;
  55.         for(int copy=strlen(tekst); copy>0; copy=copy-160)
  56.             counter++;
  57.         return counter;
  58.     }
  59.     double SMS_cena() { //За регуларна СМС -
  60.         double temp = SMS::SMS_cena();
  61.         if(this->roaming)
  62.             temp = temp+temp* rprocent/100;//цената се зголемува за 300% од основната цена ако е испратена од странство,
  63.         else temp = temp+temp*0.18;//а 18% од дома и цената се формира врз база на тоа во колку СМС пораки
  64.         return temp*calc();
  65.     } //или повеќе пораки (пр. за 162 знаци, цената на СМС е иста како и за 320 знаци).
  66. };
  67. int RegularSMS::rprocent = 300;
  68. class SpecialSMS : public SMS { //За секоја Специјална
  69. private: //СМС дополнително се чуваат податоци за тоа
  70.     bool humanitarna; //дали е наменета за хуманитарни цели (bool променлива). (5 поени)
  71.     static int sprocent;
  72. public:
  73.     SpecialSMS() {
  74.     this->humanitarna = true;
  75.     }
  76.     SpecialSMS(char * pretplatnik, double cena, bool humanitarna) : SMS(pretplatnik, cena) {
  77.         this->humanitarna = humanitarna;
  78.     }
  79.     SpecialSMS(const SpecialSMS & copy) : SMS(copy) {
  80.         this->humanitarna = copy.humanitarna;
  81.     }
  82.      double SMS_cena() {// специјална СМС - цената се зголемува за 150% од основната
  83.                 if(this->humanitarna)//цена ако пораката HE е наменета за хуманитарни цели.
  84.                 return SMS::SMS_cena();//Пресметувањето 18% данок на цената на сите СМС пораки е фиксен и не се менува,
  85.             else
  86.                 return SMS::SMS_cena() + SMS::SMS_cena() * sprocent/100;
  87.      } // менува. Да се обезбеди механизам за можност за нивно менување. (5 поени)
  88.     static void set_sProcent(int p) {
  89.         sprocent = p;
  90.     }
  91. };
  92. int SpecialSMS::sprocent = 150;
  93. void vkupno_SMS(SMS **poraka, int n) {//Да се имплементира функција vkupno_SMS со потпис:
  94.     int r = 0, s = 0;//void vkupno_SMS(SMS** poraka, int n)
  95.     double reg=0.0, spec=0.0;
  96.     for(int i=0; i<n; i++) {
  97.         RegularSMS * p1 = dynamic_cast<RegularSMS *>(poraka[i]);
  98.         if(p1!=0) {
  99.             r++;//во која се печати вкупниот број на регуларни СМС пораки и нивната вкупна цена,
  100.             reg=reg+poraka[i]->SMS_cena();
  101.         }
  102.         SpecialSMS * p2 = dynamic_cast<SpecialSMS *>(poraka[i]);
  103.         if(p2!=0) {
  104.             s++;//како и бројот на специјални СМС пораки и нивната вкупна цена во проследената
  105.             spec = spec+poraka[i]->SMS_cena();
  106.         }//низа посебно. (15 поени)
  107.     }
  108.     cout<<"Vkupno ima "<<r<<" regularni SMS poraki i nivnata cena e: "<<reg<<endl;
  109.     cout<<"Vkupno ima "<<s<<" specijalni SMS poraki i nivnata cena e: "<<spec<<endl;
  110. }
  111. int main() {
  112.     char tel[20], msg[1000];
  113.     float cena;
  114.     float price;
  115.     int p;
  116.     bool roam, hum;
  117.     SMS  **sms;
  118.     int n;
  119.     int tip;
  120.     int testCase;
  121.     cin >> testCase;
  122.     if (testCase == 1) {
  123.         cout << "====== Testing RegularSMS class ======" << endl;
  124.         cin >> n;
  125.         sms = new SMS *[n];
  126.         for (int i = 0; i < n; i++) {
  127.             cin >> tel;
  128.             cin >> cena;
  129.             cin.get();
  130.             cin.getline(msg, 1000);
  131.             cin >> roam;
  132.             cout << "CONSTRUCTOR" << endl;
  133.             sms[i] = new RegularSMS(tel, cena, msg, roam);
  134.             cout << "OPERATOR <<" << endl;
  135.             cout << *sms[i];
  136.         }
  137.         for (int i = 0; i<n; i++) delete sms[i];
  138.         delete[] sms;
  139.     }
  140.     if (testCase == 2) {
  141.         cout << "====== Testing SpecialSMS class ======" << endl;
  142.         cin >> n;
  143.         sms = new SMS *[n];
  144.         for (int i = 0; i < n; i++) {
  145.             cin >> tel;
  146.             cin >> cena;
  147.             cin >> hum;
  148.             cout << "CONSTRUCTOR" << endl;
  149.             sms[i] = new SpecialSMS(tel, cena, hum);
  150.             cout << "OPERATOR <<" << endl;
  151.             cout << *sms[i];
  152.         }
  153.         for (int i = 0; i<n; i++) delete sms[i];
  154.         delete[] sms;
  155.     }
  156.     if (testCase == 3) {
  157.         cout << "====== Testing method vkupno_SMS() ======" << endl;
  158.         cin >> n;
  159.         sms = new SMS *[n];
  160.         for (int i = 0; i<n; i++) {
  161.             cin >> tip;
  162.             cin >> tel;
  163.             cin >> cena;
  164.             if (tip == 1) {
  165.                 cin.get();
  166.                 cin.getline(msg, 1000);
  167.                 cin >> roam;
  168.                 sms[i] = new RegularSMS(tel, cena, msg, roam);
  169.             } else {
  170.                 cin >> hum;
  171.                 sms[i] = new SpecialSMS(tel, cena, hum);
  172.             }
  173.         }
  174.         vkupno_SMS(sms, n);
  175.         for (int i = 0; i<n; i++) delete sms[i];
  176.         delete[] sms;
  177.     }
  178.     if (testCase == 4) {
  179.         cout << "====== Testing RegularSMS class with a changed percentage======" << endl;
  180.         SMS *sms1, *sms2;
  181.         cin >> tel;
  182.         cin >> cena;
  183.         cin.get();
  184.         cin.getline(msg, 1000);
  185.         cin >> roam;
  186.         sms1 = new RegularSMS(tel, cena, msg, roam);
  187.         cout << *sms1;
  188.         cin >> tel;
  189.         cin >> cena;
  190.         cin.get();
  191.         cin.getline(msg, 1000);
  192.         cin >> roam;
  193.         cin >> p;
  194.         RegularSMS::set_rProcent(p);
  195.         sms2 = new RegularSMS(tel, cena, msg, roam);
  196.         cout << *sms2;
  197.         delete sms1, sms2;
  198.     }
  199.     if (testCase == 5) {
  200.         cout << "====== Testing SpecialSMS class with a changed percentage======" << endl;
  201.         SMS *sms1, *sms2;
  202.         cin >> tel;
  203.         cin >> cena;
  204.         cin >> hum;
  205.         sms1 = new SpecialSMS(tel, cena, hum);
  206.         cout << *sms1;
  207.         cin >> tel;
  208.         cin >> cena;
  209.         cin >> hum;
  210.         cin >> p;
  211.         SpecialSMS::set_sProcent(p);
  212.         sms2 = new SpecialSMS(tel, cena, hum);
  213.         cout << *sms2;
  214.         delete sms1, sms2;
  215.     }
  216.     return 0;
  217. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement