Форум программистов, компьютерный форум, киберфорум
Наши страницы

координаты - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ При введении больше 20 чисел программа выдает странный результат http://www.cyberforum.ru/cpp-beginners/thread940755.html
#include <iostream> #include <locale> using namespace std; double t1, t2; int main() { setlocale(LC_ALL, "RUS");
C++ Ошибка выноса структуры в отдельный файл Доброго времени суток. Имеется такая проблема: у меня часто используется структура координат в разных файлах, потому я ее решил вынести в отдельный файл и подключать. Вынес ее в заголовочный файл... http://www.cyberforum.ru/cpp-beginners/thread940751.html
C++ прогрмма по С++ю Рфазобратьсь что значит каждое действие
Создайте класс Time(время суток) считая что представлением времени суток является число секунд прошедших от полуночи( классе одной свойство) Напишите конструктор устанавливающий время по часам...
C++ Массивы (найти ошибку в коде)
При компилировании программы (это не полный код) пишет что b-должно быть константное выражение #include <iostream> #include <locale> #include <ctime> using namespace std; void k_1(int a);...
C++ Правильный вывод функции http://www.cyberforum.ru/cpp-beginners/thread940710.html
Всем привет! Я только недавно начал учить C++ Вот программа: #include <cstdio> #include <cstdlib> #include <iostream> #include <math.h> #include <string> using namespace std; //переменные
C++ Вывести на экран таблицу значений Необходимо вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) для х, изменяющегося от а до b с шагом h=(b-a)/n. Близость значений S(x) и Y(x) во всем диапазоне значений х... подробнее

Показать сообщение отдельно
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
21.08.2013, 10:16
Даже задание неправильное. Что за сущность такая, которая является координатой да еще и с названием города?! Жуть. Наследование тут откровенно неуместно. Тут уместна композиция -- у сущности "Город" есть свойство "Координаты" и "имя".

Вот так лучше сделать:
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
#include <cmath>
#include <iostream>
#include <iomanip>
#include <string>
 
/**
 * Функция возвращает знак переданного значения.
 * 
 * @param value передаваемое значение
 * @return -1, если число отрицательное, 1, если положительное
 *         0 если переданное число 0.
 */
template <typename T>
int sign(T value) {
    return (T(0) < value) - (value < T(0));
}
 
/**
 * Класс для хранения одной координаты.
 * Координата задается через конструкторы DMS или градусами.
 */
class Coordinate {
 public:
  Coordinate() : value(0) {}
  Coordinate(double value) : value(value) {}
  Coordinate(int degree, unsigned int minutes, double seconds)
    : value(sign(degree) * (std::abs(degree) +
    (minutes * 60. + seconds) / 3600.)) {}
  /**
   * Возвращает значение в градусах.
   * 
   * @return значение координаты в градусах
   */
  double getDegreesValue() const {
    return value;
  }
  double getSign() const {
    return sign(value);
  }
  int getDegree() const {
    return std::abs(int(value));
  }
  unsigned int getMinutes() const {
    return std::abs(int((value - int(value)) * 60));
  }
  double getSeconds() const {
    double minutes = std::abs((value - int(value)) * 60);
    return std::abs((minutes - int(minutes)) * 60);
  }
 private:
  double value;
};
 
/**
 * Для удобства вывода перегружен оператор вывода одной координаты в поток.
 */
std::ostream &operator<<(std::ostream &stream, const Coordinate &coordinate) {
  return stream <<
    coordinate.getDegree() << "," <<
    coordinate.getMinutes() << "'" <<
    std::fixed << std::setprecision(4) <<
    coordinate.getSeconds() << "\"";
}
 
/**
 * Класс для хранения геодезических координат.
 * Содержит широту и долготу. Координаты задаются через конструктор.
 */
class Coordinates {
 public:
  Coordinates() {}
  Coordinates(const Coordinate &latitude, const Coordinate &longitude)
    : latitude(latitude), longitude(longitude) {}
  const Coordinate &getLatitude() const {
    return latitude;
  }
  const Coordinate &getLongitude() const {
    return longitude;
  }
 private:
  Coordinate latitude, longitude;
};
 
/**
 * Для удобства вывода перегружен оператор вывода координат в поток.
 */
std::ostream &operator<<(std::ostream &stream, const Coordinates &coordinates) {
  return stream << "Coordinates{" <<
    "latitude=" << 
    ((coordinates.getLatitude().getSign() == 1) ? "N" : "S") <<
    coordinates.getLatitude() << 
    ", longitude=" << 
    ((coordinates.getLongitude().getSign() == 1) ? "E" : "W") <<
    coordinates.getLongitude() <<
    "}";
}
 
/**
 * Класс, содержащий данные о городе.
 * Хранит название города и его координаты.
 * Название и координаты задаются через конструктор.
 */
class City {
 public:
  City(const std::string &name, const Coordinates &coordinates)
    : name(name), coordinates(coordinates) {}
  const std::string &getName() const { return name; }
  const Coordinates &getCoordinates() const { return coordinates; }
 private:
  std::string name;
  Coordinates coordinates;
};
 
/**
 * Для удобства вывода перегружен оператор вывода города в поток.
 */
std::ostream &operator<<(std::ostream &stream, const City &city) {
  return stream << "City{" <<
    "name=\"" << city.getName() << "\", " <<
    "coordinates=" << city.getCoordinates() <<
    "}";
}
 
/**
 * Функция, сравнивающая два города по их координатам. "Меньший" город
 * находится севернее.
 * 
 * @param a первый город для сравнения
 * @param b второй город для сравнения
 * @return -1 если город a "меньше" города b, 1 если город a "больше"
 *         города b и 0, если города "равны".
 */
int cityComparator(const City &a, const City &b) {
  double x = a.getCoordinates().getLatitude().getDegreesValue();
  double y = b.getCoordinates().getLatitude().getDegreesValue();
  return (x < y) ? -1 : (x > y) ? 1 : 0;
}
 
/**
 * Функция, сортирующая список городов с использованием внешней функции
 * для сравнения городов.
 * 
 * @param first указатель на первый город списка
 * @param last указатель на последний город списка
 * @param comparator функция для сравнивания городов
 */
void sort(City *first, City *last, 
  int (*comparator)(const City&, const City&)) {
  for (City *i = first; i != last - 1; ++i) {
    for (City *j = i + 1; j != last; ++j) {
      if (comparator(*i, *j) < 0) {
        std::swap(*i, *j);
      }
    }
  }
}
 
int main(int, char**) {
  // начальный список городов
  City cities[] = {
    City("Moscow", Coordinates(Coordinate(55, 45, 7),
      Coordinate(37, 36, 56))),
    City("Minsk", Coordinates(Coordinate(53, 55, 0),
      Coordinate(27, 33, 00))),
    City("Riga", Coordinates(Coordinate(56, 56, 51),
      Coordinate(24, 06, 25))),
    City("Kyev", Coordinates(Coordinate(50, 27, 1.8),
      Coordinate(30, 31, 22.8)))
  };
  // вычисляемое количество городов в списке
  int numberOfCities = sizeof(cities) / sizeof(cities[0]);
  // сортировка городов с помощью функции
  sort(cities, cities + numberOfCities, cityComparator);
  // вывод списка городов на экран
  for (int i = 0; i < numberOfCities; ++i) {
    std::cout << cities[i] << std::endl;
  }
  
  return 0;
}
Заметьте, нет ни одной функции, длиннее четырех строчек. Кроме main, конечно, там пять.
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru