Проверка на вниманието: 'капани' или грешки?
Здравейте,
тези дни си писах поредното домашно. Направи ми впечатление, че има разминавания в няколко задачи. Възможно е да са тип грешка. Но е и много вероятно да са умишлено вмъкнати, като метод за проверка на вниманието.
Мислех си да ги пиша към съответното домашно, но може би е по-правилно да си има отделна тема за вниманието.
Предложението ми е в тази тема да се докладва за разминавания, които сте открили в заданията на задачите (условия и примери). Моля, започвайки да описвате конкретно разминаване, то упоменете първо от кой курс е домашното (C#, Java, JavaScript и т.н.), темата на домашното и съответно името на задачата. И чак след това да опишете, какво разминаване сте открили.
Желателно е коментарите и евентуални поправки по темата да са от екипа на SoftUni.
Моля, да се избягват несъдържателни коментари!
Ето и първите разминавания, на които попаднах:
Домашното е от курса: C# Basics.
Темата е: Operators, Expressions and Statements.
Problem 2. Odd or Even Integers
Write an expression that checks if given integer is odd or even.
Odd е нечетно
Even е четно
Без значение дали е на английски или на български език, чисто математически четното число е с приоритет и би било по-правилно в заглавието и в условието на задачата да се разменят, т.е. Even or Odd.
Problem 4. Divide by 7 and 5
Условието на задачата изисква да се напише булево (логическо) изразяване, което да проверява за дадено цяло число, ако то може да се раздели (без остатък) на 7 и на 5 едновременно.
В примерите като число е дадено 0 и срещу него пише false. Математически 0-та разделена на кое да е цяло число, което е различно от 0, дава резултат 0. Така че, 0 може да се дели на 7 и на 5, като резултата пак е 0. Извод: в таблицата срещу 0 трябва да пише true.
Problem 9. Prime Number Check
Условието на задачата изисква да се напише представяне, което да проверява, ако дадено положително цяло число е със стойност n (n≤100), дали е просто число (т.е. дели се без остатък само на себе си и на 1).
При така зададено условие би било логично в примерите да има само положителни цели числа, т.е. от 1 до 100 и съответно програмата да проверява дали да прости числа или не. Числото -3 е отрицателно число, а 0-та не е нито положително, нито отрицателно число, т.е. те не отговарят на предварително зададеното условие. Извод: -3 и 0 не би трябвало да присъстват в тази таблица.
Problem 11. Point Inside a Circle & Outside of a Rectangle
Тази задача бе коментирана вече и мисля, че по нея грешките са коригирани.
Макар, че някъде срещнах и коментари по 4-та задача. Но явно никой не е обърнал внимание на тези коментари, защото примерите все още не са променени.
Колеги, внимавайте в картинката, защото миг невнимание, след това ще ви струват часове лутане. По-добре пишете по-бавно и внимателно, отколкото бързо и после с дни да се чудите какво сте пропуснали, и защо не ви работи програмата.
Пожелавам успех на всички колеги, които искат да си повишат вниманието!
Поздрави,
Вили
Затова виняги пише, че входът ще е in the format described. Т.е. няма значение как прихващаш числа извън рейнджа подаден в условието. Така, че тук авторката има право. В си шарп курса и аз се сблъсках със задачи, в които уж входът са интеджъри, пък има примери с дабъли ... :) накрая се оказа най-безопасно винаги да се работи с дабъли - хем има цадоволителен рейндж, хем няма да те цакнат с вход
Здравей FilKolev,
на въпроса ти за 2-ра задача мисля, че сам си си отговорил: 'Някои хора май го бяха и сбъркали и тяхната програма правеше обратното...'.
Кое е по-често срещаното, кое е изключение или частен случай, това са все различни неща.
На всички ни е известно, че програмирането е базирано на математиката. А в математиката има: основи - фундаменти, правила и изключения, частни случаи, определения, теореми, твърдения, леми, следствия, забележки и т.н.
В математиката има две понятия - последователност и приоритетност.
Те се използват при:
-цифрите и числата (надявам се да няма нужда на обяснявам разликата между тези две понятия);
-математическите символи;
-математическите действия;
-математически функции и т.н.
Давам пример:
1, 2, 3 ...
a, b, c ... x, y, z
положителни и отрицателни числа
четни и нечетни числа
събиране и изваждане
умножение и деление
Дотук изброените в теорията по математика винаги се срещат в тази последователност и в никаква друга.
При събиране, ако имаш 3 числа, например:
3 + 6 + 9 = 18, ако трябва теоретично да бъде обяснен и показан този пример, то той ще бъде изписан точно в този си вид - на последователност на числата, но на практика в някоя задача може да го срещнеш и под вариант 9 + 3 + 6 = 18 или 3 + 9 + 6 = 18 и т.н.
Ако обаче освен събиране добавим и изваждане - ето друг пример:
6 - 7 + 8 = ? - ето тук вече имаме друго положение:
Ако е така изписан ще следваме последователността на изписване и отгововора на задачата ще ни е 7, но ако искаме да спазим първо приоритетността на действията, то примера ще изглежда така: 6 - (7 + 8), което вече дава отговор -9.
Мисля, че от дотук показаните примери се разбира защо е важно да се спазва последователност и приоритетност при решаването на задачи.
Сега да минем конкретно на темата за четност и нечетност:
Определението в математиката е: Всяко цяло число е четно или нечетно. Едно цяло число е четно, ако е кратно на две, а всички останали числа са нечетни. Което определя и приоритетността на четните числа.
Във всяка една задача може да се търсят много и различни резултати - намерете: отрицателните, нечетните числа и т.н. Но това са задания по условията в конкретна задача. Обаче е абсолютно задължително да спазваме теорията в математиката, ако искаме да имаме коректни задания и съответните отговори на задачите.
В конктерният случай, който обсъждаме, освен че теоретично са разменени и условието на задачата е на английски език, което води до голям процент вероятност за грешки. Предполагам, че има хора, които не са учили математика на английски език и не са се готвили за изпити като SAT I-II, Gre Math и други подобни. А ако човек не се е занимавал с математика на английски език е много вероятно да не знае всички математически термини на английски. Приемайки, че теоретично се спазва и следва последователността, то при една такава размяна се получават и грешни резултати.
По коментара ти за 4-та задача. 'Например ако тази задача беше дадена на изпит задължително щях да сложа проверката за 0 и да върна False, макар, че не трябва да е така.'
Аз лично дали съм на изпит или не, няма никаква разлика. Аз живея в реалният живот, а в него всеки ден си е все едно си на изпит. За мен е важно, когато се прави едно нещо то да помага, да е функционално и да работи (по възможност без грешки, или ако има да са сведени до минимум). Не ми пука как ще ме оценяват по изпити. Нееднократно съм спорила и то по време на изпити с преподаватели. И знаеш ли до какви изводи съм стигала - по интелигентните преподаватели приемат, че може и да съм права и ми поставят висока оценка, а тези, които си мислят, че само те са прави и са с някакви морално остарели мислене и разбирания са ми намаляли оценката. (Както е и с математиката при мен - най-ниската ми балообразуваща оценка в дипломата ми за средно образование е тази по математика. След това съм държала изпит по висша математика, като там бях открила грешка в условието на едната задача. Която както и да я решаваш все различни резултати се получаваха, а като тръгнеш да правиш проверка от отговора не стигаш до никъде. Затова, че казах за грешката в условието оценката от изпита ми беше намалена.)
По коментара ти за 9-та задача: Никъде в условието няма зададено, че ако има изключения - exception, то трябва да дава false или exception или нещо друго, ако се цели това то тези числа би трябвало да са описани в отделна категория на условието, а не да са приравнени към категорията положителни числа, които не са прости числа и то в графата 'сети се сам'.
Имам две любими занимания:
- Да чета мисли (някой искал да каже нещо, ама ти сам трябва да се сетиш какво си мисли, защото е пропуснал да ко каже);
- Да ми обясняват нещо все едно си го обясняват на себе си и все едно си го знам, особено ако тепърва го уча, защото аз ако го знаех и разбирах нямаше да има нужда да ми се обяснява.
По коментара ти за 11-та задача може да погледнеш коментарите във форума за нея, защото в по-предните домашни беше с грешка (аз лично следя домашните от март месец), но отдавна е поправена.
Ако имаш други въпроси съм насреща.
Правя следната вметка - не отговарям много бързо поради голяма натовареност, но рано или късно го правя.
Поздрави,
Вили
Привет Вили,
Видях наистина някакви коментари за грешката в 11-та задача, но изглежда тя отдавна е отстранена и така и не разбрах каква е била. Все пак се случва и на други места в следващи домашни да има неточности, а имаше такава и на една изпитна задача, така че няма 100% застраховка срещу такива неща и в такъв случай се обръщаме към квесторите ако сме на изпит или тук във форума.
Относно приоритета на математическите действия имам две добавки.
Така че, както често са съветвали на лекции, скобите са силно препоръчителни във всички случаи, когато смятаме някакъв по-сложен израз. Хем застраховка, за да се сметнат правилно нещата, хем за четимост.
За 2-ра задача - елементарно е според мен човек да си тества задачата. Дадени са на всички задачи от домашните и изпитите доста примери. Казват - "при този вход, ето какво очакваме като изход". В доста случаи има и коментари, по-подробна разбивка на един от примерите. Е, прочиташ условието, мислиш, че си го разбрал/а и почваш да пишеш код. Не става дума за нивото на разбиране на английски език. Мисля, че не е редно да си изкодиш решението и да не си направиш труда да го тестваш с дадените примери. В конкретния случай, още на първия тест програмата ти ако даде true, а виждаш false като очакван от авторите отговор, трябва да ти светне една червена лампичка. Не обвинявам хората, които не се чувстват много комфортно с английския, но не това е проблемът ако предадеш програма, която дава точно обратния отговор от очаквания на какъвто и да е вход. И имаш много примери, с които да провериш това, не е като да гадаеш какво се иска от теб.
RoYaL, само на изпит изрично ни е казано че входът е винаги валиден. Това е за да се концентрират хората върху алгоритъма за решаване на задачата, а не да мислят за някакъв вид exception handling. В задача за подготовка, където се учиш и може да експериментираш, може, а е и хубаво да помислиш как ще се държи програмата ти при различни ситуации. Ако ти кажат "искаме програмата да работи за числа от 1 до 10" и ти направиш програмата да работи само с такива числа и при всички останали случаи да си гърми или да дава грешен отговор, това е малко претупана работа (за човек, който няма много време за подготовка е разбираемо де). В примера за задачата, която коментираме, е дадено, че трябва входът да е положително число; ако подадем отрицателно нормалното е да даде exception (ако сме декларирали променливата като unsigned, ubyte примерно); в примера обаче ни е показан изход "False". Е, не е грешно по първия начин да си я направиш и да си гърми, не си виновен, че потребителят е идиот и не знае какво да въведе. Но защо не седнеш вместо това 5 минути да помислиш как да направиш така, че програмата ти да работи и при отрицателни числа? Една проста проверка се добавя за целта. Не казвам, че трябва винаги да отиваме на double или BigInteger, само и само да работи програмата, но докато се учим полезно е да експериментираме повече. Особено в C# Basics където имаме и повече време на разположение за такива неща, защото след това сроковете стават много кратки и едва ли ще може да го правим (и най-вероятно доста хора ще започнат да правят базовия минимум на домашните).