Поиск длины отрезка и количество таких отрезков - C#
Формулировка задачи:
Добрый день! Затупил совсем с задачей.
Вот условие:
Я не могу саму идею понять. Получается я создаю List и перед вводом нового значения бинарным поиском сравниваю его с имеющимися, если такого нету то он сам его вставляет в нужное место? А как тогда происходит изменение параметра num, если такое значение уже есть? И что такое IComparer<Segment>, а вернее Segment? Это от балды название или стандартное. В MSDN ничего такого не нашёл.
Файл 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);
Решение задачи: «Поиск длины отрезка и количество таких отрезков»
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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д