Obliczenie długości odcinka – potrzebna pomoc z wykonaniem zadania

0

Mam do napisanie taki program:

Napisz program który rozstrzyga czy punkt o współrzędnych podanych przez użytkownika leże

  1. na okręgu o środku (0,0) i promieniu 1
  2. wewnątrz tego okręgu
  3. na zewnątrz

Pamietaj o kontroli poprawności danych

Rozumiem, że mam policzyć długość odcinka? Jeśli tak to nie wiem jak to zapisać w C... ktoś pomoże?

0

Jak policzyłbyś to na karce papieru - jakiego rodzaju operacje będą Ci potrzebne?

1

Podejdź do tego jak do zadania z matematyki, napisz sobie na kartce równanie okręgu.
Następnie jeśli = to leży an okręgu
jeśli < to wewnątrz
jeśli > to poza.
Jak już rozpracujesz matematycznie, to implementacja pójdzie z górki.

0

Pewnie ze wzoru na długość odcinka w układzie współrzędnych. Tylko że problem jest jak to zapisać bo jak zaczynają się pierwiastki w C itp to powoli się gubię

0

Tylko że problem jest jak to zapisać bo jak zaczynają się pierwiastki w C itp to powoli się gubię

Czyli będziesz potrzebował takich operacji jak:

  • dodawanie (addition),
  • mnożenie (multiplication),
  • potęgowanie (power),
  • pierwiastkowanie [1] (square root w tym przypadku).

Znając ich angielskie nazwy, możesz wpisać w Google c square root i poczytać co z czym się je ;-)

[1] tak właściwie to nie potrzebujesz pierwiastkowania w tym przypadku, ale niech będzie;

1

Równanie okręgu o środku w punkcie (a,b):
(x-a)^2 + (y-b)^2 = r^2

Podstawiasz swoje dane i masz:
x^2 + y^2 = 1

x i y podaje użytkownik, zatem masz wszystko czego potrzebujesz i tylko sprawdzasz czy x^2 + y^2 jest <, =, > od 1

0
#include<stdio.h>
#include<math.h>
int main()

{
	float x, y, kwadratx, kwadraty;
	printf("Podaj wspolrzedna x: ");
	scanf("%f", &x);
	printf("Podaj wspolrzedna y: ");
	scanf("%f", &y);
	kwadratx = (("%f - 0"), x, 0, pow(x, 2));
	kwadraty = (("%f - 0"), y, 0, pow(y, 2));
	if ((kwadratx + kwadraty) == 1)
		printf("Punkt lezy na okregu\n");
	if ((kwadratx + kwadraty) > 1)
		printf("Punkt ;ezy poza okregiem\n");
	if ((kwadratx + kwadraty) < 1)
		printf("Punkt lezy wewnatrz okregu\n");
	system("pause");
	return 0;
}

No niby działa, tylko że użyłem dodatkowych zmiennych (kwadratx, kwadraty). Czy coś takiego jest dozwolone? Całe wyrażenie logiczne chciałem zmieścić pod if'ach ale mi się nie udało. Czy np w przyszłej pracy można sobie tak upraszczać? No i co to kontrola poprawności danych?

2

(("%f - 0"), x, 0, pow(x, 2)) co ten zapis oznacza?

Czy np w przyszłej pracy można sobie tak upraszczać

Jeszcze daleka droga do pracy - nie przejmuj się takimi rzeczami ;-)

0
Patryk27 napisał(a):

(("%f - 0"), x, 0, pow(x, 2)) co ten zapis oznacza?

Czy np w przyszłej pracy można sobie tak upraszczać

Jeszcze daleka droga do pracy - nie przejmuj się takimi rzeczami ;-)

No i tu jest w sumie chyba błąd. Bo zapis oznacza, że podnoszę tylko x do kwadratu?

0

a nie możesz po prostu jak człowiek napisać x*x;?
Pow opłaca się używać dla większych potęg, albo potęg nie-naturalnych.

0
Spine napisał(a):

a nie możesz po prostu jak człowiek napisać x*x;?
Pow opłaca się używać dla większych potęg, albo potęg nie-naturalnych.

No racja, jest krócej. Ale co jak to zapisać jeśli okrąg podany w zadaniu miałby np współrzędne (6,3)?

0
Brunatny Ogórek napisał(a):

No racja, jest krócej. Ale co jak to zapisać jeśli okrąg podany w zadaniu miałby np współrzędne (6,3)?

Jeśli środek okręgu ma współrzędne (6,3), to wystarczy je odjąć od współrzędnych punktu - przesuwasz środek układu współrzędnych do środka koła.
Wtedy badasz punkt, nowymi jego współrzędnymi tak jakby środek koła znajdywał się w punkcie (0,0).
Wychodzi na to samo, co napisała Ci @szarotka w komentarzu ;)

BTW. to praktycznie nigdy nie będzie spełnione dla floatów:


    if ((kwadratx + kwadraty) == 1)
        printf("Punkt lezy na okregu\n");
0
Spine napisał(a):

BTW. to praktycznie nigdy nie będzie spełnione dla floatów:


    if ((kwadratx + kwadraty) == 1)
        printf("Punkt lezy na okregu\n");

@Spine ma rację, chyba, że Podasz Punkty typu (1, 0). Trzeba wprowadzić jakąś dokładność. tak to wygląda w Pythonie, ale, mam nadzieję, że jest jasne, jak pseudokod:):

import sys
e = sys.float_info.epsilon
x = math.sqrt(1/2) - 1.9 * e
y = math.sqrt(1/2)
if 1 - e < x**2 + y**2 < 1 + e:
    print("is on circ")
elif x ** 2 + y ** 2 < 1:
    print("is inside circ")
else:
    print("out of circ")

# -> is inside circle

EDIT: Edit zgodnie z sugestią @enedil.

1

@lion137: nie ma po co wymyślać własnych wartości, po coś jest sys.float_info.epsilon, z nim należy porównywać różnicę odległości i promienia.

1

Pomimo dobrych chęci, to mieszacie młodemu w głowie tym floatem, bo w zadaniu brak nawet słowa o przybliżonych punktach leżących na okręgu. Po drugie przy uwzględnieniu epsilona dobranego na oko wciągacie do punktów leżących na okręgu także te, które nie powinny leżeć, więc dżumę zamieniacie na cholerę. I po trzecie jeśli już stosujemy przybliżenia to zgodnie z rachunkiem niepewności, czyli trzeba uwzględnić propagację błędów, więc maksymalny błąd względny wyznaczonego r^2 to r_delta = |2*x*epsilon + 2*y*epsilon|, więc promienie leżące na okręgu to te o długości od 1- r_delta do 1+delta_r. A i to nie koniec problemów, bo jak teraz wyrazić te delta_r jeśli x i y nie są liczba całkowitymi i w dodatku są < 0, kompilator musi zaokrąglić do całkowitych wielokrotności epsilona. I mamy błąd błędu ;-)

0

@enedil: Um wydaje mi się, że ten epsilon to może być za mała tolerancja błędu, gdyby robić to na poważnie.

@cs: Z floatami sam OP wyskoczył, więc zakładam, że zadanie wymaga.

Trudno mi sobie wyobrazić, by zadanie na tym poziomie wymagało wiedzy z zakresu wyznaczania niepewności obliczeń zmiennoprzecinkowych!

@Brunatny Ogórek: Skąd jest to zadanie i czego ono konkretnie wymaga?

  • Czy zadanie wymaga użycia floatów?
  • Czy zadanie wymaga obliczenia, czy punkt leży dokładnie na krawędzi okręgu?

Jeśli zadanie wymaga obu tych rzeczy na raz...

  • Czy ten kurs mówił wcześniej o kwestii niedokładności obliczeń zmiennoprzecinkowych lub chociażby słowem wspomniał o konieczności jak najdalej posuniętej ostrożności przy używaniu operatora == dla floatów doublów itd?
  • Czy aby na pewno to zadanie jest dla początkujących?

Jeśli to zadanie jest dla początkujących ORAZ mówili o ostrożności przy ==, to ja się poddaję. Jeśli to zadanie jest dla początkujących i nic o tym nie mówili, to tym gorzej dla nich. Walnij ==, nie przejmuj się epsilonami, nie będzie działać dla niektórych punktów o współrzędnych będących ułamkami, miej to w (...), tylko zapamiętaj na przyszłość, ze z tym są problemy i cyrki.

Jeśli to zadanie JEST niedokładność obliczeń zmiennoprzecinkowych, to widzę 2 możliwości:

  • Albo jesteś na matematyce i każą Ci zdobyć podstawowe obycie programistyczne - wtedy sam wiesz, jak masz liczyć te zakresy tolerancji
  • Albo sobie odpuść.

Chyba, że potrzebujesz tego do celów praktycznych? Wtedy skorzystaj z gotowych rozwiązań, zamiast próbować wymyślić własne.

0

@kmph: Jesteś pewien, czy to przybliżenie coś Ci da? Popatrz na wzór: błąd zależy też od wartości x i y, nie tylko od liczby cyfr znaczących!!! Dla x = 1 i y = 0 delta_r = 2*epsilon a dla x = 0,707 i y = 0,707 delta_r = 2,8*epsilon, po zaokrągleniu może to być 3 * epsilon, a może 4 * epsilon, zależy co zostanie zaokrąglone czy osobno x i y czy 2,8 * epsilon itd.
Czy jeśli w zadaniu zmieniłby się promień na np. 1000 to zmieniłbyś to przybliżenie, a jeśli tak to jak? Znowu na czuja? A jeśli program liczyłby czy punkt leży na okręgu o promieniu całkowitym od 1 do 100, to dla każdego promienia stosowałbyś jedno przybliżenie czy różne? Większe czy mniejsze? A za mały błąd nic by nie zmienił. Najważniejsze, jak bez wiedzy jaki powinien być ten błąd ocenić czy nasze przybliżenie z czapki jest dobre i działa? Prosty eksperyment z 1000 wartościami x zmieniającego się od 0.001 do 0.999 i wyliczanym y żeby r = 1 pokazał, że bez epsilona, aż w 811 przypadkach "poprawnie" jest wykrywana równość z 1. A przecież te wyliczone y też było często tylko przybliżeniem poprawnego y! Z tego prostego zadania także wynika jeszcze jeden wniosek, że epsilon nie musi być stałą!!!

0

@Brunatny Ogórek: Skąd jest to zadanie i czego ono konkretnie wymaga?

  • Czy zadanie wymaga użycia floatów?
  • Czy zadanie wymaga obliczenia, czy punkt leży dokładnie na krawędzi okręgu?

Jestem na pierwszym roku informatyki, jest to zadania dla początkującego XD Tak, punkt musi być dokładnie na krawędzi. Natomiast to ćwiczenie ma tylko pokazać jak używać instrukcji warunkowych. (Jego treść przepisałem dokładnie)

Dziękuje wszystkim za wyczerpujące odpowiedzi ;)

0
Brunatny Ogórek napisał(a):

@Brunatny Ogórek: Skąd jest to zadanie i czego ono konkretnie wymaga?

  • Czy zadanie wymaga użycia floatów?
  • Czy zadanie wymaga obliczenia, czy punkt leży dokładnie na krawędzi okręgu?

Jestem na pierwszym roku informatyki, jest to zadania dla początkującego XD Tak, punkt musi być dokładnie na krawędzi. Natomiast to ćwiczenie ma tylko pokazać jak używać instrukcji warunkowych. (Jego treść przepisałem dokładnie)

Dziękuje wszystkim za wyczerpujące odpowiedzi ;)

??? Jeszcze raz: Zadanie jest TYLKO na poprawne używanie ifów, ale wymaga DOKŁADNEGO obliczania, czy punkt jest na krawędzi? I wymaga stosowania obliczeń zmiennoprzecinkowych ???

Przestaję rozumieć. Wymogi zadania wydają mi się przeczyć sobie.

0
kmph napisał(a):
Brunatny Ogórek napisał(a):

@Brunatny Ogórek: Skąd jest to zadanie i czego ono konkretnie wymaga?

  • Czy zadanie wymaga użycia floatów?
  • Czy zadanie wymaga obliczenia, czy punkt leży dokładnie na krawędzi okręgu?

Jestem na pierwszym roku informatyki, jest to zadania dla początkującego XD Tak, punkt musi być dokładnie na krawędzi. Natomiast to ćwiczenie ma tylko pokazać jak używać instrukcji warunkowych. (Jego treść przepisałem dokładnie)

Dziękuje wszystkim za wyczerpujące odpowiedzi ;)

??? Jeszcze raz: Zadanie jest TYLKO na poprawne używanie ifów, ale wymaga DOKŁADNEGO obliczania, czy punkt jest na krawędzi? I wymaga stosowania obliczeń zmiennoprzecinkowych ???

Przestaję rozumieć. Wymogi zadania wydają mi się przeczyć sobie.

Ja też przestaje rozumieć, może zaczniemy co to znaczy aby pamiętać o kontroli poprawności danych?

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