Hogyan írjak meg egy mértékegység átváltó programot c#-ban?
Egy konvertáló programot szeretnék csinálni c#-ban pl méterről centiméterre. Az alapötlet hogy megadom textboxban vagy numericupdown-ban egy értéket, 2 combobox segítségével meghatározom hogy mit mire szeretnék átváltani és végül egy labelben kiíratni.
Eddig jutottam ha akár egy példát tudnátok adni nagyon sokat segítene.
:D "rohadt sok if" aha, ja, máshogy nem is lehet. Sőt, gondold csak el mennyi if lehet egy windowsban? Erről az jut eszembe, mikor c-ben az volt a feladat, hogy írja ki 1-től 10-ig a számokat, erre a gyík ezt írta:
printf("%d\n", 1);
printf("%d\n", 2);
printf("%d\n", 3);
printf("%d\n", 4);
printf("%d\n", 5);
printf("%d\n", 6);
printf("%d\n", 7);
printf("%d\n", 8);
printf("%d\n", 9);
printf("%d\n", 10);
:DD
De nem dumálok bele, csináld csak "rohadt sok if el"...
Hello! A váltószámokra kell figyelni: pl ha centiméterről váltasz méterre, ott 1cm = 0,01 m, ha viszont fordítva, akkor 1m = 100cm itt mindkét esetben 100 a váltószám, de nem mindegy, hogy osztod vagy szorzod. Úgy lehetne megoldani, hogy megnézed a 2 mértékegység közötti kapcsolatot(váltószám), és utána megnézed melyikből akarod melyiket váltani pl kapcsolóval (isFirst vagy ilyesmi). A kapcsolatok tárolásához valami adatbázistvagy adattárolást lehetne használni.
Combobox helyett inkább a Listbox-ot ajánlom(Combobox sajátossága hogy oda be lehet írni bármit)
Milyen ifeket te nagyon agyas?
Nyilván (szinte) minden programban van elágazás, de ebbe pont nem kell rengeteg.
A mértékegységekből osztályt csinálsz, a prefixekhez pedig eltárolod a jelentését, pl milli = 0,001.
Aztán először az átváltandó értéket átváltod az alapegységbe, majd onnan a kívánt mértékegységbe, úgy, hogy szorzol az eltárolt értékekkel kétszer.
Ez működik mindenre és nulla if van benne.
C++ -ban is a #8 valaszolo altal irt elven mukodik a chrononal az idoatvaltas, amit ott konnyen atlehet alakitani akarmilyen atvaltasra.
namespace length
{
template<typename _Rep, typename _Period = std::ratio<1, 1>>
using Length = std::chrono::duration<_Rep, _Period>;
template<typename _To, typename _Rep, typename _Period>
constexpr auto length_cast(const Length<_Rep, _Period>& l)
{
return std::chrono::duration_cast<_To>(l);
}
using centimeters = Length<double>;
using meters = Length<double, std::ratio<100>>;
using kilometers = Length<double, std::ratio<100000>>;
}
int main()
{
constexpr auto c = length::centimeters{550};
constexpr auto m = length::meters{4.3};
constexpr auto converted_c_to_m = length::length_cast<length::meters>(c); // = 5.5
constexpr auto converted_m_to_c = length::length_cast<length::centimeters>(m); // = 430.0
constexpr auto x = length::length_cast<length::kilometers>(length::meters{1500}); // = 1.5
}
Lenyegeben az egesz atvaltast ez intezi (VC++ implementacio):
// duration_cast
template<class _To,
class _Rep,
class _Period> inline
_CONST_FUN typename enable_if<_Is_duration<_To>::value,
_To>::type
duration_cast(const duration<_Rep, _Period>& _Dur)
{ // convert duration to another duration
typedef ratio_divide<_Period, typename _To::period> _CF;
typedef typename _To::rep _ToRep;
typedef typename common_type<_ToRep, _Rep, intmax_t>::type _CR;
return (_CF::num == 1 && _CF::den == 1
? _To(static_cast<_ToRep>(_Dur.count()))
: _CF::num != 1 && _CF::den == 1
? _To(static_cast<_ToRep>(
static_cast<_CR>(
_Dur.count()) * static_cast<_CR>(_CF::num)))
: _CF::num == 1 && _CF::den != 1
? _To(static_cast<_ToRep>(
static_cast<_CR>(_Dur.count())
/ static_cast<_CR>(_CF::den)))
: _To(static_cast<_ToRep>(
static_cast<_CR>(_Dur.count()) * static_cast<_CR>(_CF::num)
/ static_cast<_CR>(_CF::den))));
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!