Я пытаюсь создать таблицу, используя массив, например, такую таблицу
int array[5][3] = { {A, 200, 400}, {B, 300, 600}, {C, 100, 200}, {D, 200, 100}, {E, 200, 400} };
поэтому вывод массива будет таким:
| id | X | Y |
| A | 200 | 400 | //First Row
| B | 300 | 600 | //Second Row
| C | 100 | 200 |
| D | 300 | 100 |
| E | 200 | 400 |
в этом примере у меня есть значение:
int valueid = null; int valueX = 150; int valueY = 170;
поэтому в этом случае ближайшей точкой из таблицы является идентификатор C из таблицы для моего значения.
мой вопрос: как найти ближайшую точку туалета из таблицы массива
Я знаю, что sqrt можно найти только для одной строки:
int cx = array[0][1] - valueX;
int cy = array[0][2] - valueY;
int FindClosest = sqrt(cx * cx + cy * cy);
как подсчитать ближайшую точку из таблицы массива в приведенном выше коде, вычислить только ближайшую точку из первой строки, как рассчитать из всей строки и распечатать результат?
Не зная вашего точного задания или упражнения (о котором вы действительно должны нам сообщить), я бы сказал, что A
, B
и т. д. — это просто метки и не должны быть в массивах. Кроме того, пожалуйста, найдите время, чтобы прочитать справочный центр , пройти экскурсию по SO и прочитать Как задать вопрос . Также, пожалуйста, прочитайте о как написать «идеальный» вопрос , особенно о его контрольном списке . Затем отредактируйте свой вопрос, чтобы улучшить его.
@john Никаких необработанных циклов;) (Шон Пэрент).
Я бы сказал, что ваш вопрос «слишком начинающий». Очевидный первоначальный подход — просто перебирать элементы, и как это сделать, объясняется в начале любой приличной книги по C++ (кстати, у нас есть их список). Несмотря на то, что Пепейн Крамер уже дал вам очень хороший ответ, без основ C++ вы его не поймете.
@Someprogrammerdude, сэр, легко понять, как печатать ближайшее значение из моего x y, сохранять int, сравнивать с x y в каждой строке
В стандартной библиотеке есть раздел алгоритмов со всеми видами функций для часто используемых алгоритмов, которые проверены и пригодны для повторного использования. Для вашей проблемы это будет std::min_element
. Чтобы min_element работал читабельным образом, моделируйте свои точки как Point (класс/структуру), а не как какой-то многомерный целочисленный массив (в котором индексы используются для представления x и y и идентификатора).
После того, как вы смоделировали точку, вы можете создать из них массив (или вектор).
Следующий шаг — заставить std::min_element
работать, предоставив функцию сравнения: которая обычно предоставляется в виде лямбда-выражения.
Демо :https://onlinegdb.com/itNV7M3nG
#include <vector>
#include <cmath>
#include <string>
#include <algorithm>
#include <iostream>
// Do NOT use `int array[5][3]` thats a semantically meaningless thing
// only showing HOW you are implementing things, but missing the point
// of describing what you are doing. That will make code hard to read
// So lets introduce a struct to represent a point in your array
// and a function to calculate distance between two of your points
struct Point
{
std::string name;
int x;
int y;
double distance(const Point& other) const
{
return std::sqrt((x - other.x) * (x - other.x) + (y - other.y) * (y - other.y));
}
};
// https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt
// print Point to output stream
std::ostream& operator<<(std::ostream& os, const Point& point)
{
os << "`" << point.name << "(" << point.x << "," << point.y << ")`";
return os;
}
int main()
{
// resizable array (std::vector)
std::vector<Point> points{ { "A", 0, 0 }, { "B", 2, 2 }, { "C", 5, 5 }, { "D", 9, 9 } };
// The point you want to find the closest point to
Point somePoint{ "X", 3, 3 };
// https://en.cppreference.com/w/cpp/algorithm/min_element
// https://en.cppreference.com/w/cpp/language/lambda
auto it = std::min_element(points.begin(), points.end(),
// Lambda expression : Capture `somePoint` by reference and then make a compare function that compares distance to `somePoint`for two points in the input
[&](const Point& a,const Point& b)
{
return a.distance(somePoint) < b.distance(somePoint);
});
// it is now an iterator referencing the closest point to `somePoint`
std::cout << "Closest point to " << somePoint << " is " << *it << "\n";
}
Отказ от ответственности: это немного грубый подход. Он пересчитает расстояния (это можно было увидеть и раньше), я больше сосредоточился на демонстрации кодирования в стиле C++.
std::sqrt()
медленно и ненужно.
@3CxEZiVlQ вы правы. Это поиск минимума (метод SquaredDistance следует добавить в Point и использовать в comarisson). Но, как уже было сказано, это немного грубый подход ;)
это хорошо, но у меня есть вопрос: как, если A, B, C, D являются целыми примерами 1, 2, 3, 4, поэтому я хочу, чтобы результат int i = значение, близкое к точке; пример вашего кода: C является ближайшим, но как, если C — это число int, и я хочу заполнить i = Near(C); или, может быть, это может быть int i = std::min_element(point.begin()); если я хочу получить ценность
Просто замените имя std::string на int index;
, а затем вы можете использовать int index = *std::min_element...
для прямого разыменования возвращенного итератора.
@PepijnKramer нет необходимости в отдельном индексе, просто используйте it - points.begin()
@PepijnKramer, я пытаюсь вести себя так, но получаю ошибку int i = min_element(points.begin()); не могли бы вы дать мне пример кода, извините, я новичок в использовании c++
ах, ок, я понимаю, извини, я нуб
Не уговаривайте себя так, вы тот, кто хочет учиться :) Все отзывы выше в коде: onlinegdb.com/dP4ywofao
Напишите цикл для прохождения всех строк ваших таблиц. Используйте переменную, чтобы отслеживать ближайшие найденные значения. При необходимости обновите эту переменную на каждой итерации цикла. Когда цикл завершится, переменная будет содержать ближайшее расстояние. Это довольно простые вещи, и они будут объяснены в любой книге по программированию для начинающих. Если вы хотите научиться программировать, вам следует купить хорошую книгу.