Szia
Először is szeretnék reagálni az első válaszra, ami a kérdéshez érkezett. Mivel az első válaszoló nem jártas C#-ban, emiatt nem ismerhet bizonyos lehetőségeket, viszont ettől függetlenül is lényeges bizonyos dolgokra oda kell figyelni, legalábbis szerintem. Egy ilyen fontos dolog az, hogy a parkolás időtartama lehet több nap is, így figyelembe kell venni a dátumot is. Az ő példájában egyik napról a másikra még jól működik, de ha én 3,5 napot parkolok ott, akkor nem jó a számolás hozzá. A másik fontos dolog, hogy a megkezdett órákért is szokás fizetni, így ha én 5 órát parkolok és abból 1,5 ingyenes, akkor 3,5 az ott töltött idő, de mivel a 3 óra után egy új órát már megkezdtem, így nekem 4 óráért kell fizetnem.
A megoldásom a fentiek alapján a következő:
Console.WriteLine("Kérlek add meg a parkolás kezdetének időpontját éééé-hh-nn HH:mm formában, pl. 2021-02-04 08:00");
var Kezdes = Convert.ToDateTime(Console.ReadLine());
Console.WriteLine("Kérlek add meg a parkolás végének időpontját éééé-hh-nn HH:mm formában, pl. 2021-02-04 14:30");
var Vege = Convert.ToDateTime(Console.ReadLine());
var ElteltOrak = (Vege-Kezdes).TotalHours;
var FizetendoOrak = Math.Ceiling(ElteltOrak-1.5) >= 0 ? Math.Ceiling(ElteltOrak-1.5) : 0;
Console.WriteLine("A fizetendő összeg {0} forint.", FizetendoOrak*300);
A korábbiakhoz hasonlóan igyekszem most is részletezni, hogy mit miért, és hogyan használtam a megoldás során.
Először is a Console.ReadLine() segítségével beolvasunk egy sort, ami tartalmazza a megadott formában a dátumot időponttal. Ezt az értéket a Convert.ToDateTime függvénnyel dátummá alakítjuk, ez lesz a kezdő dátum. Ugyanezt megtesszük a parkolás végét jelentő dátummal.
Ezután kiszámoljuk az eltelt órákat úgy, hogy a későbbi dátumból kivonjuk a korábbi dátumot. Ez egy TimeSpan típusú változót ad, ami lényegében egy időtartam. Van egy olyan tulajdonsága (property), hogy TotalHours, ami a két dátum között eltelt órák számát adja meg.
Miután ezzel megvagyunk, bevezetünk egy változót, ami a fizetendő órákat fogja tárolni. Ezt úgy kapjuk meg, hogy az eltelt órákból kivonjuk az ingyenes 1,5 órát, majd ezután felfele kerekítünk. Azért kell felfele kerekíteni a Math.Ceiling() függvénnyel, mert ha tört számot kapunk, akkor biztosan van megkezdett óránk, amit ki kell fizetni.
Itt egyébként használom a ? : (kérdőjel-kettőspont) operátort, ami úgy néz ki, hogy:
logikai kifejezés ? igaz ág : hamis ág
Ez azt jelenti, hogy írok egy logikai kifejezést, jelen esetben azt, hogy az eltelt órák minusz a 1,5 ingyenes óra felfele kerekítve nagyobb vagy egyenlő-e, mint 0. Ha nagyobb vagy egyenlő mint 0, akkor az igaz ágra beírom azt az értéket, hogy: az eltelt órák minusz a 1,5 ingyenes óra felfele kerekítve. Ha pedig kisebb mint 0, akkor 0-át írok oda. Hisz ha csak 1 órát parkolok, és abból kivonok 1,5 órát, akkor -0.5 órát kapok. -0.5 órát nem tudok parkolni, így azt 0-ra cserélem.
(Gyakorlatilag mintha Excelben használnék egy HA függvényt.)
Végül pedig a kiírás során az összeget úgy számolom ki, hogy a fizetendő órákat beszorzom 300-zal.
Remélem tudtam segíteni, és sikerült kicsit megérteni azt, hogy mit miért kell csinálni.
Ha megfelelő a válaszom, kérlek jelöld megoldásnak. Köszi