Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Алгоритмы и теория программирования


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Гаряка Асмик
Статус: Бакалавр
Рейтинг: 2206
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 1775
∙ повысить рейтинг »
_Ayl_
Статус: Студент
Рейтинг: 1606
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Алгоритмы и теория программирования

Номер выпуска:109
Дата выхода:19.02.2010, 19:30
Администратор рассылки:Гаряка Асмик, Бакалавр
Подписчиков / экспертов:742 / 204
Вопросов / ответов:1 / 2

Вопрос № 176691: Здравствуйте! Вопрос в следующем: есть два диапозона времени суток, нужно найти промежуток когда оба диапозона протекают параллельно. Например, - первый диапозон с 18:00 до 09:00 (длительность 15 часов) - второй диапозон с...



Вопрос № 176691:

Здравствуйте! Вопрос в следующем: есть два диапозона времени суток, нужно найти промежуток когда оба диапозона протекают параллельно.
Например, - первый диапозон с 18:00 до 09:00 (длительность 15 часов)
- второй диапозон с 22:00 до 10:00 (длительность 12 часов)
Параллельно протекает 11 часов, с 22:00 до 09:00
....Начало диапозонов происходит в одни сутки и длительность по условию не более суток.

Вопрос в реализации алгоритма в виде функции с 4 входными агргументами.., помогите пожалуйста...давно не могу сдлеать.

Отправлен: 14.02.2010, 23:18
Вопрос задал: Дадаев Заур Мусаевич, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает vladisslav, 5-й класс :
Здравствуйте, Дадаев Заур Мусаевич.
Нужно от наименьшего конца интервала отнять наибольшее начало интервала и скорректировать с учетом перехода на следующие сутки.
Проще перевести все в число минут от начала первых суток.
Во вложении примерное решение на C:
Проверка:
Код:
$
make t1
cc t1.c -o t1
$ ./t1
11:00

Приложение:

Ответ отправил: vladisslav, 5-й класс
Ответ отправлен: 14.02.2010, 20:11
Номер ответа: 259463

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 259463 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает Megaloman, Бакалавр :
    Здравствуйте, Дадаев Заур Мусаевич. Идея решения:
    Если бы речь шла об интервалах на числовой оси, всё было бы легче:
    - начало совместного интервала найдём как максимум начал интервалов
    - конец совместного интервала найдём как минимум концов интервалов
    Если при этом значение конца больше значения начала, совместный интервал существует.

    Поэтому Вашу задачу сведём к численному интервалу.
    Начало исходных интервалов отсчитывается от нуля - так как находятся по условию в одних календарных сутках.
    Конец исходного интервала анализируем. По условию, интервал не длинее суток (то есть не длинее 24 часов)
    Если конец интервала по значению меньше начала, значит он принадлежит другим суткам - добавим к такому значению 24 часа
    После такого преобразования задача о нахождении общего временнОго интервала решается как и с числовой осью.
    Единственное, в ответе надо в значении для конца совместного интервала исключить при необходимости добавленные искусственн о 24 часа.
    Вот всё, что касается метода решения задачи.
    Код, естественно, будет зависеть от конкретного языка программирования.

    Для примера я написал функцию нв VBA, она возвращает значение True, если общий интервал существует.
    В аргументы я поместил в трёх массивах начала и концы исходных интервалов и вычисленного интервала, а также массив длин исходных и совместного интервала. Исходные данные и результаты представлены в виде строковых переменных. Преобразования делаю со временем, представленным в виде десятичной дроби, где сотые - это минуты.
    Таким образом, достигнуты все цели, поставленные в Вашем вопросе.
    Я бы обошелся и тремя аргументами - добавочным элементом массивов сделал бы длины интервалов, а отдельный массив длин не использовал бы.
    Код отлажен как макрос в Excel
    Код:
    Sub ttt()
    Dim Int1(1), Int2(1), Int3(1), Dlina(2)
    Int1(0) = "10:36" ' Начало первого интервала
    Int1(1) = "05:28" ' Конец первого интервала

    Int2(0) = "16:45" ' Начало второго интервала
    Int2(1) = "08:57" ' Конец второго интервала

    Rezult = Interval(Int1, Int2, Int3, Dlina)

    ' Вывод исходных данных и результатов
    Mess = "Интервал_1= " + Int1(0) + " " + Int1(1) + " Длина= " + Dlina(0) + vbCrLf + "Интервал_2= " + Int2(0) + " " + Int2(1) + " Длина= " + Dlina(1) + vbCrLf + vbCrLf
    If Rezult Then
    Mess = Mess + "Общий_отрезок= " + Int3(0) + " " + Int3(1) + vbCrLf + "Длина = " + Dlina(2)
    Else
    Mess = Mess + "Общего отрезка нет"
    End If
    MsgBox Mess
    End Sub
    Function Interval(I1, I2, I3, D)
    ' На входе:
    ' I1 - массив с началом и концом первого временнОго интервала (в символьном виде ЧЧ:ММ)
    ' I2 - массив с началом и концом второго временнОго интервала (в символьном виде ЧЧ:ММ)
    ' Функция возвращает:
    ' True, если временнЫе интервалы имеют перекрывающуюся область
    ' I3 - массив начала и конца совместного временнОго интервала (в символьном виде ЧЧ:ММ)
    ' D - длины исходных и совместного интервалов (в символьном виде ЧЧ:ММ)

    ' Преобразуем строковое представление времени в десятичные переменые
    b1 = Val(Replace(I1(0), ":", "."))
    e1 = Val(Replace(I1(1), ":", "."))
    b2 = Val(Replace(I2(0), ":", "."))
    e2 = Val(Replace(I2(1), ":", "."))

    ' Находим нижнюю границу общего временного диапазона как максимум нижней границы двух диапазонов
    ' Начало диапазонов начинается в одних календарн ых сутках
    b3 = b1
    If b2 > b1 Then b3 = b2
    ' Находим верхнюю границу общего временного диапазона
    If e1 < b1 Then e1 = e1 + 24 ' Если конец интервала в других сутках, добавляю 24 (часа)
    If e2 < b2 Then e2 = e2 + 24 ' Если конец интервала в других сутках, добавляю 24 (часа)
    ' Находим верхнюю границу общего временного диапазона как минимум вкрхних границ двух диапазоноа
    e3 = e1
    If e2 < e1 Then e3 = e2

    Interval = (e3 >= b3) ' =true, если имеет место наличие общего интервала (конец интервала > его начала)

    I3(0) = StringTime(b3) ' Преобразуем значения к строковому типу
    I3(1) = IIf(e3 >= 24, StringTime(e3 - 24), StringTime(e3))

    ' Рассчитаем длины интервалов и представим их в символьном виде
    D(0) = String Int(b1, e1)
    D(1) = StringInt(b2, e2)

    D(2) = "00:00" ' Посчитаем длину совместного интервала
    If Interval Then D(2) = StringInt(b3, e3)

    End Function

    Function StringTime(nn)
    ' Преобразует время nn, записанное в виде десятичной дроби, в строку ss вида "ЧЧ:ММ"

    j = Int(nn)
    StringTime = IIf(j < 10, "0" + CStr(j), CStr(j)) + ":"
    j = Round((nn - j) * 100, 0)
    StringTime = StringTime + IIf(j < 10, "0" + CStr(j), CStr(j))
    End Function

    Function StringInt(n1, n2)
    ' Возвращает длину временнОго интервала в виде десятичной дроби, время начала и конца которого записано в виде десятичной дроби

    i = n2 - n1
    If n2 - Int(n2) < n1 - Int(n1) Then i = i - 0.4
    StringInt = StringTime(i)
    End Function

    Готовый пример в xls-файле здесь Interval.xls (30.0 кб).

    -----
    Нет времени на медленные танцы

    Ответ отправил: Megaloman, Бакалавр
    Ответ отправлен: 16.02.2010, 23:37
    Номер ответа: 259498

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 259498 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.02.2010

    В избранное