#c #function #geometry
Вопрос:
#include <stdio.h>
char dentroRetangulo(int v1x, int v1y, int v2x, int v2y, int x, int y);
int main()
{
int a, b, c, f,d,g,x,y;
char D, h;
printf("== Coordinates of a rectangle ==n");
printf("Inform the coordinates of the left inferior corner : n");
scanf("%d %d", amp;a, amp;b);
printf("Inform the coordinates of the superior right corner: n");
scanf("%d %d", amp;c, amp;d);
printf("=== points ===n");
printf("inform the coordinates of the point (x,y)n");
scanf("%d %d", amp;f, amp;g);
h = dentroRetangulo(a,b,c,d,f,g);
if(h == D)
{
printf("O ponto(%d, %d) encontra-se dentro do retangulo", x, y);
}
return 0;
}
char dentroRetangulo(int v1x, int v1y, int v2x, int v2y, int x, int y)
{
char D;
char B;
char F;
if(x>v1x amp;amp; x<v2x || y> v1y amp;amp; y<v2y)
{
return D;
}
таким образом, в основном эта функция заключается в проверке того,находится ли точка внутри прямоугольника с нижним углом x, координатами y, равными v1x и v1y, и высшими координатами v2x и v2y, и в основной функции пользователь должен ввести координаты x и y, чтобы проверить, находятся ли они внутри него, я вроде новичка в C, но я уже потерял 1 день, пытаясь выяснить, что я сделал здесь не так, и, возможно, я слишком глуп, чтобы не видеть, что здесь происходит не так
Комментарии:
1. таким образом, функция проверяет, верно ли утверждение, и возвращает значение D основной функции, и если h == D символ, возвращаемый функцией, оператор if проверяет его и выводит точку внутри прямоугольника, извините, я бразилец, и я забыл перевести последнюю распечатку.
2. Что заставляет вас думать, что вы сделали что-то не так? Каковы симптомы? Что вы наблюдаете? Какого поведения вы хотите?
3. Кроме того,
if(x>v1x amp;amp; x<v2x || y> v1y amp;amp; y<v2y)
должно бытьamp;amp;
там, где у вас есть||
, так как вы хотите, чтобы все условия были верными.4. Похоже, вы не опубликовали весь код
5. @FaustinoDaSilva Не обновляйте вопрос с помощью «исправленного» кода… Если вы хотите, вы можете опубликовать свой исправленный код в качестве ответа, но не меняйте вопрос
Ответ №1:
В опубликованном коде есть некоторые проблемы, но основная проблема, по-видимому, возникает из-за некоторых основных недоразумений.
// The following will declare, but WON'T initialize two variables
// of type 'char'. Here, D, is the NAME of the variable, not its content,
// which is indeterminated.
char D, h;
// Here h is assigned the value returned by OP's function, which has the
// exact same issue noted before. Its value will still remain indeterminated.
h = /* ... */;
// Comparing two variables with indeterminated values has undefined behavior.
if ( h == D ) { /* ... */ }
Если цель состоит в том, чтобы написать функцию, которая возвращает char
значение 'D'
, когда точка находится внутри прямоугольника или 'F'
иным образом (возможно 'B'
, если она находится на одном из ребер), возможной реализацией может быть следующее.
typedef struct point_s
{
int x, y;
} Point;
char point_rectangle_intersection(Point bottom_left, Point top_right, Point p)
{
// Check if the point is outside.
if ( p.x < bottom_left.x || p.x > top_right.x ||
p.y < bottom_left.y || p.y > top_right.y )
return 'F';
// Check if the point is on one of the edges.
if ( p.x == bottom_left.x || p.x == top_right.x ||
p.y == bottom_left.y || p.y == top_right.y )
return 'B';
// The point is inside.
return 'D';
}
Комментарии:
1. вау, последняя часть даже лучше, чем моя, вы на самом деле сократили строку кода, просто вернув то, что внутри
2. извините, это потому, что я здесь новичок и немного запутался, я не знаю, можете ли вы ответить на свой собственный вопрос
3. если ( h == D ) это было недоразумение с моей стороны, на самом деле код должен был возвращать то, что вы там ввели, например, если код, если h == ‘D’, будет говорить, что координата находится внутри прямоугольника, и так далее, я думал, что это должно было быть другое
4. я отметил вас как ответы, потому что вы сделали свою работу, чтобы понять, почему я боролся, и извлек из этого некоторый смысл, я уже решил свою собственную проблему, кстати, но вы тот, кто на самом деле был наиболее близок к решению этой проблемы.
Ответ №2:
Вы слишком много стараетесь в одной строке… это слишком сложно:
if(x>v1x amp;amp; x<v2x || y> v1y amp;amp; y<v2y)
и это тоже неправильно. Это должно быть:
if(x>v1x amp;amp; x<v2x amp;amp; y> v1y amp;amp; y<v2y)
Но избегайте подобных заявлений…
Упростите задачу, написав больше строк кода.
Но сначала обратите внимание, что подобная функция должна возвращать 0
(она же false), когда точка находится снаружи, и 1
(она же true), когда она находится внутри.
Поэтому, чтобы все было просто, сделайте:
int dentroRetangulo(int v1x, int v1y, int v2x, int v2y, int x, int y)
{
if (x < v1x) return 0; // If the point is to the left, return 0
if (x > v2x) return 0; // If the point is to the rigth, return 0
if (y < v1y) return 0; // If the point is below, return 0
if (y > v2y) return 0; // If the point is above, return 0
return 1; // The point is inside, return 1
}
Одна простая проверка в каждой строке делает ваш код более простым.
И в main
названии это похоже
if(dentroRetangulo(a,b,c,d,f,g))
{
printf("O ponto(%d, %d) encontra-se dentro do retangulo", f, g);
}
Комментарии:
1. да, но это противоречит моему первому вопросу, и вы повторяете, если много раз, мой вопрос касался способа возврата символа D, который я нашел в своем основном коде, а вторая строка была неправильной, потому что я отредактировал код, не зная об этом
2. я сказал, что это противоречит моему первому вопросу, потому что я не хочу возвращать целое число 1, я хочу вернуть символ D
3. @FaustinoDaSilva Итак, вы хотите вернуть персонажа
D
, когда точка находится внутри, верно? И какой персонаж вам нужен, когда он находится снаружи?4. я хочу вернуть F