Как я могу изменить этот код, чтобы принимать пользовательский ввод?

#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;
}
 

Вывод вышеупомянутой программы можно увидеть здесь.