Форум программистов, компьютерный форум CyberForum.ru

Интерфейсы в классах - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Неверно вычисляет побочные определители http://www.cyberforum.ru/cpp-beginners/thread1696886.html
Ответ определителей a, b, c должен быть другим. Где ошибка? #include <iostream> #include <cstring> class Equation {
C++ Proxy. Диаграмма классов Помогите, пожалуйста, составить диаграмму классов для этого примера: class Person { string nameString; static string list; static int next; public: Person() { nameString = list; http://www.cyberforum.ru/cpp-beginners/thread1696879.html
Ввести две строки, заменить первый символ "r" символами второй строки C++
Нужно ввести две строки . Заменить первый символ "r" символами второй строки.
Замена отдельных битов в символе C++
Задача: ввести последовательность из 8 символов. В их двоичном представлении заменить: если младший бит 1, заменить его на 0, если младший бит 0, заменить его и 2-ой бит единицами. Вывести исходную последовательность и её восьмеричные коды; преобразованную последовательность и её восьмеричные коды.
C++ Project Euler: Even Fibonacci numbers http://www.cyberforum.ru/cpp-beginners/thread1696837.html
Доброго времени суток товарищи кодеры! Решение 2й задачи: Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. #include...
C++ Project Euler: Multiples of 3 and 5 Доброго времени суток дорогие товарищи кодеры! Решение 1й задачи: If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. #include <iostream> #define TARGET 1000 подробнее

Показать сообщение отдельно
ihavesoul
0 / 0 / 0
Регистрация: 18.11.2015
Сообщений: 42
28.03.2016, 14:24     Интерфейсы в классах
Все добрый день.
Такое вот задание :
Реализовать все указанные интерфейсы для классов :
а)Отрезок
б)Трапеция
Функционал системы:
// - Динамическое добавление фигур пользователем.
// - Отобразить все фигуры.
// - Общая площадь всех фигур.
// - Общий периметр всех фигур.
// - Центр масс всей системы.
// - Память, занимаемая всеми экземплярами классов.
// - Сравнение фигур между собой по массе.

Я сделал,вроде бы. Прога компилится, вроде бы всё выводит.
Просто хотелось бы спросить, всё ли правильно сделано?
Я не особо в этом опытен, поэтому писал,опираясь на чутьё.
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream>
#include "Line.h"
#include <conio.h>
#include <vector>
#include "Trapecia.h"
 
using namespace std;
 
int main()
{
 
    setlocale(0, "Russian");
    vector <LineSegent> arr(1);
    cout << " Введите данные первого отрезка " << endl;
    arr.at(0).initFromDialog();
    cout << " Создать еще один отрезок ? Y / N  " << endl;
    char c;
    cin >> c;
    if (c == 'Y' || c == 'y')
    {
        LineSegent tmp;
        tmp.initFromDialog();
        arr.push_back(tmp);
    }
 
    double m = 0, p = 0;
    for (unsigned int i = 0; i < arr.size(); i++)
    {
        m += arr.at(i).mass();
        p += arr.at(i).perimeter();
 
    }
 
    cout << " Масса всех объектов : " << m << endl;
 
    cout << " Периметр всех объектов :  " << p << endl;
    double a = (arr.at(0).position().x* arr.at(0).mass() + arr.at(1).position().x * arr.at(1).mass()) / (arr.at(0).mass() + arr.at(1).mass());
    double b = (arr.at(0).position().y * arr.at(0).mass() + arr.at(1).position().y * arr.at(1).mass()) / (arr.at(0).mass() + arr.at(1).mass());
    cout << "Центр масс всей системы равен : x = " << a << " |  y = " << b << endl;
    cout << " Площадь всех объектов  равна : " << arr.at(0).square() + arr.at(1).square() << endl;
    cout << " Объекты занимают " << arr.at(0).size() << endl;
 
    cout << " \n ******Трапеция ****** " << endl;
    vector <Hexagon> ar(1);
 
    cout << " Введите данные первого отрезка " << endl;
    ar.at(0).initFromDialog();
    cout << " Создать еще один отрезок ? Y / N  " << endl;
    cin >> c;
    if (c == 'Y' || c == 'y')
    {
        Hexagon tmp;
        tmp.initFromDialog();
        ar.push_back(tmp);
 
        m = 0; p = 0;
        for (unsigned int i = 0; i < ar.size(); i++)
        {
            m += ar.at(i).mass();
            p += ar.at(i).perimeter();
 
        }
 
        cout << " Масса всех объектов : " << m << endl;
 
        cout << " Периметр всех объектов :  " << p << endl;
        double a = (ar.at(0).position().x* ar.at(0).mass() + ar.at(1).position().x * ar.at(1).mass()) / (ar.at(0).mass() + ar.at(1).mass());
        double b = (ar.at(0).position().y * ar.at(0).mass() + ar.at(1).position().y * ar.at(1).mass()) / (ar.at(0).mass() + ar.at(1).mass());
        cout << "Центр масс всей системы равен : x = " << a << " |  y = " << b << endl;
        cout << " Площадь всех объектов  равна : " << ar.at(0).square() + ar.at(1).square() << endl;
        cout << " Объекты занимают " << ar.at(0).size() << endl;
 
    }
    cin >> a;
 
    _getch();
    return 0;
 
}
Line.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "Line.h"
 
 
int LineSegent::countSegments = 0;
double LineSegent::mass()
{
 
    return  mass_A + mass_B;
}
 
Vector2D LineSegent::position()
{
    Vector2D res;
    res.x = (dotA.x *  mass_A + dotB.x * mass_B) / (mass_A + mass_B);
    res.y = (dotA.y *  mass_A + dotB.y * mass_B) / (mass_A + mass_B);
 
 
    return  res;
}
 
double LineSegent::square()
{
    return 0.0;
}
 
double LineSegent::perimeter()
{
 
    return 0.0;
}
 
void LineSegent::initFromDialog()
{
    cout << " \n\n\n";
    cout << " Нужно ввести имя объекта  " << endl;
    char str[20];
 
    cin >> str;
    name = str;
    cout << " Нужно ввести координату x точки A : " << endl;
    cin >> dotA.x;
    cout << " Нужно ввести координату y :  точки А: " << endl;
    cin >> dotA.y;
    cout << " Нужно ввести координату x точки В : " << endl;
    cin >> dotB.x;
    cout << " Нужно ввести координату y :  точки В: " << endl;
    cin >> dotB.y;
    cout << " Нужно ввести массу  точки A : " << endl;
    cin >> mass_A;
    cout << " Нужно ввести массу  точки В : " << endl;
    cin >> mass_B;
    countSegments++;
}
 
const char * LineSegent::classname()
{
 
    return name;
}
 
unsigned int LineSegent::size()
{
    return sizeof(LineSegent) * countSegments;
}
 
void LineSegent::draw()
{
    cout << " Имя Отрзка : " << classname() << endl;
    cout << " Масса отрезка равна :  " << mass() << endl;
    cout << " Периметр отрезка равен :  " << perimeter() << endl;
    cout << " Координаты цетра масс :  x =   " << position().x << "  y =   " << position().y << endl;
    cout << " Площадь отрезка равна : " << square() << endl;
 
    cout << " \n\n\n Размер занимаемый в памяти всеми объектами : " << size() << endl;
 
}
 
bool LineSegent::operator==(const PhysObject & ob) const
{
    return true; // тут в общем такая тема ) это нельзя сделать , ну у меня не получилось , ибо аргумет - объект чисто абстрактного класса который сделать нельзя )
}
 
bool LineSegent::operator<(const PhysObject & ob) const
{
    return false;// таже история ) 
}
Line.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma once
#include <iostream>
#include <vector>
#include "intf.h"
 
using namespace std;
class Hexagon;
class LineSegent : public PhysObject, public GeoFig, public Printable, public DialogInitiable, public BaseCObject
{
private:
    Vector2D dotA;
    Vector2D dotB;
    double mass_A;
    double mass_B;
    char * name;
    static int countSegments;
 
public:
 
    friend Hexagon;
    double mass();
    Vector2D position();
    double square();
    double perimeter();
    void initFromDialog();
    const char* classname();
    unsigned int size();
    void draw();
 
    bool operator== (const PhysObject& ob) const;
    bool operator< (const PhysObject& ob) const;
};
Trapecia.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include "Trapecia.h"
 
 
int Hexagon::countHexagons = 0;
double Hexagon::mass()
{
    return   A.mass() + B.mass() + C.mass() + D.mass();
}
 
