Цели
1. научиться разрабатывать и реализовывать классы в объектной модели Delphi Pascal
2. знать особенности реализации полиморфизма
3. научиться определять свойства и работать с ними
4. научиться создавать наследников от классов, уже реализованных в среде разработки
формулировка задания:
разработать и реализовать программу, позволяющую работать с типизированными файлами. Для промежуточного хранения данных в оперативной памяти использовать структуры данных, реализованные с помощью объектной модели Delphi Pascal.
Требования
1. программа должна позволять:
1.1. создавать новый файл
1.2. открывать существующий файл
1.3. сохранять его
1.4. сохранять файл под другим именем
1.5. загружать данные из текстового файла
1.6. сохранять данные в текстовый файл
1.7. добавлять, удалять, редактировать данные
1.8. осуществлять поиск(выборку) данных с указанием количества найденных сведений по нескольким критериям.
2. в программе должен быть реализован класс, соответствующий одной записи. В классе должны присутствовать такие методы как:
2.1. конструктор, инициализирующий поля пустыми значениями
2.2. конструктор инициализирующий поля заданными значениями
2.3. процедура, обеспечивающая заполнение полей с клавиатуры
2.4. процедура, осуществляющая печать полей.
2.5. загрузка данных из текстового файла.
2.6. сохранение данных в текстовый файл и т.д.
при реализации класса обязательно наличие секций, ограничивающих доступ к полям, а также свойств, обеспечивающих этот доступ. Класс должен быть реализован в отдельном модуле.
3. в программе должен быть реализован класс «список данных»,построенный на базе стандартного класса TList(Наследник). В классе должны присутствовать такие поля, как:
3.1. имя рабочего файла
3.2. тип рабочего файла(текстовый или типизированный)
3.3. были ли какие-то изменения данных файла и т.д.
внутри класса «список данных» должны быть реализованы такие методы, как
a) создание нового файла
b) загрузка данных из сущ.файла(типизированного или текстового)
c) сохранение данных в файл(текстовый или типизированный)
d) вывод данных на экран
e) поиск (выборка) данных по нескольким простым критериям.
При реализации класса обязательно наличие секций, ограничивающих доступ к полям, а так же свойств, обеспечивающих этот доступ. Класс должен быть реализован в отдельном модуле.
Задание:
В файле хранится следующая информация о музыкальных композициях
- исполнитель(string[40]);
- песня(string[40]);
- группа (string[40]);
- альбом (string[40]);
- год выпуска (диапазон 1…2007)
- жанр(перечислимый: рок, поп и т.д.)
- длительность( TDataTime)
нужно решить ее кровь из носу, желательно к 9ому, но можно и попозже но никак не позже 13 января. Поможете?
[Ответ]
Pengvin 11:13 07.01.2008
епт да тут учебник почитать минут 15 и задача решена. Это ж где ты бедный учишся, что вам учебников не выдают? Тут даже думать не надо. Писанины много, а думать ну совсем не надо.
[Ответ]
lollipop 11:20 07.01.2008
Имхо можно просто из гугла навыдергивать готовых решений конкр. пункта задачи, сгруппировать это по-человечески и вот тебе задачка. А еще при этом хоть попытаться что-нибудь разобрать самому и вникнуть в смысл. Вот сколько пользы то будет!
[Ответ]
Да будет тебе известно, что в Delphi используется Object Pascal, который ПОЛНОСТЬЮ объектно-ориентированный.
[Ответ]
kurdt 08:24 11.01.2008
Сообщение от DWanek:
Да будет тебе известно, что в Delphi используется Object Pascal, который ПОЛНОСТЬЮ объектно-ориентированный.
то что спецификация языка позволяет реализовывать ООП ни о чем не говорит. Сама реализация в delphi убогая и неуклюжая.
[Ответ]
DWanek 12:48 11.01.2008
Сообщение от kurdt:
то что спецификация языка позволяет реализовывать ООП ни о чем не говорит. Сама реализация в delphi убогая и неуклюжая.
Так может сказать только дилетант, который мало что понимает. Готов поспорить на что угодно, что ВСЁ что ты напишешь на любом другом языке и в любом другом редакторе я без проблем сделаю в Delphi.
А вот скажем есть 10 классов, которые унаследованы друг от друга по нисходящей цепочке и в каждом добавляются по 10 новых функций. Ты на "С++" замучаешься это писать и читать. А если передать данные данные из одного стороннего класса в другой угробишься только с одними указателями (если данные например тоже класс). В Delphi всё это делается очень быстро и просто. Я не один год работаю программистом и могу сказать, что в Delphi нет ничего убогого и неуклюжего. ВСЁ работает очень быстро, правильно и удобно. Повторюсь Object Pascal объектно-ориентированный, Delphi, если так можно сказать, тоже ПОЛНОСТЬЮ ОБЪЕКТНО-ОРИЕНТИРОВАННАЯ.
а множественное наследование так и отсутствует, DWanek... да и ссылки тоже не только в дельфи присутствуют. ты с++ с с не путаешь? ))
[Ответ]
DWanek 19:57 11.01.2008
Сообщение от cfyx:
а множественное наследование так и отсутствует, DWanek... да и ссылки тоже не только в дельфи присутствуют. ты с++ с с не путаешь? ))
1. Множественное наследование:
Цитата из Википедии: Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов.
Скажем пример на Object Pascale:
TClass1 = class
constructor ...
destructor ...
end;
И так до бесконечности. Все функции, процедуры и переменные бъявленные в высших классах доступны в низших. Этого вполне достаточно.
А вот в с++ точно нет простого оператора "inherited" и чтобы сначала вызвался метод, определённый для класса-родителя а потом для наследника нужно городить целую конструкцию. В Delphi это делается одним словом.
2. На тему того, что что-то ещё где-то есть: я сдесь не пытаюсь сказать, что с++ хуже Object Pascalя. Хотя для меня Delphi лучше и удобнее. Меня зацепило, то что было сказано, что ООП в Delphi нет. И ещё перк по поводу того, что если спецификазия языка, что-то позволяет, это ещё ничего не значит.
[Ответ]
Там если пощёлкать по ссылкам и посмотреть признаки ООП, как раз приводятся примеры и на С++ и на Delphi.
Так пожалуй проще будет, чем тут что-то доказывать.
[Ответ]
PIFzBOT 21:08 11.01.2008
Сообщение от DWanek:
Так может сказать только дилетант, который мало что понимает. Готов поспорить на что угодно, что ВСЁ что ты напишешь на любом другом языке и в любом другом редакторе я без проблем сделаю в Delphi.
Готов на это поспорить.
Веско!!!
Сколько языков знаешь? как насчёт программы прошивки контролера (С51, или АСМа)... лана шучу!
[Ответ]
kurdt 14:54 15.01.2008
будет вам письками меряться..
возможно, в Delphi ООП проце и удобней чем в С, но в Java это еще проще и удобней.
[Ответ]
DWanek 15:46 15.01.2008
Сообщение от kurdt:
будет вам письками меряться..
возможно, в Delphi ООП проце и удобней чем в С, но в Java это еще проще и удобней.
Согласно тезису Тьюринга - Черча, любой язык программирования, способный эмулировать Машину Тьюринга можно использовать для решения любой вычислительной задачи, которою можно решить на Машине Тьюринга...Насколько я знаю, и С и Дельфи - полный по Тьюрингу языки....
[Ответ]
Сообщение от DWanek:
А вот в с++ точно нет простого оператора "inherited" и чтобы сначала вызвался метод, определённый для класса-родителя а потом для наследника нужно городить целую конструкцию.
улыбнуло... base_class::method() - это целая конструкция? ))
[Ответ]
The_God 15:56 16.01.2008
а если еще в определениии классов писать
typedef base_class inherited;
то можно будет использовать однотипно во всех классах
inherited::method();
изза одной строчки с typedef вводить в C++ новое зарезервированое слово "inherited" смысла нету
если комуто нравится много зарезервированых слов на все случае жизни то ради бога, а мне вот нравится с++, где каждое зарезервированое слово практически сложно или не заменимое другими конструкциями языка.
я тож давно програмлю на с++, сравнивать с делфи его не могу потомучто делфи мною был забыт за ненадобностью сразу после получения диплома вгу пмм.
язык надо понимать для каких он целей создан и куда развивается ( если конечно развивается ) и использовать его по назначению этому.. а не доказывать на форуме что "моё кунгфу сильнее твоего"
мне хоть и нравится С++, но яж не програмлю сервачные скрипты на нём, для этого есть PHP и Perl и может еще чтото, но врядли с++
кстати, как в делфи реализовано метапрограммирование, это ведь следущая ступень развития после ООП [Ответ]
DWanek 17:27 19.01.2008
Сообщение от The_God:
как в делфи реализовано метапрограммирование, это ведь следущая ступень развития после ООП
Признаю, никак.
Объясни, только пожалуйста, зачем оно нужно, по большому смыслу? Что это я знаю. Только по-моему без него можно прекрасно обойтись. Например использования в с++ "прекомпилинга", если так можно сказать (как пример метапрограммирования) влечёт за собой потерю времени, Delphi компилит проект намного быстрее.
[Ответ]
The_God 17:32 19.01.2008
Сообщение от DWanek:
Только по-моему без него можно прекрасно обойтись.
можно и без ООП обойтись
это новый уровень абстракции, программирование алгоритмов независимых от типов, да есть замедление компиляции, но оно того стоит [Ответ]
DWanek 18:33 20.01.2008
The_God, если не затруднит, приведи пример, где оно того стоит.
От себя могу сказать, что на работе мы пользуемся Delphi. Процесс билда проекта, который мы делаем занимает 5-6 секунд. Тоже самое в вижуал студии билдится 1-2 минуты. Если чесно это очень напрягает, поменял строчку - сидишь ждешь, попробовал - не то, поменял опять, опять сидишь ждешь. И так без конца.
можно написать класс который будет представлять собой массив любых однотипных элементов, операции сортировки, поиска и другие програмиш один раз и не зная какой тип элементов будет в массиве.
код для массива каждого используемого потом типа генерится уникальныйй для каждого типа и оптимизится для них независимо, поэтому проигрыша в скорости выполнения не будет.
это самое простое наверное ..
а вабще на этом заточена куча библиотек такого абстрактного программирования, например boost, или стандартный для с++ stl, в них описаны наверное все широкораспространеные алгоритмы, ты лиш биреш и применяешь их для своих типов не изобретая велик для каждого типа отдельно.
еще можно написать функцию которая будет принимать не только параметры но и типы с которыми она должна внутри оперировать
обращение к такой функции выгялдит так (пример) :
A = Calculation<CMyType, int, float>( SrcInfo, DataPtr, DataSize, true );
не нужно для каждого типа писать свою функцию, т.е. алгоритм в функции не зависит от типа, ты ей передал и типы с которыми она должна работать и параметры.. помоему это тру
можно еще чень вспомнить.. но проще в работе когда чтото нужно сделать красиво то биреш и юзаеш эту фичу
здесь идёт нагрузка на компилятор, он генерит код для типов, можно делать так что будут савсем разный код генерится в зависимости от какхто параметров, это способ программировать генерацию кода. есть книга А.Александреску Современное проектирование на С++, он так как раз описывает как можно загнаться в этой области это следущий уровень абстракции.
Сообщение от DWanek:
Тоже самое в вижуал студии билдится 1-2 минуты. Если чесно это очень напрягает, поменял строчку - сидишь ждешь, попробовал - не то, поменял опять, опять сидишь ждешь. И так без конца.
там есть разные режимы сборки, не надо на студию наезжать.. всё она умеет быстро собирать, и перекомпиливает он только то что ты там нового напрограмил, не весь проект.
[Ответ]
DWanek 19:46 20.01.2008
Я согласен с тобой, что в C++ это сделать полегче и побыстрее.
Но в Delphi это тоже возможно.
Например по поводу массива одинаковых, но неопределенных типов:
заводим такой массив:
Objects : array of TObject;
Далее пишем любые классы, они все поумолчанию наследуются от класса TObject, например
type
Class1 = class
public
X: integer;
constructor...
destructor...
end;
Class2 = class
public
X: single;
constructor...
destructor...
end;
Class3 = class
public
X: string;
constructor...
destructor...
end;
далее добавляем в этот массив переменные этих классов и используем переменную "X" как душе угодно, независимо от того какого она типа. Функции и процедуры сортировки, выборки и т.д. для массива опять таки пишутся оди раз и используются независимо от того какого они типа.
С функциями и процедурами в которые приходят параметры неизвестных типов 2 варианта:
1. использовать функции и процедуры "overload", но тогда каждую функцию нужно отдельно расписывать.
2. опять таки как выше использовать переменные типа "TObject", а в обработчике вызывать операторы "is" и "as", которые проверяют и кастят "TObject" к любому типу.
Согласен, что гемороя больше, но возможно.
[Ответ]
The_God 20:11 20.01.2008
это решение с помощью ООП. вот только более элегантно это решается с помощью метапрограммирования.
я не заставляю переходить на с++ ( чем меньше людей знают с++ тем больше у меня зп )
это хорошо что после универского обучения делфям можно идти работать программистом. главное чтоб нравилось то чем занимаешся.
функция возвращает минимум, приминима к любым типам у которых определен оператор сравнения "<" и разрешен конструктор копирования
template< class my_type >
my_type GetMin( my_type A, my_type B )
{
____if ( A < B )
________return A;
____else
________return B;
}
int X = 10;
int Y = 20;
int Min = GetMin<int>( X, Y );
более того в вызове функции "<int>" можно не писать, когда компилятору очевиден используемый тип его можно не указывать.
[Ответ]
DWanek 20:25 20.01.2008
А что будет, если в эту функцию передать integer и string?
В институте Delphi я как таковую не изучал. Хотя политех закончил. Выучил сам, интересно в свое время было вот и выучил.
[Ответ]
The_God 20:29 20.01.2008
в описании функции написано что у обоих параметров одинаковый тип.
если используется так GetMin<string>( chislo, stroka ) то если можно неявно преобразовать число в строку ( у класса строки есть конструктор от параметра integer, или у ingeter есть оператор неявного преобразования в string ) то все будет хорошо, иначе - ошибка компиляции.
если используется так GetMin<integer>( chislo, stroka ) то если можно неявно преобразовать строку в integer ( у класса integer есть конструктор от параметра string, или у string есть оператор неявного преобразования в integer ) то все будет хорошо, иначе - ошибка компиляции.
c++ тоже типизированый язык, копилятор определяет типы на этапе компиляции и генерит процедуры для каждого использованого типа свои, никакие типы не определяются при выполнении ( есть dynamic_cast но его использование приравнивается к использованияю goto )
[Ответ]
DWanek 20:35 20.01.2008
Порывшись в памяти вдруг вспомнил, что вроде как Pascal это "сильно типизированный язык", так что там так нельзя по спецификации. Хотя жаль, можно было бы упростить много вещей, которыми я пользуюсь.
[Ответ]
DWanek 20:38 20.01.2008
The_God, Я тут кстати твой сайт посмотрел, мы почти одним и тем же занимаемся. И в "Бутор" я в свое время пытался на работу устроиться, хорошо вовремя отсоветовали. Сейчас в одной компании геймдевом занимаюсь.
[Ответ]