#c
#c
Вопрос:
Как изменить этот код, чтобы программа могла принимать пользовательский ввод вместо предопределенного ввода: код предназначен для проверки, пересекаются ли две строки или нет, в этом коде указаны значения точек, но я хочу, чтобы программа запрашивала значения во время выполнения.
struct point
{
lli x, y;
};
int orientation(point p1, point p2, point p3)
{
int val = (p2.y - p1.y) * (p3.x - p2.x) -
(p2.x -p1.x) * (p3.y -p2.y);
if (val == 0) return 0;
return (val > 0)? 1: 2;
}
bool validprojection(int a, int b, int c, int d)
{
if (a > b)
swap(a,b);
if (c > d)
swap(c, d);
return max(a, c) <= min(b, d);
}
bool doIntersect(point a, point b, point c, point d)
{
int o1 = orientation(a, b, c);
int o2 = orientation(a, b, d);
int o3 = orientation(c, d, a);
int o4 = orientation(c, d, b);
if(o1 != o2 amp;amp; o3 != o4)
return true;
if (o1 == 0 amp;amp; o4 == 0)
{
if(validprojection(a.x, b.x, c.x, d.x) amp;amp; validprojection(a.y, b.y, c.y, d.y))
return true;
}
return false;
}
предварительно определенный ввод:
как я могу изменить эту часть, чтобы она просила пользователя ввести значения point
int main()
{
cout<<"To find the intersection point of two line segment";
point p1 = {1, 1}, p2 = {10, 1}, p3 = {1, 2}, p4 = {10, 2};
doIntersect(p1, p2, p3, p4)? cout << "yesn": cout<< "Non";
p1 = {10, 0}, p2 = {0, 10}, p3 = {0, 0}, p4 = {10, 10};
doIntersect(p1, p2, p3, p4)? cout << "yesn": cout<< "Non";
return 0;
Комментарии:
1. Взгляните на, std::string , std::cin и std::stoi
Ответ №1:
Код
#include <iostream>
#include <string>
#include <sstream>
std::ostream amp;operator<<(std::ostream amp;os, Point amp;p) {
return os << p.x << ',' << p.y;
}
int main() {
Point points[2][2];
std::string line;
while (true) {
for (int i = 0; i < 2; i ) {
for (int j = 0; j < 2; j ) {
std::cout << "Line " << i 1<< ", Point " << j 1 << " (x,y): "; // Prints: "Line i, Point j (x,y): "
std::getline(std::cin, line);
if (line.size() == 0) {
goto end;
}
std::stringstream ss(line);
ss >> points[i][j].x;
ss.ignore(1, ',');
ss >> points[i][j].y;
line.clear();
}
}
bool intersect = doIntersect(points[0][0], points[0][1], points[1][0], points[1][1]);
std::cout << "The lines 1 [(" << points[0][0] << "), (" << points[0][1] << ")] and 2 " << "[(" << points[1][0] << "), (" << points[1][1] << ")] " << (intersect ? "do" : "don't") << "intersectn" << std::endl; // Double new line intended, Prints: "The lines 1 [(x,y), (x,y)] and 2 [(x,y), (x,y)] do/don't intersect"
}
end: return 0;
}
Объяснение
std::ostreamamp; operator<<.....
: СделатьPoint
ostream
возможным (можно использовать с помощью cout).Point points[2][2]
: массив размером 2 x 2 точки (2 строки, по 2 точки в каждой)string line
: строка для пользовательского вводаwhile (true)
: повторите цикл «Получить ввод, проверить, пересекаются ли строки» (удалите его, если вы хотите, чтобы программа завершила работу после завершения цикла один раз)Цикл:
A. Получить ввод:- 2 вложенных цикла, один для строк, другой для точек
- С принтами
Line i, Point j (x,y):
std::getline
: Читайте, пока пользователь не нажмет enter- Если ввод пуст, завершите программу
- Считайте число в point.x, игнорируйте ‘,’ затем считывайте другое число в point.y
B. Проверьте, пересекаются ли строки
- Используйте
doIntersect
и сохраните результат в переменной - Print:
The lines 1 [(x,y), (x,y)] and 2 [(x,y), (x,y)] do/don't intersect
где (делать / не делать) зависит от того, является ли результат истинным (линии пересекаются) или нет
Ответ №2:
как я могу изменить эту часть, чтобы она просила пользователя ввести значения point
Вы можете сделать это с помощью перегрузки оператора. В частности, вы можете перегрузить operator>>
, как показано ниже. Показанная ниже программа запрашивает ввод от пользователя и использует point
введенные пользователем данные, чтобы проверить, пересекаются ли они или нет.
#include <iostream>
using namespace std;
struct point
{
int x, y;
//default constructor
point(): x(0), y(0)
{
}
//overload operator>>
friend std::istream amp;operator>>(std::istream amp;is, pointamp; inputPoint);
};
int orientation(point p1, point p2, point p3)
{
int val = (p2.y - p1.y) * (p3.x - p2.x) -
(p2.x -p1.x) * (p3.y -p2.y);
if (val == 0) return 0;
return (val > 0)? 1: 2;
}
bool validprojection(int a, int b, int c, int d)
{
if (a > b)
swap(a,b);
if (c > d)
swap(c, d);
return max(a, c) <= min(b, d);
}
bool doIntersect(point a, point b, point c, point d)
{
int o1 = orientation(a, b, c);
int o2 = orientation(a, b, d);
int o3 = orientation(c, d, a);
int o4 = orientation(c, d, b);
if(o1 != o2 amp;amp; o3 != o4)
return true;
if (o1 == 0 amp;amp; o4 == 0)
{
if(validprojection(a.x, b.x, c.x, d.x) amp;amp; validprojection(a.y, b.y, c.y, d.y))
return true;
}
return false;
}
//define overloaded operator>>
std::istream amp;operator>>(std::istream amp;is, pointamp; inputPoint)
{
std::cout<<"Enter x value: ";
std::cin >> inputPoint.x ;
std::cout<<"Enter y value: ";
std::cin >> inputPoint.y;
//check if input succeeded
if(cin)
{
//do something if needed
;
}
else
{
inputPoint = point();//otherwise leave the object in DEFAULT STATE
}
return is;
}
int main()
{
cout<<"To find the intersection point of two line segment"<<std::endl;
//TAKE INPUT(x and y values) FROM USER
point p1;
std::cin >> p1;
point p2;
std::cin >> p2;
point p3;
std::cin >> p3;
point p4;
std::cin >> p4;
//check if intersect
doIntersect(p1, p2, p3, p4)? cout << "yesn": cout<< "Non";
//AGAIN TAKE INPUT FROM USER
std::cin >> p1;
std::cin >> p2;
std::cin >> p3;
std::cin >> p4;
doIntersect(p1, p2, p3, p4)? cout << "yesn": cout<< "Non";
return 0;
}
Вывод вышеупомянутой программы можно увидеть здесь.