Advertisement
metalni

OOP Ispitni Zadaci Sliki

Jun 19th, 2020
762
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.41 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. class Image{
  8.     protected:
  9.         char * name;
  10.         char userName[50];
  11.         int width;
  12.         int height;
  13.         const void copy_obj(const Image &orig){
  14.             this->name = new char[strlen(orig.name)+1];
  15.             strcpy(this->name, orig.name);
  16.             strcpy(this->userName, orig.userName);
  17.             this->width = orig.width;
  18.             this->height = orig.height;
  19.         }
  20.     public:
  21.         Image(){
  22.             this->name = new char[10];
  23.             strcpy(this->name, "untitled");
  24.             strcpy(this->userName, "unknown");
  25.             this->width = 800;
  26.             this->height = 800;
  27.         }
  28.         Image(const char * name){
  29.             this->name = new char[strlen(name) + 1];
  30.             strcpy(this->name, name);
  31.             strcpy(this->userName, "unknown");
  32.             this->width = 800;
  33.             this->height = 800;
  34.         }
  35.         Image(const char * name, const char * userName){
  36.             this->name = new char[strlen(name)+1];
  37.             strcpy(this->name, name);
  38.             strcpy(this->userName, userName);
  39.             this->width = 800;
  40.             this->height = 800;
  41.         }
  42.         Image(const char * name, const char * userName, const int width, const int height){
  43.             this->name = new char[strlen(name)+1];
  44.             strcpy(this->name, name);
  45.             strcpy(this->userName, userName);
  46.             this->width = width;
  47.             this->height = height;
  48.         }
  49.         Image(const Image &orig){
  50.             this->copy_obj(orig);
  51.         }
  52.         Image &operator=(const Image &orig){
  53.             if(this != &orig){
  54.                 delete [] this->name;
  55.                 this->copy_obj(orig);
  56.             }
  57.             return *this;
  58.         }
  59.         ~Image(){
  60.             delete [] this->name;
  61.         }
  62.         virtual const int fileSize(){
  63.             return this->width * this->height * 3;
  64.         }
  65.         const int getTotalPixels(){
  66.             return this->width * this->height;
  67.         }
  68.         friend ostream &operator <<(ostream &os, Image &orig){
  69.             os << orig.name << " " << orig.userName << " " << orig.fileSize() << "\n";
  70.             return os;
  71.         }
  72.         bool operator>(Image &orig){
  73.             if(this->fileSize() > orig.fileSize())
  74.                 return true;
  75.             else
  76.                 return false;
  77.         }
  78. };
  79.  
  80. class TransparentImage : public Image{
  81.     private:
  82.         bool isTransparent;
  83.     public:
  84.         TransparentImage(){
  85.             this->isTransparent = true;
  86.         }
  87.         TransparentImage(const char * name, const char * userName, const int width, const int height, const bool isTransparent) : Image(name, userName, width, height){
  88.             this->isTransparent = isTransparent;
  89.         }
  90.         const int fileSize(){
  91.             if(this->isTransparent == true)
  92.                 return this->width * this->height * 4;
  93.             else
  94.                 return this->width * this->height + this->getTotalPixels() / 8;
  95.         }
  96.  
  97. };
  98.  
  99. class Folder{
  100.     private:
  101.         char name[255];
  102.         char owner[50];
  103.         Image ** img;
  104.         int n;
  105.         const void copy_obj(const Folder &orig){
  106.             strcpy(this->name, orig.name);
  107.             strcpy(this->owner, orig.owner);
  108.             this->img = new Image*[orig.n + 1];
  109.             for(int i=0; i<orig.n; i++)
  110.                 this->img[i] = orig.img[i];
  111.             this->n = orig.n;
  112.         }
  113.     public:
  114.         Folder(){
  115.             strcpy(this->name, "untitled");
  116.             strcpy(this->owner, "uknown");
  117.             this->img = new Image*[0];
  118.             this->n = 0;
  119.         }
  120.         Folder(const char * name, const char * owner){
  121.             strcpy(this->name, name);
  122.             strcpy(this->owner, owner);
  123.             this->img = new Image*[0];
  124.             this->n = 0;
  125.         }
  126.         Folder(const Folder &orig){
  127.             this->copy_obj(orig);
  128.         }
  129.         Folder &operator=(const Folder &orig){
  130.             if(this != &orig){
  131.                 delete [] this->img;
  132.                 this->copy_obj(orig);
  133.             }
  134.             return *this;
  135.         }
  136.         Folder &operator += (Image &orig){
  137.             Image ** tmp = new Image*[this->n + 1];
  138.             for(int i=0; i<this->n; i++)
  139.                 tmp[i] = this->img[i];
  140.             tmp[this->n++] = &orig;
  141.             delete [] this->img;
  142.             this->img = tmp;
  143.  
  144.             return *this;
  145.         }
  146.         ~Folder(){
  147.             delete [] this->img;
  148.         }
  149.         const int folderSize(){
  150.             int sum=0;
  151.             for(int i=0; i<this->n; i++)
  152.                 sum += this->img[i]->fileSize();
  153.             return sum;
  154.         }
  155.         Image * getMaxFile(){
  156.             int max = this->img[0]->fileSize();
  157.             int index = 0;
  158.             for(int i=1; i<this->n; i++){
  159.                 if(this->img[i]->fileSize() > max){
  160.                     max = this->img[i]->fileSize();
  161.                     index = i;
  162.                 }
  163.             }
  164.             return this->img[index];
  165.         }
  166.        
  167.         friend ostream &operator <<(ostream &os, Folder &orig){
  168.             os << orig.name << " " << orig.owner << "\n";
  169.             os << "--\n";
  170.             for(int i=0; i<orig.n; i++)
  171.                 os << *orig.img[i];
  172.             os << "--\n" << "Folder size: " << orig.folderSize();
  173.             return os;
  174.         }
  175.         Image * &operator[](int i){
  176.             return this->img[i];
  177.         }
  178. };
  179.  
  180. const void max_folder_size(Folder * fdl, int n){
  181.     int max=fdl[0].folderSize();
  182.     int index = 0;
  183.     for(int i=1; i<n; i++){
  184.         if(fdl[i].folderSize() > max){
  185.             max = fdl[i].folderSize();
  186.             index = i;
  187.         }
  188.     }
  189.     cout << fdl[index];
  190. }
  191.  
  192. int main() {
  193.  
  194.     int tc; // Test Case
  195.  
  196.     char name[255];
  197.     char user_name[51];
  198.     int w, h;
  199.     bool tl;
  200.  
  201.     cin >> tc;
  202.  
  203.     if (tc==1){
  204.       // Testing constructor(s) & operator << for class File
  205.  
  206.       cin >> name;
  207.       cin >> user_name;
  208.       cin >> w;
  209.       cin >> h;
  210.  
  211.  
  212.       Image f1;
  213.  
  214.       cout<< f1;
  215.  
  216.       Image f2(name);
  217.       cout<< f2;
  218.  
  219.       Image f3(name, user_name);
  220.       cout<< f3;
  221.  
  222.       Image f4(name, user_name, w, h);
  223.       cout<< f4;
  224.     }
  225.     else if (tc==2){
  226.       // Testing constructor(s) & operator << for class TextFile
  227.       cin >> name;
  228.       cin >> user_name;
  229.       cin >> w >> h;
  230.       cin >> tl;
  231.  
  232.       TransparentImage tf1;
  233.       cout<< tf1;
  234.  
  235.       TransparentImage tf4(name, user_name, w, h, tl);
  236.       cout<< tf4;
  237.     }
  238.     else if (tc==3){
  239.       // Testing constructor(s) & operator << for class Folder
  240.       cin >> name;
  241.       cin >> user_name;
  242.  
  243.       Folder f3(name, user_name);
  244.       cout<< f3;
  245.     }
  246.     else if (tc==4){
  247.       // Adding files to folder
  248.       cin >> name;
  249.       cin >> user_name;
  250.  
  251.       Folder dir(name, user_name);
  252.  
  253.       Image * f;
  254.       TransparentImage *tf;
  255.  
  256.       int sub, fileType;
  257.  
  258.       while (1){
  259.         cin >> sub; // Should we add subfiles to this folder
  260.         if (!sub) break;
  261.  
  262.         cin >>fileType;
  263.         if (fileType == 1){ // Reading File
  264.           cin >> name;
  265.           cin >> user_name;
  266.           cin >> w >> h;
  267.           f = new Image(name,user_name, w, h);
  268.             dir += *f;
  269.         }
  270.         else if (fileType == 2){
  271.           cin >> name;
  272.           cin >> user_name;
  273.           cin >> w >> h;
  274.           cin >> tl;
  275.           tf = new TransparentImage(name,user_name, w, h, tl);
  276.             dir += *tf;
  277.         }
  278.       }
  279.       cout<<dir;
  280.     }
  281.     else if(tc==5){
  282.       // Testing getMaxFile for folder
  283.  
  284.       cin >> name;
  285.       cin >> user_name;
  286.  
  287.       Folder dir(name, user_name);
  288.  
  289.       Image* f;
  290.       TransparentImage* tf;
  291.  
  292.       int sub, fileType;
  293.  
  294.       while (1){
  295.         cin >> sub; // Should we add subfiles to this folder
  296.         if (!sub) break;
  297.  
  298.         cin >>fileType;
  299.         if (fileType == 1){ // Reading File
  300.           cin >> name;
  301.           cin >> user_name;
  302.           cin >> w >> h;
  303.           f = new Image(name,user_name, w, h);
  304.             dir += *f;
  305.         }
  306.         else if (fileType == 2){
  307.           cin >> name;
  308.           cin >> user_name;
  309.           cin >> w >> h;
  310.           cin >> tl;
  311.           tf = new TransparentImage(name,user_name, w, h, tl);
  312.             dir += *tf;
  313.         }
  314.       }
  315.       cout<< *(dir.getMaxFile());
  316.     }
  317.     else if(tc==6){
  318.       // Testing operator [] for folder
  319.  
  320.       cin >> name;
  321.       cin >> user_name;
  322.  
  323.       Folder dir(name, user_name);
  324.  
  325.       Image* f;
  326.       TransparentImage* tf;
  327.  
  328.       int sub, fileType;
  329.  
  330.       while (1){
  331.         cin >> sub; // Should we add subfiles to this folder
  332.         if (!sub) break;
  333.  
  334.         cin >>fileType;
  335.         if (fileType == 1){ // Reading File
  336.           cin >> name;
  337.           cin >> user_name;
  338.           cin >> w >> h;
  339.           f = new Image(name,user_name, w, h);
  340.             dir += *f;
  341.         }
  342.         else if (fileType == 2){
  343.           cin >> name;
  344.           cin >> user_name;
  345.           cin >> w >> h;
  346.           cin >> tl;
  347.           tf = new TransparentImage(name,user_name, w, h, tl);
  348.             dir += *tf;
  349.         }
  350.       }
  351.  
  352.       cin >> sub; // Reading index of specific file
  353.       cout<< *dir[sub];
  354.     }
  355.     else if(tc==7){
  356.       // Testing function max_folder_size
  357.       int folders_num;
  358.  
  359.       Folder dir_list[10];
  360.  
  361.       Folder dir;
  362.       cin >> folders_num;
  363.  
  364.       for (int i=0; i<folders_num; ++i){
  365.         cin >> name;
  366.         cin >> user_name;
  367.         dir = Folder(name, user_name);
  368.  
  369.  
  370.         Image* f;
  371.         TransparentImage *tf;
  372.  
  373.         int sub, fileType;
  374.  
  375.         while (1){
  376.           cin >> sub; // Should we add subfiles to this folder
  377.           if (!sub) break;
  378.  
  379.           cin >>fileType;
  380.           if (fileType == 1){ // Reading File
  381.             cin >> name;
  382.             cin >> user_name;
  383.             cin >> w >> h;
  384.             f = new Image(name,user_name, w, h);
  385.               dir += *f;
  386.           }
  387.           else if (fileType == 2){
  388.             cin >> name;
  389.             cin >> user_name;
  390.             cin >> w >> h;
  391.             cin >> tl;
  392.             tf = new TransparentImage(name,user_name, w, h, tl);
  393.               dir += *tf;
  394.           }
  395.         }
  396.         dir_list[i] = dir;
  397.        
  398.       }
  399.  
  400.     max_folder_size(dir_list, folders_num);
  401.  
  402.     }
  403.     return 0;
  404. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement