Конструктор позволяющий создать экземпляр класса с заданными длинами сторон

Обновлено: 01.05.2024

Нужно написать программу, содержащую класс Triangle . В данном классе должно быть три конструктора:

  1. Конструктор, принимающий три стороны.
  2. Конструктор, принимающий две стороны и угол между ними и рассчитывающий третью сторону по теореме косинусов.
  3. Конструктор, принимающий два угла и сторону между ними и рассчитывающий оставшиеся стороны по теореме синусов (памятуя о теореме о сумме углов треугольника).

Каждый Triangle также должен возвращать собственную площадь.

То есть имеем следующее:

Вся проблема в том, что у всех трех конструкторов одинаковая сигнатура, но разная логика.
Вопрос: как решить эту проблему "правильно"?

  1. Замена параметра(ов) double на string и дальнейший парсинг string в double .
  2. Замена параметра(ов) double на float .

Вынесение параметров в массив:

Ура, один из немногих вопросов, где спрашивается, как решить правильно, а не как решить быстро/коротко/на тяп-ляп.

4 ответа 4

Вариант 1 - используйте именованные конструкторы.

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

Вариант 2 - использовать доменные типы данных

Определяем типы данных "длина" и "угол" - и используем их в конструкторах.

Я бы использовал одновременно оба подхода. Одной только строгой типизации может оказаться недостаточно: вдруг вам нужен треугольник по трём сторонам и по трём медианам?

@VladD три медианы не являются стандартным признаком равенства треугольников - а потому построение треугольника по трем медианам уже не будет задачей конструктора :)

Ну, два катета и катет с гипотенузой — более распространённый сюжет. Или там катет и прилежащий угол против катета и противолежащего угла.

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

Да, конечно, я не о данном частном случае. Я привёл пример проблемы из той же предметной области, которая не решается одной лишь типизацией (в разумном смысле понятия «типизация»). То, что в частном случае можно формально обойтись без именованных конструкторов — случайная подробность конкретной частной задачи, на мой вкус.

Как вариант сгруппировать наборы параметров в структуры:

но мне кажется более правильный вариант с фабриками в ответе Павла

Пара альтернативных вариантов к уже предложенным.

Т.к. выбор перегруженной функции (и конструктора в том числе) осуществляется на основании типов, понятно, что создать несколько разных конструкторов с одинаковыми сигнатурами не получится.

Проблему можно решить путем добавления дополнительного параметра.

Заводятся новые "пустые" классы (имена взял из ответа @Argon):

Сигнатуры конструкторов в этом случае будут следующие:

Используется перечисление enum .

В этом случае конструктор будет единственный с ветвлением логики внутри:

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

Анализ создания класса Triangle с помощью разработки его элементов. Разработка конструктора, позволяющего создать экземпляр класса с заданными длинами сторон. Создание методов, позволяющих рассчитать периметр и площадь треугольника, вывести длины сторон.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 07.12.2017
Размер файла 94,6 K

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

Федеральное государственное бюджетное образовательное учреждение

высшего профессионального образования

«Чувашский государственный педагогический университет

им. И. Я. Яковлева»

Кафедра Информатики и ИКТ

по дисциплине «Объектно-ориентированное программирование»

Студент Протасов Никита Евгеньевич

triangle конструктор периметр треугольник

Создать класс Triangle, разработав следующие элементы класса:

b. Конструктор, позволяющий создать экземпляр класса с заданными длинами сторон.

c. Методы, позволяющие:

· вывести длины сторон треугольника на экран;

· расчитать периметр треугольника;

· расчитать площадь треугольника.

· позволяющее получить-установить длины сторон треугольника (доступное для чтения и записи);

· позволяющее установить, существует ли треугольник с данными длинами сторон (доступное только для чтения).

static void Main(string[] args)

Triangle Ob = new Triangle(3, 3, 3);

//Проверка на существование треугольника

//если существует - напечатаем стороны

//дабы не оставлять пустой оператор ;

//Иначе - кидаем исключение

throw new Exception("There is no triangle with such sides");

//Инкрементируем стороны нашего треугольника

//Печатаем для проверки

//Умножаем каждую сторону на 5

//Печатаем через метод ToString

//Проверяем индексатор. Печатаем a

//Устанавливаем b равной 30

catch (Exception e)

//Блок выполняющийся в любом случае

// консоль не закрывалась до нажатия на кнопку

//Свойство проверки треугольника

public bool isTriangle

//Если подходит под условие существования треугольника

//возвращаем true,иначе false

if (a + b > c && a + c > b && b + c > a)

//конструктор с тремя параметрами

public Triangle(int a_,int b_,int c_)

//проверка на положительность сторон теугольника

isCorrect(a_, b_, c_);

//Установка значений через сеттеры

//Функция печати длин сторон

public void PrintSides()

Console.WriteLine("a is , b is , c is ", a, b, c);

//Функция вычисления периметра

public int Perimetr()

//Функция вычисления площади

public double Square()

//Площадь считаем по формуле Геррона

return Math.Sqrt(halfper(this) * (halfper(this) - a) * (halfper(this) - b)

//Подсчет полупериметра треугольника

static double halfper(Triangle Ob)

return Ob.Perimetr() / 2.0;

//Проверка на положительность сторон

static void isCorrect(int a, int b, int c)

//Если нет - кидаем исключение

throw new Exception("Sides of triangle can` t be negative");

public static Triangle operator ++(Triangle Ob)

//Возвращаем объект с измененными сторонами

return new Triangle(++Ob.a, ++Ob.b, ++Ob.c);

public static Triangle operator --(Triangle Ob)

return new Triangle(--Ob.a, --Ob.b, --Ob.c);

//Перегрузка оператора умножения(в данном случае на скаляр)

public static Triangle operator *(Triangle Ob, int mult)

return new Triangle(Ob.a * mult, Ob.b * mult, Ob.c * mult);

//Перевод в строку

public override string ToString()

//Печатаем стороны через геттеры

return "Sides: " + "a is " + A + " b is " + B + " c is " + C;

//Индексатор. idx - индекс

public int this[int idx]

//Если idx=1 возвращаем a

//если idx=2 возвращаем b

//если idx=3 возвращем c

//иначе кидаем исключение

throw new Exception("idx can be only 1, 2 and 3");

//Если idx=1 устанавливаем a

//если idx=2 устанавливаем b

//если idx=3 устанавливаем c

//иначе кидаем исключение

throw new Exception("idx can be only 1, 2 and 3");

//Перегрузка оператора true

//проверка на существование треугольника

public static bool operator true(Triangle t)

//Перегрузка оператора true

//проверка на существование треугольника

public static bool operator false(Triangle t)

Подобные документы

Разработка программы на языке Visual++ с использованием библиотеки MF, которая рассчитывает по введенным значениям длин сторон треугольника прямоугольный он или нет, а также вычисляет его периметр, площадь, радиус описанной и вписанной окружностей.

курсовая работа [442,0 K], добавлен 18.06.2011

Формализации в онтологии областей знаний с помощью концептуальной схемы. Определение атрибутов класса и свойств экземпляров. Создание экземпляров класса и DL-Query запросов. Методика использования для разработки онтологии среды разработки Protege.

курсовая работа [2,0 M], добавлен 18.06.2014

Разработка графического интерфейса для ввода начальных значений, отображения результатов и тестирования методов собственного класса на языке программирования С++. Подсветка цветом выбранных операндов в процессе их инициализации и вывода на дисплей.

курсовая работа [234,6 K], добавлен 27.12.2014

Понятие класса как собрания информации, которая включает в себя данные и функции. Создание класса "Дек". Реализация методов: добавления элемента в начало и в конец дека, удаление элемента из начала и конца дека, проверка дека на наличие в нем элементов.

курсовая работа [568,9 K], добавлен 08.09.2010

Создание класса прямоугольников со сторонами, параллельными осям координат. Основные требования к программе. Описание классов и диаграмма их взаимодействия. Интерфейс пользователя и руководство по эксплуатации программы. Блок-схемы разработанных методов.

Анализ создания класса Triangle с помощью разработки его элементов. Разработка конструктора, позволяющего создать экземпляр класса с заданными длинами сторон. Создание методов, позволяющих рассчитать периметр и площадь треугольника, вывести длины сторон.

Рубрика Программирование, компьютеры и кибернетика
Предмет Объектно-ориентированное программирование
Вид контрольная работа
Язык русский
Прислал(а) Протасов Никита Евгеньевич
Дата добавления 07.12.2017
Размер файла 94,6 K

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

Подобные документы

Разработка программы на языке Visual++ с использованием библиотеки MF, которая рассчитывает по введенным значениям длин сторон треугольника прямоугольный он или нет, а также вычисляет его периметр, площадь, радиус описанной и вписанной окружностей.

курсовая работа [442,0 K], добавлен 18.06.2011

Формализации в онтологии областей знаний с помощью концептуальной схемы. Определение атрибутов класса и свойств экземпляров. Создание экземпляров класса и DL-Query запросов. Методика использования для разработки онтологии среды разработки Protege.

курсовая работа [2,0 M], добавлен 18.06.2014

Разработка графического интерфейса для ввода начальных значений, отображения результатов и тестирования методов собственного класса на языке программирования С++. Подсветка цветом выбранных операндов в процессе их инициализации и вывода на дисплей.

курсовая работа [234,6 K], добавлен 27.12.2014

Понятие класса как собрания информации, которая включает в себя данные и функции. Создание класса "Дек". Реализация методов: добавления элемента в начало и в конец дека, удаление элемента из начала и конца дека, проверка дека на наличие в нем элементов.

курсовая работа [568,9 K], добавлен 08.09.2010

Создание класса прямоугольников со сторонами, параллельными осям координат. Основные требования к программе. Описание классов и диаграмма их взаимодействия. Интерфейс пользователя и руководство по эксплуатации программы. Блок-схемы разработанных методов.

Если не сложно помогите написать эту программу которая представлена ниже, а до задали в школе я пропустила и не знаю как делать ((((( И еще Коментарии то делает))
Буду очень сильно благодарно
Cоздать класс Triangle , разработав следующие элементы класса :
• Поля
Int a,b;
• Конструктор , позволяющий создать экземпляр класса с заданными длинами сторон.
• Методы позволяющие :
Вывести длины сторон треугольника на экран
Рассчитать периметр треугольника
Рассчитать площадь треугольника
• Свойства :
Позволяющее получить-установить длины сторон треугольника(доступное для чтение и записи)
Позволяющее установить , существует ли треугольники с данными длинами сторон (доступно только для чтение)

2 ответа


Сколько же вы пропустили? Ни один урок не посещали?


Вот не хотелось бы, чтобы ОНО было мне благодарно О_о.
Впрочем, думаю ответ кроется в нике: по-итальянски брат - fratello. А в данном случае имеем ни то, ни сё. Ни баба, ни мужик - ленивый школяр.

namespace SampleForStupidScholar
class Triangle
int a, b, c;

public Triangle(int A, int B, int C)
a = A;
b = B;
c = C;
>
public void Show()
Console.WriteLine(ToString());
>
public int Perimeter()
return a + b + c;
>
public double Area()
int p = (a + b + c) / 2;
return Math.Sqrt(p * (p - a) * (p - b) * (p - c));
>
public int A
get < return a; >
set < a = value; >
>
public int B
get < return b; >
set < b = value; >
>
public int C
get < return c; >
set < c = value; >
>
public bool Exists
get
if ((a + b) > c && (b + c) > a && (a + c) > b)
return true;
return false;
>
>
public int this[int index]
get
if (index == 0)
return a;
else if (index == 1)
return b;
else if (index == 2)
return c;
else
throw new IndexOutOfRangeException();
>
set
if (index == 0)
a = value;
else if (index == 1)
b = value;
else if (index == 2)
c = value;
else
throw new IndexOutOfRangeException();
>
>
public static Triangle operator ++(Triangle t)
t.a++; t.b++; t.c++;
return new Triangle(t.a, t.b, t.c);
>
public static Triangle operator --(Triangle t)
t.a--; t.b--; t.c--;
return new Triangle(t.a, t.b, t.c);
>
public static bool operator true(Triangle t)
return t.Exists;
>
public static bool operator false(Triangle t)
return t.Exists;
>
public static Triangle operator *(Triangle t, int x)
return new Triangle(t.a * x, t.b * x, t.c * x);
>
public override string ToString()
return string.Format("A = , B = , C = ", a, b, c);
>
>
class Program
static void Main()
Triangle t = new Triangle(5, 6, 7);
t.Show();

Console.WriteLine("Perimeter Area Exists: " + t.Exists);
Console.WriteLine();

t[0] = 20; t[1] = 21; t[2] = 22;
try
t[4] = 23;
>
catch (Exception ex)
Console.WriteLine(ex.Message);
>
t.Show();
Console.WriteLine();

t++; Console.Write("Increment: \n", t);
--t; Console.Write("Decrement: \n", t);
Console.WriteLine();

if (t)
Console.WriteLine("TRUE");
else
Console.WriteLine("FALSE");
t.A = 50;
if (t)
Console.WriteLine("TRUE");
else
Console.WriteLine("FALSE");
Console.WriteLine();

t = t * 2;
Console.WriteLine("Multiple by 2: " + t.ToString());
>
>
>

25) Дайте определение конструктора и деструктора. Перечислите виды конструкторов.

Задание. Создайте класс Rectangle, разработав следующие элементы класса

– поля: a, b – стороны прямоугольника;

– конструктор, позволяющий создать экземпляр класса по умолчанию для создания прямоугольника со сторонами 2 и 3;

– конструктор, позволяющий создать экземпляр класса с заданными длинами сторон;

– метод, позволяющий рассчитать и вывести на экран периметр прямоугольника;

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

Ответ

Конструктор – это специальный метод, который инициализирует объект при его создании.

Инициализация – это задание начальных параметров объектов/переменных при их создании.

Формат конструктора:

доступ Имя_класса (список параметров)

Характеристики конструкторов:

1) имя конструктора совпадает с именем класса;

2) конструктор не может возвращать значение, даже void;

3) конструкторы могут быть перегружены (иметь одинаковые имена, но разные списки параметров).

Обычно в качестве модификатора доступа используется public, т.к. конструктор вызывается вне класса.

В классе может быть несколько конструкторов:

- конструктор с параметрами – конструктор, который принимают один или несколько параметров, чтобы инициализировать объект в момент его создания соответствующими значениями;

- конструктор по умолчанию, не принимающий аргументов, инициализирует все переменные члены, имеющие числовые типы, нулями, а члены-переменные ссылочного типа (строки, массивы, объекты классов) – null- значениями;

- конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него).

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

Деструктор – метод, служащий для деинициализации (удалении) объекта (например, освобождение памяти).

Имя деструктора всегда такое же как и название класса.

Перед именем деструктора ставится символ ~.

Формат деструктора:

Деструктор класса не имеет возвращаемого типа.
Деструктор класса имеет следующие свойства:

- деструкторы применяются только в классах;

- класс может иметь только один деструктор;

- деструкторы не могут наследоваться или перегружаться;

- деструкторы невозможно вызвать. Они запускаются автоматически;

- деструктор не принимает модификаторы и не имеет параметров.

Namespace ConsoleApp1

class Rectangle

double a,b;

//конструктор по умолчанию

public Rectangle ()

a = 2;

b = 3;

// конструктор с параметрами

public Rectangle ( double a, double b)

this .a = a;

this .b = b;

// конструктор копирования

public Rectangle (Rectangle r)

a = r.a;

b = r.b;

//конструктор копирования

public void P()

double p = 2*(a + b);

Console.WriteLine( "Периметр прямоугольника со сторонами и равен " , a, b, p);

public void S()

double s = a * b;

Console.WriteLine( "Площадь прямоугольника со сторонами и равна " ,a, b,s);

class Program

static void Main( string [] args)

Rectangle rect1 = new Rectangle();

rect1.P();

rect1.S();

Rectangle rect2 = new Rectangle(1,2);

rect2.P();

rect2.S();

Rectangle rect3 = new Rectangle(rect2);

rect3.P();

rect3.S();

Console.ReadKey();

26) Опишите наследование и синтаксис наследования.

Задание. Разработайте программу, которая будет содержать два класса, базовый и производный. В первом будет метод, который будет выводить текст «Моя фамилия – ….», а во втором будет осуществляться вызов метода базового класса и вывод текста «Меня зовут …».

Ответ

Наследованиеявляется одним из фундаментальных атрибутов объектно-ориентированного программирования.

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

Класс, члены которого наследуются, называется базовым классом.

Класс, который наследует члены базового класса, называется производным классом. Следовательно, производный класс представляет собой специализированный вариант базового класса. Он наследует все переменные, методы, свойства и индексаторы, определяемые в базовом классе, добавляя к ним свои собственные элементы.

Объявление нового класса, который будет наследовать другой класс:

class [имя_класса] : [имя_базового_класса]
// тело класса
>

В классе-наследнике можно получить доступ к членам базового класса, которые объявлены как public, protected, internal и protected internal. Члены базового класса с модификатором доступа private также переходят в класс-наследник, но к ним могут иметь доступ только члены базового класса.

Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация.

Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной.

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



Читайте также: