[C++] - losowanie punktów

Aruna
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 12 sty 2008, o 18:40
Płeć: Kobieta
Lokalizacja: Karczew
Podziękował: 12 razy

[C++] - losowanie punktów

Post autor: Aruna »

Witam

Chciałam prosić o pomoc w napisaniu zadania. Niestety z C++ jestem zielona (w LO podstaw nie miałam, a tu od razu na głęboką wodę mnie rzucili i takie coś)

Treść zadania:
Wylosuj 4 punkty. Dwa to środek okręgu i punkt na obwodzie. Pozostałe dwa to punkty prostej. Policz punkty przecięcia się prostej z okręgiem. Jeżeli prosta nie przecina trójkąta jeszcze raz wylosuj punkty do stworzenia okręgu. Wyniki zapisz do pliku.
Ostatnio zmieniony 22 sty 2008, o 13:47 przez Aruna, łącznie zmieniany 1 raz.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

[C++] - losowanie punktów

Post autor: soku11 »

A promien okregu jaki ma byc?? Tez losowy?? POZDRO
Aruna
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 12 sty 2008, o 18:40
Płeć: Kobieta
Lokalizacja: Karczew
Podziękował: 12 razy

[C++] - losowanie punktów

Post autor: Aruna »

Tak, też losowy.
adek05
Użytkownik
Użytkownik
Posty: 450
Rejestracja: 3 kwie 2007, o 18:38
Płeć: Mężczyzna
Lokalizacja: Biała Podlaska
Podziękował: 12 razy
Pomógł: 68 razy

[C++] - losowanie punktów

Post autor: adek05 »

soku11, imho jak losujemy środek i punkt na okręgu to niejako promień już mamy
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

[C++] - losowanie punktów

Post autor: tmk »

Ja to bym mniej więcej tak widział. Tylko jest jeden problem, bo ja traktuję prosta jako f. liniową, a wiadomo, że np. x = 6 nie jest funkcją. Także jak programik wylosuje dane prowadzące do takiej sytuacji to się wywala.
W C++ rzadziej pisze niż w C, dlatego z przyzwyczajenia nie użyłem strumieni do wpisania danych do pliku, ale psorek nie powinien sie czepiać Ewentualnie można to zmienić co chyba nie jest skomplikowane ;]

Kod: Zaznacz cały

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>

struct punkt{int x, y;};
struct pierwiastki{double x, y;};
struct okrag{int a, b;double r;};
struct s_prosta{double a, b;};

double f(double x, s_prosta prosta){
	return prosta.a*x + prosta.b;
}

int los(int min, int max){
    static int i;
    i += time(0) % RAND_MAX;
    srand(time(0));
    max -= min;
    return max ? (rand()+ i) % max + min : min;
}

