Loading...
Villinda avatar Villinda 2 Точки

Проверка на вниманието: 'капани' или грешки?

Здравейте,

тези дни си писах поредното домашно. Направи ми впечатление, че има разминавания в няколко задачи. Възможно е да са тип грешка. Но е и много вероятно да са умишлено вмъкнати, като метод за проверка на вниманието.

Мислех си да ги пиша към съответното домашно, но може би е по-правилно да си има отделна тема за вниманието.

Предложението ми е в тази тема да се докладва за разминавания, които сте открили в заданията на задачите (условия и примери). Моля, започвайки да описвате конкретно разминаване, то упоменете първо от кой курс е домашното (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-та задача. Но явно никой не е обърнал внимание на тези коментари, защото примерите все още не са променени.

 

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

Пожелавам успех на всички колеги, които искат да си повишат вниманието!

Поздрави,

Вили smile

 

Filkolev avatar Filkolev 4482 Точки

Здравей Вили,

За 2-ра задача какво имаш предвид точно? Няма особено значение как е написано заглавието според мен. А уловка тук има, но ако човек внимава в примерите ще му стане ясно, че се иска програмата да проверява дали числото е нечетно и ако да - да връща True, а ако е четно - да връща False. Някои хора май го бяха и сбъркали и тяхната програма правеше обратното, което наистина е по-често срещаната задача - да кажеш дадено число дали е четно. Тук е обратното. И това е наистина проверка доколко внимаваш в условието май.

За 4-та задача съм съгласен. В моето решение оставих нулата да дава True, но доста хора бяха правили специална проверка за 0. А и в коментар към домашното ми беше (правилно) посочено, че щом това очакват от нас трябва да се съобразим (независимо, че не е логично). Например ако тази задача беше дадена на изпит задължително щях да сложа проверката за 0 и да върна False, макар, че не трябва да е така.

За 8-ма задача (която при теб е 9) - ако да речем числото е декларирано като uint или byte, ако потребителят въведе отрицателно число ще се получи exception. Явно в примера искат да ни кажат, че ако числото не е положително просто връщаме false, което е логично. 0 и 1 не се водят прости число, а отрицателните не отговарят на критериите (най-малкото делят се още на -1). Т.е. ако все още не си усвоил проверката на входа (например с TryParse и някаква условна конструкция, която да иска ново число от потребителя докато не вкара такова от диапазона 1-100) или exception handling, нормалният начин да се справиш с този проблем и програмата ти да връща false при некоректен вход вместо да гърми, е да декларираш числото като int например и да сложиш проверка - ако е < 1, връщаш false директно, преди да влезеш в цикъла (а може и ако е над 100 да го направиш така). А като за начален курс и едва трето домашно се очаква, че едва ли си запознат с exception handling. Така че тук примерите, по мое мнение поне, са сложени, за да те насочат да си направиш програмата малко по-надеждна, а не всеки път да хвърля exception-и като я пусне някой потребител идиот...

За 10-та (при теб 11-та) може ли да уточниш проблема? Не виждам грешки в условието, не са ми направили впечатление такива и аз като го правих това домашно.

Хубава вечер!

 

P.S. Иначе грешки по условията има на места, най-вече в тема 7. Даже писах отделна тема за това - ТУК. Може да я разгледате, вместо да се чудите какво бъркате като стигнете да решавате задачите от това домашно :)

0
RoYaL avatar RoYaL Trainer 6849 Точки

Затова виняги пише, че входът ще е in the format described. Т.е. няма значение как прихващаш числа извън рейнджа подаден в условието. Така, че тук авторката има право. В си шарп курса и аз се сблъсках със задачи, в които уж входът са интеджъри, пък има примери с дабъли ... :) накрая се оказа най-безопасно винаги да се работи с дабъли - хем има цадоволителен рейндж, хем няма да те цакнат с вход

0
Villinda avatar Villinda 2 Точки

Здравей 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-та задача може да погледнеш коментарите във форума за нея, защото в по-предните домашни беше с грешка (аз лично следя домашните от март месец), но отдавна е поправена.

