Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Projket.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include <iostream>
- #include <conio.h>
- #include <math.h>
- using namespace std;
- //protip: szybkie zakomentowanie zaznaczonego kodu = ctrl+K a potem ctrl+C (możesz bez puszczania ctrl to robić :> )
- //szybkie odkomentowywanie = ctrl+K a potem ctrl+U
- //"justowanie" kodu = ctrl+K a potem ctrl+D
- //http://kondel.dx.am/?pid=17 tu poczytaj sobie co to jest struktura (ale tylko pierwszy akapit, konstruktory i resztę olej)
- //albo tutaj http://www.algorytm.edu.pl/struktury-unie-pola-bitowe-wyliczenia/struktury-w-c-struct.html aż do "Odwoływanie się do elementów składowych" włącznie - a i nie zapamiętuj tego ich "drugiego sposobu tworzenia zmiennej typu strukturalnego" bo jest do dupy
- //możesz poczytać też sam na necie ale poza tymi dwoma nie znalazłem w pierwszej stronie wyszukiwania google nic przystępnego
- int main()
- {
- struct wierzcholek
- {
- int x, y;
- };
- int ilosc;
- int i;
- float obwod = 0; //od razu przypiszemy że zero a potem będziemy dodawac kolejne boki
- float roznicaY, roznicaX, tangens, poprzedniTangens;
- bool takiSamTangens, tenSamWierzcholek; //zmienna która może przyjmować "prawda" lub "fałsz"
- //generalnie wpadlem-wpadlismy na dwa wyjatki - gdy wszystkie wierzcholki ukladaja sie na jednej prostej
- //lub wszystkie wierzcholki sa takie same ("figurą" byłby punkt)
- //co do leżenia na prostej skoro galewski pozwolił założyć że podawane wierzchołki są kolejnymi wierzchołkami figury
- //więc chyba najwygodniej będzie sprawdzać tangens każdego kolejnego boku
- //co do punktu będzie łatwiej, wystarczy sprawdzać czy jakikolwiek kolejny punkt różni się od poprzedniego
- //...i do tego przydadzą się te dwa boole; założymy na początku programu że oba są prawdą
- //potem będziemy sprawdzali czy tangens/współrzędne badanych wierzchołków/wierzchołka są takie same jak poprzedniego
- //jeśli choć raz będzie się różnić - zmienimy odpowiedni bool na false i tak zostanie już do końca sprawdzania
- //no ale to wszystko już za chwilę
- //dobra idziemy dalej
- wierzcholek tablica[20];
- //deklaracja tablicy wierzchołków z 20 miejscami na wierzchołki; galewski zrobił limit 20 wierzchołków więc nie ma co się spuszczać nad jakimiś dynamicznymi czy coś
- //btw. deklaracja to to utworzenie np.: "int sraka;" to deklaracja - ważne słówko
- //drugie ważne to inicjalizacja i to jest np "sraka = 8;" czyli nadanie wartości zmiennej
- //jak napiszesz "int sraka=8;" to to jest deklaracja z inicjalizacją, warto zapamiętać
- //dobra wracam do tematu
- //struktura to jakby taki twój sztuczny typ danych, jak int lub char, zachowuje sie zupelnie tak samo
- //tak o wiele wygodniej przechowywać współrzędne wierzchołka i jest to bardziej uporządkowane
- do {
- cout << "----------------------------------------------" << endl << "Podaj ilosc wierzcholkow wielokata: (minimum 3, maksymalnie 20) ";
- cin >> ilosc;
- if (ilosc < 3) //sprawdzenie czy wpisano chociaż 3 wierzchołki żeby móc utworzyć trójkąt (chociaż w sumie odcinek to też figura więc ja bym dał "ilosc<2" )
- { //jeśli wpisano poniżej 3, wyświetla się komunikat
- cout << endl << "Liczba wierzcholkow wielokata nie moze byc mniejsza od 3! Sprobuj ponownie." << endl << endl << endl << endl;
- }
- } while (ilosc < 3); //jeśli nie wpisano przynajmniej 3 to chcemy aby pętla ruszyła od nowa a pytanie o liczbe wierzchołków się powtórzyło, do skutku
- cout << endl << "Podaj wspolrzedne kolejnych wierzcholkow.";
- for (i = 0; i < ilosc; i++)
- {
- //printf("\nWierzcholek nr %i:\nx: ", i + 1);
- cout << endl << "Wierzcholek nr " << i + 1 << endl << "x: "; //"i +1" a nie samo "i" bo c++ liczy od 0 w górę a człowiek od 1 więc trzeba sztucznie zwiększyć XD
- cin >> tablica[i].x; //każde pole tablicy naszej struktury "wierzchołek" ma jakby dwa pola - x i y;
- //napisanie np "tablica[8].x=5;" oznacza że pod dziewiątym miejscem tablicy iks będzie 5 (o igreku jeszcze nic nie wiadomo)
- cout << "y: ";
- cin >> tablica[i].y; //analogia, naturalnie
- }
- takiSamTangens = true; //tu się dzieje to co mówiłem wcześniej - zaplanujemy to tak że nie będziemy próbowali dowieść że leżą na prostej
- //bo wtedy trzeba potem by było sprawdzać każdy punkt czy na niej leży
- //tutaj łatwiej sprawdzić czy chociaż jeden wierzchołek nie leży
- tenSamWierzcholek = true; //z punktem identyko
- for (i = 0; i < ilosc - 1; i++) //pętla. tu sprawdzimy czy są na prostej/w punkcie czy też nie, w końcu od słów do czynów
- //dlaczego "ilosc-1" a nie "ilosc" dowiesz się za chwilę
- {
- if (i != 0) //tutaj będziemy sobie zapisywali tangens który obliczyliśmy dla poprzedniej pary wierzchołków
- { //po co ten warunek? jeśli pętla robi pierwsze koło to tangens nie ma jeszcze żadnej wartości
- poprzedniTangens = tangens;
- }
- if (i < ilosc - 1) //okej, skupmy się nie na warunku (o tym jeszcze jeszcze później), najpier to co jest wewnątrz
- {
- if ((tablica[i + 1].x - tablica[i].x != 0) || (tablica[i + 1].y - tablica[i].y != 0))
- //powyższy warunek to sprawdzenie czy figura nie będzie punktem
- //w tym warunku mamy tak naprawdę dwa warunki - kreski || oznaczają lub więc wystarczy żeby jeden z nich był spełniony
- //działa on tak że sprawdza czy współrzędna iksowa kolejnego punktu w tablicy różni się jakkolwiek od tej którą teraz badamy
- //tak samo współrzędna igrekowa - jeśli chociaż jedna z nich będzie prawdą warunek się spełni
- {
- tenSamWierzcholek = false; //a wtedy nadamy temu fałsz i gotowe
- //w programie nie ma sposobu żeby ta wartość z powrotem w jakiś sposób uzyskała wartość true
- //więc tyle nam wystarczy - a czy tylko raz zostanie jej nadane false czy się okaże że każdy punkt się różni od poprzedniego
- //i to false zostanie jej nadane choćby 20 razy - nie ważne; punktem na pewno nie jest a o to nam chodzi
- }
- roznicaY = tablica[i + 1].y - tablica[i].y; //to było o punkcje, tutaj tangens
- roznicaX = tablica[i + 1].x - tablica[i].x; //teraz liczymy jaka jest odleglosc na kazdej wspolrzednej pomiędzy wierzcholkiem
- tangens = roznicaY / roznicaX; //na ktory akurat wskazuje pętla a wierzcholkiem kolejnym po niej
- }
- else {
- //oo, tutaj ci powiem dlaczego było (ilosc-1)
- //obojętnie czy badaliśmy wierzchołki dla warunku na punkt lub na prostą
- //jeśli badaliśmy kolejne wierzchołki i KOLEJNY PO NIM to wszystko działało tak długo
- //...aż nie chcielibyśmy sprawdzić kolejnego wierzchołka - bo po nim nie ma już kolejnego
- //dlatego ta ilosc była pomniejszona o 1 - bo stosując tamten algorytm, mając figurę o dwunastu wierzchołkach
- //sprawdzając dwunasty wierzchołek chcielibyśmy go porównać z kolejnym... czyli trzynastym
- //dlatego to else - jeśli trafiamy na ostatni wierzchołek to nie przechodzi nam on już naszego warunku (ilosc-1)
- //i jest jedynym wierzchołkiem który trafi do else i zamiast być porównany z kolejnym, zostanie porównany z pierwszym
- //no wiesz, w kwadracie porównane byłby wierzchołki nr 1 z 2, 2 z 3, 3 z 4 ale 4 już z 1
- if ((tablica[i].x - tablica[0].x != 0) || (tablica[i].y - tablica[0].y != 0)) //ciąg dalszy warunku na punkt
- { //warunek lustrzany do tamtego, po prostu kolejnym wierzchołkiem jest ten pierwszy figury (indeksu 0)
- tenSamWierzcholek = false;
- }
- roznicaY = tablica[i].y - tablica[0].y; //...i ciąg dalszy warunku na prostą, identyko no
- roznicaX = tablica[i].x - tablica[0].x;
- tangens = roznicaY / roznicaX;
- }
- if (i != 0) //okej, pamiętasz jak pisałem że będziemy zapisywali sobie tangens wcześniej obliczony? (linie 82-85)
- //chodziło o to żeby przechować wartość tangensa obliczonego dla poprzedniej pary punktów
- //policzyć kolejny tangens i sprawdzić czy jakkolwiek różni się od poprzedniego
- //noo, i tu go w końcu porównamy
- //PS (i!=0) tak jak wtedy - aby nie sprawdzany był warunek przy pierwszym uruchomieniu
- //bo NIEZAINICJALIZOWANY "poprzedniTangens" miałby pewnie jakąś kosmiczną wartość
- //i całe szukanie chociaż jednego wyjątku szlag by trafił
- {
- if (abs(poprzedniTangens) != abs(tangens)) //sprawdzamy czy tangens poprzedni różni się od nowo obliczonego
- //abs(cośtam) oznacza wartość bezwzględną liczby (dołączona biblioteka math.h)
- //po chuj ten moduł? a no po to że gdyby podać trzy wierzchołki
- //(1,2),(2,4),(3,6) to tangensy między 1 a 2 i między 2 a 3 byłyby 2 i 2
- //ale już pomiędzy (1,2),(3,6),(2,4) byłyby 2 i -2
- //także na baczności (btw jakbyś wymyślił jeszcze jakieś niesnaski, gdziekolwiek, to alarmuj)
- {
- takiSamTangens = false; //jeśli znajdzie się choć jeden - fałsz!
- }
- }
- }
- //okej, sprawdziliśmy już czy leży na prostej lub jest punktem
- //przechodzimy do liczenia obwodu :>
- for (i = 0; i < ilosc - 1; i++)
- //boki liczymy klasycznie z pitagorasa i dodajemy do ogólnej puli obwodu
- {
- float bok;
- bok = sqrt((tablica[i + 1].x - tablica[i].x)*(tablica[i + 1].x - tablica[i].x) + (tablica[i + 1].y - tablica[i].y)*(tablica[i + 1].y - tablica[i].y));
- obwod += bok; //to to samo co "obwod=obwod+bok;", krócej zapisane
- }
- //oczywiście znowu jest problem z ostatnim punktem który tworzy bok z pierwszym, dlatgo dodajemy go już "ręcznie"
- obwod += sqrt((tablica[ilosc - 1].x - tablica[0].x)*(tablica[ilosc - 1].x - tablica[0].x) + (tablica[ilosc - 1].y - tablica[0].y)*(tablica[ilosc - 1].y - tablica[0].y));
- if (!tenSamWierzcholek)
- {
- //wykrzyknik oznacza odwrotność, więc jeśli startowaliśmy (linia 77) że tenSamWierzcholek=true i faktycznie wszystkie wierzcholki bylyby takie same
- //to (!tenSamWierzcholek) == false i zamiast wykonać ifa to przejdzie do elsa
- cout << "Obwod figury to " << obwod;
- if (takiSamTangens)
- {
- //generalnie odcinek jest figurą, a galewski to spryciula, więc ja bym to zostawił tak jak jest
- //ale pewnie on tego nie uznaje jako figurę aby sprawdzić warunek :D
- //mimo wszystko jeśli wykonałeś istotę sprawdzania czy to odcinek to nie powinien sapać - i chwała mu za to
- //ale jeśli chcesz to niżej mam wersję w której odcinek nie jest figurą (linie 172-185), odkomentuj i podmień je zamiast linii (154-170) aż do _getch()
- cout << endl << "Uwaga! Zadane wierzcholki leza na jednej prostej i tworza odcinek (ktory wedlug definicji jest wielokatem).";
- }
- }
- else {
- cout << "Wszystkie podane wierzcholki maja te same wspolrzedne i tworza punkt. Punkt nie jest wielokatem!";
- }
- //if ((!tenSamWierzcholek) && (!takiSamTangens))
- //{ //tak jak || znaczy LUB, tak && oznacza AND
- // cout << "Obwod figury to " << obwod;
- //}
- //else {
- // if (takiSamTangens)
- // {
- // cout << "Podane wierzcholki leza na jednej prostej i nie tworza wielokata.";
- // }
- // else
- // {
- // cout << "Podane wierzcholki maja te same wspolrzedne, tworza punkt, ktory nie jest wielokatem.";
- // }
- //}
- //yo
- _getch();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement