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

Программа на алгоритмы и контейнеры! - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 19:47     Программа на алгоритмы и контейнеры! #1
Друзья, задали написать программу на алгоритмы и контейнеры. Смотрю на условие задачки и даже не знаю за что схватиться. Подскажите идею, алгоритм, хоть что-то. Чертовски буду благодарна!

Корабли присылают в каждый момент времени данные о своей скорости и направлении и свои координаты. Необходимо предупредить пользователя, если данные не согласованы (т.е. если изменение координат не соответствует скорости и направлению движения корабля). Землю считать плоской.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2011, 19:47     Программа на алгоритмы и контейнеры!
Посмотрите здесь:

C++ Контейнеры в Windows
Алгоритмы, инетаторы и контейнеры C++
C++ контейнеры
C++ Контейнеры
контейнеры С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.06.2011, 21:59     Программа на алгоритмы и контейнеры! #2
Предположим, на входе у нас контейнер-вектор, - "А", - с элементами-координатами всех кораблей и направлением движения + скорость движения.
Для каждого элемента контейнера "А" рассчитываем по имеющимся координатам, направлению и скорости и записываем в контейнер "Б".
При следующем получении контейнера "А", сравниваем координаты с рассчитанными в контейнер "Б" и если отличаются сильно, выводим предупреждение.
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 22:25  [ТС]     Программа на алгоритмы и контейнеры! #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Предположим, на входе у нас контейнер-вектор, - "А", - с элементами-координатами всех кораблей и направлением движения + скорость движения.
Для каждого элемента контейнера "А" рассчитываем по имеющимся координатам, направлению и скорости и записываем в контейнер "Б".
При следующем получении контейнера "А", сравниваем координаты с рассчитанными в контейнер "Б" и если отличаются сильно, выводим предупреждение.
Не поняла. У нас есть уравнение движения x=v*t + x0. Параметры v, x, x0 лежат в контейнере (t туда же положить?), что именно записывается в контейнер В? И что значит сильно отличаются?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
02.06.2011, 22:26     Программа на алгоритмы и контейнеры! #4
Цитата Сообщение от lemegeton Посмотреть сообщение
Предположим, на входе у нас контейнер-вектор,
А если корабли присылают свои данные "вразнобой", не строго по порядку, и если они не просто пронумерованы, а идентифицируются похитрее (например, по именам), то лучше даже не вектор, а карту (std::map)

Цитата Сообщение от lemegeton Посмотреть сообщение
Для каждого элемента контейнера "А"
Это у нас алгоритм std::for_each

Вообще, я бы обошёлся здесь без контейнера "Б", проще всё в "А" хранить, а вычисления производить непосредственно при получении новых данных.
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 22:35  [ТС]     Программа на алгоритмы и контейнеры! #5
Цитата Сообщение от Nick Alte Посмотреть сообщение
А если корабли присылают свои данные "вразнобой", не строго по порядку, и если они не просто пронумерованы, а идентифицируются похитрее (например, по именам), то лучше даже не вектор, а карту (std::map)


Это у нас алгоритм std::for_each

Вообще, я бы обошёлся здесь без контейнера "Б", проще всё в "А" хранить, а вычисления производить непосредственно при получении новых данных.
вот теперь я вообще запуталась
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
02.06.2011, 22:42     Программа на алгоритмы и контейнеры! #6
В общем, так... Создаём запись, описывающую один корабль. Там храним x, y, vx, vy, t - это если описываем корабли на плоской карте. Создаём вектор, хранящий такие записи. Когда корабль присылает очередную порцию данных (а в ней тот же состав данных), вычисляем сначала dt = t1 - t0, затем вычисляем предполагаемые координаты по старой порции данных (xp1 = x0 + dt*vx0, yp1 = y0 + dt*vy0). Вычисляем расстояние между точками (xp1, yp1) и (x1, y1), делим расстояние на dt, сравниваем с некоторым пороговым значением, которое задаём из общих соображений. Если выше порога, то данные не согласованы - координаты изменялись чересчур сильно.
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 22:47  [ТС]     Программа на алгоритмы и контейнеры! #7
Цитата Сообщение от Nick Alte Посмотреть сообщение
сравниваем с некоторым пороговым значением, которое задаём из общих соображений.
вот, на счет порогового значения: как его вычислить? и на сколько полученное значение должно быть больше?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
02.06.2011, 22:51     Программа на алгоритмы и контейнеры! #8
Цитата Сообщение от myaho Посмотреть сообщение
вот, на счет порогового значения: как его вычислить?
Просто задаёшь из общих соображений. Например, уславливаешься, что изменение больше, чем на 10 м/с для корабля подозрительно.

Цитата Сообщение от myaho Посмотреть сообщение
и на сколько полученное значение должно быть больше?
Просто больше. Хотя бы даже и на одну мильённую. Можешь даже два порога ввести, если хочешь усложнить: скажем, >2 м/с - подозрительно, >10 м/с заведомо неверно.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.06.2011, 23:12     Программа на алгоритмы и контейнеры! #9
Цитата Сообщение от myaho Посмотреть сообщение
в каждый момент времени
Это означает через равные, заданные промежутки?

Цитата Сообщение от myaho Посмотреть сообщение
данные о своей скорости и направлении и свои координаты
Пример данных в студию.
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 23:18  [ТС]     Программа на алгоритмы и контейнеры! #10
Да, промежутки равные. Например, 10 секунд, 20 секунд.

Пример данных: 10 м/c, х=10м, y=20м, направление положительное
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
02.06.2011, 23:31     Программа на алгоритмы и контейнеры! #11
Положительное направление!? Это как?!
-- В положительном направлении от нас находится Смольный Собор.
-- Булочная находится от вас в положительном направлении.
-- Знаете, пройдите 10м в положительном направлении, потом сверните на отритцательное.
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 23:50  [ТС]     Программа на алгоритмы и контейнеры! #12
К примеру: корабль был в точке А с координатой (2,3), а доплыл до точки В с координатой (-9,2).
А вот булочной в положительном направлении от меня нет=(
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
03.06.2011, 00:53     Программа на алгоритмы и контейнеры! #13
Оу-кей. Четыре вопроса на засыпку.
Корабль из А(0, 0) приплыл в Б(1, 1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(-1, 1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(1, -1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(-1, -1). В каком направлении он плыл?
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
03.06.2011, 09:36  [ТС]     Программа на алгоритмы и контейнеры! #14
Цитата Сообщение от lemegeton Посмотреть сообщение
Оу-кей. Четыре вопроса на засыпку.
Корабль из А(0, 0) приплыл в Б(1, 1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(-1, 1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(1, -1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(-1, -1). В каком направлении он плыл?
Поговорила с препододом. Он объяснил так и так:
1. Направление - это угол поворота вектора скорости. Т.е. если скорость 20метров в секунду, а направление 45 градусов, то каждую секунду координаты по оси X и Y должны увеличиваться на 14 с небольшим метров (10 sqrt(2) ).

2. Мы говорим о согласованности, если изменение координат соответствует скорости. Если была скорость 20 метров в секунду и угол поворота 0, а обе координаты уменьшились - ясно, что данные не согласованы.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,584
Записей в блоге: 17
03.06.2011, 16:07     Программа на алгоритмы и контейнеры! #15
Один контейнер для хранения всех элементов.
Второй для последних элементов для каждого корабля по которым будет проверятся на согласование новый добовляемый эл-т.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
03.06.2011, 20:13     Программа на алгоритмы и контейнеры! #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
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <iomanip>
#include <vector>
 
struct Coordinates {
  Coordinates() : x(0), y(0), timestamp(time(NULL)) {}
  Coordinates(float x_, float y_,
              time_t timestamp_)
    : x(x_), y(y_), timestamp(timestamp_) {}
  float x;
  float y;
  time_t timestamp;
};
 
float Distance(const Coordinates &a, const Coordinates &b) {
  return sqrt(pow(a.x - b.x, 2.) + pow(a.y - b.y, 2.));
}
 
bool Compare(const Coordinates &a, const Coordinates &b,
             float accuracy = 1.) {
  return Distance(a, b) < accuracy;
};
 
struct ShipData {
  Coordinates coordinates;
  float speed;      // в м/с
  float direction;  // в радианах
};
 
Coordinates Forecast(const Coordinates &point, const ShipData &ship) {
  float distance = (ship.coordinates.timestamp - point.timestamp) * ship.speed;
  Coordinates result(point.x + distance * cos(ship.direction),
                     point.y + distance * sin(ship.direction),
                     ship.coordinates.timestamp);
  return result;
}
 
bool Consistant(const Coordinates &point, const ShipData &ship,
                float accuracy = 1.) {
  return Compare(Forecast(point, ship), ship.coordinates, accuracy);
}
 
void GetData(std::vector<Coordinates> &points,
             std::vector<ShipData> &new_data) {
  // ну вот тут надо откуда-то заполнять массив new_data.
  for (size_t i = 0; i < points.size(); ++i) {
    new_data[i].coordinates = points[i];
    new_data[i].coordinates.timestamp = time(NULL);
    new_data[i].speed = 0;
    new_data[i].direction = 0;
    if (rand() % 3 == 0) {
      new_data[i].coordinates.x += rand() % 11 - 5;
      new_data[i].coordinates.y += rand() % 11 - 5;
    }
  }
}
 
int main(int argc, char *argv[]) {
  srand(time(NULL));
  size_t ship_count = 15;
  std::vector<Coordinates> points(ship_count);
  std::vector<ShipData> new_data(ship_count);
 
  
  for (size_t i = 0; i < 10; ++i) {
    for (size_t i = 3; i > 0; --i) {
      std::cout << "." << std::flush;
      sleep(1);
    }
    std::cout << std::endl;
 
    GetData(points, new_data);
 
    for (size_t i = 0; i < points.size(); ++i) {
      std::cout << "#" << i << ": ";
      if (Consistant(points[i], new_data[i], 0.1)) {
        std::cout << "OK";
      } else {
        std::cout << "inconsistant by "
                  << Distance(new_data[i].coordinates, points[i])
                  << " meter(s).";
      }
      std::cout << std::endl;
      points[i] = new_data[i].coordinates;
    }
  }
  return 0;
}
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
03.06.2011, 22:01  [ТС]     Программа на алгоритмы и контейнеры! #17
Ох, спасибо Вам огромнейшее. Я сейчас пытаюсь написать что-то аналогичное.

Добавлено через 21 минуту
Однако функция pow не нравится:

error C2666: 'pow' : 6 overloads have similar conversions
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,584
Записей в блоге: 17
03.06.2011, 22:11     Программа на алгоритмы и контейнеры! #18
А в какой строке? при каких значениях?
myaho
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
03.06.2011, 22:29  [ТС]     Программа на алгоритмы и контейнеры! #19
c fpow вроде не ругается

Добавлено через 11 минут
а зачем нам нужно останавливать работу на 1 секунду? sleep(1)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2011, 00:04     Программа на алгоритмы и контейнеры!
Еще ссылки по теме:

Ассоциативные контейнеры(алгоритмы)с++ C++
Контейнеры с++ C++
Контейнеры C++

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,584
Записей в блоге: 17
04.06.2011, 00:04     Программа на алгоритмы и контейнеры! #20
ага на 1 мс?
Yandex
Объявления
04.06.2011, 00:04     Программа на алгоритмы и контейнеры!
Ответ Создать тему
Опции темы

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