Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 60
1
.NET 3.x

Точки, находящиеся на минимальном расстоянии от начала координат

02.10.2018, 09:41. Показов 1448. Ответов 13

Здравствуйте! Не могли бы участники форума написать консольную программу с таким условием:

Случайным образом формируются координаты X и Y 90 точек. Диапазон значений координат от минус 150 до 150. Вывести список точек, расстояние между которыми и началом координат минимально, а сами точки находятся в разных четвертях.

Случайным образом - это через

C#
1
2
3
4
Random = new Random;
x = rndx.Next(-150, 150);
Random = new Random;
y = rndy.Next(-150, 150);
Но как реализовать эти девяносто точек через while, я не понимаю. Да еще затем напечатать список точек, отстоящих недалеко от 0. Использовать массивы нельзя.
Помогите пожалуйста. В самоучителях и в Библии C# есть похожее, но не до конца.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2018, 09:41
Ответы с готовыми решениями:

Класс Точка. Вычислить расстояние от точки до начала координат...
Для всех вариантов задач создать класс с указанными двумя полями (Поле 1, Поле 2) и следующими...

Класс «Точка». В классе определить поля «координата X», «координата Y», автовычисляемое поле, хранящее расстояние от точки до начала координат,
Класс «Точка». В классе определить поля «координата X», «координата Y», автовычисляемое поле,...

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

Выяснить, какая из точек находится на минимальном расстоянии от начала координат
На плоскости заданы координаты трех точек А, В, С. Выяснить, какая из точек находится на...

13
Модератор
881 / 790 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
02.10.2018, 10:01 2
Цитата Сообщение от Galadriel1987 Посмотреть сообщение
Но как реализовать эти девяносто точек через while
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// Получить точки
/// </summary>
/// <returns></returns>
List<Point> GetRndPoints()
{
    var rnd     = new Random();
    var ch      = 90;
    var points  = new List<Point>();
 
    while (ch > 0)
    {
        var x = rnd.Next(-150, 150);
        var y = rnd.Next(-150, 150);
 
        points.Add(new Point(x, y));
 
        ch--;
    }
 
    return points;
}
Добавлено через 3 минуты
Цитата Сообщение от Galadriel1987 Посмотреть сообщение
Использовать массивы нельзя
Это как? List лист это же не массив)?
0
Модератор
9126 / 6409 / 1785
Регистрация: 21.04.2018
Сообщений: 19,068
Записей в блоге: 2
02.10.2018, 14:27 3
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Это как? List лист это же не массив)?
Один из видов массивов. Но в целом задание непонятно, возможно искажено.
Возможно идёт речь о том чтобы искать по одной точке в каждой четверти без хранения всего массива точек.
Что- то в таком духе (если четверти брать от +X+Y против часовой стрелки, граница относится к четверти против часовой, (0, 0) - относится к первой четверти)
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
int X, Y, X1, Y1, X2, Y2, X3, Y3, X4, Y4; // Переменные для хранения координат текущей точки и искомой в каждой четверти
double Quad1 = Dist (150, 150); // Начальные максимальные дистанции для каждой четверти
double Quad2 = Quad1 ;
double Quad3 = Quad1 ;
double Quad4 = Quad1 ;
 
Random rnd     = new Random();
 
For (int ch = 1; ch <= 90; ch ++)
    {
        int X = rnd.Next(-150, 151);
        int Y = rnd.Next(-150, 151);
        double D = Dist(X, Y);
 
        if ((Y >= 0 && X > 0) || (Y == 0 && X == 0))
        {
             Console.WriteLine($"{ch} точка ({X}, {Y}). Первая четверть. Расстояние {D}");
              if (D < Quad1 ) 
                   {
                          Quad1 = D;
                          X1 = X;
                          Y1 = Y;
                    }
         }
         if ((Y > 0 && X <= 0))
        {
             Console.WriteLine($"{ch} точка ({X}, {Y}). Вторая четверть. Расстояние {D}");
              if (D < Quad2 ) 
                   {
                          Quad2 = D;
                          X2 = X;
                          Y2 = Y;
                    }
         }
         if ((Y <= 0 && X < 0))
        {
             Console.WriteLine($"{ch} точка ({X}, {Y}). Третья четверть. Расстояние {D}");
              if (D < Quad3 ) 
                   {
                          Quad3 = D;
                          X3 = X;
                          Y3 = Y;
                    }
         }
         if ((Y < 0 && X >= 0))
        {
             Console.WriteLine($"{ch} точка ({X}, {Y}). Четвёртая четверть. Расстояние {D}");
              if (D < Quad4 ) 
                   {
                          Quad4 = D;
                          X4 = X;
                          Y4 = Y;
                    }
         }
        Console.WriteLine("\nНа минимальном расстоянии находятся точки:);
        Console.WriteLine($"В первой четверти:  точка ({X1}, {Y1}) - расстояние {Quad1}");
        Console.WriteLine($"Во второй четверти:  точка ({X2}, {Y2}) - расстояние {Quad2}");
        Console.WriteLine($"В третьей четверти:  точка ({X3}, {Y3}) - расстояние {Quad3}");
        Console.WriteLine($"В четвёртой четверти:  точка ({X4}, {Y4}) - расстояние {Quad4}");
      
    }
Используемый метод
C#
1
2
static double Dist (int X, int Y)
        => Math.Sqrt(X*X, Y*Y);
Писал здесь - возможны мелки ошибки
0
Модератор
881 / 790 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
02.10.2018, 14:46 4
Вот так, как вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var rnd = new Random();
var ch = 90;
var minD1 = 150f;
var minD2 = 150f;
var minD3 = 150f;
var minD4 = 150f;
 
while (ch > 0)
{
    var x = rnd.Next(-150, 150);
    var y = rnd.Next(-150, 150);
 
    var td = (float)Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
 
    if      (x <= 0 && y >= 0 ) { minD1 = minD1 > td ? td : minD1; }
    else if (x > 0  && y >= 0)  { minD2 = minD2 > td ? td : minD2; }
    else if (x <= 0 && y < 0)   { minD3 = minD3 > td ? td : minD3; }
    else if (x > 0  && y < 0)   { minD4 = minD4 > td ? td : minD4; }
 
    ch--;
}
 
Console.WriteLine("1ч = {0}\n2ч = {1}\n3ч = {2}\n4ч = {3}", minD1, minD2, minD3, minD4);
Только это минимальные расстояния) ну не суть.
0
Модератор
9126 / 6409 / 1785
Регистрация: 21.04.2018
Сообщений: 19,068
Записей в блоге: 2
02.10.2018, 14:56 5
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Вот так, как вариант:
Обратите внимание вот в такой реализации var x = rnd.Next(-150, 150); 150 - никогда не выйдет. Что бы 150 выходило надо var x = rnd.Next(-150, 151);
1
Модератор
881 / 790 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
02.10.2018, 15:08 6
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Обратите внимание вот в такой реализации var x = rnd.Next(-150, 150); 150 - никогда не выйдет. Что бы 150 выходило надо var x = rnd.Next(-150, 151);
Давайте попробуем подправить:
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
var rnd     = new Random();
var ch      = 90;
var minD1   = 150f;
var minD2   = 150f;
var minD3   = 150f;
var minD4   = 150f;
 
Point? p1 = null;
Point? p2 = null;
Point? p3 = null;
Point? p4 = null;
 
while (ch > 0)
{
    var x = rnd.Next(-150, 151);
    var y = rnd.Next(-150, 151);
 
    var td = (float)Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
 
    if      (x <= 0 && y >= 0 && minD1 > td)    { minD1 = td; p1 = new Point(x, y); }
    else if (x > 0  && y >= 0 && minD1 > td)    { minD2 = td; p2 = new Point(x, y); }
    else if (x <= 0 && y < 0 && minD1 > td)     { minD3 = td; p3 = new Point(x, y); }
    else if (x > 0  && y < 0 && minD1 > td)     { minD4 = td; p4 = new Point(x, y); }
 
    ch--;
}
 
Console.WriteLine("1ч = {0}\n2ч = {1}\n3ч = {2}\n4ч = {3}",
    p1 == null ? "Нет" : p1.ToString(),
    p2 == null ? "Нет" : p2.ToString(),
    p3 == null ? "Нет" : p3.ToString(),
    p4 == null ? "Нет" : p4.ToString());
0
Модератор
9126 / 6409 / 1785
Регистрация: 21.04.2018
Сообщений: 19,068
Записей в блоге: 2
02.10.2018, 15:14 7
Цитата Сообщение от Sanya_sa Посмотреть сообщение
Давайте попробуем подправить:
Я не для этого писал. В этом случае, это не настолько важно. А так для себя на будущее чтобы учли. В некоторых случаях, это имеет принципиальное значение.
0
Модератор
881 / 790 / 326
Регистрация: 03.02.2015
Сообщений: 5,104
Записей в блоге: 9
02.10.2018, 15:15 8
Элд Хасп, Благодарю)!
0
2 / 2 / 1
Регистрация: 23.03.2013
Сообщений: 60
04.10.2018, 20:56  [ТС] 9
Элд Хасп, Спасибо, мне ваш код подошел. Дело в том, что у нас в универе сначала изучают Простые операторы (WriteLine, ReadLine, Math); затем - составные и сложные операторы (while, for, return - этой темой я сейчас "заморочилась"). Потом будем изучать массивы, поэтому мне нужен был код без массивов, так как мы их еще не проходили. Еще: мне сказали, что программу надо написать через while, но я умею обращаться только с for (и то плохо). Спасибо за код еще раз, только в нем ошибки.
Основная проблема в методе Math.Sqrt(X*X, Y*Y) - у него не может быть два аргумента, либо X*X, либо Y*Y.
Также почему-то X и Y не распознаются программой в этом фрагменте с for:

C#
1
2
3
4
5
6
{
                int X = rnd.Next(-150, 150);
                int Y = rnd.Next(-150, 150);
                D = Distance (X, Y);
                if ((Y>=0 && X>0)||(Y ==0 && X ==0))
                {
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Points // Поинт - это точки
{
    class Program
    {
        static double Distance(int X, int Y)
        {
        => (Math.Sqrt(X*X))+(Math.Sqrt(Y*Y));
    }
 
        static void Main(string[] args)
        {
            int X, Y, X1, Y1, X2, Y2, X3, Y3, X4, Y4;
            double Quad1, Quad2, Quad3, Quad4, D;
            Quad1 = Distance(-150, 150); //Внести метод!
            Quad2 = Quad1; Quad3 = Quad1; Quad4 = Quad1;
            Random rnd = new Random();
            
            // static double Distance (int X, int Y);
            // Math.Sqrt (X*X, Y*Y);
            for (int ch = 1; ch <= 0; ch++)
            {
                int X = rnd.Next(-150, 150);
                int Y = rnd.Next(-150, 150);
                D = Distance (X, Y);
                if ((Y>=0 && X>0)||(Y ==0 && X ==0))
                {
                    Console.WriteLine("Точка №={0} координаты={1} {2} Первая четверть. Расстояние D = {3}", ch, X, Y, D);
                    if (D<Quad1)
                    {
                        Quad1 = D;
                        X1 = X;
                        Y1 = Y;
                    }
                }
                if ((Y>0 && X<=0))
                {
                    Console.WriteLine("Точка №={0} координаты={1} {2} Первая четверть. Расстояние D = {3}", ch, X, Y, D);
                    if (D<Quad2)
                    {
                        Quad2=D;
                        X2=X;
                        Y2=Y;
                    }
                }
                if ((Y<=0 && X<0))
                {
                    Console.WriteLine ("Точка №={0} координаты={1} {2} Первая четверть. Расстояние D = {3}", ch, X, Y, D);
                    if (D<Quad3)
                    {
                    Quad3=D;
                        X3=X;
                        Y3=Y;
                    }
                }
                if ((Y<0 && X>=0))
                {
                    Console.WriteLine ("Точка №={0} координаты={1} {2} Первая четверть. Расстояние D = {3}", ch, X, Y, D);
                    if (D<Quad4)
                    {
                        Quad4=D;
                        X4=X;
                        Y4=Y;
                    }
                }
                Console.WriteLine("На минимальном расстоянии находятся точки:={0} ={1}", X, Y);
                Console.WriteLine ("В первой четверти точка -={0} ={1} Расстояние={2}", X1, Y1, Quad1);
                Console.WriteLine ("Во второй четверти точка -={0} ={1} Расстояние ={2}", X2, Y2, Quad2);
                Console.WriteLine ("В третьей четверти точка -={0}, ={1} Расстояние ={2}", X3,Y3, Quad3);
                Console.WriteLine ("В четвертой четверти точка -={0}, ={1} Расстояние ={2}",X4, Y4, Quad4);
            }
 
             
        }
    }
}
0
Миниатюры
Точки, находящиеся на минимальном расстоянии от начала координат  
Модератор
9126 / 6409 / 1785
Регистрация: 21.04.2018
Сообщений: 19,068
Записей в блоге: 2
04.10.2018, 22:19 10
Цитата Сообщение от Galadriel1987 Посмотреть сообщение
Основная проблема в методе Math.Sqrt(X*X, Y*Y) -
Писал здесь, без проверки. Конечно, должно быть так Math.Sqrt(X*X+Y*Y)
0
5595 / 2110 / 618
Регистрация: 11.04.2015
Сообщений: 3,559
Записей в блоге: 41
04.10.2018, 22:34 11
Цитата Сообщение от Galadriel1987 Посмотреть сообщение
C#
1
2
3
4
static double Distance(int X, int Y) 
{
 => (Math.Sqrt(X*X))+(Math.Sqrt(Y*Y)); 
}
Здесь как минимум синтаксическая ошибка, но даже если это не принимать во внимание, то что делает этот метод? Считает расстояние между точками? Но, как минимум точек должно быть две и каждая задается двумя координатами. То есть параметров должно быть по меньшей мере четыре. Да и формула эта откуда взялась? Видимо как-то так надо
C#
1
2
3
4
        public static double Distance(double x1, double y1, double x2, double y2)
        {
            return Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
        }
Цитата Сообщение от Galadriel1987 Посмотреть сообщение
Также почему-то X и Y не распознаются программой в этом фрагменте с for:
Возможно проблема в том, что они повторно объявлены. Но точно не скажу, весь код не проверял.

Добавлено через 53 секунды
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Конечно, должно быть так Math.Sqrt(X*X+Y*Y)
Это тоже вряд ли ))

Добавлено через 7 минут
Хотя, если определяется расстояние до центра, то да, формула такая
0
Модератор
9126 / 6409 / 1785
Регистрация: 21.04.2018
Сообщений: 19,068
Записей в блоге: 2
04.10.2018, 22:46 12
Цитата Сообщение от Galadriel1987 Посмотреть сообщение
акже почему-то X и Y не распознаются программой в этом фрагменте с for:
Загнал в VS - убрал мелкие ошибки Заменил for на while
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
        #region Точки, находящиеся на минимальном расстоянии от начала координат
 
        static void Galadriel1987()
        {
            int X = 0, Y = 0, X1 = 0, Y1 = 0, X2 = 0, Y2 = 0, X3 = 0, Y3 = 0, X4 = 0, Y4 = 0; // Переменные для хранения координат текущей точки и искомой в каждой четверти
            double Quad1 = Dist(150, 150); // Начальные максимальные дистанции для каждой четверти
            double Quad2 = Quad1;
            double Quad3 = Quad1;
            double Quad4 = Quad1;
 
            Random rnd = new Random();
 
            int ch = 0;
            while (ch < 90)
            {
                ch++;
                X = rnd.Next(-150, 151);
                Y = rnd.Next(-150, 151);
                double D = Dist(X, Y);
 
                if ((Y >= 0 && X > 0) || (Y == 0 && X == 0))
                {
                    Console.Write($"{ch} точка ({X}, {Y}). Первая четверть. Расстояние {D}.");
                    if (D <= Quad1)
                    {
                        Quad1 = D;
                        X1 = X;
                        Y1 = Y;
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(" Это минимальное растояние");
                        Console.ForegroundColor = ConsoleColor.White;
                    }
                    else Console.WriteLine(" Это растояние больше минимального");
                }
                if ((Y > 0 && X <= 0))
                {
                    Console.Write($"{ch} точка ({X}, {Y}). Вторая четверть. Расстояние {D}.");
                    if (D <= Quad2)
                    {
                        Quad2 = D;
                        X2 = X;
                        Y2 = Y;
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(" Это минимальное растояние");
                        Console.ForegroundColor = ConsoleColor.White;
                    }
                    else Console.WriteLine(" Это растояние больше минимального");
                }
                if ((Y <= 0 && X < 0))
                {
                    Console.Write($"{ch} точка ({X}, {Y}). Третья четверть. Расстояние {D}.");
                    if (D <= Quad3)
                    {
                        Quad3 = D;
                        X3 = X;
                        Y3 = Y;
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(" Это минимальное растояние");
                        Console.ForegroundColor = ConsoleColor.White;
                    }
                    else Console.WriteLine(" Это растояние больше минимального");
                }
                if ((Y < 0 && X >= 0))
                {
                    Console.Write($"{ch} точка ({X}, {Y}). Четвёртая четверть. Расстояние {D}.");
                    if (D <= Quad4)
                    {
                        Quad4 = D;
                        X4 = X;
                        Y4 = Y;
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(" Это минимальное растояние");
                        Console.ForegroundColor = ConsoleColor.White;
                    }
                    else Console.WriteLine(" Это растояние больше минимального");
                }
 
            }
            Console.WriteLine("\nНа минимальном расстоянии находятся точки:");
 
 
            Console.WriteLine($"В первой четверти:  точка ({X1}, {Y1}) - расстояние {Quad1}");
            Console.WriteLine($"Во второй четверти:  точка ({X2}, {Y2}) - расстояние {Quad2}");
            Console.WriteLine($"В третьей четверти:  точка ({X3}, {Y3}) - расстояние {Quad3}");
            Console.WriteLine($"В четвёртой четверти:  точка ({X4}, {Y4}) - расстояние {Quad4}");
        }
 
 
 
        static double Dist(int X, int Y)
            => Math.Sqrt(X * X + Y * Y);
        #endregion
Добавлено через 5 минут
Цитата Сообщение от diadiavova Посмотреть сообщение
Да и формула эта откуда взялась? Видимо как-то так надо
C#
1
2
3
4
        public static double Distance(double x1, double y1, double x2, double y2)
        {
            return Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
        }
Нет. Надо определять расстояние от точки до центра координат - для этого (X, Y) . В каждой четверти отдельно - поэтому ещё по X, Y для каждой четверти.
0
diadiavova
04.10.2018, 22:48
  #13

Не по теме:

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Надо определять расстояние от точки до центра координат
Да я понял уже. Написал же выше
Цитата Сообщение от diadiavova Посмотреть сообщение
Хотя, если определяется расстояние до центра, то да, формула такая

0
Модератор
9126 / 6409 / 1785
Регистрация: 21.04.2018
Сообщений: 19,068
Записей в блоге: 2
04.10.2018, 23:13 14
Цитата Сообщение от diadiavova Посмотреть сообщение
Да я понял уже. Написал же выше
Не заметил - или во время не обновил окно.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2018, 23:13

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Найти точки, находящиеся на расстоянии от прямой
Как это решать? На прямой x = 2 + 2t, y = t найти точки, находящиеся на расстоянии 5 от прямой x...

Программа для вычисления координат точки максимально отдаленной от начала координат
Программа для вычисления координат точки максимально отдаленной от начала координат. Вроде все так,...

Вычислить сумму координат и найти расстояние от точки до начала координат
Даны координаты точки в пространстве (x,y,z). Описать их с помощью записи. Составить программу...

Подпрограммы. Для точки на плоскости найти расстояние от точки до начала координат
Для точки на плоскости с заданными координатами (x,y) найти расстояние l от точки до начала...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.