Поиск длины отрезка и количество таких отрезков - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день! Затупил совсем с задачей. Вот условие:
Файл in.txt cодержит корректные вещественные координаты отрезков на плоскости (по одному отрезку в строке) в формате: (x1;y1) (x2;y2) 1 Создать список вида (len; num) где len – длина отрезка, округлённая до целого значения, а num – количество отрезков длины len. 2) Отсортировать список по убыванию num. Пример файла in.txt: (0 ; 0) ( 2,5; 0) ( 0;1) ( 0; 2 ) (-3,0; 20,1e-1) (-2;2) Вывод: 1;2 3;1 Замечания к задаче 2 – Информационный класс, как обычно, описать в отдельном файле. Считывание файла данных и необходимые действия реализовать в методе Main() приложения. – Строку разобрать методом split( ) через регулярное выражение. Формат строки (неформально): \s*(\s*вещ.число\s*;\s*вещ.число\s*)\s*(\s*вещ.число\s*;\s*вещ.число\s*)\s* Вещественное число во входной строке правильное. Пары скобок и точка с запятой между числами гарантированно имеются. – Для поиска элемента в коллекции использовать метод BinarySearch( ) коллекции. – Для корректной работы BinarySearch() нужно, чтобы список всегда был отсортирован. Возвращаемое значение в случае неудачного поиска может быть использовано для получения индекса, куда нужно вставить новый элемент с сохранением упорядоченности массива. – BynarySearch() использует IComparable< >, а Sort() – IComparer<Segment>. Это позволяет в одном классе иметь два метода сравнения: один по длине отрезка (нужен для поиска BynarySearch()), а второй – по количеству (для сортировки перед выводом). – Длина отрезка = sqrt((x1– x2)2 + (y1–y2)2) – чтобы половинные значения округлялись к большему, нужно вызывать Math.Round(…,MidpointRounding.AwayFromZero);
Я не могу саму идею понять. Получается я создаю List и перед вводом нового значения бинарным поиском сравниваю его с имеющимися, если такого нету то он сам его вставляет в нужное место? А как тогда происходит изменение параметра num, если такое значение уже есть? И что такое IComparer<Segment>, а вернее Segment? Это от балды название или стандартное. В MSDN ничего такого не нашёл.

Решение задачи: «Поиск длины отрезка и количество таких отрезков»

textual
Листинг программы
class Segment : IComparer<Segment>, IComparable<Segment>
{
    public int Length; // Округленная длина
    public int Count;  // Число отрезков
 
    public Segment(double Length, int Count = 0)
    {
        this.Length = (int)Math.Round(Length);
        this.Count = Count;
    }
 
    public override string ToString()
    {
        return String.Format("Length: {0} Count: {1}", Length, Count);
    }
 
    // Предикат для сортировки по убыванию длин отрезков
    public int Compare(Segment x, Segment y)
    {
        return (y.Length.CompareTo(x.Length));
    }
 
    // Предикат для сортировки по убаванию числа одинаковых отрезков
    public int CompareTo(Segment other)
    {
        if (other == null) return 1;
        return other.Count.CompareTo(this.Count);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.3 из 5
Похожие ответы