Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 12

Некорректно работают конструкторы класса

29.12.2018, 00:57. Показов 1496. Ответов 2

Студворк — интернет-сервис помощи студентам
Суть задания.
Определите иерархию классов (точка-круг-конус), связанных отношением наследования. Определите в этих классах методы, которые перемещает фигуру по плоскости, возвращают ее площадь, периметр (для объемных фигур – периметр основания), и строку символов, отражающую имя класса и состояние объекта. Продемонстрируйте работу с классами.
Суть вопроса.
Некорректно создается конус. Точнее, центр его основания всегда почему-то оказывается в точке (0;0). Я понимаю, что проблема с конструктором. Но где?
Помогите, пожалуйста. Заранее спасибо!

C#
1
2
3
4
5
6
7
8
9
10
11
12
   // Абстрактный базовый класс Фигура  
    abstract class Shape
    {
        public virtual void Display() // Вывод состояния объекта
        {
            Console.WriteLine("Объект: {0};", (this.GetType().Name));
        }
        public abstract void MoveToNewPosition(); // Абстрактный метод перемещения фигуры на плоскомти
 
        public abstract double GetPerimeter();
        public abstract double GetArea();
    }
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
    // Класс точки
    class Point : Shape
    {
        protected double x;
        protected double y;
 
        public Point() // Конструктор без параметров задает значения по умолчанию
        {
            x = 0;
            y = 0;
        }
        public Point(double xPos, double yPos) // Конструктор с параметрами
        {
            x = xPos;
            y = yPos;
        }
        // Виртуальный метод сдвига
        public override void MoveToNewPosition()
        {
            Console.WriteLine("Введите на какое число переместить координату Х ");
            x += Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Введите на какое число переместить координату Y ");
            y += Convert.ToDouble(Console.ReadLine());
        }
        // Вывод состояния объекта
        public override void Display() // Вывод состояния объекта
        {
            Console.WriteLine("Объект: {0}; Координаты точки: ({1}:{2});", (this.GetType().Name), x, y);
        }
 
        public override double GetPerimeter()
        {
            throw new Exception("Периметр точки равне 0");
        }
 
        public override double GetArea()
        {
            throw new Exception("Площадь точки равна 0");
        }
 
        // Свойства для чтения
        public double getX
        {
            get { return x; }
        }
        public double getY
        {
            get { return y; }
        }
    }
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
    // Класс круга
    class Circle : Point
    {
        protected Point center; // Координата центра круга.
        protected double r; // Радиус круга.
 
        public Circle() // Конструктор без параметров задает позицию центра круга (0;0) и радиус равный 1
        {
            center = new Point();
            r = 1;
        }
        // Конструкторы с параметрами
        public Circle(double xPos, double yPos, double radius) // Задает координаты центра окружности и ее радиус
        {
            center = new Point(xPos, yPos);
            r = radius;
        }
        public Circle(Point point, double radius) // Устанавливает центром окружности объект "Точка" и радиус
        {
            center = point;
            r = radius;
        }
        // Цепочка конструкторов
        public Circle(Point point) // Устанавливает центром окружности объект "Точка" и радиус равный 1
            : this(point, 1)
        { }
        public Circle(double radius) // Устанавливает позицию центра окружности (0;0) и радиус равный 1
            : this(new Point (0,0), radius)
        { }
 
        // Метод перемещения фигуры
        public override void MoveToNewPosition()
        {
            center.MoveToNewPosition();
        }
        // Метод выводит на консоль текущие параметры круга: координаты центра и радиус.
        public override void Display()
        {
            Console.WriteLine("Объект: {0}; Координаты центра круга: ({1}:{2}); Радиус круга: {3};", (this.GetType().Name), center.getX, center.getY, r);
        }
        // Метод возвращает периметр окружности
        public override double GetPerimeter() => Math.PI * 2 * r;
        // Метод возвращает площадь круга.
        public override double GetArea() => Math.PI * Math.Pow(r, 2);
 
        // Свойство для чтения
        public double getR
        {
            get { return r; }
        }
    }
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
    // Класс конуса
class Cone : Circle
    {
        protected Circle cone_base; // Основание конуса - окружность 
        protected double height; // Высота конуса
 
        public Cone() // Конструктор без параметров задает позицию центра основания конуса (0;0) с радиусом равный 1 и высотой равной 1
        {
            cone_base = new Circle();
            height = 1;
        }
        public Cone(double xPos, double yPos, double radius, double height)  // Конструктор с параметрами
        {
            cone_base = new Circle(xPos, yPos, radius);
            this.height = height;
        }
        public Cone(Circle circle, double height) // Устанавливает основой конуса объект "Окружность" и выстоту конуса
        {
            cone_base = circle;
            this.height = height;
        }
        //Цепочка конструкторов
        public Cone(Circle circle) // УУстанавливает основой конуса объект "Окружность" и выстоту конуса равной 1
            : this(circle, 1)
        { }
        public Cone(double height) //Устанавливает основой конуса объект "Окружность" с параметрами по умолчанию и выстоту конуса
            : this(new Circle(), height)
        { }
 
        // Метод перемещения фигуры
        public override void MoveToNewPosition()
        {
            cone_base.MoveToNewPosition();
        }
        // Метод Метод выводит на консоль текущие параметры конуса
        public override void Display()
        {
            Console.WriteLine("Объект: {0}; Координаты центра основания конуса: ({1}:{2}); Радиус основания конуса: {3}; Высота конуса: {4};"
                , (this.GetType().Name), center.getX, center.getY, cone_base.getR, height);
        }
        // Метод возвращает площадь конуса
        public double GetFullConeArea() => Math.PI * r * (r + Math.Sqrt((Math.Pow(r, 2)) + (Math.Pow(height, 2))));
 
        // Метод возвращает периметр основания (окружности) конуса 
        public override double GetPerimeter() => Math.PI * 2 * r;
 
        // Метод возвращает площадь основания (окружжности) конуса
        public override double GetArea() => Math.PI * Math.Pow(r, 2);
 
    }
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
    // Точка, окружность, конус
 
    // а) Наследование. Определите иерархию  классов (см. варианты), связанных отношением наследования. 
    // Определите в этих классах методы, которые перемещает фигуру по плоскости, возвращают ее площадь, 
    // периметр (для объемных  фигур – периметр основания), и строку символов, отражающую имя класса и состояние объекта.  
    // Продемонстрируйте работу с классами.
 
    // б*) Добавьте абстрактный класс «Фигура» в вашу систему классов, включите в него все методы прочих классов.  
    // Создайте массив ссылок на базовый класс «Фигура», заполните его различными фигурами,  
    // продемострируйте работу с методами различных элементов массива.
    class Program
    {
        static void Main()
        {
            Point point = new Point(10, 12.5);//создаем обьект точка, используя конструктор с параметрами
            point.Display();
            point.MoveToNewPosition();//передвигаем точку
            Console.WriteLine(new string('_', 40));
            point.Display();//выводим информацию об объекте
            Console.WriteLine(new string('_', 40));
 
            Circle circle = new Circle(point, 5);
            circle.Display();//выводим информацию об объекте
            circle.MoveToNewPosition();//передвигаем точку
            Console.WriteLine(new string('_', 40));
            circle.Display();//выводим информацию об объекте
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Площадь круга: {0}", circle.GetArea());//Площадь круга
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Периметр круга: {0}", circle.GetPerimeter());//Периметр круга
            Console.WriteLine(new string('_', 40));
 
            Cone cone = new Cone(circle, 10);
            cone.Display();
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Площадь круга: {0}", cone.GetArea());//Площадь основания конуса
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Площадь конуса: {0}", cone.GetArea());//Площадь конуса
            Console.WriteLine(new string('_', 40));
 
            Shape[] shapes = new Shape[3];//Создаем массив объектов типа Фигура и заполняем его
            shapes[0] = new Point(1, 1);
            shapes[1] = new Circle(10, 15, 20);
            shapes[2] = new Cone(5, 7, 9, 10);
            // Высодим на консоль информацию по каждому объекту массива
            foreach (Shape s in shapes)
                s.Display();
 
            Console.ReadKey();
        }
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.12.2018, 00:57
Ответы с готовыми решениями:

Конструкторы класса, наследование
Доброго времени суток, форумчане! Создал класс и несколько производных от него. В некоторых классах (circle, rectangle) появилась...

Некорректно работают потоки
В общем мне нужно сделать задание - рассчитать детерминант матрицы. Пользуюсь стандартным алгоритмом. Решил распаралеллить вычисления,...

Создать конструкторы для класса
Уважаемые форумчане! Нужна помощь с реализацией конструкторов для класса. Заранее спасибо за любую помощь! Задан класс: Код: ...

2
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
29.12.2018, 01:20
Лучший ответ Сообщение было отмечено Usaga как решение

Решение

Потому что вы зачем-то понасоздавали лишних полей в классах...
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
    // Абстрактный базовый класс Фигура  
    abstract class Shape
    {
        public virtual void Display() // Вывод состояния объекта
        {
            Console.WriteLine("Объект: {0};", GetType().Name);
        }
        public abstract void MoveToNewPosition(); // Абстрактный метод перемещения фигуры на плоскомти
 
        public abstract double GetPerimeter();
        public abstract double GetArea();
    }
 
    // Класс точки
    class Point : Shape
    {
        protected double x;
        protected double y;
 
        public Point() // Конструктор без параметров задает значения по умолчанию
        {
            x = 0;
            y = 0;
        }
        public Point(double xPos, double yPos) // Конструктор с параметрами
        {
            x = xPos;
            y = yPos;
        }
        // Виртуальный метод сдвига
        public override void MoveToNewPosition()
        {
            Console.WriteLine("Введите на какое число переместить координату Х ");
            x += Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("Введите на какое число переместить координату Y ");
            y += Convert.ToDouble(Console.ReadLine());
        }
        // Вывод состояния объекта
        public override void Display() // Вывод состояния объекта
        {
            Console.WriteLine("Объект: {0}; Координаты точки: ({1}:{2});", GetType().Name, x, y);
        }
 
        public override double GetPerimeter()
        {
            throw new Exception("Периметр точки равне 0");
        }
 
        public override double GetArea()
        {
            throw new Exception("Площадь точки равна 0");
        }
 
        // Свойства для чтения
        public double X => x;
 
        public double Y => y;
    }
 
    // Класс круга
    class Circle : Point
    {
        protected double r; // Радиус круга.
 
        public Circle() : base() // Конструктор без параметров задает позицию центра круга (0;0) и радиус равный 1
        {
            r = 1;
        }
        // Конструкторы с параметрами
        public Circle(double xPos, double yPos, double radius) : base(xPos, yPos) // Задает координаты центра окружности и ее радиус
        {
            r = radius;
        }
        public Circle(Point point, double radius) : base(point.X, point.Y) // Устанавливает центром окружности объект "Точка" и радиус
        {
            r = radius;
        }
        // Цепочка конструкторов
        public Circle(Point point) // Устанавливает центром окружности объект "Точка" и радиус равный 1
            : this(point, 1)
        { }
        public Circle(double radius) // Устанавливает позицию центра окружности (0;0) и радиус равный 1
            : this(new Point(0, 0), radius)
        { }
 
        // Метод перемещения фигуры
        public override void MoveToNewPosition()
        {
            base.MoveToNewPosition();
        }
        // Метод выводит на консоль текущие параметры круга: координаты центра и радиус.
        public override void Display()
        {
            Console.WriteLine("Объект: {0}; Координаты центра круга: ({1}:{2}); Радиус круга: {3};", GetType().Name, x, y, r);
        }
        // Метод возвращает периметр окружности
        public override double GetPerimeter() => Math.PI * 2 * r;
        // Метод возвращает площадь круга.
        public override double GetArea() => Math.PI * Math.Pow(r, 2);
 
        // Свойство для чтения
        public double R => r;
    }
 
    // Класс конуса
    class Cone : Circle
    {
        protected double height; // Высота конуса
 
        public Cone() : base() // Конструктор без параметров задает позицию центра основания конуса (0;0) с радиусом равный 1 и высотой равной 1
        {
            height = 1;
        }
        public Cone(double xPos, double yPos, double radius, double height) : base(xPos, yPos, radius) // Конструктор с параметрами
        {
            this.height = height;
        }
        public Cone(Circle circle, double height) : base(circle.X, circle.Y, circle.R) // Устанавливает основой конуса объект "Окружность" и выстоту конуса
        {
            this.height = height;
        }
        //Цепочка конструкторов
        public Cone(Circle circle) // УУстанавливает основой конуса объект "Окружность" и выстоту конуса равной 1
            : this(circle, 1)
        { }
        public Cone(double height) //Устанавливает основой конуса объект "Окружность" с параметрами по умолчанию и выстоту конуса
            : this(new Circle(), height)
        { }
 
        // Метод перемещения фигуры
        public override void MoveToNewPosition()
        {
            base.MoveToNewPosition();
        }
        // Метод Метод выводит на консоль текущие параметры конуса
        public override void Display()
        {
            Console.WriteLine("Объект: {0}; Координаты центра основания конуса: ({1}:{2}); Радиус основания конуса: {3}; Высота конуса: {4};", GetType().Name, x, y, r, height);
        }
        // Метод возвращает площадь конуса
        public double GetFullConeArea() => Math.PI * r * (r + Math.Sqrt(Math.Pow(r, 2) + Math.Pow(height, 2)));
 
        // Метод возвращает периметр основания (окружности) конуса 
        public override double GetPerimeter() => Math.PI * 2 * r;
 
        // Метод возвращает площадь основания (окружжности) конуса
        public override double GetArea() => Math.PI * Math.Pow(r, 2);
    }
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
    class Program
    {
        static async Task Main(string[] args)
        {
            Point point = new Point(10, 12.5);//создаем обьект точка, используя конструктор с параметрами
            point.Display();
            point.MoveToNewPosition();//передвигаем точку
            Console.WriteLine(new string('_', 40));
            point.Display();//выводим информацию об объекте
            Console.WriteLine(new string('_', 40));
 
            Circle circle = new Circle(point, 5);
            circle.Display();//выводим информацию об объекте
            circle.MoveToNewPosition();//передвигаем точку
            Console.WriteLine(new string('_', 40));
            circle.Display();//выводим информацию об объекте
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Площадь круга: {0}", circle.GetArea());//Площадь круга
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Периметр круга: {0}", circle.GetPerimeter());//Периметр круга
            Console.WriteLine(new string('_', 40));
 
            Cone cone = new Cone(circle, 10);
            cone.Display();
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Площадь круга: {0}", cone.GetArea());//Площадь основания конуса
            Console.WriteLine(new string('_', 40));
            Console.WriteLine("Площадь конуса: {0}", cone.GetArea());//Площадь конуса
            Console.WriteLine(new string('_', 40));
 
            Shape[] shapes = new Shape[3];//Создаем массив объектов типа Фигура и заполняем его
            shapes[0] = new Point(1, 1);
            shapes[1] = new Circle(10, 15, 20);
            shapes[2] = new Cone(5, 7, 9, 10);
            // Высодим на консоль информацию по каждому объекту массива
            foreach (Shape s in shapes)
                s.Display();
 
            Console.ReadKey();
        }
    }
1
0 / 0 / 0
Регистрация: 14.08.2016
Сообщений: 12
29.12.2018, 01:33  [ТС]
Огромное спасибо! Целый вечер туплю...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2018, 01:33
Помогаю со студенческими работами здесь

Стоит ли объявлять конструкторы абстрактного класса с модификатором доступа protected?
1. Стоит ли объявлять конструкторы абстрактного класса с модификатором доступа protected? ReSharper подсказывает что стоит, не могу понять...

Кнопки регулировки громкости на клавиатуре иногда не работают и/или работают некорректно
Здравствуйте, у меня возникает некая неполадка/баг со звуком. Пользуюсь я данной клавиатурой, как видно на ней есть 3 кнопки для...

Не работают конструкторы....
Помогите, кому не трудно... Не работают конструкторы наследования (заккоментил подсказки на них...): #include <iostream.h> ...

наследование в BlueJ. не работают конструкторы
класс Main public class main { public static void main(String args) { Base baseSet = new Base{new Base(0,0), new...

Конструкторы класса в С++
В классе я объявил два конструктора: Node( int Depth = 0, string FunctionName = "NULL", double TimerTime = 0.0 ) : id( Depth,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru