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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lastockka
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 11
#1

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

20.08.2013, 17:19. Просмотров 717. Ответов 2
Метки нет (Все метки)

Создайте класс который принимает координаты (долгота, широта). Создайте наследника этого класса который принимает название города. Осушествите сортировку котрая будет выводить координаты с севера на юг.

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

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);
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2013, 17:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос координаты (C++):

Даны координаты вершин треугольника и координаты некоторой точки внутри него - C++
Даны координаты вершин треугольника и координаты некоторой точки внутри него. Найти расстояние от данной точки до ближайшей стороны...

Заданы координаты трех вершин прямоугольника, необходимо определить координаты четвертой вершины - C++
Заданы координаты трех вершин прямоугольника. Необходимо определить координаты четвертой вершины. Можете найти? Добавлено через 1...

Даны координаты точек х1, у1, ... х15, у15. Если точка попадает на плоскость, ограниченную кругом x2 + y2 = R2 - вывести ее координаты - C++
Лабораторная работа 5. Одномерные массивы * * Для задач этого раздела необходимо составить графический алгоритм, провести...

Заданы координаты точки подвеса математического маятника A(xa, ya, za) и координаты одной из точек его наивысшего подъема B(xb, yb, zb). Найти координ - C++
помогите написать программу на с++ Добавлено через 37 секунд вот задача:Заданы координаты точки подвеса математического маятника...

Мировые координаты и координаты устройства - C++
Пишу программу с интерфейсом напоминающем Autocad. А точнее ту часть в которой происходит черчение. Т.е. хочу создать поле которое...

Вычислительная геометрия (Даны координаты центра, R окружности, координаты точки вне окруж-ти. Найти точку пересечения одной из касательных с окруж-ю) - C++
Даны координаты центра (xc,yc) и радиус R окружности, координаты точки (x,y) вне окружности. Найти точку пересечения одной из касательных с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 не используется для указания типа наследования =)
0
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
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, конечно, там пять.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.08.2013, 10:16
Привет! Вот еще темы с ответами:

площадь треугольника, если известны координаты его углов. Введите координаты углов - C++
Напишите программу, которая вычисляет площадь треугольника, если известны координаты его углов. Введите координаты углов (числа...

координаты - C++
Подскажите, пожалуйста, как реализовать: 1) поиск точек отрезков прямых линий на плоскости XY, которые имеют обе целочисленные...

Координаты в C++ - C++
В Pascal есть модуль Graph с помощью которого всё что мне нужно можно легко сделать. А именно заставить двигаться что-нибудь по...

координаты - C++
Подскажите как при помощи Си в консоле двигать элементы, например слово какое то вывести в центре?


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru