Advertisement
metalni

Sliki za Dana Fixed

Jun 25th, 2020
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.16 KB | None | 0 0
  1. // NOT MY CODE, I WAS FIXING FOR A FRIEND, THIS CODE IS TERRIBLE BTW
  2.  
  3. //programata e resena malce so lagi prevari u mainot ama toa e
  4. #include<iostream>
  5. #include<cstring>
  6. using namespace std;
  7. class Image { //Да се креира класа која претставува слика (Image) во рамките на еден компјутер.
  8. protected: //За секоја датотека се чуваат (5 поени):
  9. char * imeslika;//име на сликата (дин. алоцирана низа од знаци).
  10. char korisnik[50]; //име на корисникот кој е сопственик на датотеката (низа од макс. 50 знаци).
  11. int sirina;//димензии на сликата
  12. int visina; //(2 цели броеви кои претставуваат ширина и висина во пиксели).
  13. public:
  14. Image(const char * imeslika = "untitled", const char * korisnik = "unknown", int sirina = 800, int visina = 800) {
  15.     this->imeslika = new char[strlen(imeslika)+1];
  16.     strcpy(this->imeslika, imeslika);
  17.     strcpy(this->korisnik, korisnik);
  18.     this->sirina = sirina;
  19.     this->visina = visina;
  20. }
  21. Image(const Image &copy) {
  22.     this->imeslika = new char[strlen(copy.imeslika)+1];
  23.     strcpy(this->imeslika, copy.imeslika);
  24.     strcpy(this->korisnik, copy.korisnik);
  25.     this->sirina = copy.sirina;
  26.     this->visina = copy.visina;
  27. }
  28. Image &operator=(const Image &copy){
  29.     if(this!=&copy) {
  30. this->imeslika = new char[strlen(copy.imeslika)+1];
  31.     strcpy(this->imeslika, copy.imeslika);
  32.     strcpy(this->korisnik, copy.korisnik);
  33.     this->sirina = copy.sirina;
  34.     this->visina = copy.visina;
  35.     }
  36.     return *this;
  37. }
  38. ~Image() {
  39.     delete [] imeslika;
  40. }//За класите Image и TransparentImage да се преоптоварат следниве оператори (5 поени):
  41. friend ostream &operator<<(ostream &o, Image &im) {//оператор << кој ги печати податоците
  42.     o<<im.imeslika<<" "<<im.korisnik<<" "<<im.fileSize()<<endl; // од датотеката во сл. формат:
  43.     return o;//    ime_fajl avtor golemina_na_fajlot_vo_bajti
  44. }
  45. bool operator>(Image &im) {
  46. if(this->fileSize() > im.fileSize())
  47. return true;
  48. else return false;
  49. } //оператор > кој ги споредува сликите според нивната големина.
  50. virtual int fileSize() { //За класите Image и TransparentImage да биде достапна метода (fileSize)
  51. //за пресметка на големината на сликата (во бајти).
  52. return this->sirina * this->visina * 3;//висината * ширината * 3.
  53. }//за објектите од класата Image, големината на датотеката е еднаква на:
  54. };
  55. class TransparentImage : public Image { //Од класата Image да се изведе класата TransparentImage,
  56. private:// која претставува слика која содржи поддржува транспарентност. За транспарентна слика дополнително се чува
  57. bool transparent; //дали поддржува нивоа на транспарентност (bool променлива
  58. public:
  59. TransparentImage (const char * imeslika = "untitled", const char * korisnik = "unknown", int sirina = 800, int visina = 800, bool transparent = true) : Image (imeslika, korisnik, sirina, visina) {
  60. this->transparent = transparent;
  61. }
  62. TransparentImage(const TransparentImage &copy) : Image(copy) {
  63.     this->transparent = copy.transparent;
  64. }
  65. int fileSize() { //за TransparentImage, доколку поддржува нивоа на транспарентност,
  66.     if(this->transparent==true) //големината на датотеката е еднаква на ширина * висина * 4.
  67.     return sirina*visina*4; //Доколку не поддржува транспарентност
  68.     else return (sirina*visina) + ((sirina*visina) / 8);  //големината на сликата
  69. }    //се пресметува како ширина * висина * 3 + бр._на_пиксели_присутни_во_сликата / 8.
  70. friend ostream &operator<<(ostream &o, TransparentImage &ti) {
  71.  o<<ti.imeslika<<" "<<ti.korisnik<<" "<<ti.fileSize()<<endl;
  72.  return o;
  73. }
  74. bool operator>(TransparentImage &ti) {
  75. if(this->fileSize() > ti.fileSize())
  76. return true;
  77. else return false;
  78. } //оператор > кој ги споредува сликите според нивната големина.
  79. };
  80. class Folder { //Да се дефинира класа Folder, што репрезентира директориум
  81. private://во кој може да се поставуваат слики. За секој фолдер се чува (5 поени):
  82. char imefolder[255]; //име на фолдерот (низа од макс 255 знаци)
  83. char sopstvenik[50]; //име на корисникот кој е сопственик на фолдерот (низа од макс. 50 знаци).
  84. Image ** niza; //низа од покажувачи кон Image објекти (макс. 100 во рамките на еден фолдер).
  85. int broj;
  86. public://Да се имплементираат следниве методи (5 поени):
  87. Folder(const char * imefolder = "", const char * sopstvenik = "") {
  88.     strcpy(this->imefolder, imefolder);
  89.     strcpy(this->sopstvenik, sopstvenik);
  90.   this->niza = new Image * [0];
  91.    this->broj = 0;
  92. }
  93.     Folder(const Folder &copy) {
  94.     strcpy(this->imefolder, copy.imefolder);
  95.     strcpy(this->sopstvenik, copy.sopstvenik);
  96.     this->broj = copy.broj;
  97.         for(int i=0;i<copy.broj;i++)
  98.             this->niza[i] = copy.niza[i];
  99.     }
  100. int folderSize() { //метода за пресметка на големината на фолдерот (folderSize).  
  101. int total=0.0;  //Големината на фолдерот е сума од големините од сите слики во
  102.     for(int i=0;i<broj; i++) //  рамките на фолдерот.
  103.         total = total+niza[i]->fileSize();
  104.         return total;
  105. }
  106.     Image * getMaxFile() {   //  метода за пронаоѓање на наголемата слика во рамките на фолдерот
  107.     int max = niza[0]->fileSize();
  108.         int indeks=0;
  109.         for(int i=0; i<broj; i++)
  110.             if(niza[i]->fileSize() > max) {
  111.             max = niza[i]->fileSize();
  112.             indeks = i;
  113.         }
  114.         return niza[indeks]; //  (getMaxFile). Методата враќа покажувач кон најголемата слика во
  115.     }  // фолдерот (сметано во бајти).
  116. Folder &operator+=(Image &add) {//За класата Folder да се имплементира и оператор += кој додава објекти
  117.     Image ** tmp = new Image * [broj+1];
  118.         for(int i=0; i<broj; i++)
  119.             tmp[i] = niza[i];
  120.         tmp[broj++] = &add;
  121.         delete [] niza;
  122.         niza = tmp;
  123.         return *this;
  124.     }//од типот Image/TransparentImage во рамките на фолдерот (5 поени).
  125.     friend ostream &operator<<(ostream &o, Folder &print) { //  operator << - со кој се печатат
  126.     o<<print.imefolder<<" "<<print.sopstvenik<<endl;
  127.         o<<"--"<<endl;
  128.         for(int i=0; i<print.broj; i++)
  129.          o<<*print.niza[i];
  130.         o<<"--"<<endl<<"Folder size: " << print.folderSize();
  131.         return o;
  132.     }
  133. //податоците за фолдерот во формат _(5 поени)_:
  134.     //ime_folder sopstvenik --
  135.       //  ime_slika avtor golemina_na_fajlot_vo_bajti
  136.         //ime_slika avtor golemina_na_fajlot_vo_bajti -- golemina_na_folder_vo_bajti
  137.  Image * &operator[](int i){ // kopirano od nikola
  138.             return this->niza[i];
  139.         } //operator [] - кој враќа покажувач кон соодветната слика во фолдерот.
  140. }; //    Доколку не постои слика на тој индекс, треба да се врати NULL (5 поени).
  141. void max_folder_size(Folder * niza, int n) { //Да се креира и глобална функција max_folder_size која
  142.    int max = niza[0].folderSize();// прима низа од објекти од типот Folder и го
  143.     int indeks=0;//враќа фолдерот кој има зафаќа најмногу простор (во бајти).
  144.     for(int i=0;i<n;i++)
  145.         if(niza[i].folderSize() > max) {
  146.         max = niza[i].folderSize();
  147.         indeks = i;
  148.     }
  149.     cout<<niza[indeks];
  150. }
  151. int main() {
  152.  
  153.     int tc; // Test Case
  154.  
  155.     char name[255];
  156.     char user_name[51];
  157.     int w, h;
  158.     bool tl;
  159.  
  160.     cin >> tc;
  161.  
  162.     if (tc==1){
  163.       // Testing constructor(s) & operator << for class File
  164.  
  165.       cin >> name;
  166.       cin >> user_name;
  167.       cin >> w;
  168.       cin >> h;
  169.  
  170.  
  171.       Image f1;
  172.  
  173.       cout<< f1;
  174.  
  175.       Image f2(name);
  176.       cout<< f2;
  177.  
  178.       Image f3(name, user_name);
  179.       cout<< f3;
  180.  
  181.       Image f4(name, user_name, w, h);
  182.       cout<< f4;
  183.     }
  184.     else if (tc==2){
  185.       // Testing constructor(s) & operator << for class TextFile
  186.       cin >> name;
  187.       cin >> user_name;
  188.       cin >> w >> h;
  189.       cin >> tl;
  190.  
  191.       TransparentImage tf1;
  192.       cout<< tf1;
  193.  
  194.       TransparentImage tf4(name, user_name, w, h, tl);
  195.       cout<< tf4;
  196.     }
  197.     else if (tc==3){
  198.       // Testing constructor(s) & operator << for class Folder
  199.       cin >> name;
  200.       cin >> user_name;
  201.  
  202.       Folder f3(name, user_name);
  203.       cout<< f3;
  204.     }
  205.     else if (tc==4){
  206.       // Adding files to folder
  207.       cin >> name;
  208.       cin >> user_name;
  209.  
  210.       Folder dir(name, user_name);
  211.  
  212.       Image * f;
  213.       TransparentImage *tf;
  214.  
  215.       int sub, fileType;
  216.  
  217.       while (1){
  218.         cin >> sub; // Should we add subfiles to this folder
  219.         if (!sub) break;
  220.  
  221.         cin >>fileType;
  222.         if (fileType == 1){ // Reading File
  223.           cin >> name;
  224.           cin >> user_name;
  225.           cin >> w >> h;
  226.           f = new Image(name,user_name, w, h);
  227.             dir += *f;
  228.         }
  229.         else if (fileType == 2){
  230.           cin >> name;
  231.           cin >> user_name;
  232.           cin >> w >> h;
  233.           cin >> tl;
  234.           tf = new TransparentImage(name,user_name, w, h, tl);
  235.             dir += *tf;
  236.         }
  237.       }
  238.       cout<<dir;
  239.     }
  240.     else if(tc==5){
  241.       // Testing getMaxFile for folder
  242.  
  243.       cin >> name;
  244.       cin >> user_name;
  245.  
  246.       Folder dir(name, user_name);
  247.  
  248.       Image* f;
  249.       TransparentImage* tf;
  250.  
  251.       int sub, fileType;
  252.  
  253.       while (1){
  254.         cin >> sub; // Should we add subfiles to this folder
  255.         if (!sub) break;
  256.  
  257.         cin >>fileType;
  258.         if (fileType == 1){ // Reading File
  259.           cin >> name;
  260.           cin >> user_name;
  261.           cin >> w >> h;
  262.           f = new Image(name,user_name, w, h);
  263.             dir += *f;
  264.         }
  265.         else if (fileType == 2){
  266.           cin >> name;
  267.           cin >> user_name;
  268.           cin >> w >> h;
  269.           cin >> tl;
  270.           tf = new TransparentImage(name,user_name, w, h, tl);
  271.             dir += *tf;
  272.         }
  273.       }
  274.       cout<< *(dir.getMaxFile());
  275.     }
  276.     else if(tc==6){
  277.       // Testing operator [] for folder
  278.  
  279.       cin >> name;
  280.       cin >> user_name;
  281.  
  282.       Folder dir(name, user_name);
  283.  
  284.       Image* f;
  285.       TransparentImage* tf;
  286.  
  287.       int sub, fileType;
  288.  
  289.       while (1){
  290.         cin >> sub; // Should we add subfiles to this folder
  291.         if (!sub) break;
  292.  
  293.         cin >>fileType;
  294.         if (fileType == 1){ // Reading File
  295.           cin >> name;
  296.           cin >> user_name;
  297.           cin >> w >> h;
  298.           f = new Image(name,user_name, w, h);
  299.             dir += *f;
  300.         }
  301.         else if (fileType == 2){
  302.           cin >> name;
  303.           cin >> user_name;
  304.           cin >> w >> h;
  305.           cin >> tl;
  306.           tf = new TransparentImage(name,user_name, w, h, tl);
  307.             dir += *tf;
  308.         }
  309.       }
  310.  
  311.       cin >> sub; // Reading index of specific file
  312.       cout<< *dir[sub];
  313.     }
  314.     else if(tc==7){
  315.       // Testing function max_folder_size
  316.       int folders_num;
  317.  
  318.       Folder dir_list[10];
  319.  
  320.       Folder dir;
  321.       cin >> folders_num;
  322.  
  323.       for (int i=0; i<folders_num; ++i){
  324.         cin >> name;
  325.         cin >> user_name;
  326.         dir = Folder(name, user_name);
  327.  
  328.  
  329.         Image* f;
  330.         TransparentImage *tf;
  331.  
  332.         int sub, fileType;
  333.  
  334.         while (1){
  335.           cin >> sub; // Should we add subfiles to this folder
  336.           if (!sub) break;
  337.  
  338.           cin >>fileType;
  339.           if (fileType == 1){ // Reading File
  340.             cin >> name;
  341.             cin >> user_name;
  342.             cin >> w >> h;
  343.             f = new Image(name,user_name, w, h);
  344.               dir += *f;
  345.           }
  346.           else if (fileType == 2){
  347.             cin >> name;
  348.             cin >> user_name;
  349.             cin >> w >> h;
  350.             cin >> tl;
  351.             tf = new TransparentImage(name,user_name, w, h, tl);
  352.               dir += *tf;
  353.           }
  354.         }
  355.         dir_list[i] = dir;
  356.       }
  357.  
  358.    max_folder_size(dir_list, folders_num);
  359.     }
  360.     return 0;
  361. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement