Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
1

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

02.06.2011, 19:47. Показов 2255. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья, задали написать программу на алгоритмы и контейнеры. Смотрю на условие задачки и даже не знаю за что схватиться. Подскажите идею, алгоритм, хоть что-то. Чертовски буду благодарна!

Корабли присылают в каждый момент времени данные о своей скорости и направлении и свои координаты. Необходимо предупредить пользователя, если данные не согласованы (т.е. если изменение координат не соответствует скорости и направлению движения корабля). Землю считать плоской.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.06.2011, 19:47
Ответы с готовыми решениями:

Ассоциативные контейнеры(алгоритмы)с++
Создать vector<int>, считать в него список чисел из текстового файла. Выполнить, не используя...

Алгоритмы, инетаторы и контейнеры
Всем привет! Написал программу в которой необходимо ввести список студентов и для каждого из них...

Линейный Алгоритмы, программа на языке Паскаль ( СРОЧНО )
Длина задана в дюймах (1 дюйм = 2,54 см). Перевести ее в метрическую систему, то есть выразить в...

Реализовать алгоритмы построения прямой: простой пошаговый алгоритм и алгоритмы Брезенхема
1. Написать на языке PASCAL программу, реализующую алгоритмы построения прямой: простой пошаговый...

21
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
02.06.2011, 21:59 2
Предположим, на входе у нас контейнер-вектор, - "А", - с элементами-координатами всех кораблей и направлением движения + скорость движения.
Для каждого элемента контейнера "А" рассчитываем по имеющимся координатам, направлению и скорости и записываем в контейнер "Б".
При следующем получении контейнера "А", сравниваем координаты с рассчитанными в контейнер "Б" и если отличаются сильно, выводим предупреждение.
0
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 22:25  [ТС] 3
Цитата Сообщение от lemegeton Посмотреть сообщение
Предположим, на входе у нас контейнер-вектор, - "А", - с элементами-координатами всех кораблей и направлением движения + скорость движения.
Для каждого элемента контейнера "А" рассчитываем по имеющимся координатам, направлению и скорости и записываем в контейнер "Б".
При следующем получении контейнера "А", сравниваем координаты с рассчитанными в контейнер "Б" и если отличаются сильно, выводим предупреждение.
Не поняла. У нас есть уравнение движения x=v*t + x0. Параметры v, x, x0 лежат в контейнере (t туда же положить?), что именно записывается в контейнер В? И что значит сильно отличаются?
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
02.06.2011, 22:26 4
Цитата Сообщение от lemegeton Посмотреть сообщение
Предположим, на входе у нас контейнер-вектор,
А если корабли присылают свои данные "вразнобой", не строго по порядку, и если они не просто пронумерованы, а идентифицируются похитрее (например, по именам), то лучше даже не вектор, а карту (std::map)

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

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


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

Вообще, я бы обошёлся здесь без контейнера "Б", проще всё в "А" хранить, а вычисления производить непосредственно при получении новых данных.
вот теперь я вообще запуталась
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
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, сравниваем с некоторым пороговым значением, которое задаём из общих соображений. Если выше порога, то данные не согласованы - координаты изменялись чересчур сильно.
1
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 22:47  [ТС] 7
Цитата Сообщение от Nick Alte Посмотреть сообщение
сравниваем с некоторым пороговым значением, которое задаём из общих соображений.
вот, на счет порогового значения: как его вычислить? и на сколько полученное значение должно быть больше?
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
02.06.2011, 22:51 8
Цитата Сообщение от myaho Посмотреть сообщение
вот, на счет порогового значения: как его вычислить?
Просто задаёшь из общих соображений. Например, уславливаешься, что изменение больше, чем на 10 м/с для корабля подозрительно.

Цитата Сообщение от myaho Посмотреть сообщение
и на сколько полученное значение должно быть больше?
Просто больше. Хотя бы даже и на одну мильённую. Можешь даже два порога ввести, если хочешь усложнить: скажем, >2 м/с - подозрительно, >10 м/с заведомо неверно.
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
02.06.2011, 23:12 9
Цитата Сообщение от myaho Посмотреть сообщение
в каждый момент времени
Это означает через равные, заданные промежутки?

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

Пример данных: 10 м/c, х=10м, y=20м, направление положительное
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
02.06.2011, 23:31 11
Положительное направление!? Это как?!
-- В положительном направлении от нас находится Смольный Собор.
-- Булочная находится от вас в положительном направлении.
-- Знаете, пройдите 10м в положительном направлении, потом сверните на отритцательное.
0
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
02.06.2011, 23:50  [ТС] 12
К примеру: корабль был в точке А с координатой (2,3), а доплыл до точки В с координатой (-9,2).
А вот булочной в положительном направлении от меня нет=(
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
03.06.2011, 00:53 13
Оу-кей. Четыре вопроса на засыпку.
Корабль из А(0, 0) приплыл в Б(1, 1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(-1, 1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(1, -1). В каком направлении он плыл?
Корабль из А(0, 0) приплыл в Б(-1, -1). В каком направлении он плыл?
0
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, а обе координаты уменьшились - ясно, что данные не согласованы.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.06.2011, 16:07 15
Один контейнер для хранения всех элементов.
Второй для последних элементов для каждого корабля по которым будет проверятся на согласование новый добовляемый эл-т.
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
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;
}
2
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
03.06.2011, 22:01  [ТС] 17
Ох, спасибо Вам огромнейшее. Я сейчас пытаюсь написать что-то аналогичное.

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

error C2666: 'pow' : 6 overloads have similar conversions
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.06.2011, 22:11 18
А в какой строке? при каких значениях?
0
0 / 0 / 0
Регистрация: 16.05.2011
Сообщений: 11
03.06.2011, 22:29  [ТС] 19
c fpow вроде не ругается

Добавлено через 11 минут
а зачем нам нужно останавливать работу на 1 секунду? sleep(1)
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.06.2011, 00:04 20
ага на 1 мс?
0
04.06.2011, 00:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2011, 00:04
Помогаю со студенческими работами здесь

Циклические алгоритмы. Алгоритмы обработки последовательностей чисел
Помогите пожалуйста... Преподаватель говорит что: 1. Программа считает правильно (за...

Циклические алгоритмы. Алгоритмы обработки последовательностей чисел
Помогите пожалуйста program Lab_3_1; const x1=1; xn=3; dx=0.2; a=3.9; ...

Циклические алгоритмы (Алгоритмы с одним циклом)
Доброго времени суток! Помогите пожалуйста написать программы на циклы в Delphi 7, а то я только...

Контейнеры
Ребят, хочу сделать простенькую игрушку. На форме будет игровое поле и панелька с текущими данными...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru