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

Ocena kodu - waluty

Object Storage Arubacloud
0 głosów
159 wizyt
pytanie zadane 16 czerwca 2019 w C i C++ przez amelia.cpp Obywatel (1,860 p.)

Cześć wszystkim!

Prosiłabym o ocene poniższego kodu. Konwertuje on podaną kwotę w PLN na daną walute i odwrotnie.

Rady i przykłady lepszego kodu mile widziane wink

 

#include <iostream>
#include "waluty.h"
#include "funkcje.h"

using namespace funkcje;


int main()
{
	while(true)
	{
		switch (menu())
		{
		case 'a':
		{
			waluty* dolar = new USD;
			wybierz_czynnosc(dolar);
			delete dolar;
			break;
		}
		case 'b':
		{
			waluty* funt = new GBP;
			wybierz_czynnosc(funt);
			delete funt;
			break;
		}
		case 'c':
		{
			waluty* euro = new EUR;
			wybierz_czynnosc(euro);
			delete euro;
			break;
		}
		case 'd':
		{
			std::cout << "\nDo widzenia!\n";
			exit(0);
			break;
		}
		}
	} 

	return 0;
}
#include <iostream>
#include <ctype.h> 
#include <iomanip>

namespace funkcje
{
	char akcja()
	{
		using namespace std;
		cout << "Wybierz akcje: \n";
		cout << "a) konwertuj na walute\n";
		cout << "b) konwertuj na PLN\n";
		char ch;
		cout << "==> ";
		cin >> ch;
		return tolower(ch);
	}

	char menu()
	{
		using namespace std;
		cout << "Wybierz walute:\n";
		cout << "---------------------------\n";
		cout << "a) USD\n";
		cout << "b) GBP\n";
		cout << "c) EUR\n";
		cout << "d) zakoncz\n";
		char ch;
		cout << "==> ";
		cin >> ch;
		return tolower(ch);
	}

	void convert(waluty*object)
	{
			std::cout << "Podaj kwote w PLN: ";
			std::cin >> object->money;
			std::cout << std::setprecision(2) << object->konwertuj() << std::endl << std::endl;
			object->money = 0;
	}

	void to_PLN(waluty*object)
	{
			std::cout << "Podaj kwote w walucie: ";
			std::cin >> object->money;
			std::cout << std::setprecision(3)<<object->konwertuj_na_pln()<< std::endl<<std::endl;
			object->money = 0;
	}

	void wybierz_czynnosc(waluty* object)
	{
		switch (akcja()) {
		case 'a':
		{
			convert(object);
			break;
		}
		case 'b':
		{
			to_PLN(object);
			break;
		}
		}
	}
}
#pragma once
class waluty
{
public:
	double money = 0;
	virtual double konwertuj() = 0;
	virtual double konwertuj_na_pln() = 0;
};

class USD : public waluty
{
public:
	double konwertuj()
	{
		return money / 3.81;
	}
	double konwertuj_na_pln()
	{
		return money * 3.78;
	}
};

class GBP :public waluty
{
public:
	double konwertuj()
	{
		return money / 4.80;
	}
	double konwertuj_na_pln()
	{
		return money * 4.76;
	}
};

class EUR :public waluty
{
public:
	double konwertuj()
	{
		return money / 4.28;
	}
	double konwertuj_na_pln()
	{
		return money * 4.25;
	}
};

 

1 odpowiedź

+2 głosów
odpowiedź 16 czerwca 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 16 czerwca 2019 przez amelia.cpp
 
Najlepsza
Tak na szybko:

- nie ma potrzeby, żeby alokować obiekty walut dynamicznie

- (w zasadzie nie ma potrzeby żeby te klasy trzymały liczby, równie dobrze to mogłyby być metody konwertuj(double))

- trochę dziwne, że wiedza o opcjach a/b/c/d jest podzielona między funkcją `menu()` a main'em.

- nie używaj exit(), wystarczyło `return 0`.

- trochę przemieszany język tego kodu między polskim i angielskim

- jeśli metody nie mutują obiektu, fajnie gdyby były `const`.

- rekomenduję dodać override i final do definicji klas dziedziczących po `waluty`

- to bardziej ciekawostka niż uwaga: w "prawdziwym" sofcie działającym na pieniądzach, zazwyczaj unika się przechowywania wartości pieniężnych w zmiennych typu zmiennoprzecinkowego (float, double), bo łatwo wtedy o przypadkowe błędy precyzji.
komentarz 16 czerwca 2019 przez amelia.cpp Obywatel (1,860 p.)
	void wybierz_czynnosc(/*const/* waluty* object)
	{
		switch (akcja()) {
		case 'a':
		{
			convert(object);    //jeżeli odkomentujemy const tu jest
                                //błąd        
			break;
		}
		case 'b':
		{
			to_PLN(object);     //tutaj również
			break;
		}
		}
	}
}

Da się tu dać const?

1
komentarz 16 czerwca 2019 przez adrian17 Ekspert (344,860 p.)

Miałem na myśli, od samej klasy:

class waluty
{
public:
    double money = 0;
    virtual double konwertuj() const = 0;
    virtual double konwertuj_na_pln() const = 0;
};
 
class USD final : public waluty
{
public:
    double konwertuj() override const
    {
        return money / 3.81;
    }

etc etc.

Tak gdzie Ty wpisałeś, obecnie nie można, bo `convert` zmienia pole klasy.

Podobne pytania

0 głosów
1 odpowiedź 284 wizyt
pytanie zadane 30 lipca 2019 w Nasze projekty przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 16 maja 2019 w Nasze projekty przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
2 odpowiedzi 192 wizyt
pytanie zadane 3 stycznia 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...