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

Что требуется ? - C++

Войти
Регистрация
Восстановить пароль
 
Stake88
0 / 0 / 0
Регистрация: 11.03.2013
Сообщений: 8
12.08.2013, 16:35     Что требуется ? #1
Здравствуйте.
Помогите пожалуйста разобрать, что от меня требуется в двух приведённых ниже этих задачах.

1) Выбрать из совокупности L плоских многоугольников с числом вершин, не большим K, правильные многоугольники, упорядочить их по возрастанию площадей. В случае отсутствия совокупности таких многоугольников выдать сообщение.

2)Тара имеет вид параллелепипеда с рёбрами a,b,c, может быть изготовлена из дерева, картона или пластмассы. По сведениям о некотором количестве элементов тары (не более N) И о выбранном материале отобрать элементы тары, изготовленные из указанного вещества. Отсортировать их по возрастанию длин наибольших ребер. Если нужных элементов тары нет, выдать сообщение.

В первой задаче так понял, есть документ в котором заданы вершины многоугольников (допустим в пределах от -10 до +10 (x,y)), и из них уже надо выбирать правильные многоугольники ?

А вот со второй завис.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2013, 16:35     Что требуется ?
Посмотрите здесь:

C++ Уважаемые форумчане, помогите понять что требуется..
Что требуется для запуска проекта использующего Crystal Reports на чистой Win2K? C++
C++ Объясните, что требуется в задании
C++ Компилятор ругается, что для индекса требуется массив или указатель
C++ string,switch, что делать, если требуется сравнение русского текста
C++ else подчеркивает и пишет что требуется оператор
Что тут требуется? C++
C++ 2012 strtok не работает и выдается ошибка, что требуется strtok_s
C++ Что стоит изучить, что перейти от консольных приложений к оконным
Проверить, что в первой ячейке массива лежит то же значение, что и в остальных C++
C++ Как записать через условие что: а не равно 0 и что d неотрицательно
Что сделать что бы консольная строка разбивалась на слова для перевода? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
13.08.2013, 12:20     Что требуется ? #2
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
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
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <iomanip>
 
class Box {
 public:
  enum Material {
    WOOD, CARTON, PLASTIC
  };
  Box() {}
  Box(double a, double b, double c, Material material)
    : a(a), b(b), c(c), material(material) {}
  const double &getA() const { return a; }
  const double &getB() const { return b; }
  const double &getC() const { return c; }
  const Material &getMaterial() const { return material; }
 private:
  double a, b, c;
  Material material;
};
 
std::ostream &operator<<(std::ostream &stream, const Box::Material &material) {
  switch (material) {
    case Box::Material::WOOD:
      stream << "wood";
      break;
    case Box::Material::CARTON:
      stream << "carton";
      break;
    case Box::Material::PLASTIC:
      stream << "plastic";
      break;
    default:
      stream << "unknown";
  };
  return stream;
}
 
std::ostream &operator<<(std::ostream &stream, const Box &box) {
  return stream << std::fixed << std::setprecision(3) <<
    "Box{a=" << box.getA() << ", b=" << box.getB() <<
    ", c=" << box.getC() << ", material='" << box.getMaterial() <<
    "'}";
}
 
Box::Material getRandomMaterial() {
  int randomNumber = rand() % 3;
  switch (randomNumber) {
    case 0: return Box::Material::WOOD;
    case 1: return Box::Material::CARTON;
    case 2: return Box::Material::PLASTIC;
  }
  return Box::Material::WOOD;
}
 
Box getRandomBox() {
  return Box((rand() % 10000) / 1000., (rand() % 10000) / 1000.,
    (rand() % 10000) / 1000., getRandomMaterial());
}
 
struct BoxMaterialComparator {
  BoxMaterialComparator(const Box::Material &material) : material(material) {}
  bool operator()(const Box &box) {
    return box.getMaterial() == material;
  }
  Box::Material material;
};
 
template <class Predicate>
Box *partition(Box *first, Box *last, Predicate predicate) {
  while (first != last) {
    while (predicate(*first)) {
      ++first;
      if (first == last) return first;
    }
    do {
      --last;
      if (first == last) return first;
    } while (!predicate(*last));
    std::swap(*first, *last);
    ++first;
  }
  return first;  
}
 
template <class Generator>
void generate(Box *first, Box *last, Generator generator) {
  while (first != last) {
    *first++ = generator();
  }
}
 
template <class Predicate>
void sort(Box *first, Box *last, Predicate predicate) {
  for (Box *i = first; i != last - 1; ++i) {
    for (Box *j = i + 1; j != last; ++j) {
      if (predicate(*i, *j)) {
        std::swap(*i, *j);
      }
    }
  }
}
 
const double &max(const double &a, const double &b) {
  return (a > b) ? a : b;
}
 
double getLongestEdgeValue(const Box &box) {
  return max(max(box.getA(), box.getB()), box.getC());
}
 
bool compareByLongestSide(const Box &a, const Box &b) {
  return getLongestEdgeValue(a) < getLongestEdgeValue(b);
}
 
int main(int, char**) {
  srand(time(0));
  
  const int NUMBER_OF_BOXES = 7 + rand() % 5;
  Box boxes[NUMBER_OF_BOXES];
  
  generate(boxes, boxes + NUMBER_OF_BOXES, getRandomBox);
  
  std::cout << "Boxes:" << std::endl;
  for (int i = 0; i < NUMBER_OF_BOXES; ++i) {
    std::cout << boxes[i] << std::endl;
  }
 
  Box::Material selectedMaterial = getRandomMaterial();
  std::cout << "Selected material: " << selectedMaterial << "." <<
    std::endl << std::endl;
 
  Box *lastBox = partition(boxes, boxes + NUMBER_OF_BOXES,
    BoxMaterialComparator(selectedMaterial));
  
  std::cout << "Not sorted:" << std::endl;
  for (Box *i = boxes; i != lastBox; ++i) {
    std::cout << *i << std::endl;
  }
  std::cout << std::endl;
 
  sort(boxes, lastBox, compareByLongestSide);
  
  std::cout << "Sorted:" << std::endl;
  for (Box *i = boxes; i != lastBox; ++i) {
    std::cout << *i << std::endl;
  }
  std::cout << std::endl;
  
  return 0;
}
Добавлено через 14 часов 12 минут
С первой могу помочь вычислениями.
Готовый прямоугольник, вывод его на экран, определение правильности, вычисление площади.
Вам остается сделать только выборку и сортировку. С уже готовыми функциями и классами.
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
#include <cmath>
#include <iostream>
#include <iomanip>
#include <stdexcept>
 
const double EPSILON = 0.00001;
const double PI = 3.141592653589793;
 
 
class Point {
 public:
  Point() : x(0), y(0) {}
  Point(const double &x, const double &y) : x(x), y(y) {}
  const double &getX() const { return x; }
  const double &getY() const { return y; }
 private:
  double x;
  double y;
};
 
std::ostream &operator<<(std::ostream &stream, const Point &point) {
  return stream << std::fixed << std::setprecision(3) <<
    "Point{x=" << point.getX() << ", y=" << point.getY() << "}";
}
 
class Polygon {
 public:
  const static int MAXIMUM_NUMBER_OF_POINTS = 50;
  Polygon() : numberOfPoints(0) {}
  const Point &getPoint(int index) const {
    if (index >= numberOfPoints) {
      throw std::out_of_range("Requested point does not exist."); 
    }
    return points[index];
  }
  void addPoint(const Point &point) {
    if (numberOfPoints >= MAXIMUM_NUMBER_OF_POINTS) {
      throw std::out_of_range("Maximum number of points reached.");
    }
    points[numberOfPoints++] = point;
  }
  int getNumberOfPoints() const { return numberOfPoints; }
 private:
  Point points[MAXIMUM_NUMBER_OF_POINTS];
  int numberOfPoints;
};
 
std::ostream &operator<<(std::ostream &stream, const Polygon &polygon) {
  stream << "Polygon{numberOfPoints=" << polygon.getNumberOfPoints() << 
    "," << std::endl;
  for (int i = 0; i < polygon.getNumberOfPoints(); ++i) {
    stream << "    " << polygon.getPoint(i) << std::endl;
  }
  return stream << "}";
}
 
bool equals(const double &a, const double &b, const double &epsilon = EPSILON) {
  return fabs(a - b) <= EPSILON;
}
 
double getDistance(const Point &a, const Point &b) {
  return sqrt(pow(a.getX() - b.getX(), 2.) + pow(a.getY() - b.getY(), 2.));
}
 
/**
 * Определение равносторонности многоугольника.
 * Многоугольник считается равносторонним, если все его стороны равны.
 *
 * @param polygon многоугольник
 * @param epsilon задаваемая точность сравнения чисел с плавающей точкой
 * @result истина, если многоугольник равносторонний и ложь, если у
 *         многоугольника меньше двух точек или он неравносторонний
 */
bool isEquilateral(const Polygon &polygon, const double &epsilon = EPSILON) {
  int numberOfPoints = polygon.getNumberOfPoints();
  if (numberOfPoints < 3) {
    return false;
  }
  double firstDistance = getDistance(polygon.getPoint(0), polygon.getPoint(1));
  for (int i = 1; i < numberOfPoints; ++i) {
    double thisDistance = getDistance(polygon.getPoint(i),
      polygon.getPoint((i + 1) % numberOfPoints));
    if (!equals(firstDistance, thisDistance, epsilon)) {
      return false;
    }
  }
  return true;
}
 
/**
 * Определение правильности многоугольника.
 * Многоугольник считается правильным, если он равносторонний и
 * для любой его стороны вычисляемый радиус описанной окружности
 * одинаков.
 *
 * @param polygon многоугольник
 * @param epsilon задаваемая точность сравнения чисел с плавающей точкой
 * @result истина, если многоугольник правильный и ложь, если у
 *         многоугольника меньше трех сторон или он неправильный
 */
bool isRegular(const Polygon &polygon, const double &epsilon = EPSILON) {
  int numberOfPoints = polygon.getNumberOfPoints();
  if (!isEquilateral(polygon, epsilon) || numberOfPoints < 3) {
    return false;
  }
  double firstSide = getDistance(polygon.getPoint(0), polygon.getPoint(1));
  double circumcircleRadius = firstSide / (2 * sin(PI / (2 * numberOfPoints)));
  
  for (int i = 1; i < numberOfPoints; ++i) {
    double thisSide = getDistance(polygon.getPoint(i),
      polygon.getPoint((i + 1) % numberOfPoints));
    double thisCircumcircleRadius = thisSide / 
      (2 * sin(PI / (2 * numberOfPoints)));
    if (!equals(thisCircumcircleRadius, circumcircleRadius, epsilon)) {
      return false;
    }
  }  
  return true;
}
 
/**
 * Поиск площади правильного многоугольника по формуле.
 *
 * @param polygon многоугольник, площадь которого надо найти
 * @result площадь правильного многоугольника
 */
double getAreaOfRegular(const Polygon &polygon) {
  int numberOfPoints = polygon.getNumberOfPoints();
  if (numberOfPoints < 3) {
    return 0;
  }
  double side = getDistance(polygon.getPoint(0), polygon.getPoint(1));
  return (numberOfPoints * pow(side, 2.0)) /
    (4 * tan(PI / numberOfPoints));
}
 
int main(int, char**) {
  // создание многоугольника
  Polygon p; 
  // добавление точек (квадрат)
  p.addPoint(Point(0, 0)); 
  p.addPoint(Point(0, 2));
  p.addPoint(Point(2, 2));
  p.addPoint(Point(2, 0));
 
  // вывод на экран
  std::cout << p << std::endl;
  
  // проверка на правильность
  if (isRegular(p)) {
    // подсчет площади правильного(!) многоугольника
    double area = getAreaOfRegular(p);
    std::cout << "Regular polygon with area of " << area << std::endl;
  } else {
    std::cout << "Not a regular polygon." << std::endl;
  }
}
Yandex
Объявления
13.08.2013, 12:20     Что требуется ?
Ответ Создать тему
Опции темы

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