[C++] - losowanie punktów
-
- Użytkownik
- Posty: 34
- Rejestracja: 12 sty 2008, o 18:40
- Płeć: Kobieta
- Lokalizacja: Karczew
- Podziękował: 12 razy
[C++] - losowanie punktów
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.
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.
-
- 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
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 ;]
O ile się nie machnąłem przy wyprowadzaniu wzorow wyniki powinny byc ok.
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;
}
-
- Użytkownik
- Posty: 34
- Rejestracja: 12 sty 2008, o 18:40
- Płeć: Kobieta
- Lokalizacja: Karczew
- Podziękował: 12 razy
[C++] - losowanie punktów
To mam jeszcze parę pytań związanych z tym zadaniem Jako że nie wszystko jest dla mnie zrozumiałe...
Jeśli w czymś sie walnęłam/źle zinterpretowałam to proszę o poprawienie
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
#include<cstdio> #include<cstdlib> #include<cmath> #include<ctime>
Tutaj mam rozumieć że chodzi o struktury... To co jest w nawiasach klamrowych zostało w tym momencie zadeklarowanetmk 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;};
To jest deklaracja prostej która miała przecinać trójkąttmk pisze:Kod: Zaznacz cały
double f(double x, s_prosta prosta){ return prosta.a*x + prosta.b; }
Ten fragment odpowiada za losowanie liczbtmk 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; }
Tu też jest deklaracja wszystkiego co będzie użyte w programie, tak A ponadto jeszcze polecenie zapisania wynikutmk 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");
Nie wiem do czego ma służyć ten zapis. A i czy hasło "powroc" też powinno sie znajdować w strukturzetmk pisze:Kod: Zaznacz cały
powroc: for(i=0;i<4;i++){ pkt[i].x = los(-5, 5); pkt[i].y = los(-5, 5); }
Ten fragment to informacja dla mnie, nie jest odczytywana przez program.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 */
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
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));
Tutaj wzory wyliczające prostą.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;
Trójkąttmk 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);
Obliczanie pierwiastków.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);
Tego też nie rozumiem...tmk pisze:Kod: Zaznacz cały
}else if(!delta){ p1.x = -b/2*a; p1.y = f(p1.x, prosta); }
Końcówka chyba jasna.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; }
Jeśli w czymś sie walnęłam/źle zinterpretowałam to proszę o poprawienie
-
- 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
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 . 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
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 . 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
-
- Użytkownik
- Posty: 34
- Rejestracja: 12 sty 2008, o 18:40
- Płeć: Kobieta
- Lokalizacja: Karczew
- Podziękował: 12 razy
[C++] - losowanie punktów
Mówię że sie nie znam, ponoć wykłady z C++ a komendy jednak "stdio.h" itd.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
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'.
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 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.
-
- 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
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'
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'
- Undre
- Użytkownik
- Posty: 1430
- Rejestracja: 15 lis 2004, o 02:05
- Płeć: Mężczyzna
- Lokalizacja: UĆ
- Podziękował: 3 razy
- Pomógł: 92 razy
[C++] - losowanie punktów
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" CAruna pisze:Mówię że sie nie znam, ponoć wykłady z C++ a komendy jednak "stdio.h" itd.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
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 ;
- kadiii
- 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
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