Форум программистов, компьютерный форум CyberForum.ru

Определить наименьшее время, когда часовая и минутная стрелки будут перпендикулярны друг другу - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
nutius
0 / 0 / 0
Регистрация: 01.06.2011
Сообщений: 60
08.11.2012, 00:34     Определить наименьшее время, когда часовая и минутная стрелки будут перпендикулярны друг другу #1
Добрый вечер!

Подскажите, пожалуйста, алгоритм вот такой прожки:

Ввести целые числа m (0 ≤ m ≤ 12) и n (0 ≤ n ≤ 60), которые указывают количество часов и минут соответственно. Определить наименьшее время, которое должно пройти до момента, когда часовая и минутная стрелки будут перпендикулярны друг другу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2012, 00:34     Определить наименьшее время, когда часовая и минутная стрелки будут перпендикулярны друг другу
Посмотрите здесь:

Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелки совпадут C++
Определить время, через которое встретятся два тела, равноускоренно движущиеся навстречу друг другу C++
C++ Определить, какое наибольшее число подряд идущих элементов этой последовательности равны друг другу.
Определить наименьшее время (число полных минут), которые должны пройти до того момента, когда часовая и минутная стрелки на циферблате совпадут C++
Определить наименьшее время, которое должно пройти до того момента, когда часовая и минутная стрелка на циферблате совпадут C++
C++ Определить наименьшее время до совпадения стрелок
Определить наименьшее время до того как часовая и минутная стрелки совпадут C++
Определить наименьшее число полных минут до момента, когда часовая и минутная стрелка на циферблате совпадут C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
08.12.2012, 15:34     Определить наименьшее время, когда часовая и минутная стрелки будут перпендикулярны друг другу #2
Обнаружил у себя решение, которое забыл опубликовать. Исправляю свою оплошность.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <complex>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::complex<double>    T_hand;
/////////////////////////////////////////////////////////////////////////////////////////
const double    PI                                  =   acos(-1.0);
const int       HOURS_PER_REVOLUTION                =   12;
const double    HOUR_HAND_REVOLUTIONS_PER_HOUR      =   1.0 / HOURS_PER_REVOLUTION;
const double    MINUTE_HAND_REVOLUTIONS_PER_HOUR    =   1.0;
 
const double    MINUTE_HAND_RELATIVE_TO_HOUR_HAND_REVOLUTIONS_PER_HOUR  =       MINUTE_HAND_REVOLUTIONS_PER_HOUR
                                                                            -   HOUR_HAND_REVOLUTIONS_PER_HOUR;
 
const int       MINUTES_PER_HOUR                    =   60;
const double    RADIANS_PER_REVOLUTION              =   PI * 2;
const double    TARGET_ANGLE_IN_RADIANS             =   PI / 2;
/////////////////////////////////////////////////////////////////////////////////////////
double  get_time_in_hours_during_which_angle_between_hour_and_minute_hands_will_reach_value
    (
        double  cur_time_in_hours,
        double  target_angle_in_radians
    )
{
    double  minute_hand_angle_in_radians    =       fmod
                                                        (
                                                            cur_time_in_hours,
                                                            1.0
                                                        )
                                                *   RADIANS_PER_REVOLUTION;
 
    T_hand  minute_hand                     =   std::polar
                                                    (
                                                        1.0,
                                                        minute_hand_angle_in_radians
                                                    );
 
    double  hour_hand_angle_in_radians      =       cur_time_in_hours
                                                /   HOURS_PER_REVOLUTION
                                                *   RADIANS_PER_REVOLUTION;
 
    T_hand  hour_hand                       =   std::polar
                                                    (
                                                        1.0,
                                                        hour_hand_angle_in_radians
                                                    );
 
    double  cur_angle                       =   arg( minute_hand / hour_hand );
    double  angular_distance_in_radians     =   target_angle_in_radians - cur_angle;
 
    if  (
            abs( cur_angle ) > target_angle_in_radians
        )
    {
        angular_distance_in_radians -= target_angle_in_radians * 2;
 
        if( cur_angle > 0 )
        {
            angular_distance_in_radians += RADIANS_PER_REVOLUTION;
        }
    }
 
    return      angular_distance_in_radians
            /   RADIANS_PER_REVOLUTION
            /   MINUTE_HAND_RELATIVE_TO_HOUR_HAND_REVOLUTIONS_PER_HOUR;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    for(;;)
    {
        std::locale::global(std::locale(""));
        int     hours   =   0;
 
        std::cout   <<  "Введите время:"
                    <<  std::endl;
        do
        {
            std::cout   <<  '\t'
                        <<  "часы (0.."
                        <<  HOURS_PER_REVOLUTION - 1
                        <<  "):"
                        <<  '\t';
 
            std::cin    >>  hours;
        }while  (   
                        hours   <   0
                    ||  hours   >=   HOURS_PER_REVOLUTION
                );
 
        std::cout   <<  std::endl;
        int     minutes     =   0;
 
        do
        {
            std::cout   <<  '\t'
                        <<  "минуты (0.."
                        <<  MINUTES_PER_HOUR - 1
                        <<  "):"
                        <<  '\t';
 
            std::cin    >>  minutes;
        }while  (
                        minutes     <   0
                    ||  minutes     >=   MINUTES_PER_HOUR
                );
 
        double  cur_time_in_hours   =   hours + double(minutes) / MINUTES_PER_HOUR;
 
        double  res_time_in_hours   =   get_time_in_hours_during_which_angle_between_hour_and_minute_hands_will_reach_value
                                            (
                                                cur_time_in_hours,
                                                TARGET_ANGLE_IN_RADIANS
                                            );
 
        std::cout   <<  std::endl
                    <<  "Стрелки часов будут перпендикулярны друг другу через "
                    <<  res_time_in_hours
                    <<  " часов."
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }
}
Yandex
Объявления
08.12.2012, 15:34     Определить наименьшее время, когда часовая и минутная стрелки будут перпендикулярны друг другу
Ответ Создать тему
Опции темы

Текущее время: 03:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru