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

Генерация исключения в своем классе при невозможности построить треугольник

10.11.2012, 13:30. Показов 1683. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача:"Описать класс, представляющий треугольник. Предусмотреть методы для создания объектов, перемещения на плоскости, изменения размеров и вращения на заданный угол. Описать свойства для получения состояния объекта. При невозможности построения треугольника выбрасывается исключение."


Код:
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace LABA3
{
    class Treug
    {
        double AB, BC, AC;
 
        public double ab  //св-во для обекта AB
        {
            get { return AB; }
            set { AB = value; }
        }
 
        public double bc  //св-во для обекта BC
        {
            get { return BC; }
            set { BC = value; }
        }
 
        public double ac  //св-во для обекта AC
        {
            get { return AC; }
            set { AC = value; }
        }
 
        //конструктор класса Treug который инициализирует объекты
        public Treug(double x1, double x2, double y1, double y2, double z1, double z2)
        {
            ab = Math.Sqrt(Math.Pow((y1 - x1), 2) + Math.Pow((y2 - x2), 2));
            bc = Math.Sqrt(Math.Pow((y1 - z1), 2) + Math.Pow((y2 - z2), 2));
            ac = Math.Sqrt(Math.Pow((z1 - x1), 2) + Math.Pow((z2 - x2), 2));
        }
 
        //метод получения поля ab
        public double Vab()
        {
            return ab;
        }
 
        //метод получения поля bc
        public double Vbc()
        {
            return bc;
        }
 
        //метод получения поля ac
        public double Vac()
        {
            return ac;
        }
 
 
        //метод определения типа треугольника
        public void Tip()
        {
            if ((ab == bc) && (ab == ac)) Console.WriteLine("Треугольник равносторонний");
            else
            {
                if (((ab == bc) && (ab != ac)) || ((ab == ac) && (ab != bc)) || ((ac == bc) && (ac != ab)) || ((bc == ac) && (bc != ab))) Console.WriteLine("Треугольник равнобедренный");
                else
                {
                    if (((ab != bc) && (ab != ac)) || ((bc != ac) && (bc != ab)) || ((ac != bc) && (ac != ab))) Console.WriteLine("Треугольник разносторонний");
                }
            }
 
        }
 
        //метод перемещения треугольника на плоскости
        public void Perem(double h, double x1, double x2, double y1, double y2, double z1, double z2)
        {
            x1 += h;
            x2 += h;
            y1 += h;
            y2 += h;
            z1 += h;
            z2 += h;
            Console.WriteLine("Координаты треугольника после перемещения на h={0}", h);
            Console.WriteLine("A({0};{1});", x1, x2);
            Console.WriteLine("B({0};{1});", y1, y2);
            Console.WriteLine("C({0};{1});", z1, z2);
 
        }
 
     }
 
 
    class Program
    {
        public static void Main(string[] args)
        {
            //задание треугольника
            double h, x1, x2, y1, y2, z1, z2;
            string buf;
            try
            {
                Console.WriteLine("Введите координаты точки А");
                Console.Write("Введите координату х:");
                buf = Console.ReadLine();
                x1 = Convert.ToDouble(buf);
                Console.Write("Введите координату y:");
                buf = Console.ReadLine();
                x2 = Convert.ToDouble(buf);
                Console.WriteLine("==Координаты точки А({0};{1})==", x1, x2);
                Console.WriteLine();
 
                Console.WriteLine("Введите координаты точки B");
                Console.Write("Введите координату х:");
                buf = Console.ReadLine();
                y1 = Convert.ToDouble(buf);
                Console.Write("Введите координату y:");
                buf = Console.ReadLine();
                y2 = Convert.ToDouble(buf);
                Console.WriteLine("==Координаты точки B({0};{1})==", y1, y2);
                Console.WriteLine();
 
                Console.WriteLine("Введите координаты точки C");
                Console.Write("Введите координату х:");
                buf = Console.ReadLine();
                z1 = Convert.ToDouble(buf);
                Console.Write("Введите координату y:");
                buf = Console.ReadLine();
                z2 = Convert.ToDouble(buf);
                Console.WriteLine("==Координаты точки C({0};{1})==", z1, z2);
                Console.WriteLine();
 
 
 
 
 
                //вычисление длинн сторон треугольника
                Treug n = new Treug(x1, x2, y1, y2, z1, z2); //вызов конструктора
                Console.WriteLine("Сторона AB={0:#,##}", n.Vab()); //вызов метода получения поля ab
                Console.WriteLine("Сторона BC={0:#.##}", n.Vbc()); // вызов метода получения поля bc
                Console.WriteLine("Сторона AC={0:#.##}", n.Vac()); // вызов метода получения поля ac
 
                //определение типа треугольника
                Console.Write("Тип треугольника ABC:"); n.Tip();//вызов метода определения типа
                Console.WriteLine();
 
 
                //перемещение треугольника
                Console.Write("Введите на сколько переместить треугольник");
                buf = Console.ReadLine();
                h = Convert.ToDouble(buf);
                Console.WriteLine();
                Console.WriteLine("Координаты вершин треугольника до перемещения: ");
                Console.WriteLine("A({0};{1});", x1, x2);
                Console.WriteLine("B({0};{1});", y1, y2);
                Console.WriteLine("C({0};{1});", z1, z2);
                n.Perem(h, x1, x2, y1, y2, z1, z2);//вызов метода для перемещения треугольника
 
                //изменение размера треугольника
                Console.WriteLine("Введите на сколько изменить размер треугольник ");
                
            }
 
 
            catch (FormatException)
            {
                Console.WriteLine("Не верный формат ввода.Нужно вводить числа");
                Console.ReadLine();
            }
 
 
        }
    }
}
Проблема: Нужно сгенерировать исключение которое будет обрабатывать ввод сторон которые будут лежать в одной точке или на одной линии. Я знаю что его нужно генерировать при помощи оператора throw, но не очень понимаю алгоритм его использования.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2012, 13:30
Ответы с готовыми решениями:

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

Поиск компонента в своем классе
Здравствуйте Столкнулся со следующей проблемой: решил вывести одну из операций приложения в отдельный поток. Описал класс. В классе...

Реализовать Handle в своем классе
Во общем есть у меня listBox с объектами типа Myclass. И их там может быть очень много, и мне бы хорошо реализовать что б каждый объект в...

7
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2012, 13:34
Skyr1ver, это надо переписывать (немного, правда).
1) названия должны быть написаны по-английски, например, triangle, а не treug, методы должны что-то возвращать, а не void.
2) конструкция: throw new Exception("Невозможно создать треугольник")
0
0 / 0 / 0
Регистрация: 26.05.2011
Сообщений: 18
10.11.2012, 13:40  [ТС]
Спасибо за замечания, но мне все же немного непонятно, допустим создам я это исключение, но как я пойму что пользователь ввел одну и туже точку?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2012, 13:52
Skyr1ver, во-первых у вас каждая точка треугольника должна описываться двумя числами (x,y), а у вас одним - double. Создайте отдельный класс "точка"
C#
1
2
3
4
5
class Point
{
   public double X {get;set;}
   public double Y {get;set;}
}
после этого треугольник
C#
1
2
3
4
5
6
7
class Triangle
{
   public Point A {get;set;}
   public Point B {get;set;}
   public Point C {get;set;}
...
}
Добавлено через 5 минут
А за
C#
1
Math.Pow((y1 - x1), 2
нужно по рукам указкой давать
0
0 / 0 / 0
Регистрация: 26.05.2011
Сообщений: 18
10.11.2012, 14:05  [ТС]
Psilon,
Цитата Сообщение от Psilon Посмотреть сообщение
1
Math.Pow((y1 - x1), 2
а что здесь не так?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2012, 14:09
Skyr1ver, x*x, все. Вызывать функцию, которая жрет кучу ресурсов ир аботает в 100 с лишним раз медленнее...
0
0 / 0 / 0
Регистрация: 26.05.2011
Сообщений: 18
10.11.2012, 14:13  [ТС]
Psilon, аа насчет этого понял
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
10.11.2012, 17:29
Есть даже специальные надстройки в студии, которые правят код, помимо всего прочего, заменяют Math.Pow(x,n) при n < 10 на x*x*x*x...

Добавлено через 34 секунды
Цитата Сообщение от Skyr1ver Посмотреть сообщение
аа насчет этого понял
ну рад за вас)

Добавлено через 55 минут
Skyr1ver, вот вам пример: разбирайтесь
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
149
150
151
152
153
154
155
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Triangle
{
    public class Point
    {
        public double X { get; set; }
        public double Y { get; set; }
 
 
        public Point(double x, double y)
        {
            X = x;
            Y = y;
        }
 
 
        public static Point operator +(Point lhs, Point rhs)
        {
            return new Point(lhs.X + rhs.X, lhs.Y + rhs.Y);
        }
 
 
        public static Point operator -(Point p)
        {
            return new Point(-p.X, -p.Y);
        }
 
 
        public static Point operator -(Point lhs, Point rhs)
        {
            return lhs + (-rhs);
        }
 
 
        public override string ToString()
        {
            return string.Format("({0},{1})", X, Y);
        }
    }
 
 
    public class Triangle
    {
        public Point A { get; set; }
        public Point B { get; set; }
        public Point C { get; set; }
 
 
        public enum Type
        {
            Equilateral,
            Isosceles,
            Right,
            Other
        }
 
 
        public double AB
        {
            get { return Distance(A, B); }
        }
 
        public double AC
        {
            get { return Distance(A, C); }
        }
 
        public double BC
        {
            get { return Distance(B, C); }
        }
 
 
        private double Distance(Point lhs, Point rhs)
        {
            double dx = lhs.X - rhs.X;
            double dy = lhs.Y - rhs.Y;
            return Math.Sqrt(dx * dx + dy * dy);
        }
 
 
        public Triangle(Point a, Point b, Point c)
        {
            A = a;
            B = b;
            C = c;
        }
 
 
        public new Type GetType()
        {
            double ab = AB, bc = BC, ac = AC;
            if ((Math.Abs(ab - bc) < double.Epsilon) && (Math.Abs(ab - ac) < double.Epsilon))
                return Type.Equilateral;
            if (((Math.Abs(ab - bc) < double.Epsilon) && (Math.Abs(ab - ac) > double.Epsilon))
                || ((Math.Abs(ab - ac) < double.Epsilon) && (Math.Abs(ab - bc) > double.Epsilon))
                || ((Math.Abs(ac - bc) < double.Epsilon) && (Math.Abs(ac - ab) > double.Epsilon))
                || ((Math.Abs(bc - ac) < double.Epsilon) && (Math.Abs(bc - ab) > double.Epsilon)))
                return Type.Isosceles;
            double hypot, k1, k2;
            if (ab > bc)
            {
                hypot = ab;
                k1 = bc;
            }
            else
            {
                hypot = bc;
                k1 = ab;
            }
            if (ac > hypot)
            {
                k2 = hypot;
                hypot = ac;
            }
            else
            {
                k2 = ac;
            }
            if (Math.Abs(hypot * hypot - (k1 * k1 + k2 * k2)) < 1E-10)
                return Type.Right;
            return Type.Other;
        }
 
 
        public void Displace(Point delta)
        {
            A += delta;
            B += delta;
            C += delta;
        }
 
 
        public void Displace(double h)
        {
            Displace(new Point(h, h));
        }
    }
 
 
    public class Program
    {
        private static void Main(string[] args)
        {
            Point p1 = new Point(0,0), p2 = new Point(1,0), p3 = new Point(0,3);
            var t = new Triangle(p1, p2, p3);
            Console.WriteLine(t.GetType());
            Console.ReadKey();
        }
    }
}
Добавлено через 2 минуты
Насчет того, что GetType у меня вроде как гораздо длиннее и хуже,чем у вас: нельзя сравнивать значения с плавающей запятой с помощью ==

Добавлено через 1 час 59 минут
Можно кстати без этих ужасных условий обойтись:
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
        public new Type GetType()
        {
            const double epsilon = 1E-10;
            double ab = AB, bc = BC, ac = AC;
            if ((Math.Abs(ab - bc) < epsilon) && (Math.Abs(ab - ac) < epsilon))
                return Type.Equilateral;
            double hypot, k1, k2;
            if (ab > bc)
            {
                hypot = ab;
                k1 = bc;
            }
            else
            {
                hypot = bc;
                k1 = ab;
            }
            if (ac > hypot)
            {
                k2 = hypot;
                hypot = ac;
            }
            else
                k2 = ac;
            if (Math.Abs(k2 - k1) < epsilon)
                return Type.Isosceles;
            if (Math.Abs(hypot * hypot - (k1 * k1 + k2 * k2)) < epsilon)
                return Type.Right;
            return Type.Other;
        }
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2012, 17:29
Помогаю со студенческими работами здесь

Использовать канвас в своём классе
unit Clock; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; ...

Как создать в своем классе событие ?
Познакомился с Qt , там написано как можно связать событие с обработчиком события , как связать обработчик события с нескольким событиями ,...

Использование компонента формы в своем классе
Здравствуйте у меня такой вопрос, можно ли как нибудь использовать компонент формы в своем классе?

Использование initializer_list<> в своём классе Vector
Привет. При разработке своего класса Vector возникла такая проблема: имеем такое определение конструктора: Vector(const...

Как создать событие в своём классе
Есть класс Class1 Есть его экземпляр var A:Class1 = new Class1(); Как сделать чтобы у переменной A было событие onMessage, чтобы я...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru