Большой Воронежский Форум
Страница 1 из 2
1 2 >
» Программирование>задача по высокоуровневым методам программирования
student1234 20:03 05.01.2008
Тема: Объектная модель делфи

Цели
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
Имхо можно просто из гугла навыдергивать готовых решений конкр. пункта задачи, сгруппировать это по-человечески и вот тебе задачка. А еще при этом хоть попытаться что-нибудь разобрать самому и вникнуть в смысл. Вот сколько пользы то будет! [Ответ]
kurdt 16:34 10.01.2008
ООП в делфи. Жжоте господа [Ответ]
skyfish 17:04 10.01.2008
цена вопроса? [Ответ]
DWanek 19:31 10.01.2008

Сообщение от kurdt:
ООП в делфи. Жжоте господа

Да будет тебе известно, что в 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, если так можно сказать, тоже ПОЛНОСТЬЮ ОБЪЕКТНО-ОРИЕНТИРОВАННАЯ.

Готов на это поспорить. [Ответ]
cfyx 13:52 11.01.2008
а множественное наследование так и отсутствует, DWanek... да и ссылки тоже не только в дельфи присутствуют. ты с++ с с не путаешь? )) [Ответ]
DWanek 19:57 11.01.2008

Сообщение от cfyx:
а множественное наследование так и отсутствует, DWanek... да и ссылки тоже не только в дельфи присутствуют. ты с++ с с не путаешь? ))

1. Множественное наследование:

Цитата из Википедии: Множественное наследование — потенциальный источник ошибок, которые могут возникнуть из-за наличия одинаковых имен методов в предках. В языках, которые позиционируются как наследники C++ (Java, C# и др.), от множественного наследования было решено отказаться в пользу интерфейсов.

Скажем пример на Object Pascale:

TClass1 = class
constructor ...
destructor ...
end;

TClass2 = class(TClass1)
constructor ...
destructor ...
end;

TClass3 = class(TClass2)
constructor ...
destructor ...
end;

И так до бесконечности. Все функции, процедуры и переменные бъявленные в высших классах доступны в низших. Этого вполне достаточно.
А вот в с++ точно нет простого оператора "inherited" и чтобы сначала вызвался метод, определённый для класса-родителя а потом для наследника нужно городить целую конструкцию. В Delphi это делается одним словом.

2. На тему того, что что-то ещё где-то есть: я сдесь не пытаюсь сказать, что с++ хуже Object Pascalя. Хотя для меня Delphi лучше и удобнее. Меня зацепило, то что было сказано, что ООП в Delphi нет. И ещё перк по поводу того, что если спецификазия языка, что-то позволяет, это ещё ничего не значит. [Ответ]
DWanek 20:40 11.01.2008
Да и кстати ссылка на Википедию: http://ru.wikipedia.org/wiki/Объектн...ограммирование.

Там если пощёлкать по ссылкам и посмотреть признаки ООП, как раз приводятся примеры и на С++ и на 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 это еще проще и удобней.

Не был бы я так категоричен. [Ответ]
Nvetal 05:32 16.01.2008
Согласно тезису Тьюринга - Черча, любой язык программирования, способный эмулировать Машину Тьюринга можно использовать для решения любой вычислительной задачи, которою можно решить на Машине Тьюринга...Насколько я знаю, и С и Дельфи - полный по Тьюрингу языки.... [Ответ]
kurdt 13:22 16.01.2008
договоримся, что это дело вкуса [Ответ]
DWanek 14:52 16.01.2008

Сообщение от kurdt:
договоримся, что это дело вкуса

Согласен. [Ответ]
cfyx 15:38 16.01.2008

Сообщение от 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 минуты. Если чесно это очень напрягает, поменял строчку - сидишь ждешь, попробовал - не то, поменял опять, опять сидишь ждешь. И так без конца.

ИМХО Delphi удобнее. [Ответ]
The_God 18:51 20.01.2008
можно написать класс который будет представлять собой массив любых однотипных элементов, операции сортировки, поиска и другие програмиш один раз и не зная какой тип элементов будет в массиве.

код для массива каждого используемого потом типа генерится уникальныйй для каждого типа и оптимизится для них независимо, поэтому проигрыша в скорости выполнения не будет.

это самое простое наверное ..

а вабще на этом заточена куча библиотек такого абстрактного программирования, например 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, Я тут кстати твой сайт посмотрел, мы почти одним и тем же занимаемся. И в "Бутор" я в свое время пытался на работу устроиться, хорошо вовремя отсоветовали. Сейчас в одной компании геймдевом занимаюсь. [Ответ]
лесоруб 20:39 20.01.2008
Пмм 3 семестр. [Ответ]
Страница 1 из 2
1 2 >
Вверх