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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
26.04.2013, 01:41     Создать класс angle, включающий указанные три поля - проверить правильность кода #1
Здравствуйте! Я изучаю С++ по учебнику Лафоре, столкнулся с задачей: "В морской навигации координаты точки измеряются в градусах, минутах широты и долготы. Например: 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2013, 01:41     Создать класс angle, включающий указанные три поля - проверить правильность кода
Посмотрите здесь:

Создать класс содержащий три поля и две функции C++
Создайте класс с именем Employee, включающий в качестве элементов данных три информационных пункта: имя, фамилию и месячную зарплату C++
Реализовать класс Triangle (задание 25), опираясь на класс Angle из задания 26 для представления углов C++
Создать класс Angle для работы с углами C++
C++ Написать программу, описывающую структуру, содержащую указанные поля и выполняющую над ней указанные действия
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GoldenId
 Аватар для GoldenId
45 / 43 / 2
Регистрация: 11.11.2010
Сообщений: 272
Завершенные тесты: 1
26.04.2013, 02:56     Создать класс angle, включающий указанные три поля - проверить правильность кода #2
Прежде всего... прежде, чем я успел вчитаться в задание, я понял, что даже если Вы решили задачу неправильно, Вы всё равно молодец. Не берусь судить других, но при такой постановке вопроса не лень и ответить на него. (...)

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

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

Добавлено через 50 минут
Еще в условии сказано
Цитата Сообщение от Koshachek Посмотреть сообщение
Один градус равен 60 минутам
Это тоже не учтено. И нет проверка правильности ввода.
Помогите разобраться с задачей (
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
12.05.2014, 19:45  [ТС]     Создать класс angle, включающий указанные три поля - проверить правильность кода #5
День добрый!
angle tchka(149, 34.8,'W');
Здесь же только широта/долгота? Не могу понять эту задачу.
Значит тут чего у нас...: N -север, S - юг, W - запад, E - восток. Исходя из этого имеем 149 градусов 34,8 ЗАПАДНОЙ долготы. Широта у нас от севера до юга, долгота от востока до запада. Если взять и вызвать метод в классе для добавления еще и широты(к этому объекту) то получим точку с двумя координатами: широтой и долготой. Что касается других условий я действительно это не учел, то ли забыл то ли еще что то, ну в общем то это не такая большая проблема дописать эти ограничения, поэтому если что то не будет получаться я помогу.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,686
13.05.2014, 07:04     Создать класс angle, включающий указанные три поля - проверить правильность кода #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();
}
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
13.05.2014, 12:14  [ТС]     Создать класс angle, включающий указанные три поля - проверить правильность кода #7
ну...он делает акцент на простоту, много форумов читал и большинство людей отзываются об этом учебнике довольно положительно. естественно кодером не станешь после его прочтения, но хоть какие то знания в области "плюсов" появятся. для старта вполне нормально считаю, особенно если "с нуля"
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,686
13.05.2014, 17:27     Создать класс angle, включающий указанные три поля - проверить правильность кода #8
Цитата Сообщение от Koshachek Посмотреть сообщение
большинство людей отзываются об этом учебнике довольно положительно.
Ну, может он в чем-то и силен, но явно не в придумывании ясных и самодокументируемых имен. Такое впечатление, что ему клавиатура дана, чтобы скрывать свои мысли.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,686
12.06.2014, 09:45     Создать класс angle, включающий указанные три поля - проверить правильность кода #9
Цитата Сообщение от Koshachek Посмотреть сообщение
ну...он делает акцент на простоту, много форумов читал и большинство людей отзываются об этом учебнике довольно положительно. естественно кодером не станешь после его прочтения, но хоть какие то знания в области "плюсов" появятся. для старта вполне нормально считаю, особенно если "с нуля"
Выбросьте его.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2014, 16:52     Создать класс angle, включающий указанные три поля - проверить правильность кода
Еще ссылки по теме:

C++ Определить класс с именем NOTE, содержащий указанные поля
C++ Определить класс с именем NOTE, содержащий указанные поля
C++ Создать производный класс Инженер, содержащий указанные данные

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

Или воспользуйтесь поиском по форуму:
Koshachek
3 / 3 / 1
Регистрация: 17.02.2012
Сообщений: 100
12.06.2014, 16:52  [ТС]     Создать класс angle, включающий указанные три поля - проверить правильность кода #10
Ну, наверное вы и правы. Сжечь его! На костер!��
Yandex
Объявления
12.06.2014, 16:52     Создать класс angle, включающий указанные три поля - проверить правильность кода
Ответ Создать тему
Опции темы

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