Ако имаш други въпроси съм насреща.

Правя следната вметка - не отговарям много бързо поради голяма натовареност, но рано или късно го правя.

Поздрави,
Вили smile

 

0
Filkolev avatar Filkolev 4482 Точки

Привет Вили,

Видях наистина някакви коментари за грешката в 11-та задача, но изглежда тя отдавна е отстранена и така и не разбрах каква е била. Все пак се случва и на други места в следващи домашни да има неточности, а имаше такава и на една изпитна задача, така че няма 100% застраховка срещу такива неща и в такъв случай се обръщаме към квесторите ако сме на изпит или тук във форума. 

Относно приоритета на математическите действия имам две добавки.

  • Операциите събиране и изваждане са с еднакъв приоритет (както умножение и деление) и се изпълняват отляво надясно. В твоя пример: 6 - 7 + 8 = 7 във всички случаи, освен ако изрично не сложим скоби. Аналогично 1 / 2 * 2 = 1, а не 1/4.
  • Калкулаторите (обикновените) не спазват приоритетност, освен ако не се сложат скоби. Изразът 2 - 3 * 4 ще се сметне отляво надясно: 2 - 3 = -1 => -1 * 4 = -4. Може да провериш със стандартен калкулатор, например уиндоуския, в режим на нормален изглед. Ако (пак говоря за уиндоуския калкулатор) сменим изгледа на scientific вече получаваме правилния резултат: -10.

Така че, както често са съветвали на лекции, скобите са силно препоръчителни във всички случаи, когато смятаме някакъв по-сложен израз. Хем застраховка, за да се сметнат правилно нещата, хем за четимост.

За 2-ра задача - елементарно е според мен човек да си тества задачата. Дадени са на всички задачи от домашните и изпитите доста примери. Казват - "при този вход, ето какво очакваме като изход". В доста случаи има и коментари, по-подробна разбивка на един от примерите. Е, прочиташ условието, мислиш, че си го разбрал/а и почваш да пишеш код. Не става дума за нивото на разбиране на английски език. Мисля, че не е редно да си изкодиш решението и да не си направиш труда да го тестваш с дадените примери. В конкретния случай, още на първия тест програмата ти ако даде true, а виждаш false като очакван от авторите отговор, трябва да ти светне една червена лампичка. Не обвинявам хората, които не се чувстват много комфортно с английския, но не това е проблемът ако предадеш програма, която дава точно обратния отговор от очаквания на какъвто и да е вход. И имаш много примери, с които да провериш това, не е като да гадаеш какво се иска от теб.

RoYaL, само на изпит изрично ни е казано че входът е винаги валиден. Това е за да се концентрират хората върху алгоритъма за решаване на задачата, а не да мислят за някакъв вид exception handling. В задача за подготовка, където се учиш и може да експериментираш, може, а е и хубаво да помислиш как ще се държи програмата ти при различни ситуации. Ако ти кажат "искаме програмата да работи за числа от 1 до 10" и ти направиш програмата да работи само с такива числа и при всички останали случаи да си гърми или да дава грешен отговор, това е малко претупана работа (за човек, който няма много време за подготовка е разбираемо де). В примера за задачата, която коментираме, е дадено, че трябва входът да е положително число; ако подадем отрицателно нормалното е да даде exception (ако сме декларирали променливата като unsigned, ubyte примерно); в примера обаче ни е показан изход "False". Е, не е грешно по първия начин да си я направиш и да си гърми, не си виновен, че потребителят е идиот и не знае какво да въведе. Но защо не седнеш вместо това 5 минути да помислиш как да направиш така, че програмата ти да работи и при отрицателни числа? Една проста проверка се добавя за целта. Не казвам, че трябва винаги да отиваме на double или BigInteger, само и само да работи програмата, но докато се учим полезно е да експериментираме повече. Особено в C# Basics където имаме и повече време на разположение за такива неща, защото след това сроковете стават много кратки и едва ли ще може да го правим (и най-вероятно доста хора ще започнат да правят базовия минимум на домашните). 

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