Loading...
BobbyTrade avatar BobbyTrade 0 Точки

Complex Conditional Statements 08. Trade Comissions 94/100

Здравейте,

това е решението ми на задачата https://pastebin.com/bE8gygcX , но judge ми казва , че като въведе друго освен посочените градове, вместо error изписва числото под градът само че с минус отпред.

Проверих си всички входове/изходи от условието - всичко е точно , ако въведа kaspichan -20 ми изписва error (както трябва да бъде), обаче наистина ако въведа burgas 2000 ми изписва -2000.00

А if конструкцията съм я завършил с else , би трябвало да обхваща всичко което не съм описал. Прегледах кодът бая пъти , не мога да открия къде греша, прегледах и на други колеги кодовете и решенията и все още не намирам грешката си.

Благодаря.

Тагове:
0
Programming Basics
TonislavAtanasov avatar TonislavAtanasov 86 Точки

Както каза колегата @Rogneda. Аз само ще добавя, че предвид въпроса ти, трябва да отделиш повече внимание на условните конструкции.
else ще се изпълни само ако условието на прилежащия му if е false. В случая това е if (sales >= 0). Винаги когато не си сигурен защо се случва нещо, го пусни през дебъгера ред по ред. Изключително е полезно и в 99% от случаите ще разбереш сам къде ти е грешката.

Ако искаш да изпишеш "error" ако не бъде избран нито един от трите посочени града, трябва да използваш if-else if-else или по-чистия вариант според мен - switch-case.

Нещо такова:

switch(town) {
    case "Sofia":
        // code
        break;
    case "Varna":
        // code
        break;
    case "Plovdiv":
        // code
        break;
    default:
        Console.WriteLine("error");
        break;
}

// if (sales >= 0) goes here

Не съм чел условието на задачата, но входът винаги ли е с главна първа буква? Ако има възможност да се въведе друго, сложи едно toLower() да ти е мирна главата :)

0
02/04/2018 17:36:15
Rogneda avatar Rogneda 60 Точки

ПРи else(останалите градове) след error.... както и в случая със switch, при default по-добре да напишеш return, вместо break .. за да не изписва -2000 след error.

0
TonislavAtanasov avatar TonislavAtanasov 86 Точки

Както казах, не съм чел условието на задачата. Дадох примерен код. Ако не трябва да се изписва нищо, биеш return return (за по-сигурно) и си в играта :)

0
BobbyTrade avatar BobbyTrade 0 Точки

Благодаря за помощта , за тази задача не исках да използвам switch-case, защото смятам , че с нея е по-лесният вариант. Иначе case конструкцията ще я ползвам в следващата задача. Входовете са с главна буква, но може да го направя и с ToLower. Благодаря и на двама ви за бързата намеса.

 

П.П. ето го и кода (100/100 в judge) https://pastebin.com/DUkDwv5r

0
02/04/2018 20:28:22
BobbyTrade avatar BobbyTrade 0 Точки

Здравейте пак, написах я със switch-case конструкция , но сега пък при правилен град , но грешен sales не ми дава нищо, прескача default-a на дебъгера. Пример: sofia -20

https://pastebin.com/dudAdiTq

0
Rogneda avatar Rogneda 60 Точки

Не трябваше да изтриваш последният else.. 

switch ()

....

default:
                    Console.WriteLine("error");
                    return; 
            }
            if (commission >= 0)
            {
                Console.WriteLine("{0:f2}", sales * commission);
            }
            else
            {
                Console.WriteLine("error");
            }

 

Error от switch се изписва при грешно въведен град, error от else.. се изписва при стойност на продажбите  <0.

1
03/04/2018 08:36:13
BobbyTrade avatar BobbyTrade 0 Точки

Благодаря! Първоначално го махнах (последния else), защото ми излизаха два error, но не бях сложих return, сега всичко е точно. Съжалявам, че не мога да гласувам все още, за да ви дам ъп или оценка, благодаря пак!

https://pastebin.com/f0fgNW8d

0
03/04/2018 10:02:26
TonislavAtanasov avatar TonislavAtanasov 86 Точки

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

А иначе в последното ти решение, ако искаш да е съвсем тарикатско, можеш последния if-else да го замениш с един тернарен оператор и да стане нещо такова:

string result = commission >= 0 ? String.Format("{0:f2}", sales * commission) : "error";
Console.WriteLine(result);

П.П. Сега виждам едно нещо, което си направил и ти го отбелязвам като грешка. Няма да се впускам в подробности, информация има по въпроса много из нета, но не пиши подобни неща никога:

if (sales >= 0 && sales <= 500) commission = 0.045;
else if (sales > 500 && sales <= 1000) commission = 0.075;

Пропускането на скобите е изключително лоша практика, не си ги спестявай. Знам, че изглежда много яко така на един ред, но не свиквай да пишеш така иначе ще си навлечеш сериозни неприятности вбъдеще. Можеш да напишеш if на един ред (евентуално), но нещо такова 

if (condition) { // some short code here, usually return; }

// real exapmle, production code
if (! is_object(this.charter)) { return; }

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

Еми, това е. Дерзай и успех :)

0
BobbyTrade avatar BobbyTrade 0 Точки

TonislavAtanasov много благодаря за отделеното време, приемам критиката , даже обичам критиката поради факта, че тя ме изгражда към по-добро. Прав си за абсолютно всичко. По принцип гледам да съм изряден в писането на код, не знам защо това ми е убягнало, явно в бързината ли , не знам. Дано не ме сложат в руския сайт laugh все пак още се уча. Благодаря ти за съветите!

https://pastebin.com/tJ8piGnf

 

 

0
TonislavAtanasov avatar TonislavAtanasov 86 Точки

Споко. За руския сайт ще трябва още доста да се постараеш :D 
Гледай като пишеш да пишеш правилно и по добрите конвенции, за да свикнеш да си работиш така.
Другото важно е да се научиш да документираш кода, който пишеш. В момента пишете много кратки програмки, които ако спазваш добро именоване на променливите, ще са общо взето self-documented, но е хубаво да свиквате да вмъквате и по някой коментар. Сещам се за тия работи, щото точно в момента това правя :D
Ето пример, забележи на колко ред код, колко документация има. Да не ти пука, че е на PHP, самият код не е важен в случая.

    /**
     * @created 09.03.2018
     * @author [name]
     * @see [Task Number]
     * 
     * Returns whether a user has to be notified about this issue's status
     * 
     * Currently, only the [list of departments]
     * can receive notifications about charter issues.
     * Every issue has a list of roles to be notified upon raise.
     * This list is set by the client and is stored in [database table name]
     * 
     * However, for issue [issue name] ([issue id]), there is a separate logic, required by the client
     * The user who raises the issue can select a list of roles to be notified
     * This list can be different for each charter and is stored in [database table name][column name]
     * 
     * A user has to be notified in two cases:
     *   When their role is contained in array [array name]
     *     or
     *   When their role is contained in array [array name] (for issue [issue name] only)
     *
     * @param int $user_id
     * @param int $charter_id
     * @return boolean
     */
    public function user_has_to_be_notified(int $user_id, int $charter_id) : bool
    {
        $user =& cms\users\models\user::get_readonly_instance($user_id, $USER);
        $roles_to_notify =  explode(',', $this->quality_issue_roles_to_notify[0]);

        foreach ($roles_to_notify as $role_id) {
            /**
             * We'll use has_direct_role here instead of is_member_of
             * Because we need to avoid issues related to one department
             * being wrongly listed under another due to role inheritance
             * 
             * e.g. An issue is listed as related to [role 1], but [role 2] inherits [role 3]
             * which in turn inherits [role 1] thus making the issue appear as related to [role 2] department
             */
            if ($user->has_direct_role($role_id)) { 
                return true;
            }
        }
        
        /** 
         * We'll check whether there is a record in the [database table name] table
         * This is to ensure [issue name] ([issue id]) quality issue is handled properly
         * Note: users to notify are dynamic for [issue name] issue, as they are manually selected by the Quality Director when the issue is raised for a charter
         */
        if ($this->get_index() == 5) {
            $charter =& site\charters\models\charter::get_readonly_instance($charter_id, $CHARTER);

            $roles_to_notify_other = $charter->qc_issue_other_recipients ?? [];
            
            foreach ($roles_to_notify_other as $role_id_other) {
                if ($user->has_direct_role($role_id_other)) {
                    return true;
                }
            }
        }    
                
        return false;
    }

Това впоследствие ако знаеш колко време и усилия спестява, няма да ти се вярва. Понеже знам, че на курсовете ги говорите тези неща, затова искам да дам и реален отзив от практиката, че не ви пълнят главите с врели-некипели :)

1
03/04/2018 14:10:14
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.