На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
Модераторы: JoeUser, Qraizer
  
> Наследование квадрата от прямоугольника
    Помогите пожалуйста написать часть кода: квадрат унаследует от прямоугольника все методы, дополнительно вычисляет площадь квадрат(достаточно ввести одну вершину и ширину) написал базовый класс только, и начал писать производный класс, но че то затупил
    ExpandedWrap disabled
      #include "stdafx.h"
      #include <iostream>
      #include <windows.h>
      #include <cmath>
      using namespace std;
      class rectangle
      {
          private:
              double x1,x2,y1,y2,dx,dy;
          public:
              rectangle(double a,double b,double c,double d): x1(a),x2(b),y1(c),y2(d) {} // конструктор с параметрами
              rectangle(): x1(2),x2(5),y1(2),y2(0) {}  // конструктор по умолчанию
              ~rectangle() {} // деструктор
              void Input();
              void Result();
              void Peremeshenie();
              void Size();
              void Square();
              void Minimal();
              void Сross();
      };
       
      void rectangle::Input()
      {
          cout << "Введите координату х левой точки" << endl; cin >> x1;
          cout << "Введите координату y верхней точки" << endl; cin >> y1;
          cout << "Введите координату х правой точки" << endl; cin >> x2;
          cout << "Введите координату y нижней точки" << endl; cin >> y2;
      }
       
      void rectangle::Result()
      {
          cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
          cout << " B:" << "(" << x2 << "," << y1 << ")" << endl;
          cout << " C:" << "(" << x2 << "," << y2 << ")" << endl;
          cout << " D:" << "(" << x1 << "," << y2 << ")" << endl;
      }
       
      void rectangle::Peremeshenie()
      {
          cout << "На сколько переместить по X?" << endl; cin >> dx;
          cout << "На сколько переместить по Y?" << endl; cin >> dy;
          cout << " A:" << "(" << x1 + dx << "," << y1 + dy << ")" << endl;
          cout << " B:" << "(" << x2 + dx << "," << y1 + dy << ")" << endl;
          cout << " C:" << "(" << x2 + dx << "," << y2 + dy << ")" << endl;
          cout << " D:" << "(" << x1 + dx << "," << y2 + dy << ")" << endl;
      }
       
      void rectangle::Size()
      {
          cout << "На сколько изменить Х?" << endl; cin >> dx;
          cout << "На сколько изменить Y?" << endl; cin >> dy;
          x2 += dx; y2 += dy;
          Result();
      }
       
      void rectangle::Minimal()
      {
          double x3,x4,y3,y4,x_min = x1,x_max = x1,y_min = y1,y_max = y1;
          cout << " 2 прямоугольник:" << endl;
          cout << "Введите координату х левой точки" << endl; cin >> x3;
          cout << "Введите координату y верхней точки" << endl; cin >> y3;
          cout << "Введите координату х правой точки" << endl; cin >> x4;
          cout << "Введите координату y нижней точки" << endl; cin >> y4;
          cout << endl << "Вы ввели следующие координаты 1 прямоугольника:" << endl;
          cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
          cout << " B:" << "(" << x2 << "," << y1 << ")" << endl;
          cout << " C:" << "(" << x2 << "," << y2 << ")" << endl;
          cout << " D:" << "(" << x1 << "," << y2 << ")" << endl;
          cout << endl;
          cout << "Вы ввели следующие координаты 2 прямоугольника:" << endl;
          cout << " A:" << "(" << x3 << "," << y3 << ")" << endl;
          cout << " B:" << "(" << x4 << "," << y3 << ")" << endl;
          cout << " C:" << "(" << x4 << "," << y4 << ")" << endl;
          cout << " D:" << "(" << x3 << "," << y4 << ")" << endl;
          cout << endl;
          double A[4]= {x1,x2,x3,x4}, B[4]= {y1,y2,y3,y4};
          for(int i = 0; i < 4; i++)
          {
              if (x_max < A[i])  {x_max = A[i];}
              if (y_max < B[i])  {y_max = B[i];}
              if (x_min > A[i])  {x_min = A[i];}
              if (y_min > B[i])  {y_min = B[i];}
          }
          cout <<" Наименьший прямоугольник содержащий оба предыдущих имеет следующие координаты: " << endl;
          cout << " A:" << "(" << x_min << "," << y_max << ")" << endl;
          cout << " B:" << "(" << x_max << "," << y_max << ")" << endl;
          cout << " C:" << "(" << x_max << "," << y_min << ")" << endl;
          cout << " D:" << "(" << x_min << "," << y_min << ")" << endl;
      }
       
      void rectangle::Сross()
      {
          double x3,x4,y3,y4,x_min = x1,x_max = x1,y_min = y1,y_max = y1,x1_sred,x2_sred,y1_sred,y2_sred;
          cout << " 2 прямоугольник:" << endl;
          cout << "Введите координату х левой точки" << endl; cin >> x3;
          cout << "Введите координату y верхней точки" << endl; cin >> y3;
          cout << "Введите координату х правой точки" << endl;    cin >> x4;
          cout << "Введите координату y нижней точки" << endl;    cin >> y4;
          cout << endl;
          cout << "Вы ввели следующие координаты 1 прямоугольника:" << endl;
          cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
          cout << " B:" << "(" << x2 << "," << y1 << ")" << endl;
          cout << " C:" << "(" << x2 << "," << y2 << ")" << endl;
          cout << " D:" << "(" << x1 << "," << y2 << ")" << endl;
          cout << endl;
          cout << "Вы ввели следующие координаты 2 прямоугольника:" << endl;
          cout << " A:" << "(" << x3 << "," << y3 << ")" << endl;
          cout << " B:" << "(" << x4 << "," << y3 << ")" << endl;
          cout << " C:" << "(" << x4 << "," << y4 << ")" << endl;
          cout << " D:" << "(" << x3 << "," << y4 << ")" << endl;
          cout << endl;
          double A[4]= {x1,x2,x3,x4}, B[4]= {y1,y2,y3,y4};
          for(int i = 0; i < 4; i++)
          {
              if (x_max < A[i])  {x_max = A[i];}
              if (y_max < B[i])  {y_max = B[i];}
              if (x_min > A[i])  {x_min = A[i];}
              if (y_min > B[i])  {y_min = B[i];}
          }
          for(int i = 0; i < 4; i ++)
          {
              if((A[i] != x_max) && (A[i] != x_min)) {x1_sred = A[i]; break;}
          }
          for(int i = 0; i < 4; i++)
          {
              if((A[i] != x_max) && (A[i] != x_min) && (A[i] != x1_sred)) {x2_sred = A[i]; break;}
          }
          for(int i = 0; i < 4; i++)
          {
              if((B[i] != y_max) && (B[i] != y_min)) {y1_sred = B[i]; break;}
          }
          for(int i = 0; i < 4; i++)
          {
              if((B[i] != y_max) && (B[i] != y_min) && (B[i] != y1_sred)) {y2_sred = B[i]; break;}
          }
              cout <<" Прямоугольник на пересечении двух предыдущих имеет следующие координаты: " << endl;
              cout << " A:" << "(" << x2_sred << "," << y1_sred << ")" << endl;
              cout << " B:" << "(" << x1_sred << "," << y1_sred << ")" << endl;
              cout << " C:" << "(" << x1_sred << "," << y2_sred << ")" << endl;
              cout << " D:" << "(" << x2_sred << "," << y2_sred << ")" << endl;
      }
      class quadrate: public rectangle
      {
      private:
          double S;
      public:
          quadrate() : rectangle() {}
       
      int main()
      {
          setlocale(LC_ALL, "Russian");
          cout << " 1 - Ввод данных \n 2 - Вывод \n 3 - Перемещение \n 4 - Изменение размера\n"
              " 5 - Минимальный прямоугольник \n 6 - Прямоугольник получившийся на пересечении \n 0 - Выход\n" << endl;
          rectangle A;
          char Control;
              cout << "> "; cin >> Control;
              switch (Control)
              {
                  case '1':
                      A.Input();
                      cout << "> "; cin >> Control;
                  case '2':
                      A.Result();
                      cout << "> "; cin >> Control;
                  case '3':
                      A.Peremeshenie();
                      cout << "> "; cin >> Control;
                  case '4':
                      A.Size();
                      cout << "> "; cin >> Control;
                  case '5':
                      A.Minimal();
                      cout << "> "; cin >> Control;
                  case '6':
                      A.Сross();
                      cout << "> "; cin >> Control;
                  case '0': break;
              }
                  system("pause");
                  return 0;
      }
    Сообщение отредактировано: Simon25 -
      Как-то так, наверное, ожидалось:
      ExpandedWrap disabled
        public:
            quadrate() : rectangle(0,0,1,1) {}
            quadrate(double a,double b,double c,double d): rectangle(a,b,c,d) {} // конструктор с параметрами : вершины диагонали
            double Square() { return ((c-a)*(c-a) + (d-b)*(d-b))/2; }
            double Size() { return sqrt(Square()); } // длина ребра
        Единственное отличие квадрата от прямоугольника это то, что (x2 - x1) == (y2 - y1). Поэтому достаточно только определить конструктор, все остальные методы - те же самые (кроме Input)

        ExpandedWrap disabled
          class quadrate: public rectangle
          {
          public:
              quadrate() : rectangle(0, 1, 0, 1) {}
              quadrate(double x, double y, double s) : rectangle(x, x + s, y, y + s) {}
          };
          спасибо, а в main все то же самое оставить?

          Добавлено
          а площадь тогда как вычислить double Square() { return ((x^2) }?
            Цитата Simon25 @
            а площадь тогда как вычислить double Square() { return ((x^2) }?

            Та к же как у прямоугольника (x2 - x1) * (y2 - y1)

            Input() можно сделать виртуальной и переопределить для квадрата
              Цитата Олег М @
              Та к же как у прямоугольника (x2 - x1) * (y2 - y1)

              но у вас же x,x+s,y,y+s, а не х2,х1 или я не туда смотрю
              Цитата Олег М @
              Input() можно сделать виртуальной и переопределить для квадрата

              а как это сделать?

              Добавлено
              ExpandedWrap disabled
                class quadrate: public rectangle
                {
                public:
                    quadrate() : rectangle(0,1,0,1) {} // конструктор по умолчанию
                    quadrate(double x, double y, double s) : rectangle(x, x + s, y, y + s) {} // конструктор с параметрами
                    double Square(void);
                };
                // вычисление площади
                double quadrate::Square(void)
                {
                    double x1,x2,y1,y2;
                    double S = (x2-x1)*(y2-y1);
                    cout << "Площадь квадрата = " << S << endl;
                }

              правильно ли я делаю?
                Цитата Simon25 @
                но у вас же x,x+s,y,y+s, а не х2,х1 или я не туда смотрю

                Не туда. Здесь просто создаётся прямоугольник с равными сторонами, т.е. будет rectangle.x1 = x, rectangle.x2 = x + s и т.д. Все вычисления уже есть в классе rectangle

                Добавлено
                Цитата Simon25 @
                double quadrate::Square(void)
                {
                    double x1,x2,y1,y2;
                    double S = (x2-x1)*(y2-y1);
                    cout << "Площадь квадрата = " << S << endl;
                }

                правильно ли я делаю?


                Нет, этот метод уже есть в классе rectangle
                ExpandedWrap disabled
                  double rectangle::Square()
                  {
                     return (x2 - x1) * (y2 - y1);
                  }
                  ExpandedWrap disabled
                    class quadrate: public rectangle
                    {
                    public:
                        quadrate() : rectangle(0,1,0,1) {} // конструктор по умолчанию
                        quadrate(double x, double y, double s) : rectangle(x, x + s, y, y + s) {} // конструктор с параметрами
                        double Square();
                    };
                    // вычисление площади
                    double rectangle::Square()
                    {
                       return (x2 - x1) * (y2 - y1);
                    }
                    int main()
                    {
                        setlocale(LC_ALL, "Russian");
                        double x,y,S;
                        cout <<" Введите координаты квадрата:" << endl; cin >> x >> y;
                        cout << A.square();
                        cout << " 1 - Ввод данных \n 2 - Вывод \n 3 - Перемещение \n 4 - Изменение размера\n"
                            " 5 - Минимальный прямоугольник \n 6 - Прямоугольник получившийся на пересечении \n 0 - Выход\n" << endl;
                        char Control;
                            cout << "> "; cin >> Control;
                            switch (Control)
                            {
                                case '1':
                                    A.Input();
                                    cout << "> "; cin >> Control;
                                case '2':
                                    A.Result();
                                    cout << "> "; cin >> Control;
                                case '3':
                                    A.Peremeshenie();
                                    cout << "> "; cin >> Control;
                                case '4':
                                    A.Size();
                                    cout << "> "; cin >> Control;
                                case '5':
                                    A.Minimal();
                                    cout << "> "; cin >> Control;
                                case '6':
                                    A.Сross();
                                    cout << "> "; cin >> Control;
                                case '0': break;
                            }
                                system("pause");
                                return 0;
                    }

                  теперь осталось в main подкорректировать?
                    Цитата Simon25 @
                    double Square();

                    Это не нужно. Метод Square и так будет унаследован из класса rectangle. Для квадрата его переопределять не нужно.

                    Добавлено
                    Или ты считаешь, что площадь квадрата вычисляется иначе, чем площадь прямоугольника?
                      Цитата Олег М @
                      Или ты считаешь, что площадь квадрата вычисляется иначе, чем площадь прямоугольника?

                      нет, все правильно вы написали, это я че то затупил

                      Добавлено
                      Дк Метод Square в классе rectangle нету
                        Цитата Simon25 @
                        Дк Метод Square в классе rectangle нету

                        Ты его и определил double rectangle::Square() {.........
                          понял
                            Цитата Simon25 @
                            а площадь тогда как вычислить double Square() { return ((x^2) }?
                            Площадь квадрата равна произведению длин двух его смежных сторон. Точно также, как и площадь любого прямоугольника. Просто так как у квадрата они равны, то квадрат задаётся длиной одной стороны, положением центра и углом поворота, а прямоугольник – длинами двух смежных сторон, положением центра и углом поворота. Вывод: квадрат отличается конструктором, присваивающим длинам обеих сторон значение одного параметра. Но квадрат должен быть потомком не только прямоугольника, но и ромба. По определению ромб есть четырёхугольник, у которого все стороны равны, а у любого квадрата все стороны равны. А это значит, что любой квадрат – ромб, но не всякий ромб – квадрат. Или ромба у Вас нет совсем?
                            1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                            0 пользователей:


                            Рейтинг@Mail.ru
                            [ Script Execution time: 0,1283 ]   [ 15 queries used ]   [ Generated: 25.08.19, 18:02 GMT ]