double length(double Ax, double Ay, double Bx, double By)
{
    return sqrt(Ax * Bx + Ay * By);
}
Vector2D Hexagon::position()
{
    Vector2D a;
    a.x = (A.position().x - C.position().x) / 2;
    a.y = (A.position().y - C.position().y) / 2;
    return a;
}
 
double Hexagon::square()
{
    return pow(length(A.dotA.x, A.dotA.y, A.dotB.x, A.dotB.y), 2);
}
 
double Hexagon::perimeter()
{
    return length(A.dotA.x, A.dotA.y, A.dotB.x, A.dotB.y)
        + length(B.dotA.x, B.dotA.y, B.dotB.x, B.dotB.y)
        + length(C.dotA.x, C.dotA.y, C.dotB.x, C.dotB.y)
        + length(D.dotA.x, D.dotA.y, D.dotB.x, D.dotB.y);
 
 
}
 
void Hexagon::initFromDialog()
{
    cout << " \n\n\n";
    cout << " Нужно ввести имя объекта  " << endl;
    char str[20];
    cin >> str;
    Name = str;
 
    cout << " сторона A : " << endl;
    A.initFromDialog();
 
    cout << " сторона B : " << endl;
    B.initFromDialog();
 
    cout << " сторона C : " << endl;
    C.initFromDialog();
 
    cout << " сторона D : " << endl;
    D.initFromDialog();
 
 
}
 
const char * Hexagon::classname()
{
    return Name;
}
 
unsigned int Hexagon::size()
{
    return sizeof(Hexagon) * countHexagons;
}
 
void Hexagon::draw()
{
 
    cout << " Имя Отрзка : " << classname() << endl;
    cout << " Масса отрезка равна :  " << mass() << endl;
    cout << " Периметр отрезка равен :  " << perimeter() << endl;
    cout << " Координаты цетра масс :  x =   " << position().x << "  y =   " << position().y << endl;
    cout << " Площадь отрезка равна : " << square() << endl;
 
    cout << " \n\n\n Размер занимаемый в памяти всеми объектами : " << size() << endl;
 
}
 
bool Hexagon::operator==(const PhysObject & ob) const
{
 
    return false;
}
 
bool Hexagon::operator<(const PhysObject & ob) const
{
 
    return false;
}
Trapecia.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#pragma once
#pragma once
#include "intf.h"
#include "Line.h"
#include <math.h>
 
class Hexagon : public PhysObject, public GeoFig, public Printable, public DialogInitiable, public BaseCObject
{
private:
 
    LineSegent A;
    LineSegent B;
    LineSegent C;
    LineSegent D;
 
 
    static int countHexagons;
    char * Name;
 
 
public:
 
    double mass();
    Vector2D position();
    double square();
    double perimeter();
    void initFromDialog();
    const char* classname();
    unsigned int size();
    void draw();
 
 
    bool operator== (const PhysObject& ob) const;
    bool operator< (const PhysObject& ob) const;
 
 
};
intf.h (interface.h)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#pragma once
 
class GeoFig {
public:
    // Площадь.
    virtual double square() = 0;
    // Периметр.
    virtual double perimeter() = 0;
};
 
// Вектор
class Vector2D {
public:
    double x, y;
};
 
// Интерфейс "Физический объект".
class PhysObject {
public:
    // Масса, кг.
    virtual double mass() = 0;
    // Координаты центра масс, м.
    virtual Vector2D position() = 0;
    // Сравнение по массе.
    virtual bool operator== (const PhysObject& ob) const = 0;
    // Сравнение по массе.
    virtual bool operator< (const PhysObject& ob) const = 0;
};
 
// Интерфейс "Отображаемый"
class Printable {
public:
    // Отобразить на экране
    // (выводить в текстовом виде параметры фигуры).
    virtual void draw() = 0;
};
 
// Интерфейс для классов, которые можно задать через диалог с пользователем.
class DialogInitiable {
    // Задать параметры объекта с помощью диалога с пользователем.
    virtual void initFromDialog() = 0;
};
 
// Интерфейс "Класс"
class BaseCObject {
public:
    // Имя класса (типа данных).
    virtual const char* classname() = 0;
    // Размер занимаемой памяти.
    virtual unsigned int size() = 0;
 
};
Добавлено через 28 минут
Почему-то выводит площадь и периметр фигур 0.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru