Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
1

Доступ к методу структуры из другого метода класса

04.05.2018, 18:32. Показов 1900. Ответов 18
Метки нет (Все метки)

Здравствуйте. У меня есть стуктура Point и класс Triangle, в поинте есть метод который считает расстояние между точками. А в треугольнике есть метод периметр. Я так понимаю, периметр равен сумме расстояний между точками. Но периметр не видит метода distance(). Как решить проблему?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace HW11
{
    class Program
    {
        static void Main()
        {
            
        }
    }
    public struct Point
    {
        int x, y;
        public Point(int X, int Y)
        {
            x = X;
            y = Y;
        }
        public double Distance(Point point1,Point point2)
        {
            int dx = point2.x - point1.x;
            int dy = point2.x - point1.y;
            return Math.Sqrt(x * x + y * y);
        }
    }
    class Triangle
    {
        Point vertex1, vertex2, vertex3;
        public Triangle (Point vertex1,Point vertex2,Point vertex3)
        {
            vertex1 = this.vertex1;
            vertex2 = this.vertex2;
            vertex3 = this.vertex3;
        }
        public double Perimetr()
        {
            return Distance(vertex1, vertex2) + Distance(vertex2, vertex3) + Distance(vertex1, vertex3);
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2018, 18:32
Ответы с готовыми решениями:

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая:...

Разрешить доступ к методу класса только для другого класса
Здравствуйте, нужно что бы у Item ссылка на Box была только для чтения, но при добавлении Item в...

Получить доступ из гл. функции к методу другого класса
Представляю свой "кодик" class Auto { public string Name; private string...

Как реализовать доступ к методу из другого класса?
Народ, как вообще правильно обращаться к методу из другого класса? Есть две формы. Form1 выводит...

18
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 18:37 2
Лучший ответ Сообщение было отмечено orestsyn как решение

Решение

orestsyn,
C#
1
2
3
public static double Distance(Point point1,Point point2)
...
return Point.Distance(vertex1, vertex2) + ...
1
Wanna be serious
582 / 470 / 185
Регистрация: 31.07.2013
Сообщений: 1,691
04.05.2018, 18:38 3
Варианта два:
1 внутри метода Perimetr() создать объект структуры Point(), и обращаться к методу Distance с помощью объекта:
C#
1
2
3
4
public double Perimetr()
{
    return newPoint(/*Аргументы*/).Distance(vertex1, vertex2) + Distance(vertex2, vertex3) + Distance(vertex1, vertex3);
}
2 сделать метод Distance статическим:
C#
1
2
3
4
5
6
public static double Distance(Point point1,Point point2)
{
    int dx = point2.x - point1.x;
    int dy = point2.x - point1.y;
    return Math.Sqrt(x * x + y * y);
}
Что первый вариант, что второй, мягко говоря, не ахти, в плане архитектуры.
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 18:43 4
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Что первый вариант, что второй, мягко говоря, не ахти, в плане архитектуры.
Второй-то вам чем не угодил? Нормальный вариант
0
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
04.05.2018, 18:47  [ТС] 5
woldemas, Спасибо большое, все заработало.
Но когда я попытался создать Square, то мне написало что для нестатического поля Point.x и Point.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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace HW11
{
    class Program
    {
        static void Main()
        {
            
        }
    }
    public struct Point
    {
        int x, y;
        public Point(int X, int Y)
        {
            x = X;
            y = Y;
        }
        public static double Distance(Point point1,Point point2)
        {
            int dx = point2.x - point1.x;
            int dy = point2.x - point1.y;
            return Math.Sqrt(x * x + y * y);
        }
    }
    class Triangle
    {
        Point vertex1, vertex2, vertex3;
        public Triangle (Point vertex1,Point vertex2,Point vertex3)
        {
            vertex1 = this.vertex1;
            vertex2 = this.vertex2;
            vertex3 = this.vertex3;
        }
        public double Perimetr()
        {
            return Point.Distance(vertex1, vertex2) + Point.Distance(vertex2, vertex3) + Point.Distance(vertex1, vertex3);
        }
        public double Square()
        {
            double p = Perimetr() / 2;
            return Math.Sqrt(p * (p - Point.Distance(vertex1, vertex2)) * (p - Point.Distance(vertex2, vertex3)) * (p - Point.Distance(vertex1, vertex3)));
        }
    }
}
0
Wanna be serious
582 / 470 / 185
Регистрация: 31.07.2013
Сообщений: 1,691
04.05.2018, 18:48 6
woldemas, он меньшее из зол. Но я бы лучше воспользовался той же агрегацией, нежели построением не очевидных (не здесь, слишком маленький пример) связей между классами.
0
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
04.05.2018, 18:50  [ТС] 7
Bespridelschic, Например?
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 18:57 8
Цитата Сообщение от Bespridelschic Посмотреть сообщение
Но я бы лучше воспользовался той же агрегацией
Что еще за агрегация? И какие тут связи? По-моему, логично, что функция, определяющая расстояние межу точками, объявлена в классе точки. Где ее еще легче найти?
Цитата Сообщение от orestsyn Посмотреть сообщение
поля Point.x и Point.y нужна ссылка на обьект
C#
1
2
3
4
5
6
public static double Distance(Point point1,Point point2)
{
      int dx = point2.x - point1.x;
      int dy = point2.x - point1.y;
      return Math.Sqrt(dx * dx + dy * dy);
}
1
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
04.05.2018, 18:57  [ТС] 9
woldemas, Я идиот Разобрался уже) Спасибо большое еще раз)
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 19:00 10
orestsyn, кстати, площадь лучше считать как половину модуля векторного произведения, меньше операций и корень считать не надо
0
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
04.05.2018, 19:32  [ТС] 11
woldemas, Да я какую формулу вспомнил со школьной программы, такую и ткнул.

Добавлено через 27 минут
woldemas, Скажите, пожалуйста, выводит все точки по нулям. В чем может быть дело?
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace HW11
{
    class Program
    {
        static void Main()
        {
            List<Triangle> triangle = new List<Triangle>();
            Triangle tr1 = new Triangle(new Point(1, 2) ,new Point(3, 2), new Point(4, 3));
            Triangle tr2 = new Triangle(new Point(3, 4), new Point(5, 1), new Point(2, 2));
            Triangle tr3 = new Triangle(new Point(1, 1), new Point(2, 3), new Point(5, 5));
            triangle.Add(tr1);
            triangle.Add(tr2);
            triangle.Add(tr3);
            foreach (var k in triangle)
            {
                Console.WriteLine(k.Print());
            }
            Console.ReadLine();
        }
    }
    public struct Point
    {
        int x, y;
        public Point(int X, int Y)
        {
            x = X;
            y = Y;
        }
        public static double Distance(Point point1,Point point2)
        {
            int dx = point2.x - point1.x;
            int dy = point2.x - point1.y;
            return Math.Sqrt(dx * dx + dy * dy);
        }
        public override string ToString()
        {
            return string.Format("[{0},{1}]", x, y);
        }
    }
    class Triangle
    {
        Point vertex1, vertex2, vertex3;
        public Triangle (Point vertex1,Point vertex2,Point vertex3)
        {
            vertex1 = this.vertex1;
            vertex2 = this.vertex2;
            vertex3 = this.vertex3;
        }
        public double Perimetr()
        {
            return Point.Distance(vertex1, vertex2) + Point.Distance(vertex2, vertex3) + Point.Distance(vertex1, vertex3);
        }
        public double Square()
        {
            double p = Perimetr() / 2;
            return Math.Sqrt(p * (p - Point.Distance(vertex1, vertex2)) * (p - Point.Distance(vertex2, vertex3)) * (p - Point.Distance(vertex1, vertex3)));
        }
        public string Print()
        {
            return string.Format("Triangle with points x1 = {0},x2 = {1},x3 = {2},Perimeter = {3}, Square = {4}", vertex1, vertex2, vertex3, Perimetr(), Square());
        }
    }
}
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 19:43 12
Цитата Сообщение от orestsyn Посмотреть сообщение
В чем может быть дело?
C#
1
2
3
4
5
6
public Triangle (Point vertex1,Point vertex2,Point vertex3)
{
    this.vertex1 = vertex1;
    this.vertex2 = vertex2;
    this.vertex3 = vertex3;
}
0
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
04.05.2018, 19:50  [ТС] 13
woldemas, Действительно) Почему так?
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 19:53 14
Цитата Сообщение от orestsyn Посмотреть сообщение
Почему так?
потому что вам именно полям создаваемого экземпляра класса Point нужно присвоить передаваемые значения, а никак не наоборот
1
SETI
63 / 48 / 18
Регистрация: 09.04.2018
Сообщений: 210
04.05.2018, 19:58  [ТС] 15
woldemas, А можете еще написать формулу по которой вы говорили площадь искать?
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
04.05.2018, 20:20 16
Лучший ответ Сообщение было отмечено orestsyn как решение

Решение

Цитата Сообщение от orestsyn Посмотреть сообщение
А можете еще написать формулу по которой вы говорили площадь искать?
Тогда, надо добавлять некоторые измения.
Сделать public поля x,y в Point, добавить оператор разности для точек.
Сама-то формула ерунда.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public struct Point
{
    public int x, y;
    ...
    public static Point operator-(Point a, Point b) 
    {
        return new Point (a.x - b.x, a.y - b.y);
    }
}
...
class Triangle
{
...
public double Square()
{
    Point v12 = vertex2 - vertex1;
    Point v13 = vertex3 - vertex1;
    return 0.5 * Math.Abs (v12.x * v13.y - v12.y * v13.x);
}
}
Если я нигде не ошибся.
1
Wanna be serious
582 / 470 / 185
Регистрация: 31.07.2013
Сообщений: 1,691
05.05.2018, 06:24 17
Цитата Сообщение от orestsyn Посмотреть сообщение
Например?
Цитата Сообщение от woldemas Посмотреть сообщение
Что еще за агрегация? И какие тут связи? По-моему, логично, что функция, определяющая расстояние межу точками, объявлена в классе точки. Где ее еще легче найти?
Сам метод оставляем как есть:
C#
1
2
3
4
5
6
public double Distance(Point point)
{
    int dx = x - point.x;
    int dy = x - point.y;
    return Math.Sqrt(dx * dx + dy * dy);
}
А метод по расчёту периметра изменить на этот:
C#
1
2
3
4
public double Perimetr()
{
    return vertex1.Distance(vertex2) + vertex2.Distance(vertex3) + vertex1.Distance(vertex3);
}
IMHO стало читабельней и короче, нежели использование статических методов в данной задаче.
0
616 / 426 / 205
Регистрация: 06.09.2013
Сообщений: 1,191
05.05.2018, 06:50 18
Bespridelschic, то есть просто сделать методом экземпляра? Ну это не принципиально, мне статический метод кажется понятнее, можно и как вы предлагаете. Я-то думал что-то кардинально отличное будет.
0
Wanna be serious
582 / 470 / 185
Регистрация: 31.07.2013
Сообщений: 1,691
05.05.2018, 07:04 19
Цитата Сообщение от woldemas Посмотреть сообщение
мне статический метод кажется понятнее
Цитата Сообщение от Bespridelschic Посмотреть сообщение
IMHO

Цитата Сообщение от woldemas Посмотреть сообщение
Я-то думал что-то кардинально отличное будет.
Была такая идея. Остановившись, я понял что смысла от этого в рамках данной задачи - никакого
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2018, 07:04

Как обратиться к методу из другого метода внутри одного и того же класса
Доброго времени суток. Продолжаю изучение C#, и вот моя третья тема (или четвертая, за сегодня) с...

Доступ к методу другого класса
здравствуйте как можно вызвать метод класса из другого класса пример qw.h #ifndef QW_H #define...

Как получить доступ к методу из другого класса?
public partial class Form1 : Form { private void button1_Click(object sender,...

Доступ к методу родительского класса из метода свойства родительского класса
Не знаю правильно ли написал тему, ну суть такая, есть класс который описывает допустим шарик, а...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru