Nov 01

Что-то я затянул немного выполнение лабораторных работ некоторых по универу, нужно исправляться. Сегодня решил вернуться ко второй лабе по ООП. Задание таково:

“Разработать объектно-ориентированную библиотеку для работы со структурами данных по одной из нижеперечисленных тем в соответствии с нижеуказанными требованиями. Свойства и методы для классов разработать в соответствии с известными определениями соответствующих структур данных. Составить тесты для проверки работоспособности библиотеки. Составить программу, демонстрирующую возможности разработанной библиотеки.”

Требования - хрен с ними, а вот тема мне попалась интересная: “Сетевые базы данных (ввод/вывод, навигация)”. Когда я это задание читал в первый раз - я впал в ступор. Потом оклемался, но когда видишь такое задание как-то не по себе становится…

Сетевая бд - это бд, в которой для связи записей используются графы (граф, по курсу структур данных, - это сеть). Т.е. здесь, в отличии от иерархических бд, связи получаются “много к многим” (а там - “один ко многим”).

Поговорил немного с преподами о задании, итог получился такой - “нам не нужна универсальная бд, сделай несколько таблиц статических и связывай их”. Говорил действительно немного - минуты полторы, так что кроме фразы выше я ничего особо не услышал. Сегодня решил хоть чего-нибудь напроектировать, чтобы в пятницу показать преподам и убедится, правильно ли я делаю, или нет. Мысля сейчас такая: есть отдельные таблицы (неважно, как представленные) и есть какой-нибудь класс Relation, который их связывает. Собственно, это очень напоминает обычную иерархическую бд (таблица - связующая таблица - таблица), но как это оформлять по другому я пока что не представляю.

Сел за комп, закодил… Получилось такая фигня:

class Masseur : public Record {
public:
    Masseur();
    virtual ~Masseur();
private:
    char* _name;
    char* _surname;
    char* _fathername;
    char* _qualification;
    Date _birthday;
};

class Service : public Record {
public:
    Service();
    virtual ~Service();
private:
    char* _name;
    char* _part;
    int _duration;
    double _price;
};

class MasseurServiceRelation : public Relation {
public:
    MasseurServiceRelation();
    virtual ~MasseurServiceRelation();
private:
    void add(Masseur*, Service*);
    void remove(Masseur*, Service*);
    void remove(Service* service);
    void remove(Masseur* masseur);
};

Сейчас сижу и думаю, правильным ли путем я иду…

PS. А первые две таблицы очень напоминают паттерн ActiveRecord, на правда ли? :)

written by fxposter \\ tags:

Oct 25

Ну вот нахера, скажите мне, мне, знающему очень даже неплохо SQL учить этот галимый Visual FoxPro?  Нет, я все понимаю - он несложный, его выучить можно быстрее чем тот же MySQL, с его помощью можно быстро писать законченные desktop-приложения, но… Просто когда сидишь над этим FoxPro по 8 часов подряд, пытаясь сделать хоть что-то по лабораторной работе, а в итоге нихера не получается… И так у всего потока практически. по-моему это уже немного не мои проблемы, а самого FoxPro и препода, который нам его читает.

Ну это так… Накипело.

На самом деле я против FoxPro в рамках учебной программы ничего не имею (если рассмартивать его просто как “еще одну СУБД”), в отличии от тотального большинства моих одногрупников. Ну поставили нам его в программу - фиг с ним, лабы сдадим и забудем. Я также вполне нормально отношусь к тому, что нам запрещают использовать SQL, хотя СУБД его нормально поддерживает, - преподаватель всегда прав. :) Да, и еще - я не пытаюсь сравнивать, в отличии от все того-же большинства одногрупников, FoxPro с тем же MySQL - они сделаны для разных задач и… в принципе я считаю, что каждая из этих СУБД имеет место быть (хотя иногда мой мозг выступает категорически против FoxPro).

Мне не нравятся совершенно другие вещи:

  1. FoxPro пришел к нам из доса, и в нем до сих пор есть куча комманд, которые сейчас уже особого смысла не имеют. Например, работа со связями или с окошками. То есть, многие действия можно выполнить как минимум двумя разными способами, причем способы, которые пришли из доса явно функциональнее. Самая главная проблема, что способы вообще несовместимы. Хотите построить меню define’ами (препод сказал, что типа за это больше всего баллов) - стройте также и все остальное (формочки всякие и прочее), а вот построить удобным построителем форму и добавить туда define’ами меню не получится никак.
  2. Я не любитель работать с формами. Вообще. А здесь еще, к тому же, сама работа с формами несколько “кривоватая”. :)
  3. Индексирование и связывание глючит. И, похоже, не только у меня. Правда отдельные личности сумели вроде как с этим ужиться. А сегодня препод вообще выдал “если у вас связывание много-ко-многим - фильтрация данных может глючить” - я был очень рад после этих слов! Тем не менее, лабу сдать все равно нужно. :(

Раздражает глючность и несбалансированность самого FoxPro. Причем раздражение начинается только тогда, когда посидишь над ним часиков 5, и за это время решишь две простенькие задачи. Да, потом эти задачи ты будешь решать быстро, но пока вьедешь, как и что…

Одно радует - в MSDN все-таки можно найти хорошие примеры кода, которые быстро все обьясняют. :)

written by fxposter \\ tags:

Oct 23

Начнем издалека… Есть в C++ встроенный тип size_t, который является “целым типом без знака, используемым реализацией для индексирования массивов” © Страуструп. То есть, если вы работаете с индексами в массивах и их длинами, то в общем-то “правильнее” использовать не int, что в большинстве случаев и делается, а именно size_t (для длин можно еще использовать ptrdiff_t - тип, который возвращает операция вычитания двух указателей). Вчера эта “правильность” для меня вышла боком…

size_t length;
...
for(size_t i = 0; i < length; ++i) {
    double x = 2 * (i - length / 2) / length;
    ...
}

Вот такой был изначальный код. Через несколько минут после написания я вспомнил, что неплохо бы сделать так:

size_t length;
...
for(size_t i = 0; i < length; ++i) {
    double x = 2 * static_cast<double>(i - length / 2) / length;
    ...
}

потому что при делении двух целых чисел у нас тоже целое будет, а мне нужно было как раз вещественное.

Но это еще ладно. После этого я отдал свой кусок лабораторной (мы ее пишем парами) своей девушке (а я как раз с ней пишу). Когда она добралась до этого кода и стала тестить его - у нее стали получаться какие-то странные, неправильные числа. Долгое время я копался в коде и не мог понять, в чем проблема, а потом до меня наконец-то дошло - разность двух беззнаковых чисел также будет беззнаковая (т.е. число -1 будет на самом деле 0xFFFFFFFF), после чего код превратился в такой:

size_t length;
...
for(size_t i = 0; i < length; ++i) {
    double x = 2 * static_cast<double>(static_cast<int>(i) - static_cast<int>(length) / 2) / length;
    ...
}

После чего я на всякий случай еще полчаса проверял небольшую программу на вот такие ошибки - на всякий случай. К счастью, таких больше не нашлось, но неприятный осадок остался.

Выводы: или пишите не особо заморачиваясь на правильности употребления типов (везде используйте int и double, например), или пишите семантически правильно, но не делайте таких ошибок, как я… Может, конечно, это только я такой, но мне лично сложно было именно по коду определить, что результат будет получаться не такой как я хочу.

PS. Я теперь немного понимаю, почему в Java нет unsigned типов. :) 

written by fxposter \\ tags:

Sep 01

Всех учеников и студентов поздравляю с началом нового учебного года! Хороших вам преподов и классных оценок!

PS. А я уже на 3-м курсе.

written by fxposter

Jul 14

Ну вот теперь я полноценный третьекурсник, вчера сдал летнюю практику и получил (может и не)заслуженную пятерку. :)

Сдал я практику просто офигительно - за день сделал “змейку”, написал по ней отчет. Принес, показал - препод сказал - “А где help? Делай help!”. Ну ладно - принес сдаваться в последний день, вместе с отпечатанным отчетом. Препод на игрушку даже не посмотрел, полистал отчет и начал “шутить”:

Он: “Ну что, Паша, трояк?”

Я: “Не, ну какой трояк, там почти все, что вы просили в задании, реализовано!”

Он: думает минуту… “Ну ладно, ставлю 75 баллов.” (это четверка)

Я: “А больше никак?”

Он: “Никак”

Я: “Ну ладно…”

Отдал, значит, ему зачетку. Он там поставил что-то. Я забрал ее и не глядя положил в рюкзак.

Где-то минут через 10, когда я уже собирался уходить, я решил глянуть - сколько он мне все-таки поставил. Смотрю - 90 баллов (пятерка). Я поофигевал секунд 30 и свалил домой. :)

written by fxposter

Jul 01

Ну вот и закончился последний экзамен. Как и ожидалось - по всем экзаменам у меня пятерки. Можете меня с этим поздравить. :) Огорчает одна вещь - еще 2 недели у нас будет летняя практика, на которой мы должны сделать какую-нибудь программу (препод явно так настаивает на игрушке) и подготовить по ней полную документацию. Вообще, если не кривить душой - эту практику можно было спокойно сделать во время всего 2-го семестра, сдать ее и забыть. Но в силу некоторых обстоятельств (а точнее - моей природной лени) - у меня пока что ничего не готово, если не считать того, что я могу попробовать сдать свои две игрушки (арканоид и змейку), которые я писал в далеком 10-м классе (т.е. ни много, ни мало, а больше 3-х лет назад) на Visual Basic 6.0. Доделывать эти игрушки сейчас уже особо возможным не представляется по нескольким причинам:

  1. Разбираться в том, что я писал 3 года назад особо не хочется, хотя это и поправимо
  2. Вспоминать 6-й VB мне как-то тоже не хочется

Так что попробую сдать свои игрушки ему такие, какие они сейчас есть, а если не прокатит - буду переделывать на c++.

И наконец самое главное - через 3 часа я уезжаю на неделю на море! Поздравления принимаются. :)

PS. Половину летней практики я прогуливаю. Препод меня убьет. :)

written by fxposter \\ tags:

Jun 10

Уррра!!! Осталось сдать экзамены (3 из 5, по остальным - автоматом 5-ки будут) и буду полностью свободен!

PS. На выходных был у бабушки с дедушкой в луганской области - покушал шашлычков, чего и всем желаю :) 

written by fxposter

Jun 07

Последняя лабораторная, которую я делал достаточно долго и до сих пор не уверен в 100%-й правильности ее работы, потому прошу всех протестировать эту лабу.

Как я раньше писал, по Компьютерным Информационным Технологиям у нас 3 лабораторные работы + экзамен, но те, кто сделал эти 3 работы раньше чем нужно, могут попросить препода дать им 4-ую лабу, сделав которую можно не идти на экзамен. Моя 4-ая лаба - реализация одного из алгоритмов поиска всех вхождений подстроки в строке, а именно - реализация алгоритма Бойера-Мура (Boyer-Moore). В этом алгоритме поиск в лучшем случае (при удачной реализации) выполняется за сублинейное время (т.е., за O(k*n), где k = const, k < 1). Проблема реализации заключалась в том, что:

  • алгоритм нам объясняли с использованием строк с символами [1...n] (т.е. первый символ строки находится на [1]-й позиции), а мне пришлось делать с обычными c’шными строками [0...n-1]; на первый взгляд кажется - ну и в чем тут проблема… проблема в сложности алгоритма… его и просто по книжке нелегко реализовать, а тут еще и добавляются всякие проблемы - там единицу не добавил, там - не отнял и т.д.
  • алгоритм нам объяснили не полностью, а где-то на 2/3… оставшуюся часть пришлось выводить самому… над алгоритмом, который в итоге был реализован функцией в 20 строчек, я сидел часа 4… вроде заработало…
  • ну и все остальное по мелочи :)

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

Файлы: source (string.h + string.cpp).

written by fxposter \\ tags: , ,

Jun 06

Последняя лабораторная по “Архитектуре ЭВМ” - это был отжиг. Один из преподов (которому мы эту работу должны были сдать) долго болел и на наших занятих был всего пару раз. После того, как он “отболел”, он появился у нас на уроке, начал наезжать, что мы всей группой нифига не сдаем (офигенно просто, особенно если учитывать, что сдавать некому было), пугал тем, что нас расформируют как группу и все мы перейдем под его кураторство (он куратор в параллельной группе).

После наездов препод огласил наконец - что именно он от нас хочет на лабораторной, а именно - низкоуровневого программирования (работа с каким-нибудь устройством), и желательно на ассемблере. Попытки доказать ему, что ни одна современная ОС не даст нам напрямую соединится с устройством, он мне выдал замечательнейшую фразу - “загружайтесь с дискеты под дос и программируйте”. Это была жесть.

Сейчас он немного успокоился и без проблем принимает лабораторные на WinAPI (которого, как мне показалось, он вообще не знает).

Так как выбор был небольшой (особо парится не хотелось) - сделал программу для “работы” с клавиатурой. Смотрите сами. :) В файлах - класс работы с клавиатурой (обертка для некоторых функций из WinAPI), builder’овский проект (мне влом разбираться, что здесь нужно, а что нет - выкладываю весь проект, ну и exe’шник.

Файлы: source (keyboard.h), source (builder project), exe.

PS. Ближе к вечеру сегодня появится еще одна лаба. :) 

written by fxposter \\ tags: , , ,

Jun 06

После долгого отдыха от универа (как-то странно получилось, я на полтора месяца забил на домашние задания), возвращаюсь к программированию. Последняя лабораторная работа по “Абстрактным Типам Данных” (предмет на самом деле называется не так, но по сути на нем преподают как раз АТД) - класс графа.

Описание и вся документация по графу - в исходниках. Если нужно - могу выложить HTML’ные странички, сгенерированные cpp-doc’ом, хотя вы и сами можете сделать их. ;)

Так как это лаба модульная (к ней нужно делать отчет и прочее) - пришлось соорудить на скорую руку простенький GUI (делал в Borland C++ Builder), показывающий некоторые возможности графа. Его исходники я не выкладываю, они вряд ли будут кому-то интересны.

Файлы: source, gui (exe).

written by fxposter \\ tags: , ,