Advertisement
Guest User

Untitled

a guest
May 23rd, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 11.70 KB | None | 0 0
  1. /*
  2.  
  3.   Author: Shen Zeng
  4.  
  5.   Datum: 09.05.2010
  6.  
  7.                     */
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  #include <string>
  14.  
  15.  #include <cstdio>
  16.  
  17.  #include <math.h>
  18.  
  19.  #include <iostream>
  20.  
  21.  
  22.  
  23. using namespace std;
  24.  
  25.  
  26.  
  27. class geomKoerper {
  28.  
  29.       protected:
  30.  
  31.              std::string oberflaefarbe;
  32.  
  33.              double volumen;
  34.  
  35.              double oberflaeinhalt;
  36.  
  37.              
  38.  
  39.              // unterscheiden, um später Gesamtfläche des Turms algorithmisiert berechnen zu können
  40.  
  41.              double mantelflaeinhalt;
  42.  
  43.              double o_flaeinhalt;
  44.  
  45.              double u_flaeinhalt;
  46.  
  47.              
  48.  
  49.       public:
  50.  
  51.              double getOberflaeinhalt(){return oberflaeinhalt;};
  52.  
  53.              double getVolumen(){return volumen;};
  54.  
  55.              double getMantelflaeinhalt(){return mantelflaeinhalt;};
  56.  
  57.              double getO_flaeinhalt(){return o_flaeinhalt;};
  58.  
  59.              double getU_flaeinhalt(){return u_flaeinhalt;};
  60.  
  61.              std::string getFarbe(){return oberflaefarbe;};
  62.  
  63. };
  64.  
  65.  
  66.  
  67.  
  68.  
  69. //-----------------------------------------------------------------------------------------------------------------------
  70.  
  71.  
  72.  
  73.  
  74.  
  75. class Pyramide : public geomKoerper {
  76.  
  77.       private:
  78.  
  79.               double a, b, h;
  80.  
  81.       public:
  82.  
  83.              // Konstruktor
  84.  
  85.              Pyramide(std::string xf, double xa, double xb, double xh) {
  86.  
  87.                     oberflaefarbe = xf;                          
  88.  
  89.                     a = xa;
  90.  
  91.                     b = xb;
  92.  
  93.                     h = xh;
  94.  
  95.                    
  96.  
  97.                     // Fakten aus der Geometrie
  98.  
  99.                     volumen = 1/3*a*b*h;
  100.  
  101.                     oberflaeinhalt = sqrt ( (1/2*a)*(1/2*a) + h*h)  * b + sqrt ( (1/2*b)*(1/2*b) + h*h)  * a;
  102.  
  103.                     mantelflaeinhalt = sqrt ( (1/2*a)*(1/2*a) + h*h)  * b + sqrt ( (1/2*b)*(1/2*b) + h*h)  * a + a*b;
  104.  
  105.                     o_flaeinhalt = 0;
  106.  
  107.                     u_flaeinhalt = a*b;
  108.  
  109.               }      
  110.  
  111. };
  112.  
  113.      
  114.  
  115.      
  116.  
  117. //-----------------------------------------------------------------------------------------------------------------------
  118.  
  119.                      
  120.  
  121.  
  122.  
  123. class Kugel : public geomKoerper {
  124.  
  125.       private:
  126.  
  127.               double r;
  128.  
  129.       public:
  130.  
  131.              Kugel(std::string xf, double xr) {
  132.  
  133.                     oberflaefarbe = xf;
  134.  
  135.                     r = xr;
  136.  
  137.                    
  138.  
  139.                     volumen = 4*r*r*r*(3.14159)/3;
  140.  
  141.                     oberflaeinhalt = 4*(3.14159)*r*r;
  142.  
  143.                     mantelflaeinhalt = oberflaeinhalt;
  144.  
  145.                     o_flaeinhalt = 0;
  146.  
  147.                     u_flaeinhalt = 0;
  148.  
  149.              }
  150.  
  151. };
  152.  
  153.  
  154.  
  155.  
  156.  
  157. //-----------------------------------------------------------------------------------------------------------------------
  158.  
  159.  
  160.  
  161.  
  162.  
  163. class Zylinder : public geomKoerper {
  164.  
  165.     private:
  166.  
  167.         double r, h;
  168.  
  169.     public:
  170.  
  171.         Zylinder(std::string xf, double xr, double xh) {
  172.  
  173.                oberflaefarbe = xf;
  174.  
  175.                r = xr;
  176.  
  177.                h = xh;
  178.  
  179.                
  180.  
  181.                volumen = (3.14159)*r*r*h;
  182.  
  183.                oberflaeinhalt = 2*(3.14159)*r * (2+h);
  184.  
  185.                mantelflaeinhalt = h*2*(3.14159)*r;
  186.  
  187.                o_flaeinhalt = (3.14159)*r*r;
  188.  
  189.                u_flaeinhalt = (3.14159)*r*r;
  190.  
  191.          }
  192.  
  193. };
  194.  
  195.        
  196.  
  197.  
  198.  
  199. //-----------------------------------------------------------------------------------------------------------------------
  200.  
  201.                      
  202.  
  203.  
  204.  
  205. class Kegel : public geomKoerper {
  206.  
  207.       private:
  208.  
  209.               double r, h;
  210.  
  211.       public:
  212.  
  213.              Kegel(std::string xf, double xr, double xh) {
  214.  
  215.                       oberflaefarbe = xf;
  216.  
  217.                       r = xr;
  218.  
  219.                       h = xh;
  220.  
  221.                      
  222.  
  223.                       volumen = 1/3*r*r*(3.14159)*h;
  224.  
  225.                       oberflaeinhalt = (3.14159)*r*r + (3.14159)*r* sqrt(r*r + h*h);
  226.  
  227.                       mantelflaeinhalt = (3.14159)*r* sqrt(r*r + h*h);
  228.  
  229.                       o_flaeinhalt = 0;
  230.  
  231.                       u_flaeinhalt = (3.14159)*r*r;
  232.  
  233.              }
  234.  
  235. };
  236.  
  237.  
  238.  
  239.  
  240.  
  241. //-----------------------------------------------------------------------------------------------------------------------
  242.  
  243.                      
  244.  
  245.  
  246.  
  247. class Kegelstumpf : public geomKoerper {
  248.  
  249.       private:
  250.  
  251.               double r1, r2, h;
  252.  
  253.       public:
  254.  
  255.              Kegelstumpf(std::string xf, double xr1, double xr2, double xh) {
  256.  
  257.                       oberflaefarbe = xf;
  258.  
  259.                       r1 = xr1;
  260.  
  261.                       r2 = xr2;
  262.  
  263.                       h = xh;
  264.  
  265.                      
  266.  
  267.                       volumen = h*(3.14159)/3 * (r2*r2 + r2*r1 + r1*r1);
  268.  
  269.                       oberflaeinhalt = (3.14159)*(r1*r1+r2*r2) + (r2+r1)*(3.14159)* sqrt ((r2-r1)*(r2-r1) + h*h);
  270.  
  271.                       mantelflaeinhalt = (r2+r1)*(3.14159)* sqrt ((r2-r1)*(r2-r1) + h*h);
  272.  
  273.                       o_flaeinhalt = (3.14159)*r1*r1;
  274.  
  275.                       u_flaeinhalt = (3.14159)*r2*r2;
  276.  
  277.               }
  278.  
  279. };
  280.  
  281.  
  282.  
  283.  
  284.  
  285. //-----------------------------------------------------------------------------------------------------------------------
  286.  
  287.                      
  288.  
  289.  
  290.  
  291. class Quader : public geomKoerper {
  292.  
  293.       private:
  294.  
  295.               double a, b, h;
  296.  
  297.       public:
  298.  
  299.              Quader(std::string xf, double xa, double xb, double xh) {
  300.  
  301.                       oberflaefarbe = xf;
  302.  
  303.                       a = xa;
  304.  
  305.                       b = xb;
  306.  
  307.                       h = xh;
  308.  
  309.                      
  310.  
  311.                       volumen = a*b*h;
  312.  
  313.                       oberflaeinhalt = 2*(a*b + b*h + a*h);
  314.  
  315.                       mantelflaeinhalt = 2*(b*h + a*h);
  316.  
  317.                       o_flaeinhalt = a*b;
  318.  
  319.                       u_flaeinhalt = a*b;
  320.  
  321.              }
  322.  
  323. };
  324.  
  325.  
  326.  
  327.  
  328.  
  329. //-----------------------------------------------------------------------------------------------------------------------
  330.  
  331.  
  332.  
  333.  
  334.  
  335. class List {
  336.  
  337.       // einzelt verkettete Listenstruktur speichtert Zeiger auf geomKoerper
  338.  
  339.              
  340.  
  341.       private:
  342.  
  343.               geomKoerper* figur;
  344.  
  345.               List* next;
  346.  
  347.               List* anker;
  348.  
  349.      
  350.  
  351.       public:
  352.  
  353.               List();
  354.  
  355.  
  356.  
  357.               void add (geomKoerper*); // "addToFront"
  358.  
  359.               void loesch (geomKoerper* k);
  360.  
  361.              
  362.  
  363.               List* findK (geomKoerper*);
  364.  
  365.               List* findvorK (geomKoerper*); // findet Vorgänger von k und gibt Zeiger auf diesen zurück
  366.  
  367.               void tauschK (geomKoerper*, geomKoerper*); // tauscht über Verwenden von obigen Methoden direkt die eingegebenen Koerper
  368.  
  369.               void tausch (List*, List*, List*, List*); // primitives Tausch, tauscht Zeiger
  370.  
  371.              
  372.  
  373.               double gesOberflaeinhalt ();
  374.  
  375.               double gesVolumen ();
  376.  
  377.              
  378.  
  379.               void ausgabe ();                        
  380.  
  381. };
  382.  
  383.  
  384.  
  385.  
  386.  
  387. List::List() { anker = 0; }
  388.  
  389.  
  390.  
  391. void List::add (geomKoerper* k) {
  392.  
  393.         List* p = anker;
  394.  
  395.         anker = new List;
  396.  
  397.         anker->figur = k;
  398.  
  399.         anker->next = p;
  400.  
  401. }
  402.  
  403.  
  404.  
  405.  
  406.  
  407. void List::loesch(geomKoerper* k) {
  408.  
  409.      
  410.  
  411.      /*Idee: Durchlaufen d. Liste von vorne nach hinten.
  412.  
  413.  
  414.  
  415.      Fall 1: Hierbei trifft man auf den Zeiger von k. Dann entferne
  416.  
  417.      man dieses Listenelement (es genügt, den Zeiger des
  418.  
  419.      Vorgängers auf den Nachfolger zu setzen -> "ausklinken").
  420.  
  421.  
  422.  
  423.      Fall 2: Das Element k ist in der Liste nicht enthalten, dann
  424.  
  425.      bleibt die Liste unverändert.
  426.  
  427.      */
  428.  
  429.  
  430.  
  431.      List* p = anker;
  432.  
  433.      List* q = NULL;
  434.  
  435.          
  436.  
  437.      while (p != 0 && p->figur != k) {
  438.  
  439.            q = p;
  440.  
  441.            p = p->next; //durchlaufen
  442.  
  443.      }          
  444.  
  445.          
  446.  
  447.      if (p != 0) {
  448.  
  449.      //k also gefunden
  450.  
  451.              if (q == 0) {anker=0;} // Liste besteht nur aus k
  452.  
  453.              else {q->next = p->next;} // "ausklinken des Gelöschten"
  454.    
  455.  
  456.      }
  457.      
  458.      
  459.  
  460. }
  461.  
  462.  
  463.  
  464. List* List::findK (geomKoerper* k) {
  465.  
  466.  
  467.  
  468.         List* p = anker;
  469.  
  470.         List* q = 0;
  471.  
  472.          
  473.  
  474.         while (p != 0 && p->figur != k) {
  475.  
  476.            q = p;
  477.  
  478.            p = p->next; //durchlaufen          
  479.  
  480.     }
  481.          
  482.  
  483.         if (p != 0) {
  484.  
  485.          //k also gefunden
  486.  
  487.              if (q == 0) {return p;} // Liste besteht nur aus k
  488.  
  489.              else {return p;} // p speichern, hier ist das gesuchte k
  490.  
  491.  
  492.         }
  493.        
  494.         else { return 0; };
  495.  
  496. }
  497.  
  498.  
  499.  
  500.  
  501. List* List::findvorK (geomKoerper* k) {
  502.  
  503.     // da die Liste einfach gerichtet verkettet ist
  504.  
  505.     // muss man sich dieser Funktion bedienen
  506.  
  507.  
  508.  
  509.         List* p = anker;
  510.  
  511.         List* q = NULL;
  512.  
  513.          
  514.  
  515.         while (p != 0 && p->figur != k) {
  516.  
  517.            q = p;
  518.  
  519.            p = p->next; //durchlaufen          
  520.  
  521.         }
  522.  
  523.  
  524.         if (p != 0) {
  525.  
  526.          //k also gefunden
  527.  
  528.                if (q == 0) {return 0;} // Liste besteht nur aus k
  529.  
  530.                else {return q;} // q als Zeiger vor k speichern
  531.  
  532.         }
  533.        
  534.         else { return 0; };
  535.  
  536. }
  537.  
  538.  
  539.  
  540.  
  541.  
  542. void List::tausch (List* zwei, List* acht, List* vorzwei, List* voracht) {
  543.  
  544.  
  545.  
  546.     List* h = acht->next;
  547.  
  548.    
  549.  
  550.     vorzwei->next = acht;
  551.  
  552.     acht->next = h->next;
  553.  
  554.     voracht = zwei;
  555.  
  556.     zwei->next = h;
  557.  
  558. }
  559.  
  560.  
  561.  
  562.  
  563.  
  564.  
  565.  
  566. void List::tauschK (geomKoerper* A, geomKoerper* B) {
  567.  
  568.  
  569.     tausch (anker->findK(A), anker->findvorK(A), anker->findK(B), anker->findvorK(B));
  570.  
  571.    
  572.  
  573. }
  574.  
  575.    
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.              
  584.  
  585. double List::gesOberflaeinhalt() {
  586.  
  587.      List* p = anker;
  588.  
  589.      List* q = 0;
  590.  
  591.      double gesO = 0; // gesamter Oberflächeninhalt des Turms
  592.  
  593.  
  594.  
  595.      /* p und q laufen bis ans Ende durch die Liste,
  596.  
  597.         wobei p auf das jeweils betrachtete und q auf
  598.  
  599.         das unmittelbar vor p stehende Element zeigt.
  600.  
  601.         Für p=null zeigt q auf das letzte Elemente der Liste.
  602.  
  603.      */
  604.  
  605.      
  606.  
  607.      while (p != 0) {
  608.  
  609.            
  610.  
  611.            gesO = gesO + (p->figur)->getU_flaeinhalt() + (p->figur)->getO_flaeinhalt() + 0;
  612.  
  613.                 /* 0 soll hier A_schnitt zwischen pfigur.o und pnextfigur.u sein, dessen Berechnung
  614.  
  615.                  nicht trivial ist, wie wenn sich beide nur ganz und nicht halb überschneiden.
  616.  
  617.                  Allgemein ist das aber nicht immer der Fall, siehe Entwurfsbeschreibung.
  618.  
  619.                  Es ist also eine Funktion f(p,q) zu bestimmen und als Methode zu implementieren.
  620.  
  621.                 */
  622.  
  623.            q = p;
  624.  
  625.            p = p->next;
  626.  
  627.            
  628.  
  629.      }
  630.  
  631.      
  632.  
  633.      if (q != 0) {
  634.  
  635.          
  636.           gesO = gesO + (q->figur)->getO_flaeinhalt();
  637.  
  638.      }
  639.  
  640.      
  641.  
  642.      else {gesO = 0;}
  643.  
  644.      
  645.  
  646.      return gesO;
  647.  
  648.      
  649.  
  650. }
  651.  
  652.  
  653.  
  654. double List::gesVolumen() {
  655.  
  656.      List* p = anker;
  657.  
  658.      List* q = 0;
  659.  
  660.      double gesV = 0;
  661.  
  662.      
  663.  
  664.      while (p != 0) {
  665.  
  666.            
  667.  
  668.            gesV = gesV + (p->figur)->getVolumen();
  669.  
  670.            
  671.  
  672.            q = p;
  673.  
  674.            p = p->next;
  675.  
  676.            
  677.  
  678.      }
  679.  
  680.      
  681.  
  682.      if (q != 0) {
  683.  
  684.          
  685.  
  686.           gesV = gesV + (q->figur)->getVolumen();
  687.  
  688.      }
  689.  
  690.      
  691.  
  692.      else {gesV = 0;}
  693.  
  694.      
  695.  
  696.      return gesV;
  697.  
  698.      
  699.  
  700. }
  701.  
  702.  
  703.  
  704. void List::ausgabe() {
  705.  
  706.      
  707.  
  708.      List* p = anker;
  709.  
  710.      List* q = 0;
  711.  
  712.      
  713.  
  714.      while (p != 0) {
  715.  
  716.            
  717.  
  718.            cout << (p->figur)->getVolumen() << endl;
  719.  
  720.            cout << (p->figur)->getOberflaeinhalt() << endl;
  721.  
  722.            cout << (p->figur)->getFarbe() << endl;
  723.  
  724.            
  725.  
  726.            q = p;
  727.  
  728.            p = p->next;
  729.  
  730.            
  731.  
  732.      }
  733.  
  734.      
  735.  
  736.       if (q != 0) {
  737.  
  738.          
  739.  
  740.           cout << (q->figur)->getVolumen() << endl;
  741.  
  742.           cout << (q->figur)->getOberflaeinhalt() << endl;
  743.  
  744.           cout << (q->figur)->getFarbe() << endl;
  745.  
  746.          
  747.  
  748.      }
  749.  
  750.      
  751.  
  752.      else cout << "leer" << endl;
  753.  
  754.          
  755.  
  756. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement