Advertisement
Guest User

Posledna ispitna OOP

a guest
Sep 19th, 2019
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.80 KB | None | 0 0
  1. /*
  2. За потребите на компанија која врши продажба на звучници, да се креира класа Speaker во која се чуваат следните податоци:
  3. моќност (изразена во W, децимален број), модел (динамичка низа од знаци), дали има појачало (bool), основна цена (децимален број).
  4. оператор за споредба на два звучници според моделот,цена и моќност (5 поени)
  5. оператор + која додава 80% од моќноста на двата звучници, моделот станува двојна низа од двата модели со + измеѓу имињата и цената е 75% од собраните цени за двата звучници (5 поени)
  6. функција покачиЦена што ќе ја покачи основната цена на звучникот за толку колку што ќе внесеме (5 поени)
  7. Компанијата нуди два вида на звучници за кои треба да се дефинираат посебни класи: TowerSpeaker и MonitorSpeaker. За првиот вид звучници дополнително се чува податок за типот на столбот на звучникот (има две можности: full/semi), а за вториот вид звучници дополнително се чува податок за намената (има две можности: за во студио/за друга намена).
  8. За класите треба да се обезбедат:
  9. соодветни конструктори и деструктори (погледнете ги повиците во main функцијата) (5 поени)
  10. оператор << за печатење на звучниците во формат: (5 поени)
  11. модел има/нема појачало цена
  12. оператор > за споредба на два звучника од каков било вид според пресметаната цена (5 поени)
  13. метод принт() кој ќе принта звучникот со сите спецификации по редослед од конструктор
  14. метод float presmetajCena() за пресметување на цената на посебните видови звучници на следниот начин: (10 поени)
  15. за TowerSpeaker - цената се зголемува за 10% од основната ако звучникот има појачало и за 5% од основната ако видот на столбот е full
  16. за MonitorSpeaker - цената се зголемува за 10% од основната ако звучникот има појачало и за 15% од основната ако е наменет за во студио
  17.  
  18. Во класата Speaker се чува целобројна променлива која е заедничка за сите звучници и го означува данокот на додадена вредност (ДДВ) кој се плаќа за овие производи. Иницијалната вредност на оваа променлива е 18 и ќе биде иста за сите звучници. За работа со оваа променлива да се имплементираат следните методи: (5 поени)
  19. Доколку се стави негативна вредност за данокот да се фрли усклучок кој ќе принта:
  20. Ne moze da se stavi negativna vrednost za danok (5 поени)
  21.  
  22. Да се имплементира надворешна функција со потпис void minAndMax(Speaker** s, int n) што ќе го отпечати звучникот со најмала цена и звучникот со најголема цена. (10 поени)
  23. void setDDV(int ddv) за менување на вредноста на ДДВ (5 поени)
  24. void vkupnoDDV(Speaker** s, int n) која ја печати вкупната цена што треба да се плати за сите звучници и по пресметаниот ДДВ. (5 поени)
  25. функција void daliIma(Speaker** niza, int n,Speaker &s) која ќе принта дали може да се купи звучникот т.е. дали го има звучникот во низата (5 поени)
  26. функција void pogolemaVrednost(Speaker** s, int n)која ќе принта кој тип на звучници има поголема средна вредност во споредба со другиот (10 поени)
  27. Функција kupiZvucnik(Speaker** s, int n, float kesh) што ќе ги отпечати сите звучници што можеме да ги купиме со дадена цена (10 poeni)
  28. */
  29.  
  30.  
  31.  
  32. #include<iostream>
  33. using namespace std;
  34. class Iskluchok{
  35. private:
  36. char error[100];
  37. public:
  38. Iskluchok(char error[]){
  39. strcpy(this->error,error);
  40. }
  41. void print(){
  42. cout<<error<<endl;
  43. }
  44. };
  45. class Speaker{
  46. protected:
  47. float w;
  48. char *model;
  49. bool pojacalo;
  50. float cena;
  51. static int ddv;
  52. public:
  53. Speaker(){}
  54. Speaker(float w,char *model,bool pojacalo,float cena){
  55. this->w=w;
  56. this->model=new char[strlen(model)+1];
  57. strcpy(this->model,model);
  58. this->pojacalo=pojacalo;
  59. this->cena=cena;
  60. }
  61. // operator <<
  62. friend ostream& operator<<(ostream &output,Speaker &s){
  63. output<<s.w<<" "<<s.model<<" "<<s.pojacalo<<" "<<s.cena<<endl;
  64. return output;
  65. }
  66. // operator ==
  67. bool operator==(Speaker &s){
  68. if((strcmp(this->model,s.model)==0)&&(this->w==s.w)&&(this->cena==s.cena)){
  69. return true;
  70. }else{
  71. return false;
  72. }
  73. }
  74. // operator +
  75. Speaker& operator+(Speaker &drugSpeaker){
  76. Speaker nov;
  77. nov.w=(this->w+drugSpeaker.w)*0.80;
  78. nov.model=new char[strlen(this->model)+strlen(drugSpeaker.model)+2];
  79. strcat(nov.model,this->model);
  80. strcat(nov.model,"+");
  81. strcat(nov.model,drugSpeaker.model);
  82. nov.cena=(this->cena+drugSpeaker.cena)*0.75;
  83. nov.pojacalo=true;
  84. return nov;
  85. }
  86. void pokaciCena(float suma){
  87. this->cena+=suma;
  88. }
  89.  
  90. static int getDDV(){
  91. return ddv;
  92. }
  93. static void setDDV(int x){
  94. if(x<0){
  95. throw Iskluchok("Ne moze da se stavi negativna vrednost za danok");
  96. }
  97. ddv=x;
  98. }
  99. // virtuelna funkcija
  100. virtual float presmetajCena()=0;
  101. ~Speaker(){}
  102. };
  103. int Speaker::ddv=18;
  104.  
  105. class TowerSpeaker:public Speaker{
  106. private:
  107. bool stolb;
  108. public:
  109. TowerSpeaker(){}
  110. TowerSpeaker(float w,char *model,bool pojacalo,float cena,bool stolb):Speaker(w,model,pojacalo,cena){
  111. this->stolb=stolb;
  112. }
  113. // preoptovaruvame virtuelnata funkcija
  114. float presmetajCena(){
  115. float novaCena=0;
  116. if(pojacalo==true){
  117. //this->cena=this->cena*1.10;
  118. novaCena+=this->cena*0.10;
  119. }
  120. if(stolb==true){
  121. novaCena+=this->cena*0.05;
  122. }
  123. novaCena+=this->cena;
  124. return novaCena;
  125. }
  126.  
  127. ~TowerSpeaker(){
  128. // delete []model;
  129. }
  130. };
  131. class MonitorSpeaker:public Speaker{
  132. private:
  133. bool namena;
  134. public:
  135. MonitorSpeaker(){}
  136. MonitorSpeaker(float w,char *model,bool pojacalo,float cena,bool namena):Speaker(w,model,pojacalo,cena){
  137. this->namena=namena;
  138. }
  139. // preoptovaruvame virtuelnata funkcija
  140. float presmetajCena(){
  141. float novaCena=this->cena;
  142. if(pojacalo){
  143. novaCena+=this->cena*0.10;
  144. }
  145. if(namena){
  146. novaCena+=this->cena*0.15;
  147. }
  148. return novaCena;
  149. }
  150. ~MonitorSpeaker(){
  151. // delete []model;
  152. }
  153.  
  154. };
  155. // min/max
  156. void minAndMax(Speaker **niza,int n){
  157. float minCena=niza[0]->presmetajCena();
  158. float maxCena=niza[0]->presmetajCena();
  159. int pamtiMax;
  160. int pamtiMin;
  161. for(int i=0;i<n;i++){
  162. if(niza[i]->presmetajCena()>maxCena){
  163. maxCena=niza[i]->presmetajCena();
  164. pamtiMax=i;
  165. }
  166. if(niza[i]->presmetajCena()<minCena){
  167. minCena=niza[i]->presmetajCena();
  168. pamtiMin=i;
  169. }
  170. }
  171. cout<<"Najevtin zvucnik e"<<endl;
  172. cout<<niza[pamtiMin];
  173. cout<<"Najskap zvucnik e"<<endl;
  174. cout<<niza[pamtiMax];
  175. }
  176. // suma
  177. void vkupnoDDV(Speaker** niza, int n){
  178. float sumSpeakers=0;
  179. for(int i=0;i<n;i++){
  180. sumSpeakers+=niza[i]->presmetajCena();
  181. }
  182. float danok=((float)Speaker::getDDV()/100);
  183. sumSpeakers=sumSpeakers + danok*sumSpeakers;
  184. cout<<"Vkupnata suma posle danok e "<<sumSpeakers<<endl;
  185. }
  186. // flag
  187. void daliIma(Speaker** niza, int n,Speaker *s){
  188. int flag=0;
  189. for(int i=0;i<n;i++){
  190. if(niza[i]==s){
  191. cout<<"Go ima zvucnikot, idi kupi go"<<endl;
  192. flag=1;
  193. break;
  194. }
  195. }
  196. if(flag==0){
  197. cout<<"Go nema zvucnikot na lager"<<endl;
  198. }
  199. }
  200. // najteshkata
  201. void pogolemaVrednost(Speaker** niza, int n){
  202. int brojTower=0;
  203. int brojMonitor=0;
  204. float sumaTower=0;
  205. float sumaMonitor=0;
  206. for(int i=0;i<n;i++){
  207. TowerSpeaker *ts=dynamic_cast<TowerSpeaker*>(niza[i]);
  208. if(ts!=0){
  209. brojTower++;
  210. sumaTower+=niza[i]->presmetajCena();
  211. }
  212. MonitorSpeaker *ms=dynamic_cast<MonitorSpeaker*>(niza[i]);
  213. if(ms!=0){
  214. brojMonitor++;
  215. sumaMonitor+=ms->presmetajCena();
  216. }
  217. }
  218. float srednaTower=sumaTower/brojTower;
  219. float srednaMonitor=sumaMonitor/brojMonitor;
  220. if(srednaTower>srednaMonitor){
  221. cout<<"Tower zvuchnicite se poskapi"<<endl;
  222. }else{
  223. cout<<"Monitor zvuchnicite se poskapi"<<endl;
  224. }
  225. }
  226. int main() {
  227. float power;
  228. char model[100];
  229. bool amp;
  230. float price;
  231. bool fullSemi;
  232. int n;
  233. cin >> n;
  234. Speaker** speakers = new Speaker*[n];
  235. for(int i = 0; i < n; ++i) {
  236. cin >> power;
  237. cin >> model;
  238. cin >> amp;
  239. cin >> price;
  240. cin >> fullSemi;
  241. if(i % 2 == 1)
  242. speakers[i] = new TowerSpeaker(power, model, amp, price, fullSemi);
  243. else
  244. speakers[i] = new MonitorSpeaker(power, model, amp, price, fullSemi);
  245. }
  246. cout<<"== Testirame najmal i najgolem zvucnik funkcija =="<<endl;
  247. lowestPrice(speakers, n);
  248. cout<<"== Testirame vkupnoDDV funkcija =="<<endl;
  249. Speaker::vkupnoDDV(speakers, n);
  250. int ddv;
  251. cout<<"== Testirame DDV =="<<endl;
  252. cin >> ddv;
  253. try{
  254. Speaker::setDDV(ddv);
  255. }catch(Iskluchok objekt){
  256. objekt.print();
  257. }
  258. cout<<"== Testirame vkupnoDDV funkcija =="<<endl;
  259. Speaker::vkupnoDDV(speakers, n);
  260.  
  261. for(int i = 0; i < n; ++i) {
  262. delete speakers[i];
  263. }
  264. delete [] speakers;
  265. return 0;
  266. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement