Функция возвращает true, когда она должна быть ложной С++

-11

bool Square::isPointOnShape(int x, int y) {
if((minX == x) || (x == maxX)){
if((minY < y) && (y < maxY)) {
return true;
}
}

if((minY == y) || (y == maxY)) {
if((minX < x) && (x < maxX)) {
return true;
}
}
else
return false;
}

Это моя функция. Так, предположительно, когда я его протестировал,

minX and minY = 0;
maxX and maxY = 4;

Когда я делаю что-то вроде let say,

bool funct;
Square Obj*;// Assume already initialized with values required.
funct = Obj->isPointOnShape(4,4)

Функция фактически возвращает true вместо false. Может ли кто-нибудь понять, почему?

Я действительно попытался напечатать значения во время вызова этой функции

this is min x: 0
this is max x:4
this is x:4
this is min y:0
this is max y:4
this is y:4

Поэтому я могу сказать, что значения верны во время выполнения, это мой главный вызов функции.

for (int e = 0; e < numX; e++) { //numX is the number of elements in allX[]

for (int r = 0; r < numY; r++) { //numY is the number of elements in allY[]

if (shapeVec[i]->isPointOnShape(allX[e], allY[r])) { //allX and allY contains all the x and y values which i want to test for

onX[onCounter] = allX[e]; //onX is the array which i store x values which return true

onY[onCounter] = allY[r]; //onY is the array which i store y values which return true

onCounter++;
}

if (shapeVec[i]->isPointInShape(allX[e], allY[r])) {

inX[inCounter] = allX[e];

inY[inCounter] = allY[r];

inCounter++;
}

спросил(а) 2016-05-10T19:29:00+03:00 5 лет, 2 месяца назад
0
78

Я не совсем уверен, но я думаю, вы должны получить предупреждение для этого кода, говорящего, что не все пути возвращают значение...

Для вашего примера x = Xmax = y = yMax = 4 и Ymin = Xmin = 0:


bool Square::isPointOnShape(int x, int y) {
if((minX == x) || (x == maxX)){ // this is true
if((minY < y) && (y < maxY)) { // this is false
return true;
}
}

if((minY == y) || (y == maxY)) { // this is true
if((minX < x) && (x < maxX)) { // this is false
return true;
}
}
else // this is ignored because
return false; // the above if was true

// ... and you miss to return
// anything for that case
} // <- was missing in your code

Если вы хотите проверить, находится ли точка, заданная переданными координатами, в форме, вам просто нужно удалить else, тогда функция вернет false как значение по умолчанию.

ответил(а) 2016-05-10T19:42:00+03:00 5 лет, 2 месяца назад
77

Вы обрабатываете только граничные случаи (буквально), чтобы вернуть true из вашей функции:

if((minX == x) || (x == maxX)) {

а также

if((minY == y) || (y == maxY)) {

но нет

if((minX < x) && (x < maxX) && (minY < y) && (y < maxY)) return true;

Я думаю, что самый простой способ написать вашу функцию будет

bool Square::isPointOnShape(int x, int y) {
return (minX <= x) && (x <= maxX) && (minY <= y) && (y <= maxY);
}

ответил(а) 2016-05-10T19:36:00+03:00 5 лет, 2 месяца назад
64

Когда я прочитал код со значениями, я обнаружил, что return выполнен.

правильно? возможно, вы можете подтвердить это со следами?

Приведенные значения:

minX and minY = 0;
maxX and maxY = 4;
call isPointOnShape(4,4) implies x==y==4

Для показа исполнения были добавлены комментарии:

 if((minX == x) || (x == maxX)){   // (0 == 4) || (4 == 4) => false || true
if((minY < y) && (y < maxY)) { // (0 < 4) && (4 < 4) => true && false
return true; // not executed
}
}

if((minY == y) || (y == maxY)) { // (0 == 4) || (4 == 4) => false || true
if((minX < x) && (x < maxX)) { // (0 < 4 ) && (4 < 4) => true && false
return true; // not executed
}
}
else
return false; // not executed because if((minY == y) || (y == maxY)) == true

попытайтесь полностью удалить строку с else и оставьте return false; и проверить снова.

это то, чего вы хотели достичь?

ответил(а) 2016-05-10T19:51:00+03:00 5 лет, 2 месяца назад
63

Вы специально написали себя из правильного тестового примера.

if((minX == x) || (x == maxX)){
if((minY < y) && (y < maxY)) {
return true;
}
}

В этом выражении он будет возвращать true только в том случае, если y не находится по краям. Или, в вашем случае, x=4,y=4 вернет false, потому что 4 не менее 4.

Правильная логика

if((minX == x) || (x == maxX)){
if((minY <= y) && (y <= maxY)) {
return true;
}
}

Я бы подумал просто переписать все это так, чтобы сделать его более элегантным:

bool Square::isPointOnShape(int x, int y) {
return
(
(x == minX || x == maxX) &&
(minY <= y && y <= maxY)
) ||
(
(y == minY || y == maxY) &&
(minX <= x && x <= maxX)
);
}

Я также предполагаю, что, основываясь на том, как вы написали код, вы хотите, чтобы он возвращал true по краям, а не в форме, правильно? Если вы намерены вернуть true для любой точки в форме, то (более простая) логика

bool Square::isPointInShape(int x, int y) {
return minX <= x && x <= maxX && minY <= y && y <= maxY;
}

ответил(а) 2016-05-10T19:41:00+03:00 5 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема