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

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

Восстановить пароль Регистрация
 
lastockka
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 11
20.08.2013, 17:19     координаты #1
Создайте класс который принимает координаты (долгота, широта). Создайте наследника этого класса который принимает название города. Осушествите сортировку котрая будет выводить координаты с севера на юг.

помогите пожалуйста написать программу. Если можно было бы с объяснением что каждая строка значит.

P.S. есть написанная но я не уверена в правильсти

C++ (Qt)
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
#include <iostream>
#include <cstring>
 
using namespace std;
 
class Cor
{
 public:
 struct napr{int m,h; char c;}NS,EW;
 
 virtual void get()
 {
 cout << "Введите широту (N/S): "; cin >> NS.c;
 cout << "Введите градусы(0-180): "; cin >> NS.h;
 cout << "Введите минуты (0-59): "; cin >> NS.m;
 
 cout << "Введите широту (E/W): "; cin >> EW.c;
 cout << "Введите градусы(0-180): "; cin >> EW.h;
 cout << "Введите минуты (0-59): "; cin >> EW.m;
 }
 virtual void show()=0;
};
 
class Town : virtual public Cor
{
 private:
 string title;
 public:
 void get()
 {
 cout << "Введите название города: "; cin >> title;
 Cor::get();
 }
 void show()
 {
 cout << "Город: " << title;
 cout << "\n Координаты: " <<NS.h<<"градус(ов)"<<NS.m<<"минут(ы)"<<NS.c<<"\t"
 <<EW.h<<"градус(ов)"<<EW.m<<"минут(ы)"<<EW.c<<endl;
 }
};
 
void sortShow(Town *a,int n)
{
    for(int i=0;i<n;i++)
    {
        if(a[i].NS.c=='N'){a[i].NS.h*=-1;a[i].NS.m*=-1;}
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-1;j++)
        {
            if ((a[j].NS.h > a[j+1].NS.h)
            || ((a[j].NS.h == a[j+1].NS.h)&& ((a[j].NS.m > a[j+1].NS.m))))
            {
            Town mem = a[j];
            a[j] = a[j+1];
            a[j+1] = mem;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        if(a[i].NS.c=='N'){a[i].NS.h*=-1;a[i].NS.m*=-1;}
    }
    for(int i=0;i<n;i++) a[i].show();
}
 
int main()
{
 setlocale(0,"");
 int n=3;
 Cor *p;
 Town t[n];
 
 for(int i=0;i<n;i++)
 {
    p=&t[i];
    p->get();
 }
 sortShow(t,n);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 17:19     координаты
Посмотрите здесь:

C++ координаты
площадь треугольника, если известны координаты его углов. Введите координаты углов C++
C++ Даны координаты вершин треугольника и координаты некоторой точки внутри него
C++ Мировые координаты и координаты устройства
C++ координаты
Вычислительная геометрия (Даны координаты центра, R окружности, координаты точки вне окруж-ти. Найти точку пересечения одной из касательных с окруж-ю) C++
Даны координаты точек х1, у1, ... х15, у15. Если точка попадает на плоскость, ограниченную кругом x2 + y2 = R2 - вывести ее координаты C++
Заданы координаты точки подвеса математического маятника A(xa, ya, za) и координаты одной из точек его наивысшего подъема B(xb, yb, zb). Найти координ C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Lvaruky
8 / 8 / 0
Регистрация: 10.05.2013
Сообщений: 26
21.08.2013, 00:12     координаты #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
#include <iostream>
#include <string>   //Вы используете переменные типа string, а подключаете <cstring>
            //<cstring> - это заголовочный файл для, так называемых C-строк, т.е. char*
 
using namespace std;
 
class Cord {
public:
     virtual void scan() {
        cout << "Введите широту (N/S): "; cin >> NS.c;
        cout << "Введите градусы(0-180): "; cin >> NS.h;
        cout << "Введите минуты (0-59): "; cin >> NS.m;
 
        cout << "Введите широту (E/W): "; cin >> EW.c;
        cout << "Введите градусы(0-180): "; cin >> EW.h;
        cout << "Введите минуты (0-59): "; cin >> EW.m;
     }
     //Зачем здесь нужен был пустой метод show ?
    struct {
        int h,m;
        char c;
    } NS, EW;
};
class Town : public Cord {  //Никакого виртуального наследования не существует, virtual используется,
public:             //чтобы показать, что метод может быть переопределен в наследниках
    void scan() {
        cout << "Введите название города: "; cin >> title;
        Cord::scan();
    }
    void show() {
        cout    << "Город: " << title << "\nКоординаты:\t" 
                << NS.h << " градус(ов) " << NS.m << " минут(ы) " << NS.c << "\n\t\t"
                << EW.h << " градус(ов) " << EW.m << " минут(ы) " << EW.c << endl;
    }
private:
    string title;
};
 
void sortShow(Town *a,int n)
{
    for(int i=0;i<n;i++)
    {
        if(a[i].NS.c=='N'){a[i].NS.h*=-1;a[i].NS.m*=-1;}
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n-1;j++)
        {
            if ((a[j].NS.h > a[j+1].NS.h)
            || ((a[j].NS.h == a[j+1].NS.h)&& ((a[j].NS.m > a[j+1].NS.m))))
            {
            Town mem = a[j];
            a[j] = a[j+1];
            a[j+1] = mem;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        if(a[i].NS.c=='N'){a[i].NS.h*=-1;a[i].NS.m*=-1;}
    }
    for(int i=0;i<n;i++) a[i].show();
}
 
int main () {
    setlocale(LC_ALL,"Russian");
    const int size=3;
    Town list[size];
    for (int i = 0; i < size; i++) {
        list[i].scan();
    }
    sortShow(list,size);
    return 0;
}
Ваш алгоритм сортировки я не трогал.

Добавлено через 7 минут
Я погорячился немного, конечно, виртуальное наследование существует, но ключевое слово virtual не используется для указания типа наследования =)
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
21.08.2013, 10:16     координаты #3
Даже задание неправильное. Что за сущность такая, которая является координатой да еще и с названием города?! Жуть. Наследование тут откровенно неуместно. Тут уместна композиция -- у сущности "Город" есть свойство "Координаты" и "имя".

Вот так лучше сделать:
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, конечно, там пять.
Yandex
Объявления
21.08.2013, 10:16     координаты
Ответ Создать тему
Опции темы

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