Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/35: Рейтинг темы: голосов - 35, средняя оценка - 4.86
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
1

Создать класс angle, включающий указанные три поля - проверить правильность кода

26.04.2013, 01:41. Показов 6511. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Я изучаю С++ по учебнику Лафоре, столкнулся с задачей: "В морской навигации координаты точки измеряются в градусах, минутах широты и долготы. Например: 149 градусов 34.8 минут восточной долготы и 17 градусов 31.5 минут южной широты. Это записывается как . Один градус равен 60 минутам (устаревшая система также делила одну минуту на 60 секунд, но сейчас минуту делят на обычные десятичные доли). Долгота измеряется величиной от 0 до 180 градусов восточнее или западнее Гринвича. Широта принимает значения от 0 до 90 градусов севернее или южнее экватора. Создайте класс angle, включающий следующие три поля: типа int для числа градусов, типа float для числа минут и типа char для указания направления (N, S, Е или W). Объект этого класса может содержать значение как широты, так и долготы. Создайте метод, позволяющий ввести координату точки, направление, в котором она измеряется, и метод, выводящий на экран значение этой координаты, например 179°59.9 Е. Кроме того, напишите конструктор, принимающий три аргумента. Напишите функцию mainQ, которая сначала создает переменную с помощью трехаргументного конструктора и выводит ее значение на экран, а затем циклически запрашивает пользователя ввести значение координаты и отображает введенное значение на экране.".
Задачу я решил, работает, но немного сомневаюсь в правильности, проверьте пожалуйста - вот код:
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
#include <iostream>
#include <conio.h>
using namespace std;
class angle
{
    private:
        int grad; //градусы
        float min; //минуты
        char nprv; // направление
    public:
        angle(): grad(0), min(0), nprv(0)
        {}
        
        angle(int g, float m, char n): grad(g), min(m), nprv(n)
        {}
        
        void koord_tochki()
        {cin >> grad >> min >> nprv;}
        
        void show_koord()
        {cout << grad << ' ' << min << "'" << nprv;}    
};
int main()
{
    system("chcp 1251 > nul");  
    char yn = 'y';
    angle tchka(149, 34.8,'W');
    tchka.show_koord();
    do
    {
        cout << "\nВведите координаты точки: "; tchka.koord_tochki();
        cout << "Координаты равны: "; tchka.show_koord();
        cout << "\nПродолжать (y/n): ";
        cin >> yn;
    }while(yn != 'n');
    getch();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2013, 01:41
Ответы с готовыми решениями:

Создать неизменяемый класс Angle
Всем привет! Стоит такая задача: нужно создать неизменяемый класс Angle со следующими членами...

Создать класс содержащий три поля и две функции
Создать класс содержащий три поля,две функции.В основной программе создать три обьекта данного...

Создать класс Angle для работы с углами
Здравствуйте, Создать класс Angle для работы с углами на плоскости, задаваемыми величинами в...

Создать класс Angle для работы с углами на плоскости
реализовать в классе по 3 конструктора с разными вариантами инициализации и один деструктор....

9
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 876
Записей в блоге: 10
26.04.2013, 02:56 2
Прежде всего... прежде, чем я успел вчитаться в задание, я понял, что даже если Вы решили задачу неправильно, Вы всё равно молодец. Не берусь судить других, но при такой постановке вопроса не лень и ответить на него. (...)

Добавлено через 6 минут
Вы всё сделали достаточно чисто. Единственные две рекомендации:
кириллица в консоли устанавливается :
C++
1
    setlocale( LC_ALL, "rus" );
пауза до нажатия клавиши:
C++
1
    system( "pause" );
А по существу вашего задания, насколько я вижу, всё чисто

Добавлено через 1 минуту
А, да, перевод каретки с STLными потоками:
C++
1
cout << endl;
1
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
26.04.2013, 13:18  [ТС] 3
спасибо, ваши замечания учту, теперь спокоен
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 3
12.05.2014, 16:18 4
Цитата Сообщение от Koshachek Посмотреть сообщение
Объект этого класса может содержать значение как широты, так и долготы.
Цитата Сообщение от Koshachek Посмотреть сообщение
angle tchka(149, 34.8,'W');
Здесь же только широта/долгота? Не могу понять эту задачу.

Добавлено через 50 минут
Еще в условии сказано
Цитата Сообщение от Koshachek Посмотреть сообщение
Один градус равен 60 минутам
Это тоже не учтено. И нет проверка правильности ввода.
Помогите разобраться с задачей (
0
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
12.05.2014, 19:45  [ТС] 5
День добрый!
angle tchka(149, 34.8,'W');
Здесь же только широта/долгота? Не могу понять эту задачу.
Значит тут чего у нас...: N -север, S - юг, W - запад, E - восток. Исходя из этого имеем 149 градусов 34,8 ЗАПАДНОЙ долготы. Широта у нас от севера до юга, долгота от востока до запада. Если взять и вызвать метод в классе для добавления еще и широты(к этому объекту) то получим точку с двумя координатами: широтой и долготой. Что касается других условий я действительно это не учел, то ли забыл то ли еще что то, ну в общем то это не такая большая проблема дописать эти ограничения, поэтому если что то не будет получаться я помогу.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.05.2014, 07:04 6
Цитата Сообщение от Koshachek Посмотреть сообщение
изучаю С++ по учебнику Лафоре
Мда… И эти люди пишут книги и учат нас программировать…
Более дурацких и бессмысленных имен, чем предлагает этот Лафоре, трудно придумать.
Когда видишь тип angle, то как-то сразу догадываешься, что речь идет о географической координате, а когда char – сразу ясно, что это направление географической координаты.
А из имени функции mainQ сразу понятно какие действия она производит...
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/////////////////////////////////////////////////////////////////////////////////////////
//В морской навигации координаты точки измеряются в градусах, минутах широты и долготы. 
//Например: 149 градусов 34.8 минут восточной долготы и 17 градусов 31.5 минут южной широты. 
//Это записывается как . Один градус равен 60 минутам (устаревшая система также делила одну минуту 
//на 60 секунд, но сейчас минуту делят на обычные десятичные доли). Долгота измеряется величиной 
//от 0 до 180 градусов восточнее или западнее Гринвича. Широта принимает значения от 0 до 90 градусов 
//севернее или южнее экватора. 
//  Создайте класс angle, включающий следующие три поля: типа int 
//для числа градусов, типа float для числа минут и типа char для указания направления (N, S, Е или W). 
//Объект этого класса может содержать значение как широты, так и долготы. 
//  Создайте метод, позволяющий 
//ввести координату точки, направление, в котором она измеряется, 
//и метод, выводящий на экран значение 
//этой координаты, например 179°59.9 Е. 
//Кроме того, напишите конструктор, принимающий три аргумента. 
//
//  Напишите функцию mainQ, которая сначала создает переменную с помощью трехаргументного конструктора 
//и выводит ее значение на экран, а затем циклически запрашивает пользователя ввести значение координаты 
//и отображает введенное значение на экране.
/////////////////////////////////////////////////////////////////////////////////////////
#include <cctype>
#include <cmath>
#include <conio.h>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
typedef int             T_int_degree;
typedef double          T_real_minute;
/////////////////////////////////////////////////////////////////////////////////////////
enum    T_geo_direction
{
    N,
    S,
    E,
    W
};
/////////////////////////////////////////////////////////////////////////////////////////
class  T_geo_coord
{
    //-----------------------------------------------------------------------------------
    static const int    MINUTES_PER_DEGREE_ = 60;
    static const int    RIGHT_ANGLE_        = 90;
    static const int    DEGREE_PERIOD_      = 360;
    //-----------------------------------------------------------------------------------
    T_int_degree        int_degrees_;
    T_real_minute       real_minutes_;
    T_geo_direction     geo_direction_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    T_geo_coord
        (
            T_int_degree        degrees         =   0,
            T_real_minute       minutes         =   0,
            T_geo_direction     geo_direction   =   E
        )
        :
        int_degrees_    ( degrees       ),
        real_minutes_   ( minutes       ),
        geo_direction_  ( geo_direction )
    {
        normalize();
    }
    //-----------------------------------------------------------------------------------
    void  input()
    {
        print_prompt_and_input_val
            (
                "\n\n\nВведите географическую координату:\n\t"
                "градусы (целое значение)\t\t=\t",
                int_degrees_
            );
 
        print_prompt_and_input_val
            (
                "\tминуты (с плавающей точкой)\t\t=\t",
                real_minutes_
            );
 
        print_prompt_and_input_geo_direction( "\tгеографическое направление (N, S, E, W)\t=\t" );
 
        normalize();
    }
    //-----------------------------------------------------------------------------------
    T_str  str()    const
    {
        std::ostringstream  sout;
 
        sout    <<  int_degrees_
                <<  '°'
                <<  real_minutes_
                <<  ' ';
 
        switch( geo_direction_ )
        {
        case N:
            sout    <<  'N';
            break;
 
        case S:
            sout    <<  'S';
            break;
 
        case E:
            sout    <<  'E';
            break;
 
        case W:
            sout    <<  'W';
        }//switch
 
        return  sout.str();
    }
    //-----------------------------------------------------------------------------------
private:
    //-----------------------------------------------------------------------------------
    void  normalize()
    {
        T_real_minute   real_degrees    =   int_degrees_ + real_minutes_ / MINUTES_PER_DEGREE_;
 
        if( real_degrees < 0 )
        {
            real_degrees *= -1;
            change_geo_direction();
        }
 
        real_degrees    =   fmod    (
                                        real_degrees,
                                        DEGREE_PERIOD_
                                    );
 
        switch( geo_direction_ )
        {
        case N:
        case S:
            if( real_degrees >= RIGHT_ANGLE_ * 3 )
            {
                real_degrees = DEGREE_PERIOD_ - real_degrees;
                change_geo_direction();
            }
            else if( real_degrees >= RIGHT_ANGLE_ * 2 )
            {
                real_degrees = real_degrees - RIGHT_ANGLE_ * 2;
                change_geo_direction();
            }
            else if( real_degrees >= RIGHT_ANGLE_ )
            {
                real_degrees = RIGHT_ANGLE_ * 2 - real_degrees;
            }
            break;
        case E:
        case W:
            if( real_degrees >= RIGHT_ANGLE_ * 2 )
            {
                real_degrees = DEGREE_PERIOD_ - real_degrees;
                change_geo_direction();
            }
        }//switch
 
        T_real_minute   real_degrees_int_part;
        real_minutes_   =   modf( real_degrees, &real_degrees_int_part ) * MINUTES_PER_DEGREE_;
        int_degrees_    =   T_int_degree( real_degrees_int_part );
    }
    //-----------------------------------------------------------------------------------
    void  change_geo_direction()
    {
        switch( geo_direction_ )
        {
        case N:
            geo_direction_ = S;
            break;
 
        case S:
            geo_direction_ = N;
            break;
 
        case E:
            geo_direction_ = W;
            break;
 
        case W:
            geo_direction_ = E;
        }//switch
    }
    //-----------------------------------------------------------------------------------
    template<typename  T>
    void  print_prompt_and_input_val
        (
            const T_str&    prompt,
            T&              val
        )
    {
        std::cout   <<  prompt;
        std::cin    >>  val;
    }
    //-----------------------------------------------------------------------------------
    void  print_prompt_and_input_geo_direction( const T_str&  prompt )
    {
        char  geo_dir = 0;
 
        do
        {
            std::cout   <<  prompt;
 
            std::cin    >>  geo_dir;
            geo_dir     =   toupper( geo_dir );
        }
        while   (
                        geo_dir     !=  'N'
                    &&  geo_dir     !=  'S'
                    &&  geo_dir     !=  'E'
                    &&  geo_dir     !=  'W'
                );
 
        switch( geo_dir )
        {
        case 'N':
            geo_direction_ = N;
            break;
        case 'S':
            geo_direction_ = S;
            break;
        case 'E':
            geo_direction_ = E;
            break;
        case 'W':
            geo_direction_ = W;
        }//switch
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
void  demo_geo_coord()
{
    T_geo_coord     geo_coord
                        (
                            -1000000,
                            -1000000.5,
                            N
                        );
 
    std::cout   <<  geo_coord.str();
 
    for(;;)
    {
        geo_coord.input();
        std::cout   <<  geo_coord.str();
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
int  main()
{
    std::locale::global(std::locale(""));
    T_geo_coord     geo_coord;
    demo_geo_coord();
    getch();
}
1
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
13.05.2014, 12:14  [ТС] 7
ну...он делает акцент на простоту, много форумов читал и большинство людей отзываются об этом учебнике довольно положительно. естественно кодером не станешь после его прочтения, но хоть какие то знания в области "плюсов" появятся. для старта вполне нормально считаю, особенно если "с нуля"
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
13.05.2014, 17:27 8
Цитата Сообщение от Koshachek Посмотреть сообщение
большинство людей отзываются об этом учебнике довольно положительно.
Ну, может он в чем-то и силен, но явно не в придумывании ясных и самодокументируемых имен. Такое впечатление, что ему клавиатура дана, чтобы скрывать свои мысли.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.06.2014, 09:45 9
Цитата Сообщение от Koshachek Посмотреть сообщение
ну...он делает акцент на простоту, много форумов читал и большинство людей отзываются об этом учебнике довольно положительно. естественно кодером не станешь после его прочтения, но хоть какие то знания в области "плюсов" появятся. для старта вполне нормально считаю, особенно если "с нуля"
Выбросьте его.
1
7 / 7 / 5
Регистрация: 17.02.2012
Сообщений: 119
12.06.2014, 16:52  [ТС] 10
Ну, наверное вы и правы. Сжечь его! На костер!��
0
12.06.2014, 16:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2014, 16:52
Помогаю со студенческими работами здесь

Создать класс Angle для работы с углами на плоскости
Создать класс Angle для работы с углами на плоскости, которые задаются величиной в градусах и...

Создать класс Angle для работы с углами на плоскости
Задание: реализовать определение нового класса, для демонстрации работы с объектами класса...

Создать класс Angle для работы с углами на плоскости
Создать класс Angle для работы с углами на плоскости. Предусмотреть перевод из градусной меры в...

Создать параметризованный класс, содержащий три закрытых поля-массива (одномерный, двумерный и вложенный)
Здравствуйте. У меня возникли проблемы. Я работаю в C# MVS 2010 Вот задание: Разработать...

Создайте класс с именем Employee, включающий в качестве элементов данных три информационных пункта: имя, фамилию и месячную зарплату
Дело обстоит так: Прочитав и, как я думал, поняв 3ю главу книги &quot;Как программировать на с++&quot;...

Создать простой запрос для выборки сведений из БД, включающий следующие поля
Создать простой запрос для выборки сведений из БД, включающий следующие поля: Наименование...


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

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