Skip to content

Классы в C++ Задача 1

Уважаемые читатели, переходим к очень важной теме: реализация классов на языке C++, на этот раз код будет достаточно большим, поэтому напомню, что в конце статьи, впрочем как и всегда, вас ждет готовый исходник, написанный под Windows.

Переходим к заданию:

Составить описание класса прямоугольников со сторонами, параллельными осям координат. Предусмотреть возможность перемещения прямоугольников на плоскости, изменения размеров, построения наименьшего прямоугольника, содержащего два заданных прямоугольника, и прямоугольника, являющегося общей частью (пересечением) двух прямоугольников.
Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.

О том, что такое классы в C++, достаточно хорошо написано здесь. А наша задача заключается в том, чтобы понять как эти классы реализуются, а также, что можно с ними делать, конечно, на нашем примере. Что ж начнем:

#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <ctime>

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 прямоугольников
};

Ну, для начала подключим стандартные библиотеки и пространство имен. Далее уже идет само объявление класса rectangle (от англ. прямоугольник). В объявлении класса необходимо написать конструктор по умолчанию — это означает, что когда в main мы создадим какой либо объект класса, то по умолчанию он заполнится стандартными значениями, которые мы указали.

Конструктор с параметрами — соответственно, когда мы будем создавать объект в том же main, мы можем сразу же указать какие значения мы хотим для координат нашего прямоугольника. Далее идет деструктор, который по своей сути ничего не делает (в данной задаче), но в классах C++ он необходим.

После этого мы объявили несколько функций, подобно тому как мы это делали чуть ранее, когда говорили про функции в C++ на примере динамических массивов. И, отмечу, что функции, которые объявляются в классе, принято называть методами класса, и в будущем мы будем говорить именно о методах класса.

Также не забудем про объявление переменных в разделе private. Так как это раздел private, то обращаться к этим переменным могут только методы этого класса, в других местах программы это невозможно.

И еще кое что: так как в прямоугольнике 4 точки, то соответственно требуется 8 координат (по 2 на точку) — 8 переменных, в нашей же программе используется всего 4 переменные: 2 координаты по Х (левые и правые точки) и 2 координаты по Y (нижние и верхние точки). Так можно сделать, учитывая, что в задании сказано, что стороны прямоугольника параллельны осям координат.

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;
}

Далее начинаем описывать наши методы. Начнем сразу с 2 простых: ввод и вывод. Думаю, что если вы изучаете классы в C++, то эта часть кода для вас очень проста.

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;

}

Помните в начале я говорил, что код будет большим, так вот, поздравляю вас, мы пересекли экватор. Ну что, еще 2 метода в этой части кода: перемещение прямоугольника и изменение его размеров. Оба метода реализуются просто: мы спрашиваем у пользователя на сколько или во сколько раз нужно переместить или увеличить наш прямоугольник. А затем выдаем ему уже новые координаты прямоугольника.

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;
	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];
        }
    }
	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;
}

А вот это уже что то слишком здоровое! Я не стал разбивать на блоки этот ОДИН метод, чтобы у вас была цельная картина.

Принцип метода: для начала просим пользователя задать координаты второго прямоугольника, так как для этого метода их нужно 2. Затем все это выводим на экран, далее, записываем координаты по X и Y соответственно в массивы. Зачем нам тут массивы — сейчас увидите, для начала, на картинке:new-piktochart

Так вот, чтобы найти координаты прямоугольника, содержащего оба заданных прямоугольника, нужно взять минимальные и максимальные координаты по X и по Y. Именно это мы и находим, перебирая наши массивы в цикле. Затем уже выводим полученные координаты общего прямоугольника.

Последний метод:

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;

}

Логика этого метода, аналогична предыдущему методу. Только вместо минимальных и максимальных координат, мы используем серединные координаты, для того чтобы определить координаты прямоугольника на пересечении. И, конечно, если вы зададите прямоугольники, которые не пересекаются, то у вас возникнет ошибка, значения вы получите, но они не будут верными.

И наконец перейдем к main:

int main()
{
	setlocale(LC_ALL, "Russian");
	cout << "Ну че поехали!" << endl;
	cout << "Прямоугольники \n"
        "Справка: \n 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;
		}

return 0;
}

Напомню, что нам нужно было реализовать меню. В моей программе оно реализовано через switch, но главное, чтобы это было похоже на меню, и при нажатии клавиши выполнялся соответствующий метод. Именно это и реализовано.eith

На этом сегодня все, кто дочитал от начала до конца, тот просто молодец! И, конечно, не забудьте скачать исходники.

Скачать исходники

Опубликовано вC++

23 комментария

    • Nikiqq Nikiqq

      Вообще, код написан для windows на visual studio, поэтому по возможности советую перейти на нее. На счет dev не знаю, может стоит закоментить подключение #include conio.h и _getch в самом конце.

  1. Sam Sam

    А в visual studio не удается запустить программу, в дев не получилось, пробывал

    • Nikitas Nikitas

      Запустил на Visual, распишу по шагам на 12 версии VS.
      1.https://yadi.sk/i/jj_C75cxzhUv7 — Создать проект
      2.https://yadi.sk/i/YxqW-UEozhUvE
      3.https://yadi.sk/i/Fs800zmVzhUvN
      4.https://yadi.sk/i/9CXjiGbvzhUvd
      5.https://yadi.sk/i/yYfAGO-FzhUvk — Выдели всё кроме #include «stdafx.h» и вставь свой код.

  2. Sam Sam

    Может в visual studio я что-то не так делаю? Можно по шагам обьяснить?

  3. Sam Sam

    Rectangle(): x1(2), x2(5), y1(2), y2(0)
    поясните что значат 2, 5, 2, 0

    • Nikiqq Nikiqq

      Это сокращенная запись инициализации x1 = 2, x2 = 5, y1 = 2, y2 = 0, то есть, когда вы создаете объект класса Rectangle в int main, то эти переменные примут такие значения по умолчанию.

  4. Sam Sam

    Как соединить все это с классом точки?

    • Nikiqq Nikiqq

      В каком смысле соединить? Может вы лучше напишите вашу задачу и мы посмотрим, у нас просто есть архив задач, про класс точки там что то было.

  5. Sam Sam

    Задача эта, только сюда нужно еще вставить класс точки, что-то похоже на это
    // Point.h
    #ifndef POINT_H
    #define POINT H
    Задача 1.2. Реализация класса треугольников 35
    class Point {
    public:
    // Конструктор
    PointCdouble _х = 0. double _у = 0) : х(_х). у(_у) {}
    // Другие методы
    void ShowO const:
    public:
    double X. у:
    }:
    #endif /* POINT_H */
    ///////////////////////////////////////////////////////////
    // Point.cpp
    #1nclude
    #include «Point.h»
    using namespace std;
    void Point::ShowO const {
    cout « » (» « X « У « «)•’
    ///////////////////////////////////////////////////////////
    // Triangle.h
    #ifndef TRIANGLEJ
    #define TRIANGLEJ
    #include «Point.h»

    • Nikiqq Nikiqq

      Чтобы подключить файл, нужно, как вариант, сделать его заголовочным, то есть в той же visual studio создаете файл с расширением .h, затем помещаете туда код с вашим классом point, а затем с помощью #include «имя_файла.h» подключаете его к любому файлу .cpp

  6. Ivan Bogatkov Ivan Bogatkov

    У Вас получилось сделать данную задачу ?
    «Создать класс согласно своему варианту. Класс должен содержать конструктор с умолчанием, конструктор с параметрами, методы чтения и изменения закрытых данных.
    Можно добавить другие методы.
    Написать программу, тестирующую все методы класса. Создать многофайловый проект.
    Вариант 2.
    Описать класс прямоугольников со сторонами, параллельными осям координат. Предусмотреть возмож¬ность перемещения прямоугольников на плоскости, измене¬ние размеров, построение наименьшего прямоугольника, содержащего два заданных прямоугольника, и прямоуголь¬ника, являющегося общей частью (пересечением) двух прямоугольников. »
    Если да, то пожалуйста , напишите мне или скиньте по почте код.

  7. Ivan Bogatkov Ivan Bogatkov

    Тот исходник , который Вы кинули , там несколько методов ? Нужно их всех копировать иди только один ? Я о том, что я пытаюсь сделать файл Rectangle.h, Rectangle.cpp и main.cpp. Задание просто немного другое , хотел узнать, как это правильно сделать.

  8. Ivan Bogatkov Ivan Bogatkov

    Уже не надо. Я все сделал.

    • Nikiqq Nikiqq

      Рад, что вы разобрались. Вообще хорошим тоном в программировании является создание многофайлового проекта. Об этом мы напишем статьи позже, просто цель данной статьи: показать, как описываются методы классов.

  9. Viktor Viktor

    Nikiqq, Есть задание которое вы разобрали Тема: «Разработка программы моделирования прямоугольников со сторонами, параллельными осям координат».
    Задание. Составить описание класса прямоугольников со сторонами, параллельными осям координат. Предусмотреть возможность перемещения прямоугольников на плоскости, изменение размеров, построение наименьшего прямоугольника, содержащего два заданных прямоугольника, и прямоугольника, являющегося общей частью (пересечением) двух прямоугольников.
    Написать программу, демонстрирующую работу с этим классом. Программа должна содержать меню, позволяющее осуществить проверку всех методов класса.

    Помогите пожалуйста с этим дополнением к выше указанной задаче !!!

    Реализовать интерфейс программы для работы со списком объектов, заданного класса: просмотра, добавления, удаления, редактирования, поиска, сортировки, записи и чтения из файла.

    • Nikiqq Nikiqq

      Это уже совсем другая задача выходит, возможно она будет разобрана в следующих статьях, но сейчас мне нечем вам помочь.

  10. Viktor Viktor

    Я готов заказать у вас эту программу !!!

  11. Viktor Viktor

    как возможно с вами связаться ?

    • Nikiqq Nikiqq

      Связаться с нами можно по почте Codetown@yandex.ru, но у нас сейчас немного времени. чтобы делать заказы, поэтому единственное — вы можете скинуть всё условие задачи на почту, если у нас есть что то похожее, то мы вам пришлем.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *