Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2011, 23:35   #1
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию Совпадение стрелок циферблата

Помогите, пожалуйста, решить задачу (на языке Си):
Надані цілі числа m, n(голини та хвилини), 0≤m≤11, 0≤n≤59, що визначають час доби. Визначити найменший час(число повних хвилин), які повинні пройти до того моменту, коли годинна ат хвилинна стрілки на циферблаті співпадуть.
Паркер вне форума Ответить с цитированием
Старый 30.09.2011, 02:26   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Украинский, да еще и с опечатками - это интересный экспириенс.. ))

Наконец-то эта задача получила полное условие (вот тут она оборвалась на полуслове)).

Паркер, давай выкладывай свои наработки или хотя бы соображения - поможем обязательно!
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 30.09.2011, 02:53   #3
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию Совпадение стрелок циферблата

Перевод на русский этой задачки(я не знала, что тут не все понимают украинский):
Даны целые числа m, n (часы и минуты), 0 ≤ m ≤ 11, 0 ≤ n ≤ 59, определяющие время суток. Определить наименьшее время (число полных минут), которые должны пройти до того момента, когда часовая и минутная стрелки на циферблате совпадут.
За ошибки в тексте прошу прощения!
А вот на счет 0 <m ≤ 12, 0 ≤ n <60 не знаю, было написано точно 0 ≤ m ≤ 11, 0 ≤ n ≤ 59.
Смысл задачи понимаю, но алгоритма догнать не могу)))
Паркер вне форума Ответить с цитированием
Старый 30.09.2011, 05:46   #4
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Спасибо за перевод - я-то и так понял, но другим это может быть важно.
Цитата:
Сообщение от Паркер Посмотреть сообщение
Смысл задачи понимаю, но алгоритма догнать не могу)))
А хочешь? в смысле - хочешь "догнать"? ))
Слушай, Паркер, большинство народу тут хочет готовый код, чтобы сдать его все забыть. Если ты не такая - мы могли бы помочь тебе сделать все самой. Ты ответь, а пока я тогда начну..

Задача про совпадение стрелок стара, как мир. Нарисуй себе циферблат (12-часовой, говорим только о нем) на листочке и отметь все положения стрелок, когда они совпадают. Их будет 11. Первое в 12:00. Как узнать следующее? Для этого нужно решить уравнение.

Пусть t - это время (от 12:00), в которое стрелки снова встретились. Минутная стрелка проходит полный круг за 1 час. Значит, за время t она пройдет угол (считая в полных оборотах), равный t/60 (время считаем в минутах). Часовая стрелка проходит полный круг за 12 часов, то есть 12*60=720 минут. Значит, за время t она пройдет угол t/720. Приравниваем эти два числа и получаем уравнение для t

t/60 = t/720
12*t= t
11*t = 0
t = 0

Мы получили ответ t=0. Это означает, что в самый начальный момент времени (в 12:00) стрелки совпадают. Это правильно, но только это мы и так знали. Это совпадение будем называть нулевым, t(0)=0 (в скобках я пишу индекс). Как рассчитать другие совпадения?

Если ты последишь за часами с 12:00 до 1:00 (то есть в течение первого часа), ты увидишь, что стрелки ни разу не встретились. А встретятся они в начале второго часа, когда минутная, пройдя полный круг, догонит часовую. Это значит, что она пройдет на самом деле угол, больше полного круга. Но нас интересеут только часть этого пути ЗА полным кругом. Поэтому мы вычтем из полного угла один оборот:
t(1)/60 - 1
(напоминаю: в скобках я пишу индекс) И теперь, как и прежде, снова приравняем углы:
t(1)/60 - 1 = t(1)/720
И решим это уравнение:
12*t(1) - 720 = t(1)
11*t(1) = 720
t(1) = 720/11 = 65.454545454545454545454545454545.. . = 65.(45) = 60 + 5.(45)

То есть, стрелки встретятся через 1 час и 5 мин с секундами.

Чтобы найти второй момент встречи, можно либо решить уравнение:
t(2)/60 - 2 = t(2)/720
(потому что встреча происходит после двух полных оборотов минутной стрелки), либо просто заметить, что время между моментами встречи должно проходить одинаковое - в силу симметрии, ведь мы могли бы повернуть циферблат (без стрелок), чтобы первый момент встречи снова был на 12:00.

Таким образом, мы получаем следующую формулу:
t(i) = t(1) * i = 720/11 * i

Это - точные моменты встречи. Если мы подставим i=11 в эту формулу, то получим, что 11-ый момент встречи произойдет через 720 минут, что есть ровно 12 часов. То есть стрелки в 11-ый раз встретятся ровно через полсуток, снова на 12:00. Это вполне соответствует нашему опыту и служит проверкой на правильность.

Кул? ))

Теперь возвращаемся к условию задачи: нам дано текущее время T, нужно предсказать cколько пройдет до следующей встречи с точностью до минут. Для того, чтоб это сделать, надо сначала определить, сколько встреч уже произошло. Это можно сделать по формуле:
n = [T/t(1)]
- квадратные скабки означают целую часть.
Тут остается вопрос.. Как быть, если время T точно совпало с моментом какой-то встречи стрелок? Считать эту встречу "следующей" (то есть до нее 0 минут) - или считать, что она уже произошла, и следующая наступит через t(1)? Поскольку в условии это не уточнено, то предлагаю поступать вторым образом. Тогда вышеприведенную формулу не придется корректировать )).

Итак, мы знаем, что уже было n встреч. Значит, следующая встреча будет иметь номер n+1, и ее время можно рассчитать по той формуле как:
t(n+1) = 720/11*(n+1)
- тут первые скобки это индекс, а вторые - нет.

Ну вот, осталось только вычесть T из t(n+1) - и мы узнаем, сколько времени с момента T до следующей встречи. Это время будет в минутах, но только оно включает и дробную часть. Нас же спрашивают, сколько ПОЛНЫХ минут, так что нужно снова воспользоваться услугами целой части.

x = [720/11*(n+1) - T]
где
n = [T / (720/11)]

Или, полностью:

x = [720*([T/(720/11)]+1)/11 - T]

Понятно пока? Жду ответа.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 30.09.2011, 18:53   #5
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию

Конечно, хочу! в смысле - "догнать" ))
И, благодаря тебе(правильно поняла - "Предпочитаю на "ты"."?) уже догнала и все поняла! Это именно то, что было нужно , понять суть задачи!
Только там, еще надо было добавить несколько скобочек в формулах.

Так что, огромное тебе спасибо за разъяснение!!!
Паркер вне форума Ответить с цитированием
Старый 01.10.2011, 04:09   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Ты все правильно поняла )).
Anytime, anywhere .
Цитата:
Сообщение от Паркер Посмотреть сообщение
Только там, еще надо было добавить несколько скобочек в формулах.
Хм.. Где? Укажи поточнее, плз.

Так что - с программированием ты сама справишься, или тоже показать, как?
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 01.10.2011, 09:46   #7
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию

Нууууу, для правильности записи t(i) = t(1) * i = 720/11 * i нужно t(i) = t(1) * i = (720/11) * i и тд., там, конечно, понятно, что на что перемножается, но если написать так в какой-нибудь проге, то оно будет считать не так, как надо. Может не во всех, но в некоторых точно(прогах).
Паркер вне форума Ответить с цитированием
Старый 01.10.2011, 10:17   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Паркер Посмотреть сообщение
Нууууу, для правильности записи t(i) = t(1) * i = 720/11 * i нужно t(i) = t(1) * i = (720/11) * i и тд., там, конечно, понятно, что на что перемножается, но если написать так в какой-нибудь проге, то оно будет считать не так, как надо. Может не во всех, но в некоторых точно(прогах).
Боюсь, ты ошибаешься.. )
Но прежде всего - выше я писал не для программы, и даже не задумывался над такими вопросами.
Интересно как совпало - я как раз пару часов назад ответил человеку именно про это (про скобочки и т.п.) Почитай тот мой пост, ладно? чтоб мне не повторяться..
Вот та тема: http://programmersforum.ru/showthread.php?t=167142

Тут добавлю только, что в любом вопросе надо достигать полной ясности. То есть ставить (ну, например) скобочки "почему-то" - не надо. Если что-то делаешь, надо понять, почему. Вот, я сейчас, например, поставлю тут примерно с дюжину скобочек, и мне совершенно ясно, почему: потому что настроение хорошее ))))))))))))

Так как насчет программы? Сдюжишь сама или помочь? Мне кажется, что сдюжишь )). Но если будут вопросы - давай сюда!
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 01.10.2011 в 10:19.
TinMan вне форума Ответить с цитированием
Старый 02.10.2011, 01:59   #9
Паркер
Пользователь
 
Аватар для Паркер
 
Регистрация: 11.08.2011
Сообщений: 23
По умолчанию

Цитата:
Сдюжишь сама или помочь?
Наверно, лучше помочь, потому что прога, написанная мной, дает не правильный ответ.
(Я только начала изучать этот язык, поэтому очень часто возникают проблемы и вопросы, но у меня есть желание в них разобраться)
Паркер вне форума Ответить с цитированием
Старый 02.10.2011, 02:44   #10
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Очень хорошо.
Ты покажи тогда, что у тебя получилось, мы найдем ошибку вместе.
Или хотя бы только ввод начальных данных сделай и покажи. Остальное доделаем )).
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
коды стрелок Lapo4ka Общие вопросы C/C++ 9 16.04.2017 22:53
Проверка стрелок Ковалёв Александр Общие вопросы C/C++ 4 04.01.2011 09:01
Врашение стрелок ddeman666 Помощь студентам 3 16.05.2010 22:37
Коды стрелок (Delphi) VadEr Помощь студентам 6 13.06.2009 12:57
Borland C, перхват нажатий стрелок Arion Помощь студентам 3 30.04.2008 12:33