[Homework] Tech 4.0 C# - Intro and Basic Syntax - Задача 3 - Vacation
Здравейте! Получавам 91/100 на тази и наистина не мога да разбера причината. Някой намира ли пропуск?
using System;
namespace _03._Vacation
{
class Program
{
static void Main(string[] args)
{
int ppl = int.Parse(Console.ReadLine());
string type = Console.ReadLine().ToLower();
string day = Console.ReadLine().ToLower();
double price = 0;
if (type == "students")
{
switch (day)
{
case "friday": price = 8.45; break;
case "saturday": price = 9.80; break;
case "sunday": price = 10.46; break;
}
}
else if (type == "business")
{
switch (day)
{
case "friday": price = 10.90; break;
case "saturday": price = 15.60; break;
case "sunday": price = 16; break;
}
}
else if (type == "regular")
{
switch (day)
{
case "friday": price = 15; break;
case "saturday": price = 20; break;
case "sunday": price = 22.50; break;
}
}
double sum = ppl * price;
if (type == "students" && ppl >= 30) sum *= 0.85;
else if (type == "business" && ppl >= 100) ppl -= 10;
else if (type == "regular" && (10 <= ppl && ppl <= 20)) sum *= 0.95;
if (price != 0)
Console.WriteLine($"Total price: {sum:F2}");
}
}
}
Така по-добре ли е?
using System;
namespace _03._Vacation_ST
{
class Program
{
static void Main(string[] args)
{
int people = int.Parse(Console.ReadLine());
string type = Console.ReadLine().ToLower();
string day = Console.ReadLine().ToLower();
double price = 0;
if (type == "students")
{
if (day == "friday") price = 8.45;
else if (day == "saturday") price = 9.80;
else if (day == "sunday") price = 10.46;
if (people >= 30) Console.WriteLine("Total price: {0:F2}", people * price * 0.85);
else Console.WriteLine("Total price: {0:F2}", people * price);
}
else if (type == "business")
{
if (day == "friday") price = 10.90;
else if (day == "saturday") price = 15.60;
else if (day == "sunday") price = 16;
if (people >= 100) Console.WriteLine("Total price: {0:F2}", (people - 10) * price);
else Console.WriteLine("Total price: {0:F2}", people * price);
}
else if (type == "regular")
{
if (day == "friday") price = 15;
else if (day == "saturday") price = 20;
else if (day == "sunday") price = 22.50;
if (10 <= people && people <= 20) Console.WriteLine("Total price: {0:F2}", people * price * 0.95);
else Console.WriteLine("Total price: {0:F2}", people * price);
}
}
}
}
Това, което имах предвид, е че трябва да се избягват такива неща:
Дори ако погледнеш официалната документация за if-else statements ще видиш, че всички примери са със тяло, дори и statement-а, който е вътре да е само един. Дори си го и пише:
Винаги слагай и разтояния м/у самите statement-и.
Един от малкото случаи, където не ползвам скоби за if проверка е когато трябва да прекъсна while цикъл със даден аргумент, но въпреки това винаги го пиша на нов ред:
За самата машина няма никакво значение как ще го напишеш (можеш и цялата програма на един ред да я напишеш стига да се компилира), но кодът е важно да бъде възможно най-четим и от хора, особено когато се работи с екипи. Най-малкото на човек ще му е трудно да се ориентира в твойта логика, а и можеш сам да се оплетеш в нея. Същото важи и за switch-case (можеш да прочетеш в документацията по-горе, в ляво е съдържанието).
Друг проблем, който виждам във вторият код е, че твърде много неща се повтарят. Това ще ти стане по-ясно като стигнеш до темата за методи и функции. Общо взето когато виждаш, че повтаряш няколко пъти едно и също нещо веднага трябва да ти светне червена лампа и трябва да се замислиш как може да го избегнеш. Във "поправения" код проблемът е в принтирането. Навсякъде повтаряш:
Няма ли да е по-добре да си изнесеш сметките в една променлива и накрая само да принтираш интерполирания стринг ? Така ще имаш само един низ, който да принтираш и няма нужда да извикваш WriteLine() по два пъти за всеки случаи, който трябва да покриеш за бройката на хората.
Естествено за такава проста задача тези неща ще ти се сторят безсмислени, но единствено ще са ти от полза за напред.