Koki99

SMS Пораки - Втор Колоквиум - Пример

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