Adam Patterson Ответов: 2

Помощь с проблемой кода C++, включая декартовы точки


I need a C++ code that generates 100 Cartesian points at random with a uniform distribution between 1 and 100. As output it must print the points ordered by X coordinate in ascending order and indicate the closest points in the distribution. 


Что я уже пробовал:

Я пытался создать V-код сам, но не смог.

Rick York

Начните с разделения задачи на более мелкие задачи и выполняйте их по одной с прицелом на генерацию данных для следующего шага. Как я вижу, ваша первая задача-сгенерировать 100 баллов в "равномерном распределении", что бы это ни значило. Лучше всего хранить их в какой-то коллекции, так как вам придется сортировать их и определять ассоциации для вывода.

Попробуйте написать код, чтобы сделать это, и мы поможем вам, как сможем. Мы не будем писать это для вас, хотя, как вы узнаете мало, если мы это сделаем.

2 Ответов

Рейтинг:
2

OriginalGriff

Мы более чем готовы помочь тем, кто застрял, но это не значит, что мы здесь, чтобы сделать все это для вас! Мы не можем сделать всю работу, вам либо платят за это, либо это часть ваших оценок, и было бы совсем несправедливо, если бы мы сделали все это за вас.

Поэтому нам нужно, чтобы вы сделали работу, и мы поможем вам, когда вы застряли. Это не значит, что мы дадим вам пошаговое решение, которое вы можете сдать!
Начните с объяснения, где вы находитесь в данный момент и каков следующий шаг в этом процессе. Затем расскажите нам, что вы пытались сделать, чтобы этот следующий шаг сработал, и что произошло, когда вы это сделали.

Просто сказать "я пытался", боюсь, не поможет.


CPallini

5.

Рейтинг:
0

CPallini

Вы можете найти много учебников, свободно доступных по различным задачам, которые вы должны выполнить, а именно:

  • генерация случайных чисел
  • сортировка коллекций
  • найдите минимальное значение функции пары (различных) значений, принадлежащих коллекции.

Вы также можете попробовать следующий код:
#include <iostream>
#include <tuple>
#include <vector>
#include <random>
#include <algorithm>
#include <limits>
using namespace std;

using Point = tuple<double, double>;

double generate_scaled( mt19937 & generator );
double distance( const Point & p1, const Point & p2);

int main()
{
  mt19937 generator{};

  vector < Point  > vpoint;

  while ( vpoint.size() < 100)
  {
    vpoint.emplace_back( make_tuple<double, double>( generate_scaled(generator), generate_scaled(generator) ) );
  }

  sort(vpoint.begin(), vpoint.end(), [](const Point & p1, const Point & p2) { return get<0>(p1) < get<0>(p2); } );

  double min_i, min_j;
  double min_distance = numeric_limits<double>::max();
  for (size_t i=0; i<vpoint.size()-1; ++i)
    for (size_t j=i+1; j<vpoint.size(); ++j)
    {
      auto d = distance( vpoint[i], vpoint[j]);
      if ( min_distance > d)
      {
        min_distance = d;
        min_i = i;
        min_j = j;
      }
    }

  for (const auto & t : vpoint)
    cout << get<0>(t) << ", " << get<1>(t) << endl;

  cout << "closest points are\n";
  cout <<  "p[" << min_i << "] = (" << get<0>(vpoint[min_i]) << "," << get<1>(vpoint[min_i]) << ")\n";
  cout <<  "p[" << min_j << "] = (" << get<0>(vpoint[min_j]) << "," << get<1>(vpoint[min_j]) << ")\n";
  cout << "with distance = " << sqrt(min_distance) << endl;

}

double generate_scaled( mt19937 & generator )
{
  double x = generator();
  x = 1.0 + (x - generator.min()) * 99.0 / (generator.max() - generator.min());
  return x;
}

double distance( const Point & p1, const Point & p2)
{
  double dx =  get<0>(p1)-get<0>(p2);
  double dy =  get<1>(p1)-get<1>(p2);
  return (dx*dx + dy*dy);
}