6 / 6 / 2
Регистрация: 31.03.2013
Сообщений: 120
1

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

28.11.2014, 12:47. Показов 4347. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Затупил совсем с задачей.
Вот условие:
Кликните здесь для просмотра всего текста
Файл 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 ничего такого не нашёл.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2014, 12:47
Ответы с готовыми решениями:

Вывести значение длины отрезков и набор из точек, образующих разбиение отрезка
Дано целое число N (&gt; 2) и две вещественные точки на числовой оси: A, B (A &lt; B). Отрезок разбит на...

длины отрезков
Даны длины отрезков a,b,c,d,e. Выяснить, можно ли построить треугольники со сторонами {a,b,c},...

Вывести лестницу из отрезков определённой длины
14. Вывести лестницу из отрезков определённой длины. Длина (например, 14) и количество ступенек...

Даны длины отрезков a, b, c, d, e. Выяснить, можно ли построить треугольники
Даны длины отрезков a,b,c,d,e. Выяснить, можно ли построить треугольники со сторонами {a,b,c},...

5
813 / 421 / 169
Регистрация: 08.02.2013
Сообщений: 711
28.11.2014, 14:43 2
Лучший ответ Сообщение было отмечено Agrik как решение

Решение

Agrik, похоже, что Segment это класс отрезков унифицированных своей длиной. BinarySearch сам не вставляет, вернет или положительный индекс найденного элемента, или отрицательный в противном случае, Вы сами должны написать код обработки на его основе. Примерный код класса Segment
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
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);
    }
}
И метод добавления
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void AddSegment(List<Segment> List, double Length)
{
    Segment s = new Segment(Length);
 
    // Пробуем найти
    int idx = List.BinarySearch(s, s);
 
    if (idx < 0)
    {
        // Если не нашли то вставляем
        idx = -idx - 1;
        List.Insert(idx, s);
    }
    else
    {
        // Если нашли то получаем существующий элемент
        s = List[idx];
    }
 
    // Увеличиваем число отрезков данного типа
    s.Count++;
}
Добавлено через 2 минуты
вот так использовать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var list = new List<Segment>();
 
AddSegment(list, 3);
AddSegment(list, 3);
AddSegment(list, 2);
AddSegment(list, 5);
AddSegment(list, 4);
        
Console.WriteLine("Сортированно по убыванию длин");
foreach (var s in list) Console.WriteLine(s);
 
list.Sort();
 
Console.WriteLine("Сортированно по убыванию числа отрезков");
foreach (var s in list) Console.WriteLine(s);
1
6 / 6 / 2
Регистрация: 31.03.2013
Сообщений: 120
28.11.2014, 15:22  [ТС] 3
rRczZZ, вот мой класс Segment
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
 
namespace Task2
{
    class Segment
    {
        double x1, x2, y1, y2;
        protected string[] segment;
 
        public Segment()
        { }
 
        public Segment(string line)
        {
            segment = Regex.Replace(line, " ", "").Split('(', ')', ';');
            string[] tempsegment = {"","","",""};
            int j=0;
            foreach(var s in segment) 
            {
                if (s != "")
                {
                    tempsegment[j] = s;
                    j++;                
                }
            }
            x1 = Double.Parse(tempsegment[0]);
            y1 = Double.Parse(tempsegment[1]);
            x2 = Double.Parse(tempsegment[2]);
            y2 = Double.Parse(tempsegment[3]);
            Console.WriteLine("x1={0} y1={1} x2={2} y2={3}", x1, y1, x2, y2);
        }
 
        public double CalculationSegmentLength()
        { 
            return (Math.Round((Math.Sqrt(Math.Pow((x1-x2),2)+Math.Pow((y1-y2),2))),MidpointRounding.AwayFromZero));
        }
       
    }
}

а вот Мэйн, только недоделанный
Кликните здесь для просмотра всего текста
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.RegularExpressions;
 
namespace Task2
{
    class Program
    {
        static void Main(string[] args)
        {
          
            string[] spl={};
            string ab="";
            Segment s = new Segment();
            string[] lines = File.ReadAllLines(@"e:\in.txt");
            foreach (var l in lines)
            {
                s = new Segment(l);
                ab = Regex.Replace(l, " ", "");              
                spl = ab.Split('(', ')', ';');
            
            
            }
            Console.ReadKey();
        }
    }
}

т.е. у меня уже реализовано чтение с файла и прочая фигня вплоть до нахождения длины... или я не разобрался в коде или Вы сразу вносите длину отрезка и количество таких отрезков, а надо только длину вносить, а количество уже высчитывается само, в зависимости от того был ли раньше отрезок с такой длиной или нет.. вот с этим напряг(
0
813 / 421 / 169
Регистрация: 08.02.2013
Сообщений: 711
28.11.2014, 15:27 4
Agrik, да в этом и разница. У вас Segment есть "конкретный отрезок", а у меня это "класс отрезков некой длины", судя по заданию Segment должен быть именно таким.
0
6 / 6 / 2
Регистрация: 31.03.2013
Сообщений: 120
28.11.2014, 20:43  [ТС] 5
rRczZZ, у меня ж это класс... в который я с текстового файла по одной вкидываю строки с координатами, а внутри он разбивает строки по координатам и находит длину... т.е. с него я получаю длину... осталось мне допедрить, как эту длину помещать в List и там уже сортировать и находить отрезки одинаковой длины, увеличивая им счётчик... при этом не должна сбиваться сортировка... думал ещё вместо листа hashtable заюзать, но с этим геморойнее..

Добавлено через 4 часа 25 минут
rRczZZ, сделал я в итоге.. основную идею у Вас взял... хотя я так себе это и представлял только затупил с реализаций.. ещё раз спасибо
0
0 / 0 / 1
Регистрация: 29.10.2016
Сообщений: 19
02.12.2016, 13:21 6
Agrik, был бы рад помощи как решил, не считает счетчик, не могу добиться правды.
0
02.12.2016, 13:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2016, 13:21
Помогаю со студенческими работами здесь

Ввести количество отрезков и их длины; найти, сколько треугольников можно составить из этих отрезков
надо написать такую программу: пользователь вводит количество отрезков и их длины, и надо найти...

Два отрезка заданы координатами их концов. Вычислить и сравнить эти длины отрезков
Два отрезка заданы координатами их концов: A1(7,5;8);B1(2,3;5) A2(-1,2;4);B2(4,2;8) ...

На отрезке длины A размещены максимально возможное количество отрезков длины B
Даны положительные числа A и B (A&gt;B). На отрезке длины A размещены максимально возможное количество...

Есть ли у кого похожий алгоритм: распределения отрезков разной длины внутри отрезков фиксированной длины?
Народ помогите мне с программой распределения отрезков разной длины внутри отрезков фиксированной...


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

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

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