pętla while o raz za dużo

0

Gdy wpisze się osiem zer program powinien się skończyć, jednak mój wypisuje wynik, a potem się kończy. Wykonuje czynność z pętli o jeden raz za dużo, nie wiem co mam źle, już się pogubiłam w tym.
Mój fragment kodu z tą pętlą:

do
	{
		cin >> A.x >> A.y;
		cin >> B.x >> B.y;
		cin >> C.x >> C.y;
		cin >> X.x >> X.y;
	
			P_ABC = 0.5*abs((B.x - A.x)*(C.y - A.y) - (B.y - A.y)*(C.x - A.x));
			P_ABX = 0.5*abs((B.x - A.x)*(X.y - A.y) - (B.y - A.y)*(X.x - A.x));
			P_ACX = 0.5*abs((C.x - A.x)*(X.y - A.y) - (C.y - A.y)*(X.x - A.x));
			P_BCX = 0.5*abs((C.x - B.x)*(X.y - B.y) - (C.y - B.y)*(X.x - B.x));

			sprawdzenie(P_ABC, P_ABX, P_ACX, P_BCX);

	} while (A.x != 0 && A.y != 0 && B.x != 0 && B.y != 0 && C.x != 0 && C.y != 0 && X.x != 0 && X.y != 0);

Proszę o jakąś pomoc <3

0

Nie ma tu żadnego wypisania wyniku. https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

0

bo jest w funkcji i nie w tym jest problem, a w pętli :/

0

Kamilka, a jeśli zamiast cin >> zmienna wszędzie użyjesz zmienna = 0 to pętla się kończy, czy nie?

0

Raz wykonuje to sprawdzenie, co mam w funkcji, bo tam jest, że jak pole jest równe 0 to wypisz E i on zawsze to E wypisuje na końcu jak wpisuje zera. :(

0

Jak wiesz gdzie jest problem to po co pytasz na forum? Jak nie wiesz gdzie jest problem, to dlaczego dajesz niepełny kod?

0
#include <iostream>
#include <cmath>
using namespace std;

struct wierzcholek
{
	int x, y;
};
struct punkt
{
	int x, y;
};
void sprawdzenie(double P_ABC, double P_ABX, double P_ACX, double P_BCX)
{
	if (P_ABX == 0 || P_ACX == 0 || P_BCX == 0)
		cout << "E" << endl;
	else
	{
		if (P_ABX + P_ACX + P_BCX > P_ABC)
			cout << "O" << endl;
		else
		{
				cout << "I" << endl;
		}
	}
}
int main()
{
	wierzcholek A, B, C;
	punkt X;
	double P_ABC, P_ABX, P_ACX, P_BCX;
	do
	{
		cin >> A.x >> A.y;
		cin >> B.x >> B.y;
		cin >> C.x >> C.y;
		cin >> X.x >> X.y;
	
			P_ABC = 0.5*abs((B.x - A.x)*(C.y - A.y) - (B.y - A.y)*(C.x - A.x));
			P_ABX = 0.5*abs((B.x - A.x)*(X.y - A.y) - (B.y - A.y)*(X.x - A.x));
			P_ACX = 0.5*abs((C.x - A.x)*(X.y - A.y) - (C.y - A.y)*(X.x - A.x));
			P_BCX = 0.5*abs((C.x - B.x)*(X.y - B.y) - (C.y - B.y)*(X.x - B.x));

			sprawdzenie(P_ABC, P_ABX, P_ACX, P_BCX);

	} while (A.x != 0 && A.y != 0 && B.x != 0 && B.y != 0 && C.x != 0 && C.y != 0 && X.x != 0 && X.y != 0);
	
	system("pause");
	return 0;
}
0

Kamilka, tuż przed sprawdzaniem warunku while() daj zestaw cout-ów wyświetlających, co jest w A,B,C,X - mam podejrzenia, że nie zawsze trafia do danych 0 wtedy, kiedy byś chciała.

0

Wszystko się zgadza :/

0

Nie widzę problemu, wpisujesz 4·4 elementy i tyle jest obsłużonych: https://wandbox.org/permlink/8wCkuGn3jiVMHLhh

0

No ale chodzi o to, że podaje te wartości punktów, wszystko ładnie działa, ale jak wpisze 0 0 0 0 0 0 0 0 program powinien się skończyć, a wypisuje E i dopiero się kończy

1

A czego się spodziewasz, skoro po wprowadzeniu wartości wywołujesz funkcję wypisującą? Jeśli chcesz ją wywoływać warunkowo - to zrób dokładnie to.

while(true)
{
    cin >> ...
    if(exit_condition)
        break;
    process_params(...);
}
0

Wiem, że tak można, ale muszę to zadanie wkleić do spoja, który mówi, że mam błędną odpowiedź, jak tak zrobię.

0

Czyli masz problem z jednym, ale pytasz o drugie. https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

Wypadałoby wkleić link do zadania, szybciej byśmy mogli pomóc...

0

SPOJ mówi, że masz źle, bo masz zły algorytm, a nie "pętla była zła". Przykładowy błędny input: 10 10 12 10 10 12 13 10

0

Ale pętla też jest źle :')

0

Ta zaproponowana przeze mnie jest ok.

0

@Kamilka: to co @kq powiedział + przetestuj wpisując jako dowolną zmienną zero a reszte nie zero

1 użytkowników online, w tym zalogowanych: 0, gości: 1