Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
 с++ Не могу решить задание  [new]
Knicks12
Member

Откуда:
Сообщений: 6
Здравствуйте, помогите пожалуйста решить задание. 4 дня потратил, ничего толком не выходит.

Составить описание класса прямоугольников со сторонами, параллельными осям координат (должен задаваться координатами центра, длинной ширины и высоты). Предусмотреть методы для создания объекта данного класса, изменения его размеров и отображение координат его вершин на консоли. Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.
8 апр 21, 13:00    [22305921]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
Aklin
Member

Откуда: Прямо сейчас меня здесь нет
Сообщений: 61625
А что именно не получается? Продемонстрируйте исходный код с вашими попытками.
8 апр 21, 13:11    [22305927]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
Knicks12
Member

Откуда:
Сообщений: 6
Aklin, вот код. Выводит 3 ошибки
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
using namespace std;
class Rectangle {
private:
    double x1, x2, y1, y2, dx, dy, r;
public:
    // Конструктор с 4 параметрами
    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 Minimal(); // построение минимального
    void Сross(); // пересечение 2 прямоугольников
};

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 << "Вы ввели следующие координаты прямоугольника:" << endl;
    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 << "Получились следующие координаты прямоугольника:" << endl;
    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 >> r;
    cout << "Получились следующие координаты прямоугольника:" << endl;
    cout << " A:" << "(" << x1 << "," << y1 << ")" << endl;
    cout << " B:" << "(" << x2 * r << "," << y1 << ")" << endl;
    cout << " C:" << "(" << x2 * r << "," << y2 << ")" << endl;
    cout << " D:" << "(" << x1 << "," << y2 << ")" << endl;

}

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:" << "(" << x1_sred << "," << y2_sred << ")" << endl;
    cout << " B:" << "(" << x2_sred << "," << y2_sred << ")" << endl;
    cout << " C:" << "(" << x2_sred << "," << y1_sred << ")" << endl;
    cout << " D:" << "(" << x1_sred << "," << y1_sred << ")" << endl;
}

int main()
{
    setlocale(LC_ALL, "Russian");
    cout << "1 - Ввод данных \n 2 - Вывод \n 3 - Перемещение \n 4 - Изменение размера\n"
        " 5 - Минимальный прямоугольник содержащий 2 заданных\n 6 - Прямоугольник получившийся на пересечении 2 заданных\n 0 - выход\n" << endl;
    Rectangle ObjectA; // Создаем объект без параметров, то есть будет использован конструктор по умолчанию
    char Control;
    cout << ">";
    cin >> Control;
    switch (Control)
    {
    case '1':
        ObjectA.Input();
        cout << ">";
        cin >> Control;
    case '2':
        ObjectA.Result();
        cout << ">";
        cin >> Control;
    case '3':
        ObjectA.Peremeshenie();
        cout << ">";
        cin >> Control;
    case '4':
        ObjectA.Size();
        cout << ">";
        cin >> Control;
    case '5':
        ObjectA.Minimal();
        cout << ">";
        cin >> Control;
    case '6':
        ObjectA.Сross();
        cout << ">";
        cin >> Control;
    case '0': break;
    }
    system("pause");
    return 0;
}


Сообщение было отредактировано: 8 апр 21, 15:04
8 апр 21, 13:52    [22305954]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
Siemargl
Member

Откуда: 010100
Сообщений: 6422
Knicks12,

Там откуда ты копировал код посмеялись, заменили английскую С на русскую С.

А так все компилируется

Сообщение было отредактировано: 8 апр 21, 15:58
8 апр 21, 16:05    [22306044]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
Пётр Седов
Member

Откуда: Санкт-Петербург
Сообщений: 700
Knicks12
#include <Windows.h>
Это не нужно, потому что вы не используете WinAPI.

Knicks12
    switch (Control)
    {
    case '1':
        ObjectA.Input();
        cout << ">";
        cin >> Control;
    case '2':
        ObjectA.Result();
        cout << ">";
        cin >> Control;
    case '3':
        ObjectA.Peremeshenie();
        cout << ">";
        cin >> Control;
    case '4':
        ObjectA.Size();
        cout << ">";
        cin >> Control;
    case '5':
        ObjectA.Minimal();
        cout << ">";
        cin >> Control;
    case '6':
        ObjectA.Сross();
        cout << ">";
        cin >> Control;
    case '0': break;
    }
В switch-е надо break-и писать, иначе будет «проваливание» (fall through) в следующий case. И тут скорее цикл надо делать:
int main() {
  ...
  Rectangle ObjectA;
  for (;;) { // цикл
    cout << ">";
    char Control;
    cin >> Control;
    switch (Control) {
    case '1':
      ObjectA.Input();
      break; // выход из switch-а
    case '2':
      ObjectA.Result();
      break;
    case '3':
      ObjectA.Peremeshenie();
      break;
    case '4':
      ObjectA.Size();
      break;
    case '5':
      ObjectA.Minimal();
      break;
    case '6':
      ObjectA.Cross();
      break;
    default:
      goto out_of_loop; // выход из цикла for
    }
  }
out_of_loop:
  system("pause");
  return 0;
}
9 апр 21, 04:38    [22306248]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
xerxf
Member

Откуда:
Сообщений: 211
Knicks12

Составить описание класса прямоугольников со сторонами, параллельными осям координат (должен задаваться координатами центра, длинной ширины и высоты).

мне одному кажется, что в программе прямоугольник задаётся координатами вершин, а не тем, что просят в задание?
9 апр 21, 11:48    [22306364]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
mayton
Member

Откуда: loopback
Сообщений: 51016
Этого будет достаточно для описания данных о прямоугольнике на плоскости.


class Rectangle {
private:
    double x, y; // Center
    double w; // Width
    double h; // Height
    ....
9 апр 21, 11:53    [22306366]     Ответить | Цитировать Сообщить модератору
 Re: с++ Не могу решить задание  [new]
xerxf
Member

Откуда:
Сообщений: 211
ну и перемещение и изменение размеров ничего никуда не перемещает и не изменяет. просто выодит координаты, которые могли бы быть, если бы переместили и изменили.
И нафига dx, dy, r вынесено на уровень класса?
В общем - гуглом тоже нужно уметь пользоатья и списывая программу хотя бы понимать, что она делает и насколько соответствует тому, что нужно
9 апр 21, 11:54    [22306367]     Ответить | Цитировать Сообщить модератору
Все форумы / C++ Ответить