Loading...
Gabble avatar Gabble 3 Точки

[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}");
        }
    }
}
 

Тагове:
0
Fundamentals Module
DennisKostadinov avatar DennisKostadinov 16 Точки
Best Answer

При else if (type == "business" && ppl >= 100) ppl -= 10; изваждаш 10 души от бройката, но цената си остава същата. Добави

sum -= 10 * price; към тялото на if-a.

0
VulioRaikov avatar VulioRaikov 5 Точки

 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;

на този ред нямаш цена !!!

 else if (type == "business" && ppl >= 100) sum = ppl - (10 * price); 

0
25/01/2019 18:20:45
VasilKotsev avatar VasilKotsev 830 Точки

Не искам да звуча като хейтър, но как очакваш някой да дебъгва толкова зле написан код ? Нямаш тяло на проверките, зле наименoвани променливи(колко време спести да напишеш ppl вместо people ? Aко беше някой по-голям проект това име говори ли ти нещо ?), кодът не е подравнен и нямаш логическо разделение между променливите и проверките. Казвам ти го не случайно, а за да си изградиш някакви елементарни навици за КПК(Качествен програмен код), които ще са ти от голям плюс ако продължиш да се занимаваш с програмиране.

Пропускът в твоят пример е в изчислението на тоталните разходи за почивката. Отново се свежда до това, че проверките са много зле написани (без тяло) и като цяло не можеш да видиш елементарна грешка защото е трудно да се ориентираш в кода. В първият else if премахваш 10 човека, но преди това вече си калкулирала цялата сума за всички ? Как очакваш след това сумата да се промени, като вече е изчислена ?

Надявам се да не съм разбран погрешно, всеки е минавал през този път включително и аз. Просто за такъв код ще те уволнят на работа...

0
25/01/2019 18:26:03
Gabble avatar Gabble 3 Точки

Така по-добре ли е?

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);
            }

        }
    }
}
 

0
VasilKotsev avatar VasilKotsev 830 Точки

Това, което имах предвид, е че трябва да се избягват такива неща:

if (day == "friday") price = 8.45;
else if (day == "saturday") price = 9.80;
else if (day == "sunday") price = 10.46;

 

Дори ако погледнеш официалната документация за if-else statements ще видиш, че всички примери са със тяло, дори и statement-а, който е вътре да е само един. Дори си го и пише:

Both the then-statement and the else-statement can consist of a single statement or multiple statements that are enclosed in braces ({}). For a single statement, the braces are optional but recommended.

Винаги слагай и разтояния м/у самите statement-и.

 Един от малкото случаи, където не ползвам скоби за if проверка е когато трябва да прекъсна while цикъл със даден аргумент, но въпреки това винаги го пиша на нов ред:

while(true)
{
    if(condition)
        break;
}

 

За самата машина няма никакво значение как ще го напишеш (можеш и цялата програма на един ред да я напишеш стига да се компилира), но кодът е важно да бъде възможно най-четим и от хора, особено когато се работи с екипи. Най-малкото на човек ще му е трудно да се ориентира в твойта логика, а и можеш сам да се оплетеш в нея. Същото важи и за switch-case (можеш да прочетеш в документацията по-горе, в ляво е съдържанието).

Друг проблем, който виждам във вторият код е, че твърде много неща се повтарят. Това ще ти стане по-ясно като стигнеш до темата за методи и функции. Общо взето когато виждаш, че повтаряш няколко пъти едно и също нещо веднага трябва да ти светне червена лампа и трябва да се замислиш как може да го избегнеш. Във "поправения" код проблемът е в принтирането.  Навсякъде повтаряш:

Console.WriteLine("Total price: {0:F2}", people * price);

 

Няма ли да е по-добре да си изнесеш сметките в една променлива и накрая само да принтираш интерполирания стринг ? Така ще имаш само един низ, който да принтираш и няма нужда да извикваш WriteLine() по два пъти за всеки случаи, който трябва да покриеш за бройката на хората.

Естествено за такава проста задача тези неща ще ти се сторят безсмислени, но единствено ще са ти от полза за напред.

0
25/01/2019 21:02:53
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.