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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

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

Лучшие эксперты по данной тематике

Роман Селиверстов
Статус: Советник
Рейтинг: 4974
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2050
∙ повысить рейтинг »
Megaloman
Статус: Академик
Рейтинг: 1788
∙ повысить рейтинг »

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

Номер выпуска:175
Дата выхода:03.01.2014, 18:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:75 / 38
Вопросов / ответов:3 / 7

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


Консультация # 29444: Здравствуйте. Приведите, пожалуйста, словесный (общий) алгоритм построения бинарного дерева. Построения из набора чисел и если можно, то максимально подробно. Заранее спасибо. ..
Консультация # 36683: здравствуйте не скажете ли вы с помошью какой программы создаются игры для пк я не имею в ввиду крутые заранее спасибо ...

Консультация # 176691:

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

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

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


Консультирует vladisslav:

Здравствуйте, Дадаев Заур Мусаевич.
Нужно от наименьшего конца интервала отнять наибольшее начало интервала и скорректировать с учетом перехода на следующие сутки.
Проще перевести все в число минут от начала первых суток.
Во вложении примерное решение на C:
Проверка:

Код :
$ make t1
cc     t1.c   -o t1
$ ./t1
11:00

Приложение:

Консультировал: vladisslav
Дата отправки: 14.02.2010, 20:11
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует 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) = StringInt(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
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 29444:

Здравствуйте.
Приведите, пожалуйста, словесный (общий) алгоритм построения бинарного дерева. Построения из набора чисел и если можно, то максимально подробно.
Заранее спасибо.

Дата отправки: 13.11.2005, 00:36
Вопрос задал: Martin
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Schmak (Практикант):

Здравствуйте, Martin!
Бинарное дерево собственно строить и не надо, его можно задать массивом размерностью n, при этом учитывая, что элемент [i] может иметь:
1) 2-х сыновей [2*i] и [2*i+1]
2) 1-ого сына [2*i] (тогда размер массива [2*i])
3) не иметь сыновей (если [i]-лист)
Исходя из этого каждый элемент дерева [i] (кроме корня (элемент [1])) имеет одного предка [i div 2]

Если же Вы имеете ввиду сортирующее бинарное дерево (известное как Heap) то посетите страничку http://algolist.manual.ru/sort/pyramid_sort.php

Консультировал: Schmak (Практикант)
Дата отправки: 13.11.2005, 11:54
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Lector:

Здравствуйте, Martin!
1. Берём первое число. Это врешина. (15)
2. Берём второе число. (9). Оно меньше чем (15). Ставми его левым листом от 15
15
/
9
3. Берём третье число. (13). Оно меньше (15) и больше (13). Ставим его праым листом от (9)

15
/
9
\
13
4. Берём четвёртое число. (73). Оно больше (15). Ставим его правым листом от (15)
15
/ \
9 73
\
13
И так далее :-)

Консультировал: Lector
Дата отправки: 14.11.2005, 12:06
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 36683:

здравствуйте не скажете ли вы с помошью какой программы создаются игры для пк я не имею в ввиду крутые заранее спасибо

Дата отправки: 03.03.2006, 21:47
Вопрос задал: Simon simon simon
Всего ответов: 3
Страница онлайн-консультации »


Консультирует romodos:

Здравствуйте, Simon simon simon!
Ну вы и задали вопрос. Если вы его задаете, то вам уж точно не суждено создавать "крутые" игры. Игры, крутые и некрутые, создаются на языке программирования. Используется при этом труд не только программистов, но и художников, редакторов и т.д. Вас интересует какая стадия? Программирования.
Дык языков полно - C++, Delphi, Basic и т.д. Чаще всего, конечно, пишут на с++ (Microsoft Visual C++), используя технологии DirectX. Вроде бы есть еще такая прога DarkBasic, на ней тоже мона писать игры. В одиночку игру не создать. Насчет некрутых игр. Есть GameMaker - для создания 2D Игр. Всем известный Pacman мона на нем писать.

Консультировал: romodos
Дата отправки: 04.03.2006, 07:13
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Gluck3D:

Здравствуйте, Simon simon simon!

Для создания простых игр подойдут: The Games Factory
The PIE 3D Game Creation System
3D RAD
Milk Shape 3D
Game Maker
По моему самая лучшая программа для создания простых 2D и 3D Игр это Dark Basic.
Если вы хотите делать простые 2D игры то возможно вам подойдет Флэш.

Консультировал: Gluck3D
Дата отправки: 04.03.2006, 09:11
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует AlexanderZh:

Здравствуйте, Simon simon simon!
Копай в сторону DarkBasic и ему подобных (Blitz3D, GLScene, 3DGameStudio, Game Maker)

Консультировал: AlexanderZh
Дата отправки: 04.03.2006, 17:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное