C, PHP, VB, .NET

Дневникът на Филип Петров


Категория ‘ПИК3 Java’

* Автоматично определяне на тип в Java

Публикувано на 18 октомври 2018 в раздел ПИК3 Java.

С идването на Java 10 се въведе едно вероятно дълго чакано нововъведение. Става въпрос за „local type inference“, което аз си позволявам да преведа като „автоматично определяне на тип за локални променливи“. Надявам се да намеря по-къс термин за това определение.

Една тенденция при развитието на повечето езици за програмиране винаги е била да се опростява синтаксиса така, че програмистите да пишат по-изчистен и лесночетим код. Java от самото си начало и до ден днешен не е била сред водещите езици по този критерий – едно от честите оплаквания на програмистите са сложните езикови конструкции.

Преди години с Java 7 се направи първата крачка към съкращаване на кода чрез автоматично типизиране при генерични типове. Нека погледнем следния код, с който дефинираме речник, в който на всяка дума отговаря списък от други думи: Прочети още…

.

 


* Форматиране на низове – примерна задача

Публикувано на 26 януари 2017 в раздел ПИК3 Java.

В долната задача демонстрирам употребата на String.format(). Дадена е следната задача: по подадено число N, да се отпечата чрез стандартния изход матрица с размерност NxN със звезди по диагоналите и празни интервали за останалите елементи.

Обикновено хората започват да търсят решение чрез вложени цикли, например: Прочети още…

.

 


* Упражнение 15, 2015

Публикувано на 08 януари 2016 в раздел ПИК3 Java.

Това е решението на примерната задача за изпит, която е дадена на javac.bg. Имаме библиотека за документ (docslib), сървърно приложение (Upr15Server) и две клиентски приложения: Upr15Student, което изпраща документи и Upr15Secretary, което обработва документи. Прочети още…

.

 


* Задача за подготовка за изпит: конзолна игра на Пексесо

Публикувано на 07 януари 2016 в раздел ПИК3 Java.

Трябва да се създаде сървър за игра на “Пексесо” (blocks). Играта ще се играе от трима души с четен брой от двойки картинки (карти). Картинките се разполагат на масата закрити с лицето надолу, а играчите един след друг се редуват да ги обръщат две по две. Ако даден играч с един ход обърне две еднакви картинки, той ги прибира и печели точка. В противен случай (ако картинките са различни), той ги връща обратно с лицето надолу където са били. Печели играчът, който събере най-много точки в края на играта. Във варианта, който се изисква вие да реализирате, няма да се показват картинки, а ще се използва матрица с числа. Например: Прочети още…

.

 


* Упражнение 13, 2015

Публикувано на 18 декември 2015 в раздел ПИК3 Java.

Задачата беше да се направи клиент-сървър приложение за обмен на файлове. Когато клиент се свърже, той първо си подава потребителското име. След това подава една от следните две команди:

  • send <име на файл>
  • get <име на файл>

При команда send клиента изпраща файла на сървъра и затваря връзката. Сървърът трябва да запише файла с име <username>-<име на файл>. При команда get сървъра намира файл с име <username>-<име на файл>, изпраща го на клиента и затваря връзката. Прочети още…

.

 


* Работа с дата и час

Публикувано на 09 декември 2015 в раздел ПИК3 Java.

В общи линии още от своето създаване Java винаги е търпяла критики към своята библиотека за работа с дата и час. Стандартните класове java.util.Date и java.util.Calendar имат редица проблеми:

  • Сбъркан дизайн: например Date не е дата, а е всъщност timestamp, месеците започват от 0. Дори да свикнете с това, дните пък си започват от 1. И т.н.;
  • Много трудна работа с часови зони;
  • Не можете да имате стандартни неща като дати без години, часове без отчитане на секунди и т.н.;
  • Няма вградена синхронизация за работа в многонишкова среда.

През годините паралелно с JDK се е развивала една библиотека наречена Joda, която решава тези проблеми. В крайна сметка с Java 8 се въвежда пакета java.time, който е с работно име JSR 310 и е базиран на библиотеката Joda, но има известни разлики с нея. В тази статия ще разгледаме именно JSR 310, защото от тук нататък това ще е стандартната библиотека за работа с дата и час в Java.

Четирите най-основни класа за работа с java.time са: Прочети още…

.

 


* Упражнение 11, 2015

Публикувано на 05 декември 2015 в раздел ПИК3 Java.

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

По сървъра редакциите са основно върху main метода на класа на създаденото преди това приложение. Това, което трябва да направите, е: Прочети още…

.

 


* Сериализация на обекти

Публикувано на 05 декември 2015 в раздел ПИК3 Java.

Java ни предлага механизъм, наречен сериализация на обекти. При него даден обект се представя като бинарна поредица съдържаща описание на класа на обекта и неговите конкретни данни (член-променливи). Така получената бинарна поредица може да бъде изпращана чрез ObjectOutputStream – например да бъде записана във файл, да бъде изпратена по мрежата до друг компютър и т.н. Четенето на обекта се осъществява чрез прозцес наречен „десериализация“ – при него обекта се възстановява в паметта в оригиналния си вид. Извършва се чрез ObjectInputStream. Най-важното за процеса на сериализация-десериализация е, че те са платформено независими, т.е. няма проблем да е сериализиран на един компютър и да бъде десериализиран на друг, който е със съвсем различни характеристики (дори и различна Java виртуална машина). Прочети още…

.

 


* Упражнение 10, 2015 – добавка

Публикувано на 01 декември 2015 в раздел ПИК3 Java.

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

  • GPOffice вече е самостоятелен клас;
  • Създаден е клас Report. При всяко посещение в стая с лекар за пациента се изготвя доклад за извършената дейност. После обратно в GPOffice докладите се сливат в един общ (метод mergeWith). За целта е променена логиката на метод nextPatient() – вече връща доклад за следващия пациент;
  • Няма хвърляне на изключения и не се утежняваме с try-catch блокове;
  • MedicalRoom и HospitalRoom вече са наследници на клас Room, с което структурата им става по-ясна;
  • Вече можете да вкарвате всякакви диагнози на пациенти, а не само предварително дефинираните. В MedicalRoom и HospitalRoom ще бъдат лекувани само тези болести, които са възможни (possibleCures), а непознатите няма да бъдат разглеждани;
  • Две болести (Diagnosis) приемаме за еднакви, ако имената им съвпадат – не обръщаме внимание на цените. Тоест ако даден пациент е болен от болест A и си мисли, че тя струва X лева, това не значи, че в болницата ще му струва толкова – може да е по-евтино или по-скъпо. Реализирано е по този начин, защото се стремих да намаля количеството код. Реално в масива с болести на пациента (sicknesses) не е нужно да се пази цената, а само името на болестта, но в случая преизползвах вече готовия клас (което следва и по наследство от решението на оригиналната задача);
  • Двама пациента приемаме за еднакви, ако са с едно и също име и ЕГН. Заболяванията им и болестите им не се взимат под внимание при сравнение на обекти;
  • GPOffice няма опашка с пациенти – такива има само при MedicalRoom и HospitalRoom. За опашката пред GPOffice се грижи main метода;
  • Пазим дълга (debt) на пациентите на две места – веднъж в репорта му в GPOffice и веднъж в статичния ArrayList debtors. За конкретната програма не е необходимо това дублиране на информация, но го запазих заради продължението от предишната задача.

Решение: Прочети още…

.

 


* Изходен код от упражнение 10, 2015

Публикувано на 29 ноември 2015 в раздел ПИК3 Java.

В това упражнение продължаваме задачата от уражнение 9. Ще я разширим и ще поправим някои нарочно допуснати в миналия час грешки. Вземете сорс кода от упражнение 9 и променете основния клас да е с име Upr10. Прочети още…

.