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

Как реализовать массив объектов Абстрактного класса

10.11.2020, 19:07. Показов 5417. Ответов 20

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Есть такое задание:
Написать программу на языках С# в которой идёт со следующими геометрическими фигурами:
1.Треугольник
2.Квадрат
3.Прямоугольник.
В программе имеется массив фигур, с которым можно сделать следующие операции:
1.Добавить новую фигуру
2.Посчитать периметр у всех фигур
3.Посчитать площадь у всех фигур
Для фигуры использовать базовый абстрактный класс фигуры, у которого есть методы посчитать периметр и посчитать площадь фигуры.
не понимаю вот пункт ниже:
Массив фигур в программе должен быть представлен как массив объектов этого базового класса. Массив фигур должен создаваться и вся работа с ним идёт внутри main.
Разъясните, пожалуйста, как реализовать массив объектов.

Базовый абстрактный класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    abstract class Figure
    {
        abstract public double S();
        abstract public double P();
 
    }
}

Класс наследник - Треугольник:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Triangle: Figure
    {
        public uint LengthSideA { get; set; }
        public uint LengthSideB { get; set; }
        public uint LengthSideC { get; set; }
        public Triangle(uint lengthSideA, uint lengthSideB, uint lengthSideC) 
        {
            LengthSideA = lengthSideA;
            LengthSideB = lengthSideB;
            LengthSideC = lengthSideC;
        }
        
        public override double S()
        {
            double p = (P())/2;
            return Math.Sqrt(p * (p - LengthSideA) * (p - LengthSideB) * (p - LengthSideC));
        }
        public override double P()=>LengthSideA + LengthSideB + LengthSideC;
 
    }
}

Класс наследник - прямоугольник
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Rectangle:Figure
    {
        public uint Length { get; set; }
        public uint Width { get; set; }
        public Rectangle(uint lentgh, uint width)
        {
            Length = Length;
            Width = width;
        }
        public override double P() => 2 * (Length + Width);
        public override double S() => Length * Width;
 
 
    }
}


Класс наследник - квадрат
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Square:Rectangle
    {
        public double length { get; set; }
        public Square() : this(1) { }
        public Square(uint length ):base(length,length)
        {
 
        }
        public override double P() => 4 * Length;
        public override double S() => 2 * Length;
 
    }
}


Класс - программа
???
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2020, 19:07
Ответы с готовыми решениями:

Можно ли реализовать наследование абстрактного класса
Можно ли на шарпе реализовать наследование абстрактного класса двумя независимыми друг от друга производными?

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

Массив объектов абстрактного класса
Есть абстрактный класс с двумя чисто виртуальными методами, от него наследуются два класса в которых эти методы переопределены и есть класс...

20
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
10.11.2020, 19:26
Цитата Сообщение от m054 Посмотреть сообщение
как реализовать массив объектов.
C#
1
Figure[] figures = {new Triangle(...), new Rectangle(...), new Square(...), ...};
1
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
10.11.2020, 19:34  [ТС]
Класс квадрат у меня не работает в такой реализации, поэтому унаследую его от Базового класса Figure. Хотя логичнее было бы его наследовать от прямоугольника, но что-то пошло не так...Кстати, если подскажите как унаследовать его от прямоугольника, буду признателен:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Square:Figure
    {
        public uint Length { get; set; }
        public Square(uint length) 
        {
            Length = length;
        }
        //public Square() : this(1) { }
        //public Square(uint length) : base(length, length)
        //{
 
        //}
        public override double P() => 4 * Length;
        public override double S() => 2 * Length;
 
    }
}
0
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
10.11.2020, 19:36
m054, а сам класс Rectangle нормально работает? Там в конструкторе ошибка
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
10.11.2020, 19:43  [ТС]
Цитата Сообщение от Ellizio Посмотреть сообщение
а сам класс Rectangle нормально работает? Там в конструкторе ошибка
Спасибо. Да, работает. Ошибку заметил после того, как сюда отправил..

Добавлено через 4 минуты
В общем, пойду учить "мат.часть", можете порекомендовать материалы по работе с абстрактными классами, т.к. в тех материалах что у меня есть, не раскрывается тема работы с массивами объектов абстрактного класса)).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Program
    {
        static void Main(string[] args)
        {
            Figure[] figures = { new Triangle(2,2,2),new Square(2), new Rectangle(2,4)};
            
 
        }
    }
}
а то, как теперь вызывать объекты нужных мне классов и их методы - не знаю...((

 Комментарий модератора 
Используйте для C# соответсвующий тег и кнопку.
Не надо использовать [CODE]!
0
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
10.11.2020, 19:44
m054, а что именно не работает?
После наследования два свойства Lenght получаются
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
10.11.2020, 19:47  [ТС]
метод P() не работает, всегда возвращает 0. После того, как наследовался от Figure, все заработало.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
10.11.2020, 19:53
Цитата Сообщение от m054 Посмотреть сообщение
Класс квадрат у меня не работает в такой реализации,
В классе треугольника нужна обязательно в конструкторе проверка на существование треугольника.
Во всех классах нужно из публичных свойств убрать сеттеры.
В классе квадрата свойство Length излишне, если наследовать от прямоугольника.
Переопределять методы P() и S() тоже не нужно.

Но в остальном, вроде, рабочий код... или я чего-то не вижу.

Добавлено через 3 минуты
Цитата Сообщение от m054 Посмотреть сообщение
можете порекомендовать материалы по работе с абстрактными классами
Так же как и с любым базовым классом.
Единственное отличие - нельзя создать его экземпляр.
1
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
10.11.2020, 20:02  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Так же как и с любым базовым классом.
Единственное отличие - нельзя создать его экземпляр.
Спасибо за помощь. Утром добью код, на сегодня хватит.
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
11.11.2020, 12:37  [ТС]
1. не пойму как организовать проверку на корректность значений так, чтобы, при вводе некорректных значений, объект не создавался?
Т.е. нужно такой метод организовывать не в классе, например, Triangle, а в Program?
Например, так:
C#
1
2
3
4
5
6
7
8
9
10
11
   //Program     
public static string Error(Form f)
        {
            if (f.CorrectValues() != true)
            {
                Console.WriteLine("Error");
                return "Error";
            }
            else
                return "The figure creation is possible ";
        }
Метод CorrectionValues() объявлен в абстрактном классе и реализован в наследниках, к примеру, в классе Triangle:
C#
1
2
3
4
5
6
7
8
9
        
//Triangle
public override bool CorrectValues() 
        {
            if (SideA > 0 && SideB > 0 && SideC > 0)
                return true;
            else 
                return false;
        }
Но, мне во всей этой истории не нравится что метод CorrectionValues() публичный (закрыть его не могу, т.к. в базовом классе он абстрактный). Можно реализовать в каждом классе свой собственный метод, но тогда теряется смысл полиморфизма. Подскажите, как реализовать вот эти 4 задачи, на основе моих классов:
2. Массив фигур в программе должен быть представлен как массив объектов этого базового класса.
3. Массив фигур должен создаваться и вся работа с ним идёт внутри main.
4. При создании фигур необходимо осуществлять проверку входных данных на возможность создания данной фигуры и в случае ошибки выдавать соответствующие сообщения.
Или подскажите что гуглить? А то, видимо, не те вопросы гуглу задаю))
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.11.2020, 13:28
Цитата Сообщение от m054 Посмотреть сообщение
4. При создании фигур необходимо осуществлять проверку входных данных на возможность создания данной фигуры и в случае ошибки выдавать соответствующие сообщения.
Какие входные данные?

По идее нужно в базовом классе создавать метод-фабрику.
Который будет проверять параметры и создавать производные классы, но если знания ООП слабые - реализовать будет сложно.

Если по входными данными сразу задаётся требуемая фигура, то задайте в каждом классе статический метод проверяющий параметры и создающий фигуру.
Примерно с такой сигнатурой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static bool TryCreate(string param1, string param2, ...., out Rectangle figure)
{
    // Здесь проверка параметров.
    // Если корректны, то создание figure и возврат true
    {
         figure = new Rectangle (...);
         return true;
     }
     else
    {
         figure = null;
         return false;
     }
}
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
11.11.2020, 17:58  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
По идее нужно в базовом классе создавать метод-фабрику.
Который будет проверять параметры и создавать производные классы, но если знания ООП слабые - реализовать будет сложно.
Да, только только начинаем изучать ООП. Поэтому неясно, как в Базовом классе создать метод-фабрику, ведь у каждой фигуры разное кол-во параметров, а значит, сигнатура будет меняться и это уже будет не перегруженный метод базового класса, верно?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Если по входными данными сразу задаётся требуемая фигура, то задайте в каждом классе статический метод проверяющий параметры и создающий фигуру.
Здесь мне и самому не совсем понятно, т.к. задание сформулировано следующим образом:
Массив фигур в программе должен быть представлен как массив объектов базового класса. Массив фигур должен создаваться и вся работа с ним идёт внутри main.
Т.е. если делать так, как Вы мне вчера подсказали:
C#
1
Figure[] figures = { new Triangle(2,2,2),new Square(2), new Rectangle(2,4)};
то, как вызвать метод вычисления площади, например у треугольника?
C#
1
figures.S();
- не работает, т.к. я не могу объектом абстрактного класса вызвать абстрактный метод этого же класса.
В С++, например, можно создать указатель на объект, а как в C# это сделать, не понимаю
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.11.2020, 18:22
Цитата Сообщение от m054 Посмотреть сообщение
- не работает, т.к. я не могу объектом абстрактного класса вызвать абстрактный метод этого же класса.
Как это не работает ??? !!!
Это же метод базового класса!

Если у вас код который вы выложили - будет работать.
Если изменили его, то покажите, что у вас за код.

Цитата Сообщение от m054 Посмотреть сообщение
В С++, например, можно создать указатель на объект, а как в C# это сделать, не понимаю
По меркам C++, в переменных C# ссылочного типа (для классов, например) и так содержатся ссылки на объект.
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
11.11.2020, 21:20  [ТС]
я возвращаюсь к исходному коду, где у меня реализованы только классы. На всякий случай дублирую:
Базовый класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
 
    abstract class Figure
    {
       // public string Error()=>"Error. The shape is cannot be create";
 
        public Figure[] array;
        abstract public double S();
        abstract public double P();
 
    }
}
Наследник - Треугольник:
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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Triangle: Figure
    {
        public uint LengthSideA { get;}
        public uint LengthSideB { get;}
        public uint LengthSideC { get;}
        public Triangle(uint lengthSideA, uint lengthSideB, uint lengthSideC)
        {
                LengthSideA = lengthSideA;
                LengthSideB = lengthSideB;
                LengthSideC = lengthSideC;
        }
 
        public override double S()
        {
 
            double p = (P())/2;
            return Math.Sqrt(p * (p - LengthSideA) * (p - LengthSideB) * (p - LengthSideC));
        }
        public override double P()=>LengthSideA + LengthSideB + LengthSideC;
 
    }
}
Наследник - Прямоугольник
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Rectangle:Figure
    {
        public uint Length { get;}
        public uint Width { get;}
        public Rectangle(uint lentgh, uint width)
        {
            Length = Length;
            Width = width;
        }
        public override double P() => 2 * (Length + Width);
        public override double S() => Length * Width;
    }
}
Наследник - квадрат
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Square:Rectangle
   // class Square:Figure
    {
        // public uint Length { get; set; }
        //public Square(uint length) 
        //{
        //    Length = length;
        //}
        public Square() : this(1) { }
        public Square(uint length) : base(length, length)
        {
 
        }
        public override double P() => 4 * Length;
        public override double S() => 2 * Length;
 
    }
}
Добавлено через 10 минут
Запутался окончательно.
для начала, нужно реализовать проверку входных данный, при создании объекта класса-наследника
я пытался это реализовать через конструктор, просто добавив условия при которых поля инициализируются (если входные данные корректны).
Но это неверный подход, т.к. объект все-равно будет создан c нулевыми значениями полей.
C#
1
2
3
4
5
6
7
8
9
        public Triangle(uint lengthSideA, uint lengthSideB, uint lengthSideC)
        {
            if (lengthSideA > 0 && lengthSideB > 0 && lengthSideC > 0)
            {
                LengthSideA = lengthSideA;
                LengthSideB = lengthSideB;
                LengthSideC = lengthSideC;
            }
        }
Как Интегрировать ваш метод
Цитата Сообщение от Элд Хасп Посмотреть сообщение
public static bool TryCreate(string param1, string param2, ...., out Rectangle figure)
я тоже не понял, т.к. если реализовывать его в классе-наследнике, то какими данными инициализировать объект, ведь они неизвестны, вот эта строка:
Цитата Сообщение от Элд Хасп Посмотреть сообщение
figure = new Rectangle (...);
Добавлено через 2 часа 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Figure
{
    class Program
    {
        //abstract public bool TryCreate(uint lengthSideA, uint lengthSideB, uint lengthSideC, out Figure figure)
        //{
        //    if (lengthSideA > 0 && lengthSideB > 0 && lengthSideC > 0)
        //    {
        //        figure = new Triangle(lengthSideA, lengthSideB, lengthSideC);
        //        return true;
        //    }
        //    else
        //    {
        //        figure = null;
        //        return false;
        //    }
        //}
        static void Main(string[] args)
        {
 
            Triangle t=new Triangle(0,2,2);
            Console.WriteLine(t.P());//так работает
            Truangle test;
 
            Figure[] figures = { new Triangle(2,2,2),new Square(2), new Rectangle(2,4)};
            figures.P();//не работает
            test.P();//не работает, т.к. объект не создан, а только объявлен
            
 
            
            Console.WriteLine();
            
            Console.ReadKey();
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.11.2020, 22:44
Цитата Сообщение от m054 Посмотреть сообщение
для начала, нужно реализовать проверку входных данный, при создании объекта класса-наследника
Один из возможных вариантов, для класса треугольник
C#
1
2
3
4
5
6
    public abstract class Figure
    {
        abstract public double S();
        abstract public double P();
 
    }
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
    public class Triangle : Figure
    {
        public double LengthSideA { get; }
        public double LengthSideB { get; }
        public double LengthSideC { get; }
        public Triangle(double lengthSideA, double lengthSideB, double lengthSideC)
        {
            if (lengthSideA <= 0)
                throw new ArgumentOutOfRangeException("Длина стороны должна быть положительным числом.", nameof(lengthSideA));
            if (LengthSideB <= 0)
                throw new ArgumentOutOfRangeException("Длина стороны должна быть положительным числом.", nameof(lengthSideB));
            if (lengthSideC <= 0)
                throw new ArgumentOutOfRangeException("Длина стороны должна быть положительным числом.", nameof(lengthSideC));
 
            var a = lengthSideA;
            var b = lengthSideB;
            var c = lengthSideC;
 
            if (a < b)
                (a, b) = (b, a);
 
            if (a < c)
                (a, c) = (c, a);
 
            if (a >= b + c)
                throw new ArithmeticException("Треугольник с такими сторонами создать невозможно.");
 
            LengthSideA = lengthSideA;
            LengthSideB = lengthSideB;
            LengthSideC = lengthSideC;
        }
        private double? s;
        public override double S()
        {
            if (s != null)
                return s.Value;
 
            double p = (P()) / 2;
            return (s = Math.Sqrt(p * (p - LengthSideA) * (p - LengthSideB) * (p - LengthSideC))).Value;
        }
        private double? p;
        public override double P() => p ?? (p = LengthSideA + LengthSideB + LengthSideC).Value;
 
        public static bool TryCreate(double lengthSideA, double lengthSideB, double lengthSideC, out Triangle triangle)
        {
            try
            {
                triangle = new Triangle(lengthSideA, lengthSideB, lengthSideC);
                return true;
            }
            catch (Exception)
            {
                triangle = null;
                return false;
            }
        }
 
    }
C#
1
2
            Figure[] figures = { new Triangle(2,2,2),new Square(2), new Rectangle(2,4)};
            figures[0].P();// "не работает" - надо задавать ИНДЕКС. Это же метод элемента массива, а не самого массива!
C#
1
2
3
   double a =10, b = -1, с = 3;
   if (!Tringle.TryCreate(a, b, c, out Tringle trn))
      Console.WriteLine("Треугольник с такими данными создать невозможно.");
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
12.11.2020, 09:34  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
figures[0].P();// "не работает" - надо задавать ИНДЕКС. Это же метод элемента массива, а не самого массива!
Я же это знаю, почему не увидел сам
В Целом с Вашим кодом разобрался, вот только не пойму что делается в этом участке кода:
C#
1
2
3
4
5
6
7
8
9
10
11
private double? s;
        public override double S()
        {
            if (s != null)
                return s.Value;
 
            double p = (P()) / 2;
            return (s = Math.Sqrt(p * (p - LengthSideA) * (p - LengthSideB) * (p - LengthSideC))).Value;
        }
        private double? p;
        public override double P() => p ?? (p = LengthSideA + LengthSideB + LengthSideC).Value;
Если это не тернарный оператор (не сталкивался еще с такой реализацией), тогда что это? (мои наивные запросы в гугл результат не принесли)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
12.11.2020, 09:48
Лучший ответ Сообщение было отмечено m054 как решение

Решение

Цитата Сообщение от m054 Посмотреть сообщение
В Целом с Вашим кодом разобрался, вот только не пойму что делается в этом участке кода:
Это Оператор объединения с NULL.

Если значение перед ним равно null, то присваивается значение после него.

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

Но решил показать вам другой альтернативный вариант, тоже часто испоьзуемый.
Можно эту же переменную вычислить при первом обращении к методу.
В методе проверяется переменная на NULL, если она не null - возвращается её значение.
Если она NULL, то сначала присваивается ей значение, а потом оно возвращается.

Сделать это можно явным образома через if (в методе S()) или неявным образом через ?? (в методе P()).

Может вот так будет понятнее:
C#
1
2
3
4
5
6
7
8
        private double? s;
        public override double S()
        {
            if (s == null)
                s = Math.Sqrt(p * (p - LengthSideA) * (p - LengthSideB) * (p - LengthSideC));
 
            return s.Value;
        }
1
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
12.11.2020, 10:40  [ТС]
Большое человеческое спасибо Вам!


Добавлено через 26 минут
А, и еще, зачем тип var тут?
Цитата Сообщение от Элд Хасп Посмотреть сообщение
var a = lengthSideA;
            var b = lengthSideB;
            var c = lengthSideC;
ведь программе же заранее известно какой тип данных передается в конструктор, при создании объекта?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
12.11.2020, 10:50
Цитата Сообщение от m054 Посмотреть сообщение
ведь программе же заранее известно какой тип данных передается в конструктор, при создании объекта?
Для проверки возможности создания треугольника с указанными сторонами, необходимо сравнить большую сторону с суммой меньших.

В этом коде я просто сортирую стороны.
a - большая, b и с - меньшии.
C#
15
16
17
18
19
20
21
22
23
            var a = lengthSideA;
            var b = lengthSideB;
            var c = lengthSideC;
 
            if (a < b)
                (a, b) = (b, a);
 
            if (a < c)
                (a, c) = (c, a);
Добавлено через 5 минут
Можно так сделать:
C#
15
16
17
18
19
20
var max = lengthSideA > lengthSideB ? lengthSideA : lengthSideB ;
if (max < lengthSideC)
   max = lengthSideC;
 
if (2 * max >=  lengthSideA + lengthSideB + lengthSideC)
    throw new ArithmeticException("Треугольник с такими сторонами создать невозможно.");
0
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
12.11.2020, 12:08  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
В этом коде я просто сортирую стороны.
я это понял, спасибо!
Вопрос был немного о другом, почему используется именно тип var при объявлении переменных:
C#
1
2
3
var a = lengthSideA;
            var b = lengthSideB;
            var c = lengthSideC;
я понимаю, что если оставить тип переменных такой же как и у значений параметров конструктора (double), то ничего не изменится.
Вот и стало любопытно, почему Вы решили использовать именно var в данном контексте.
Возможно Вы это сделали по привычке, а возможно в этом есть какой-то смысл?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2020, 12:08
Помогаю со студенческими работами здесь

Реализовать класс "Динамический массив"
1. Согласно заданию реализовать класс абстрактного типа данных (далее АТД) как динамический массив. Для этого определение класса должно...

Переопределение конструктора копирования абстрактного класса, на клонирование дочерних объектов
Здравствуйте. Помогите решить следующую проблему. Есть абстрактный класс Object, у которого есть метод AddChild(Object* child)...

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

Массив объектов одного класса как поле другого класса
Доброе время суток. Мне тут в универе задали лабу, нужно создать класс полем которого будет массив объектов класса из предыдущей лабы и в...

Как правильно создать массив объектов текущего класса в методе данного класса?
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru