• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kalkulator do liczenia pól figur płaskich

0 głosów
2,110 wizyt
pytanie zadane 2 października 2018 w Nasze projekty przez Karol Kotyński Nowicjusz (120 p.)
Witam serdecznie, stworzyłem ostatnio kalkulator do liczenia pól figur płaskich (w Visual Studio). Jakbym mógł prosić o opinie na temat kodu, co zmienić, co jest niepotrzebne itp.

https://github.com/karol1111/Areas_calculator

Serdecznie dziękuję.

5 odpowiedzi

+1 głos
odpowiedź 2 października 2018 przez Secrus Nałogowiec (32,880 p.)
Ze klasy masz w osobnych plikach to super, ale każda klasa powinna mieć swój osobny plik. Poza tym, co ma oznaczać nazwa pliku "pch"? Poza tym, w programowaniu stosujemy angielskie nazewnictwo. No i jak nazywasz zmienne to nadawaj im sensowne nazwy, a nie "a" "aa" itp, bo wracając za miesiąc do kodu, nie będziesz wiedział co znaczą poszczególne nazwy.
komentarz 2 października 2018 przez Karol Kotyński Nowicjusz (120 p.)
Okej dziękuję, dobre uwagi.
+1 głos
odpowiedź 2 października 2018 przez niezalogowany
edycja 3 października 2018

Obiekt danej klasy możesz tworzyć w krótszy sposób:

#include "pch.h"
#include <iostream>
#include <string>

using namespace std;

int main()
{
	for (bool is_end_loop = false; !is_end_loop;)
	{
		cout << "1. Trojkat" << endl;
		cout << "2. Trojkat rownoboczny" << endl;
		cout << "3. Prostokat" << endl;
		cout << "4. Kwadrat" << endl;
		cout << "5. Rownoleglobok" << endl;
		cout << "6. Romb" << endl;
		cout << "7. Kolo" << endl;
		cout << "0. Wyjscie" << endl;
		cout << "Wybierz numer: ";

		int nr;
		cin >> nr;

		Fig_plaskie *figura;
		switch (nr)
		{
		case 1:
			figura = new Trojkat;
			break;
		case 2:
			figura = new Trojkat_row;
			break;
		case 3:
			figura = new Prostokat;
			break;
		case 4:
			figura = new Kwadrat;
			break;
		case 5:
			figura = new Rownoleglobok;
			break;
		case 6:
			figura = new Romb;
			break;
		case 7:
			figura = new Kolo;
			break;
		case 0:
			is_end_loop = true;
			continue;
		default:
		{
			cout << "Nie ma takiego numeru\n\n";
			return 1;
		}
		}

		figura->sprawdzamy();
		figura->pole();
		cout << endl;
        delete figura;
	}
	return 0;
}

Nie używaj goto. Używaj override (pomaga unikać błędów). Klasa bazowa Fig_plaskie powinna mieć wirtualny destruktor. Inaczej gdybyś wykonał delete na Fig_plaskie* to oznacza UB, a w konsekwencji w większości implementacji niewykonanie destruktora klasy pochodnej (+ możliwy wyciek pamięci gdyby takową miałby zwalniać). 

Używaj listy inicjacyjnej:

Trojkat::Trojkat(string n, float a, float h)
	:nazwa(n), a(a), h(h)
{}

Pobieranie danych od użytkownika bardzo często się pojawia. Byłoby dobrze wydzielić taki fragment do osobnej funkcji (plik pch.cpp zostanie uszczuplony o 100 linii kodu):

float getInput(const string& msg, const string& name)
{
	float number;
	bool is_bad = true;
	do
	{
		cout << msg << name << ": ";
		if (cin >> number)
			is_bad = false;
		cin.clear();
		cin.ignore(numeric_limits<streamsize>::max(), '\n');
	} while (is_bad);
	return number;
}

Przykład z użyciem dla trójkąta:

}
void Trojkat::sprawdzamy()
{
	cout << "Podaj nazwe " << nazwa << ": ";
	cin >> nazwa;

	a = getInput("Podaj podstawe ", nazwa);
	h = getInput("Podaj wysokosc ", nazwa);
}

W kolejnych projektach staraj się rozdzielać warstwę logiki od wczytywania i wyświetlania informacji. Przykładowo teraz każda metoda o nazwie 'pole' zawiera:

cout << endl << "Pole " << nazwa << " wynosi: " << a * h << endl;

Figury mogłyby mieć dodatkowo funkcje zwracające pole i nazwę. Przykład użycia w main (bez powtarzania każdorazowo w każdej z klas):

cout << "\nPole " << figura->getName() << " wynosi: " << figura->area() << "'n";
komentarz 3 października 2018 przez Karol Kotyński Nowicjusz (120 p.)
Super, dziękuję bardzo za informacje!
0 głosów
odpowiedź 2 października 2018 przez Poczprogramista123 Bywalec (2,900 p.)
To jest prosty program wiec nie ma zbytnio co oceniac ale wszystko jest ok. Polimorfizm na plus
0 głosów
odpowiedź 2 października 2018 przez Tomek Sochacki Ekspert (227,490 p.)
Koledzy napisali ocenę, ja nie znam C++ więc o kodzie się nie wypowiem, ale mogę podsunąć pomysł na rozbudowę. W tej chwili wybierasz między figurami, a może dać też opcję dowolnej figury płaskiej (na początek) np. poprzez podawanie kolejnych wierzchołków X,Y i oblicz pole takiej dowolnej figury :) Wbrew pozorom nie jest to trudne, w necie jest masa algorytmów, pokombinuj :)
komentarz 2 października 2018 przez Karol Kotyński Nowicjusz (120 p.)
A to nawet ciekawe jest :D
komentarz 2 października 2018 przez Tomek Sochacki Ekspert (227,490 p.)
i wbrew pozorom wcale nie takie trudne :) A ponad to może w przyszłości jakaś wizualizacja graficzna, np. podajesz x,y i zaznacza Ci kolejne punkty na współrzędnych, kreśli linie miedzy kolejnymi itp. Teoretycznie może wydawać sie skomplikowane, ale jeśli faktycznie byś się w to wgłębił to jest to całkiem proste :)

Jak gdy się uczyłem programowania to lubiłem bawić się w algorytmikę, m.in. przez jakiś czas bawiłem się na CodeWars (dopóki nieco nie popsuło się towarzystwo i wszystkie zmiany zaczęły się robić mocno problematyczne... ale mimo wszystko polecam do nauki).

To rozwija bo po pierwsze uczysz się praktycznie róznych pętli, funkcji itp. wraz z ich optymalizacją, a po drugie uczy szukania informacji w necie. Możesz mi wierzyć lub nie, ale w pracy programisty nie jest problemem np. zakodowanie systemu logowania od strony technicznej, ale problemem jest wykombinowanie całej struktury, całego flow danego rozwiązania. Wracając tutaj, nie jest problemem zakodować algorytm w dowolnym języku, problemem jest znalezienie dobrego algorytmu i przeanalizowanie warunków brzegowych itp.

Powodzenia i czekam na drugi etap apki do review :)
0 głosów
odpowiedź 3 października 2018 przez obl Maniak (51,300 p.)

Swego czasu zrobiłem program, w którym liczy się pole powierzchni dowolnego wielokąta płaskiego, którego boki nie przecinają się. Dodatkowo program oblicza środek ciężkości takiego wielokąta. Jak chcesz możesz się pobawić programem, który opisałem na mojej stronie tutaj

Co do kodu to warto od samego początku używać nazw angielskich. Przecież przetłumaczenie tak prostych słówek zajmie ci chwilkę a przy okazji nauczysz się w przyjemny sposób angielskiego. Nazwa pliku cpp i h nie wiele mówiąca o zawartości. Każda klasa powinna być w oddzielnym pliku.

komentarz 3 października 2018 przez Karol Kotyński Nowicjusz (120 p.)
Dziękuję bardzo, na pewno skorzystam.

Podobne pytania

0 głosów
0 odpowiedzi 1,480 wizyt
pytanie zadane 4 listopada 2020 w C i C++ przez Bartosz007 Nowicjusz (120 p.)
+1 głos
2 odpowiedzi 778 wizyt
pytanie zadane 29 września 2015 w C i C++ przez patrykblu Nowicjusz (160 p.)
0 głosów
1 odpowiedź 453 wizyt

93,426 zapytań

142,421 odpowiedzi

322,647 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...