Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.152.162] |
|
Сообщ.
#1
,
|
|
|
Помогите пожалуйста написать часть кода: квадрат унаследует от прямоугольника все методы, дополнительно вычисляет площадь квадрат(достаточно ввести одну вершину и ширину) написал базовый класс только, и начал писать производный класс, но че то затупил
#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; } |
Сообщ.
#2
,
|
|
|
Как-то так, наверное, ожидалось:
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()); } // длина ребра |
Сообщ.
#3
,
|
|
|
Единственное отличие квадрата от прямоугольника это то, что (x2 - x1) == (y2 - y1). Поэтому достаточно только определить конструктор, все остальные методы - те же самые (кроме Input)
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) {} }; |
Сообщ.
#4
,
|
|
|
спасибо, а в main все то же самое оставить?
Добавлено а площадь тогда как вычислить double Square() { return ((x^2) }? |
Сообщ.
#5
,
|
|
|
Цитата Simon25 @ а площадь тогда как вычислить double Square() { return ((x^2) }? Та к же как у прямоугольника (x2 - x1) * (y2 - y1) Input() можно сделать виртуальной и переопределить для квадрата |
Сообщ.
#6
,
|
|
|
Цитата Олег М @ Та к же как у прямоугольника (x2 - x1) * (y2 - y1) но у вас же x,x+s,y,y+s, а не х2,х1 или я не туда смотрю Цитата Олег М @ Input() можно сделать виртуальной и переопределить для квадрата а как это сделать? Добавлено 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; } правильно ли я делаю? |
Сообщ.
#7
,
|
|
|
Цитата 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 double rectangle::Square() { return (x2 - x1) * (y2 - y1); } |
Сообщ.
#8
,
|
|
|
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 подкорректировать? |
Сообщ.
#9
,
|
|
|
Цитата Simon25 @ double Square(); Это не нужно. Метод Square и так будет унаследован из класса rectangle. Для квадрата его переопределять не нужно. Добавлено Или ты считаешь, что площадь квадрата вычисляется иначе, чем площадь прямоугольника? |
Сообщ.
#10
,
|
|
|
Цитата Олег М @ Или ты считаешь, что площадь квадрата вычисляется иначе, чем площадь прямоугольника? нет, все правильно вы написали, это я че то затупил Добавлено Дк Метод Square в классе rectangle нету |
Сообщ.
#11
,
|
|
|
Цитата Simon25 @ Дк Метод Square в классе rectangle нету Ты его и определил double rectangle::Square() {......... |
Сообщ.
#12
,
|
|
|
понял
|
Сообщ.
#13
,
|
|
|
Цитата Simon25 @ Площадь квадрата равна произведению длин двух его смежных сторон. Точно также, как и площадь любого прямоугольника. Просто так как у квадрата они равны, то квадрат задаётся длиной одной стороны, положением центра и углом поворота, а прямоугольник – длинами двух смежных сторон, положением центра и углом поворота. Вывод: квадрат отличается конструктором, присваивающим длинам обеих сторон значение одного параметра. Но квадрат должен быть потомком не только прямоугольника, но и ромба. По определению ромб есть четырёхугольник, у которого все стороны равны, а у любого квадрата все стороны равны. А это значит, что любой квадрат – ромб, но не всякий ромб – квадрат. Или ромба у Вас нет совсем? а площадь тогда как вычислить double Square() { return ((x^2) }? |