Для нахождения расстояния между двумя точками необходимо знать только формулу, а дальше все просто.
Советую Вам попробовать реализовать эту программу самостоятельно, а уж если что-то не получится, то взглянуть на код приведенный ниже.
Формулу по нахождению расстояния на плоскости выглядит вот так:
AB = √(xb — xa) 2 + (yb — ya) 2
формула нахождения расстояния на плоскости
Пример входных и выходных данных для проверки работоспособности программы:
Input: 1,1,2,1
Output: 1
#include #include #include using namespace std; int main(int argc, char* argv[]) < double x1,x2,y1,y2,distance; cout >x1; cout >y1; cout >x2; cout >y2; distance=sqrt(pow((x2-x1),2)+pow((y2-y1),2)); // формула для вычисления расстояния cout
Источник: best-exam.ru
Расстояние между двумя точками с заданными координатами
Расстояние между двумя точками на плоскости и в пространстве
Всем привет. Изучаю C#. Написал консольное приложение, для проверки расстояние между двумя точками на плоскости и в пространстве. Все работает, вроде багов не заметил, а те что были исправил. Прошу оценить, по возможности. Если что-то сделал не так, тыкните носом.
Сейчас это мне очень нужно)).
static void Main(string[] args) < char selection; Double x1, x2, y1, y2, z1, z2, distance; Console.WriteLine(«1. Расстояние между двумя точками на плоскости.»); Console.WriteLine(«2.
Расстояние между двумя точками в пространстве.»); Console.WriteLine(«Выберите нужный пункт (1 или 2):»); selection = Convert.ToChar(Console.ReadLine()); switch (selection) < case ‘1’: Console.Write(«Введите координаты x1: «); x1 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты x2: «); x2 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y1: «); y1 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y2: «); y2 = Convert.ToDouble(Console.ReadLine()); distance = Math.Sqrt(Math.Pow(x2 — x1, 2) + Math.Pow(y2 — y1, 2)); Console.WriteLine($»Расстояние между двумя точками на плоскости равно «); Console.ReadKey(); break; case ‘2’: Console.Write(«Введите координаты x1: «); x1 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты x2: «); x2 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y1: «); y1 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y2: «); y2 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты z1: «); z1 = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты z2: «); z2 = Convert.ToDouble(Console.ReadLine()); distance = Math.Sqrt(Math.Pow(x2 — x1, 2) + Math.Pow(y2 — y1, 2) + Math.Pow(z2 — z1, 2)); Console.WriteLine($»Расстояние между двумя точками в пространстве равно «); Console.ReadKey(); break; default: Console.WriteLine(«Вы ввели неверный символ»); Console.ReadKey(); break; > > >
> Есть готовый exe, но сюда никак не приложить. Если что, можно скачать тут.
Расстояние между точками по координатам.
Отслеживать
13.6k 12 12 золотых знаков 43 43 серебряных знака 72 72 бронзовых знака
задан 1 янв 2019 в 20:33
87 1 1 золотой знак 2 2 серебряных знака 10 10 бронзовых знаков
Не понятно, в чем конкретно у вас проблема?
1 янв 2019 в 21:08
1 янв 2019 в 21:19
1 янв 2019 в 21:22
tym32167 Здарова)). Я тебя узнал, а ты меня нет). Я сам по себе учу). У проги конкретные две задачи. А интересовала меня, как и написали выше: проверка/критика кода
1 янв 2019 в 21:59
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Когда вы пишете программу, пишете код, то требования к качеству кода, стилю и структуре могут различаться, в зависимости от многих факторов. Это как писать художественное произведение — если вы пишете короткий рассказ, то вам можно не беспокоиться о вселенной, где обитают персонажи, о мотивации каждого из них и прочих вещах. Если же вы пишете большой труд, то вам придется предусмотреть всё, законы вымышленного мира, события, которые в этом мире будут пересекаться, разные части вашего произведения будут тесто переплетены и общая сложность произведения увеличится.
Попробую пояснить это подробней. Если вы не планируете развивать приложение, то есть тот код, что вы прислали — это конечный вариант и у вас никогда не будет необходимости вносить в него изменения, то все в порядке, ваши несколько строчек кода вполне сгодятся. Такое бывает если вы решаете курсовую или просто тренировочную задачку.
Теперь давайте представим, что мы пишем часть огромной корпоративной системы (то есть один из самых замороченных вариантов), какие требования тут могут быть и что можно поменять?
Итак, первое, что бросается в глаза, вы в своем коде оперируете точками — двухмерной и трехмерной. В текущем варианте, что у вас есть, точка представлена 2 или 3 переменными — координатами. И каждый раз, когда вам нужно хранить точку, вы храните её в виде набора переменных. Для простого приложения это не имеет значения. Для корпоративного — это плохо, так как
- если в каких то других участках программы понадобится использовать точки, то там также придется оперировать 2 переменными, а не одной, что в 2 раза сложнее.
- вы, по большому счету, уже в самом задании оперируете термином «точка», то есть по заданию это целостный объект. Вы рассматриваете ввод точки юзером, расстояние между точками, но у вас в коде нет сущности «точка», что заставляет читателя вашего кода (а код чаще читают, чем пишут, потому читаемость кода очень важна) прилагать умственные усилия, чтобы увидеть ваши точки в коде, чтобы собрать в голове точку из ваши переменных.
Поэтому, первое, что я бы сделал, будь это корпоративным приложением, это выделил бы 2 сущности — 2д и 3д точки. Выглядеть это может вот так:
public class Point2D < public double X < get; >public double Y < get; >public Point2D(double x, double y) < X = x; Y = y; >> public class Point3D < public double X < get; >public double Y < get; >public double Z < get; >public Point3D(double x, double y, double z) < X = x; Y = y; Z = z; >>
Теперь, имея на руках точки, читаем задание дальше — нам надо иметь возможность находить расстояние между точками.
Вы это делаете прямо в вашей основной функции, но мы же пишем корпоративную систему — а это значит, что ваше приложение будет развиваться годами, то есть уж точно где-то когда-то, возможно уже другому программисту, понадобится точно такой же функционал — вычисление расстояния между точками. Поэтому, целесообразно написать функцию для этого. Но куда эту функцию деть? Я бы создал отдельный класс для работы с точками или с геометрическими примитивами, для простейших операций. Класс и сам метод я бы сделал статическими, так как вычисление расстояния между точками — это алгоритм, что навряд ли будет меняться в будущем, не зависимо от изменений в логике нашего приложения.
public static class GeomertyMath < public static double Distance(Point2D p1, Point2D p2) < return Math.Sqrt((p1.X — p2.X) * (p1.X — p2.X) + (p1.Y — p2.Y) * (p1.Y — p2.Y)); >public static double Distance(Point3D p1, Point3D p2) < return Math.Sqrt((p1.X — p2.X) * (p1.X — p2.X) + (p1.Y — p2.Y) * (p1.Y — p2.Y) + (p1.Z — p2.Z) * (p1.Z — p2.Z)); >>
Далее, вопрос — а как нам понять, что наши методы работают правильно? К тому же, программист, что будет работать над кодом после нас, может случайно или намеренно изменить наши формулы и привести программу в негодность. Как снизить риск подобного? Тут нам на помощь приходят автоматические тесты (ключевые слова для поиска в гугле — unit testing, юнит тестирование). Например, вот пара тестов с использованием фреймворка NUnit
[TestFixture] public class GeomertyMath_Tests < [Test] public void Distance2D_positive_test() < var p1 = new Point2D(10, 10); var p2 = new Point2D(13, 14); var expectedResult = 5; var actualResult = GeomertyMath.Distance(p1, p2); var eps = 0.000001; Assert.True(Math.Abs(expectedResult — actualResult) < eps); >[Test] public void Distance2D_zero_test() < var p1 = new Point2D(0, 0); var p2 = new Point2D(0, 0); var expectedResult = 0; var actualResult = GeomertyMath.Distance(p1, p2); var eps = 0.000001; Assert.True(Math.Abs(expectedResult — actualResult) < eps); >>
Итак, что мы имеем?
У нас есть точки и есть проверенный и протестированный метод для расчета расстояния. Далее, нам надо уметь эти точки считать от пользователя. То есть нам нужна функция для считывания точки (2д и 3д). По мере получения опыта в разработке, вы начнете понимать такие вещи, как ответсвенность кода за какие-то функции.
Вот, например, считывание точки с консоли — это функционал, который, по идее, никак не пересекается ни с логикой работы самой точки, ни с логикой расчетов расстояний, ни вообще с геометрическими операциями. То есть считвание точки с консоли — это абсолютно обособленный функционал, поэтому я сделаю для этого отдельный класс. В принципе, я в эот класс добавлю все взаимодействие с консолью, что нам необходимо.
public interface IReaderWriter < Point2D Read2DPoint(); Point3D Read3DPoint(); string ReadLine(); void WriteLine(string line); >public class ConsoleReaderWriter : IReaderWriter < public Point2D Read2DPoint() < Console.Write(«Введите координаты x: «); var x = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y: «); var y = Convert.ToDouble(Console.ReadLine()); return new Point2D(x, y); >public Point3D Read3DPoint() < Console.Write(«Введите координаты x: «); var x = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты y: «); var y = Convert.ToDouble(Console.ReadLine()); Console.Write(«Введите координаты z: «); var z = Convert.ToDouble(Console.ReadLine()); return new Point3D(x, y, z); >public void WriteLine(string line) < Console.WriteLine(line); >public string ReadLine() < return Console.ReadLine(); >>
Обратите внимание, что сам класс — не статический и реализует нами же написанный интерфейс. Это сделано специально, так как в будущем, если нам придется считывать точки не только с консоли, но и, например, из базы данных или веб сервиса или какого-либо другого источника данных, то будет легко написать несколько реализаций для интерфейса, где считывание с консоли будет только одним из вариантов. И тогда, мы сможем запускать наши сценарии, считывая при этом данные не только из консоли. Это нам также поможет при тестировании наших сценариев.
Итак, у нас есть считватель точек, что дальше? Дальше, у нас есть главный сценарий с выбором и 2 независимых сценария, в одном сценарии мы считываем 2д точки, в другом — 3д. Давайте это оформим в виде 3 функций. Не забываем, что эти сценарии — это отдельный функционал, который никак не связан с другими участками нашего кода, потому я его выделю в отдельный класс.
public class MainScenarios < private readonly IReaderWriter _readerWriter; public MainScenarios(IReaderWriter readerWriter) < _readerWriter = readerWriter; >public void Start() < _readerWriter.WriteLine(«1. Расстояние между двумя точками на плоскости.»); _readerWriter.WriteLine(«2.
Расстояние между двумя точками в пространстве.»); _readerWriter.WriteLine(«Выберите нужный пункт (1 или 2):»); var selection = Convert.ToChar(_readerWriter.ReadLine()); switch (selection) < case ‘1’: Read2DScenario(); break; case ‘2’: Read3DScenario(); break; default: _readerWriter.WriteLine(«Вы ввели неверный символ»); break; >> private void Read2DScenario() < _readerWriter.WriteLine(«Введите первую точку:»); var p1 = _readerWriter.Read2DPoint(); _readerWriter.WriteLine(«Введите вторую точку:»); var p2 = _readerWriter.Read2DPoint(); var distance = GeomertyMath.Distance(p1, p2); _readerWriter.WriteLine($»Расстояние между двумя точками на плоскости равно «); > private void Read3DScenario() < _readerWriter.WriteLine(«Введите первую точку:»); var p1 = _readerWriter.Read3DPoint(); _readerWriter.WriteLine(«Введите вторую точку:»); var p2 = _readerWriter.Read3DPoint(); var distance = GeomertyMath.Distance(p1, p2); _readerWriter.WriteLine($»Расстояние между двумя точками в пространстве равно «); > >
Обратите внимание, что сценарии не знают, откуда точно они считывают и куда пишут значения. Этому классу со сценариями был передан просто интерфейс. Как это использовать? Давайте уже напишем логику нашей точки входа:
class Program < static void Main(string[] args) < var readerWriter = new ConsoleReaderWriter(); var logic = new MainScenarios(readerWriter); logic.Start(); Console.ReadKey(); >>
Расстояние между двумя точками
В этой задаче требуется найти расстояние между двумя точками в декартовой системе координат.
Найти расстояние между двумя точками можно с помощью теоремы Пифагора.
Функция получает координаты двух точек a и b в виде словаря, где ключами являются x и y . Функция должна вернуть расстояние между этими точками, округленное до тысячных.
Примеры
get_distance(, ) ➞ 6.325 get_distance(, ) ➞ 1.414 get_distance(, ) ➞ 21.095
Примечание
- Расстояние — это кратчайшее расстояние между двумя точками a и b .
- Если вы не знаете, как его найти, воспользуйтесь интернетом.
Источник: codechick.io