Loading...
ph.kolarov avatar ph.kolarov 63 Точки

Тестове от PHP декември ?

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

Дали има възможност някой да качи тестовете от изпитните задачи на декемврийския изпит по PHP в сайта ?

Благодаря!

Тагове:
4
PHP Web Development Basics
mar0der avatar mar0der 191 Точки

Здравейте,

аз имам следния въпрос към 2ра задача от темата на изпита от 22.12. Мисия в живота ми е да я разнищя до края тая задача. Прилатам 3 решения в един код като просто трябва да се разкометарят и закоментарят по няколко реда за всяко от 3 те решения. 2 от решенията са мои а третото е авторското. Първото ми решение не минава и заради него си провалих изпита. Не минават 2 от тестовете и много искам да ги видя тия тестове.

Мисля да предложа като подобрение на системата за оценяване да се сложат по - дескриптивни имена на отделните тестове. Примерно вместо тест#3 "тест с дати с дни с от 1 до 9) където трябва да се сетиш че трябва да добавиш 0 пред датата. В тази задача това не е най - добрия пример защото го има в условието, но когато правиш някаква задача в неучбна ситуация винаги можеш да я пуснеш и да видиш реалния аутпут и да дебъгваш. По начина по който е в момента си играеме по 1 час да гадаеме какво е имал предвид автора. Какво мислите за това предложение?

ето проблемния код:

http://pastebin.com/gi9Gv0bN

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

0
Filkolev avatar Filkolev 4482 Точки

Не знам дали няма и други проблеми с кода, но със сигурност ти гърми функцията strtotime. Ако само 2 теста не ти минават, мисля, че само в нея е проблемът.

strtotime работи с ограничен диапазон от дати, между 1900 и 2080-2100, не съм сигурен точно за горната граница, но може да се провери. За да се избегне това трябва да се ползва DateTime обект и би трябвало да тръгне за 100. Не знам точно какви са тестовете, но мисля, че точно два има с дати извън тези стойности.

1
RoYaL avatar RoYaL Trainer 6849 Точки

strtotime работи с 32 битов интеджър, когато UNIX времето прехвърли 2 млрд секунди, функцията спира да работи нормално. Т.е. горната граница е 2038 година

1
Filkolev avatar Filkolev 4482 Точки

^ Точно така, от документацията: "The valid range of a timestamp is typically from Fri, 13 Dec 1901 20:45:54 GMT to Tue, 19 Jan 2038 03:14:07 GMT. (These are the dates that correspond to the minimum and maximum values for a 32-bit signed integer)."

ЦЪК - секция Changelog

1
mar0der avatar mar0der 191 Точки

Супер явно това е проблема. Не видях къде пише кой е валидния рейндж за класа DateTime.  И изобщо каде могат да се видят тези неща. За командата която ползвах това го пише в changeloga защото са го променили в 5.1, но ако не бяха го променили къде мога да видя валидните дати?

Мерси много за помощта

ПП: това ме връща на предложението ми за подобряване на judge ако теста се казваше тест със години под 1900 и тест с година над 2038. щях да се сетя че проблема е във функцията за дата да се разтърся в нета и да разбера че функцията която ползвам е калпава и евнетуално да намеря по - добра. 

0
02/01/2015 01:02:03
Filkolev avatar Filkolev 4482 Точки

Във всеки случай, когато не знаеш с какви стойности работи дадена функция и не може да ги намериш в нета, просто си тествай програмата с произволни стойности в широк диапазон. Аз на изпита така установих, че с дати след 2050 и преди 1900 връщам грешни резултати преди да реша да ползвам DateTime. Тук донякъде е проблем, че и в условието не е споменато (напълно умишлено предполагам) какви дати ще бъдат подадени на входа и трябва сам да се досетиш.

За самия DateTime, не знам да има някакви ограничения, но и да има такива това не е от особено значение тъй като няма какво друго да ползваш и без това.

1
mar0der avatar mar0der 191 Точки

мерси

0
RoYaL avatar RoYaL Trainer 6849 Точки

@mar0der, Y2038 е common-known issue, както постнах има цяла статия в уикипедия. Трикът в тази задача е да се сетиш, че може да достигнаш до подобен проблем и да го избегнеш. Обикновено когато непрограмист (нормален клиент) поиска от теб да му направиш приложение, което работи с дати, той не е длъжен да ти каже, че ще работи с дати преди 1900 или след 2038 година, най-малкото защото не знае за този проблем, ти трябва обаче да се сетиш, че клиентът ти може да иска да ползва дата извън този диапазон и да избегнеш проблема преди да се е зародил.

DateTime API-а специално е странен (включително Обекто ориентирания и Процедурния), трудно можеш да разбереш някои неща как работят само от четене. На останалите функции, на които можеш да подадеш различно от mixed type пише какъв е типът. Когато пише "int" значи има голям шанс да не работи добре с числа, които прехвърлят ограничението на integer type-а в PHP. Примерно на rand() подай нещо по-голяма от макса на инт-а за платформата ти и ще почне да връща странни стойности, като -1 например

1
mar0der avatar mar0der 191 Точки

Да аз за първи път чувам за 2038 и изчетох цялата статия. Отдавна ползвам unix време и знам че интовете превъртат но някак си никога не бях свързвал двете неща и не се бях замислял за този проблем още повече, че ще се случи толкова скоро. Мерси за отговора. Иначе за идеята ми за наименуване на unit тестовете в judje може би това не е най - удачния пример но в повечето ситуации виждаш реузлтата и грешката от това което правиш и съответно можеш да коригираш кода си. Може пък да се направи като жокер ако много запънеш да видиш подсказката на тества (проба с години над 2038) и вече тия жокери да помагат в подреждане на хората с равни точки (които ползвл жокер се подрежда под тоя дето не е. И така истинските шампиони ще изплуват най - отгоре :) ). Така хем си взимаш изпита хем научаваш нещо. Особенно важи за нещо което си се борил сума време и ти се е наложило да вземеш жокер за да го решиш тогава ще ти остане в главта за винаги. Както на мен сега този проблем 2038 за който не бях чувал.

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