Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

3 punkty należące do prostej

Ostatnio zmodyfikowano 2010-10-28 21:02
Autor Wiadomość
Maciekka
Temat założony przez niniejszego użytkownika
3 punkty należące do prostej
» 2010-10-25 23:14:37
Treść zadania:
Dane są współrzędne trzech punktów na płaszczyźnie. Należy określić, czy punkty te leżą na jednej prostej.

Dane wejściowe to 3 wiersze zawierające po 2 liczby całkowite rozdzielone znakiem odstępu (spacją) będące współrzędnymi x i y trzech punktów.

Napisz program, który wypisze na standardowe wyjście słowo TAK lub NIE, w zależności od tego, czy podane punkty leżą na jednej prostej czy nie. Ponadto, w drugim wierszy należy wypisać trzy odległości pomiędzy podanymi punktami w kolejności rosnącej (z dokładnością do drugiego miejsca po przecinku).

Napisałem coś takiego, ale nie chcą mi wychodzić poprawne odległości, próbowałem %.2d %.2f i %.2lf. Piszę to w Code::Blocks


#include <cstdio>

int main ()
{
    int x1, y1, x2, y2, x3, y3;

    scanf("%d %d\n",&x1, &y1);
    scanf("%d %d\n",&x2, &y2);
    scanf("%d %d",&x3, &y3);

    if ((x1-x2)*(x2-x3)*(x3-x1)==0)
    {
        if ((x1-x2)^2+(x2-x3)^2+(x3-x1)^2==0) printf("TAK");
        else printf("NIE");
    }
    else
    {
        if ((y2-y1)/(x2-x1)==(y3-y2)/(x3-x2)==(y1-y3)/(x1-x3)) printf ("TAK");
        else printf ("NIE");
    }

    int a, b, c;
    a=((x2-x1)^2+(y2-y1)^2)^(1/2);
    b=((x3-x1)^2+(y3-y1)^2)^(1/2);
    c=((x2-x3)^2+(y2-y3)^2)^(1/2);

    if      (a<=b && b<=c)printf("\n%.2f %.2f %.2f",a,b,c);

    else if (a<=c && c<=b)printf("\n%.2f %.2f %.2f",a,c,b);

    else if (b<=a && a<=c)printf("\n%.2f %.2f %.2f",b,a,c);

    else if (b<=c && c<=a)printf("\n%.2f %.2f %.2f",b,c,a);

    else if (c<=a && a<=b)printf("\n%.2f %.2f %.2f",c,a,b);

    else                  printf("\n%.2f %.2f %.2f",c,b,a);

    return 0;
}
P-23333
ison
» 2010-10-25 23:35:59
operator ^ to nie jest potęgowanie tylko XOR ;)
%f jest dla zmiennych typu float
%lf jest dla zmiennych typu double
nie możesz dla int'ów używać %lf
w zapisie %.2lf - dwójka oznacza ilość wypisywanych miejsc po przecinku

mógłbyś posortować punkty względem osi x i potem zwyczajnie sprawdzić czy suma odległość punktów 1 od 2 i 2 od 3 jest równa odległości punktów 1 od 3

kod na szybko:
C/C++
#include <algorithm>
#include <cstdio>
#include <cmath>

struct punkt {
    int x, y;
};

bool mniejsze_x( punkt pkt1, punkt pkt2 ) {
    return static_cast < bool >( pkt1.x < pkt2.x );
}

inline double square( int val ) {
    return static_cast < double >( val * val );
}

double odleglosc( punkt odleglosc_pkt1, punkt odleglosc_pkt2 ) {
    return sqrt( square( odleglosc_pkt2.x - odleglosc_pkt1.x ) + square( odleglosc_pkt2.y - odleglosc_pkt1.y ) );
}

inline bool Eq( double a, double b, double epsilon = 0.0001 ) {
    return static_cast < bool >( fabs( a - b ) < epsilon );
}

int main()
{
    punkt pkt[ 3 ];
    for( int i = 0; i < 3; ++i ) {
        scanf( "%d %d", & pkt[ i ].x, & pkt[ i ].y );
    }
    std::sort( pkt, pkt + 3, mniejsze_x );
    if( Eq( odleglosc( pkt[ 0 ], pkt[ 1 ] ) + odleglosc( pkt[ 1 ], pkt[ 2 ] ), odleglosc( pkt[ 0 ], pkt[ 2 ] ) ) ) printf( "TAK\n" );
    else printf( "NIE\n" );
   
}

z wypisaniem odległości to już sobie chyba poradzisz
P-23334
dmx81
» 2010-10-27 00:22:05
@ISON, troszke OT, ale zapytam, chodzi o uzywanie inline i static_cast - uzywasz tego, bo wiesz, ze wlasnie tak powinno byc? (tzn dlatego, ze to najbardziej optymalne rozwiazanie?) pytam z czystej ciekawosci, bo wczesniej nigdy nie uzywalem jeszcze tych zwrotow (rzutowanie robie poprostu przez np (int)a/b, a o inline czytalem "kiedys", ale jakos sam nie mam jeszcze wyczucia, kiedy nalezy uzyc i poki co nie uzywalem ;) ) pewnie powinienem poczytac o rodzajach rzutowania i porownac, ale wole zapytac kogos, kto stosuje:P bo poki co mecze inne rzeczy (ale pewnie i tak poczytam :))
P-23354
ison
» 2010-10-27 08:03:03
static_cast jest w stylu C++
zwykłe rzutowanie - w stylu C

zawsze bezpieczniej jest rzutować na odpowiedni typ, fakt faktem, że gdy funkcja zwraca double to rzutowania do double'a nie jest konieczne, lecz w innych sytuacjach -wall może sypać warningami. To czy użyjesz static_cast<int> czy (int) nie ma zbyt wielkiego znaczenia

inline mówi o tym, aby kompilator bezpośrednio wpisał kod funkcji w miejscu jej wystąpienia i nie wstawiał wskaźnika funkcji w pamięci. Korzysta się z tego przy krótkich funkcjach, chociaż i tak niekiedy kompilator sam o tym decyduje kiedy ma wystąpić inline.
Przykładowo jeśli napiszesz inline przy funkcji długiej bądź rekurencyjnej to inline zostanie zignorowany

Funkcja składowa klasy zostaje natomiast automatycznie uznana za inline jeśli napiszemy jej kod bezpośrednio po jej deklaracji we wnętrzu klasy.
P-23357
malan
» 2010-10-27 12:20:51
(...)że gdy funkcja zwraca double to rzutowania do double'a nie jest konieczne(...)
Taaa? A, gdy funkcja (lub operator) zwraca bool to rzutowanie na bool jest już potrzebne, tak?
P-23359
ison
» 2010-10-27 16:10:50
@up twierdzisz że zapis
C/C++
double a( int b ) { return b; }
nie jest poprawny?

A, gdy funkcja (lub operator) zwraca bool to rzutowanie na bool jest już potrzebne, tak?
nie jest
P-23366
dmx81
» 2010-10-27 19:39:45
nadrobilem zaleglosci :P fajna stronke znalazlem, opisujaca i porownujaca wszystkie rodzaje rzutowania (wykonano rzutowanie wielu typow na wiele innych porownujac w tebelce "sprawnosc" rodzajow rzutowania) no i rzeczywiscie w stylu c i static_cast wypadaja w sumie najlepiej, a poki co innego sposobu jeszcze uzywac  nie musialem

a co do inline, to warto dodac, ze zbyt wiele wywolan funkcji moze nieco spowolnic dzialanie programu - kazde wywolanie funkcji powoduje powstanie nowej instancji - mam nadzieje, ze czegos nie pomieszalem ;)

a temat ogolnie poruszylem, bo czesto ktos poczatkujacy (czasem rowniez to ja) prosi o pomoc - jakas prosta funkcje, a dostaje w odpowiedz funkcje uzbrojona w rozne dziwne, rzadko spotykane slowka (ktorych w kursie sie raczej nie uzywa w prostych funkcjach), dlatego fajnie by jeszcze bylo umieszczac komentarze, dlaczego stosuje sie to i to, a dlaczego tego lub tamtego tu nie stosowac, moze nieco wiecej pracy, ale wiecej pozytku:)
P-23375
malan
» 2010-10-27 19:58:00
@ison:
@up twierdzisz że zapis
C/C++
double a( int b ) { return b; }
nie jest poprawny?
Ja bym powiedział, że teoretycznie jest poprawny, ale zachodzi niejawna konwersja.
Chodzi mi o taką sytuację:
C/C++
double sum( double a, double b )
{
    double res = a + b;
    return static_cast < double >( res );
}
P-23379
« 1 » 2
  Strona 1 z 2 Następna strona