int main(){

	punkt pkt[4];
	pierwiastki p1, p2;
	okrag okr;
	s_prosta prosta;
	char i;
	double a, b, c, delta;
	FILE *p = fopen("wynik.txt", "w");

powroc:

for(i=0;i<4;i++){
	pkt[i].x = los(-5, 5);
	pkt[i].y = los(-5, 5);
}

/*
pkt[0] - śr. okregu
pkt[1] - pkt na obwodzie okregu
pkt[2] - 1. pkt prostej
pkt[3] - 2. pkt prostej */

okr.a = pkt[0].x;
okr.b = pkt[0].y;
okr.r = sqrt(pow(pkt[1].x - pkt[0].x, 2) + pow(pkt[1].y - pkt[0].y , 2));


prosta.a = (pkt[3].y - pkt[2].y)/(pkt[3].x - pkt[2].x);
prosta.b = pkt[2].y - prosta.a*pkt[2].x;

a = pow(prosta.a, 2) + 1;
b = -2*(okr.a - prosta.a*prosta.b + prosta.a*okr.b);
c = pow(okr.a, 2) - pow(okr.r, 2) + pow(okr.b - prosta.b, 2);

delta = b*b - 4*a*c;

if(delta > 0.0){

	p1.x = (-b - sqrt(delta))/(2*a);
	p1.y = f(p1.x, prosta);
	p2.x = (sqrt(delta) - b)/(2*a);
	p2.y = f(p2.x, prosta);

}else
if(!delta){
	p1.x = -b/2*a;
	p1.y = f(p1.x, prosta);
}

fprintf(p, "S = (%i, %i)
punkt na obwodzie = (%i, %i)
"
	"1. pkt prostej: (%i, %i)
2. pkt prostej: (%i, %i)
",
	pkt[0].x, pkt[0].y, pkt[1].x, pkt[1].y,
	pkt[2].x, pkt[2].y, pkt[3].x, pkt[3].y);

if(delta > 0.0)
	fprintf(p, "2 punkty wspolne: (%.2f, %.2f), (%.2f, %.2f)", p1.x, p1.y, p2.x, p2.y);
else if(!delta)
	fprintf(p, "1 punkt wspolny: (%.2f, %.2f)", p1.x, p1.y);
else{
	fprintf(p, "	*Nie ma punktow wspolnych. Losuje jeszcze raz*

");
	goto powroc;
}

return 0;
}

O ile się nie machnąłem przy wyprowadzaniu wzorow wyniki powinny byc ok.
Aruna
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 12 sty 2008, o 18:40
Płeć: Kobieta
Lokalizacja: Karczew
Podziękował: 12 razy

[C++] - losowanie punktów

Post autor: Aruna »

To mam jeszcze parę pytań związanych z tym zadaniem Jako że nie wszystko jest dla mnie zrozumiałe...
tmk pisze:

Kod: Zaznacz cały

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
Czemu użyłeś "cstdio", "cstdlib", "cmath" i "ctime" Czy jest to zamiennie używane z "stdio.h", "math.h", "stdlib.h", "time.h"
tmk pisze:

Kod: Zaznacz cały

struct punkt{int x, y;};
struct pierwiastki{double x, y;};
struct okrag{int a, b;double r;};
struct s_prosta{double a, b;}; 
Tutaj mam rozumieć że chodzi o struktury... To co jest w nawiasach klamrowych zostało w tym momencie zadeklarowane
tmk pisze:

Kod: Zaznacz cały

double f(double x, s_prosta prosta){
    return prosta.a*x + prosta.b;
} 
To jest deklaracja prostej która miała przecinać trójkąt
tmk pisze:

Kod: Zaznacz cały

int los(int min, int max){
    static int i;
    i += time(0) % RAND_MAX;
    srand(time(0));
    max -= min;
    return max ? (rand()+ i) % max + min : min;
} 
Ten fragment odpowiada za losowanie liczb
tmk pisze:

Kod: Zaznacz cały

int main(){

    punkt pkt[4];
    pierwiastki p1, p2;
    okrag okr;
    s_prosta prosta;
    char i;
    double a, b, c, delta;
    FILE *p = fopen("wynik.txt", "w");
Tu też jest deklaracja wszystkiego co będzie użyte w programie, tak A ponadto jeszcze polecenie zapisania wyniku
tmk pisze:

Kod: Zaznacz cały

powroc:

for(i=0;i<4;i++){
    pkt[i].x = los(-5, 5);
    pkt[i].y = los(-5, 5);
} 
Nie wiem do czego ma służyć ten zapis. A i czy hasło "powroc" też powinno sie znajdować w strukturze :?:
tmk pisze:

Kod: Zaznacz cały

/*
pkt[0] - śr. okregu
pkt[1] - pkt na obwodzie okregu
pkt[2] - 1. pkt prostej
pkt[3] - 2. pkt prostej */
Ten fragment to informacja dla mnie, nie jest odczytywana przez program.
tmk pisze:

Kod: Zaznacz cały

okr.a = pkt[0].x;
okr.b = pkt[0].y;
okr.r = sqrt(pow(pkt[1].x - pkt[0].x, 2) + pow(pkt[1].y - pkt[0].y , 2));
Tego zapisu też nie rozumiem. Co to jest to "pow" :?: I czemu jest "pkt[0].x" a potem to samo z "y" :?: Do czego ".x", ".y" a później użyte jeszcze ".a", ".b" :?:
tmk pisze:

Kod: Zaznacz cały

prosta.a = (pkt[3].y - pkt[2].y)/(pkt[3].x - pkt[2].x);
prosta.b = pkt[2].y - prosta.a*pkt[2].x; 
Tutaj wzory wyliczające prostą.
tmk pisze:

Kod: Zaznacz cały

a = pow(prosta.a, 2) + 1;
b = -2*(okr.a - prosta.a*prosta.b + prosta.a*okr.b);
c = pow(okr.a, 2) - pow(okr.r, 2) + pow(okr.b - prosta.b, 2); 
Trójkąt :?:
tmk pisze:

Kod: Zaznacz cały

delta = b*b - 4*a*c;

if(delta > 0.0){

    p1.x = (-b - sqrt(delta))/(2*a);
    p1.y = f(p1.x, prosta);
    p2.x = (sqrt(delta) - b)/(2*a);
    p2.y = f(p2.x, prosta); 
Obliczanie pierwiastków.
tmk pisze:

Kod: Zaznacz cały

}else
if(!delta){
    p1.x = -b/2*a;
    p1.y = f(p1.x, prosta);
} 
Tego też nie rozumiem...
tmk pisze:

Kod: Zaznacz cały

fprintf(p, "S = (%i, %i)
punkt na obwodzie = (%i, %i)
"
    "1. pkt prostej: (%i, %i)
2. pkt prostej: (%i, %i)
",
    pkt[0].x, pkt[0].y, pkt[1].x, pkt[1].y,
    pkt[2].x, pkt[2].y, pkt[3].x, pkt[3].y);

if(delta > 0.0)
    fprintf(p, "2 punkty wspolne: (%.2f, %.2f), (%.2f, %.2f)", p1.x, p1.y, p2.x, p2.y);
else if(!delta)
    fprintf(p, "1 punkt wspolny: (%.2f, %.2f)", p1.x, p1.y);
else{
    fprintf(p, "	*Nie ma punktow wspolnych. Losuje jeszcze raz*

");
    goto powroc;
}

return 0;
} 
Końcówka chyba jasna.

Jeśli w czymś sie walnęłam/źle zinterpretowałam to proszę o poprawienie
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

[C++] - losowanie punktów

Post autor: tmk »

1. Ponieważ w C++ używa się literki 'c'(np. ) przed nazwa biblioteki, a w C normalna nazwę pliku(np. ) jeśli byś napisała, że to ma być w C to trzeba wtedy zmienić te nazwy na takie które podałaś: , itd

2. Tak to struktury, ale to tylko ich deklaracje wieć nie zostało teraz zdefiniowane. Zdefiniowane(komputer zaalokowal na nie pamieć) zostało na początku funkcji main() poprzez "nazwa_strukruty zmienna" np. punkt pkt[4], s_prosta prosta.

3. *ZONK* chyba nie zrozumiałem polecenia :) O jaki trójkąt chodzi? Jakie punkty są jego wierzchołkami? Bo on się tak ni stąd ni zowąd pojawił w treści to myślałem, że się pomyliłaś i napisałaś 'trojkat' zamiast 'okreg'. Także u mnie prosta przecina okreg i liczy wpolrzedne punktow w ktorych prosta ma punkt wspolny z okregiem. A co do funkcji f to ona zwraca wartosc y = ax + b gdzie x to argument funkcji, a zmienna 'prosta' jako drugi argument zawiera wspolczynnik a i wyraz wolny b tej funkcji potrzebny do obliczenia wartości funkcji.

4. Tak.

5. Tak, tu jest deklaracja wszystkich zmiennych, ktore komputer uzyje do liczenia i tworzony jest plik do zapisu.

6. Te słowo 'powroć' to tzw. kotwica. To od tego momentu program zaczyna losować liczby po użyciu pod koniec instrukcji 'goto powroc'. Program wtedy poprostu wraca do tego momentu gdzie znajduje się nazwa kotwicy. Wiecej na ten temat znajdziesz na googlach. Pierwszy lepszy link:

7.Tak, to tylko komentarz.

8. pow(od power) to funkcja podnosząca do potegi np. pow(2, 4) da nam 2^4 = 16, pow(3, 2) = 9. sqrt to pierwiastkowanie jak coś.
pkt[0] jest zmienna typu 'punkt' wiec posiada wewnatrz pola x i y (tak jak to zostalo zdeklarowane na samej gorze.
Tu jest to lepiej wyjasnione:

9. Tak, obliczany jest wspolczynnik i woraz wolny prostej.

10. Nie, to nie trojkat :P . Jeśli chciałem policzyć pkty wspolne prostej z okregiem to we wzorze na okreg za y podstawilem y = ax + b czyli nasza prosta. Te rownanie po uporządkowaniu ma postać rownania kwadratowego gdzie jego pierwiastkami sa iksy tychże punktow wspolnych. Wiec to są wspolczynniki tego rownania. Ale że chodzi o jakis trojkąt o ktorym nic nie wiem to ten kod jest na nic. Na pewno chodziło o trojkat? ;) Jak tak to o jaki.

11. Tak.

12. if(!delta) jest rownowazne z if(delta == 0.0) - sprawdzam czy delta rowna jest zero , jak tak to obliczam 1 tylko pierwiastek.

13. Wpis do pliku.

Rzeczywiście mogłem użyć komentarzy, żebyś lepiej zrozumiała kod, ale teraz chyba się coś objaśniło :)
Aruna
Użytkownik
Użytkownik
Posty: 34
Rejestracja: 12 sty 2008, o 18:40
Płeć: Kobieta
Lokalizacja: Karczew
Podziękował: 12 razy

[C++] - losowanie punktów

Post autor: Aruna »

tmk pisze:1. Ponieważ w C++ używa się literki 'c'(np. ) przed nazwa biblioteki, a w C normalna nazwę pliku(np. ) jeśli byś napisała, że to ma być w C to trzeba wtedy zmienić te nazwy na takie które podałaś: , itd
Mówię że sie nie znam, ponoć wykłady z C++ a komendy jednak "stdio.h" itd.
tmk pisze:

Kod: Zaznacz cały

O jaki trójkąt chodzi? Jakie punkty są jego wierzchołkami? Bo on się tak ni stąd ni zowąd pojawił w treści to myślałem, że się pomyliłaś i napisałaś 'trojkat' zamiast 'okreg'.
tmk pisze:

Kod: Zaznacz cały

Ale że chodzi o jakis trojkąt o ktorym nic nie wiem to ten kod jest na nic. Na pewno chodziło o trojkat? ;) Jak tak to o jaki. 
No w poleceniu było podane "trójkąt". Chyba że i wykładowca sie rozpędził i coś źle podał. A może chodzi o trójkąt punkty prostej - środek okręgu. I czy przetnie go punkt tworzący ze środkiem promień. Troche chyba zagmatwałam.
tmk
Użytkownik
Użytkownik
Posty: 25
Rejestracja: 18 paź 2007, o 19:36
Płeć: Mężczyzna
Lokalizacja: Ustka
Podziękował: 1 raz
Pomógł: 8 razy

[C++] - losowanie punktów

Post autor: tmk »

A to jak na wykladach było podane, że stdio.h to możesz tak zmienić, kompilator będzie includował tę samą bibliotekę w obu przypadkach.

Jakby tam zamiast trójkąta był okręg to to by mialo wtedy sens, bo dla trojkata trzeba obliczac pkty wspolne osobno dla kazdego boku, będący odcinkiem, a nie prostą wiec to kolejne utrudnienie - wtedy to rzeczywiście można nazwać 'głęboka woda' ;)
Awatar użytkownika
Undre
Użytkownik
Użytkownik
Posty: 1430
Rejestracja: 15 lis 2004, o 02:05
Płeć: Mężczyzna
Lokalizacja:
Podziękował: 3 razy
Pomógł: 92 razy

[C++] - losowanie punktów

Post autor: Undre »

Aruna pisze:
tmk pisze:1. Ponieważ w C++ używa się literki 'c'(np. ) przed nazwa biblioteki, a w C normalna nazwę pliku(np. ) jeśli byś napisała, że to ma być w C to trzeba wtedy zmienić te nazwy na takie które podałaś: , itd
Mówię że sie nie znam, ponoć wykłady z C++ a komendy jednak "stdio.h" itd.
aby być trendy i ISO przede wszystkim, zamiast stdio.h w C++ pisze się cstdio - frontowa literka c symbolizuje iz jest to biblioteka starego C, jest jak pewnie wiesz dostepna w C++ jako ze C++ to "nadzbior" C :P

a co do struktur, to mozna tez stworzyc sobie jakas strukturke przy jej deklaracji :

Kod: Zaznacz cały

struct nazwa_struktury { zawartosc :P } nazwa_obiektu ;
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

[C++] - losowanie punktów

Post autor: kadiii »

To ja ze swojej strony tylko dodam, skoro niejako istota problemu została chyba wyczerpana, że nie jest dobrym pomysłem używanie instrukcji goto, szczególnie wtedy kiedy łatwo ją zastąpić prostym warunkiem w pętli. Nietrudno zauważyć, że w programie chcemy losować dopóki delta
ODPOWIEDZ