![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 06.12.2006
Сообщений: 31
|
![]()
Привет всем. Не подскажите мне как исправить ошибки. Это по предмету «Объектно-ориентированное программирование». На тему «Взаимодействие классов на принципах композиции». Примером является создание структуру данных «Динамический список статических очередей». Я написала описание классов(Буду делать в Delphi):
Информационный класс: TADS=class private FNumber:integer; // какая-то информация public constructor Create(NaveNumber:integer); function GetNumber:integer; function SetNumber(NewNumber:integer); end; Класс очередь: TQueue=class private FQueue: array[1..10] of TADS; // статический массив объектов типа «информация» FFirst,FLast:TQueue; FCount:integer // число элементов в очереди(массиве) public constructor Create(NewQueue:TADS, NewCount:integer) ;overload; function GetCount:integer; function GetFirst:integer; function GetLast:integer; function Add(Item:TADS; Index:integer); function Delete(Index:integer); function SetCount(NewCount:integer); procedure ShowAll; end; Класс элемента списка: TListItem=class private FQueue: TQueue; // содержимое элемента списка(очередь) FNext: TListItem; public function GetQueue:integer; function SetQueue(NewQueue:integer); function GetNext:integer; procedure ShowAll; end; Класс списка: TList=class private FFirst: TListItem;// показывает первый элемент списка FCount1:integer; // число элементов public constructor Create(NewFirst: TListItem,NewCount1:integer);overlo ad; function GetCount1:integer; function SetCount1(NewCount1:integer); function GetFirst:integer; function Delete(Index:integer); procedure Insert(Index:integer, NewQueue: TQueue); procedure Open; procedure Close; procedure Save; end; Мне сказали ошибки есть. И даже сказали где мои ошибки: 1. В классе очереди свойства FFirst и FLast объявлены неправильно (очередь реализуется на базе массива!) 2. В классе элементов списка нет конструктора 3. Для чего нужны методы типа ShowAll ? 4. Что это за методы Open и Close ? 5. Параметры некоторых методов продуманы плохо, при реализации это вылезет И вы добрые люди не сможете показать как будет выглядеть описание классов если исправить ошибки. 2 и 3 я как бы поняла а вот остальные ошибки не как не могу сообразить, то есть не знаю как исправить. Методы Open и Close я использовала для того что для сохранения в файл и загрузка из файла. Если эти не используется а какой метод для этого предназначен то а? Я в инете пробовала искать электронные учебники че то не смогла найти хорошую. C НЕТЕРПЕНИЕМ жду ваших советов добрые люди. Заранее БОЛЬШОЕ СПАСИБО. |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Код:
Напишите тестовые примеры. Например Код:
Код:
|
![]() |
![]() |
![]() |
#3 | ||
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]() Цитата:
ну так допишите Цитата:
ну хотя бы, если функция ничего не возвращает, то уж сделайте ее процедурой. |
||
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 06.12.2006
Сообщений: 31
|
![]()
Большое спасибо что не оставили мой вопрос без ответа. АlexBlack
если у меня в дальнейшим будет вопросы можно будет у тебя спрашивать а? Pu4koff вот это: 1. В классе очереди свойства FFirst и FLast объявлены неправильно (очередь реализуется на базе массива!) 2. В классе элементов списка нет конструктора 3. Для чего нужны методы типа ShowAll ? 4. Что это за методы Open и Close ? 5. Параметры некоторых методов продуманы плохо, при реализации это вылезет Мне отправил преподаватель. Я сама подумала но особо не смогла исправить свои ошибки вот поэтому к вам обратилась. |
![]() |
![]() |
![]() |
#5 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]()
про очередь на основе массива. одного кол-ва элементов в очереди мало. надо хранить первый и последний элемент очереди. мы же добавляем элементы в конец очереди, а извлекаем из начала. поэтому может быть так:
__****___ где _ - свободные ячейки очереди, а * - занятые. или так: **_____** метод вставки в очередь по идее не нужен, а сделать просто добавление в конец очереди и удаление из начала очереди и больше никаких модификаций. это же очередь. зачем нам ненужные функции. всё должно быть по делу. ShowAll если по заданию не нужен, то лучше удалить наверно, ибо непонятный и ненужный функционал он в любом случае нести будет) |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 06.12.2006
Сообщений: 31
|
![]()
Привет всем. Люди доброе подскажите-ка мне пожалуйста. В классе очереди надо свойства FFirst и FLast объявить. Если так написать код правильно будет.
TQueue=class private FQueue: array[1..10] of TADS; FCount, FFirst, FLast:integer // число элементов в очереди(массиве) public constructor Create(NewQueue:TADS);overload; destructor Destroy;override; function GetCount:integer; procedure Add(Item:TADS); procedure Insert(Item:TADS; Index:integer); function GetFirst:TADS; function GetLast:TADS; end; А еще вот че alexBlack ты написал мне: // Удаление и вставка по индексу ? // Может тогда список реализовать по другому ? // Для используемого связанного списка это будет неэффективно function Delete(Index:integer); procedure Insert(Index:integer, NewQueue: TQueue); В списки удаление и вставка таким кодом производится ведь, или еще другие методы есть? |
![]() |
![]() |
![]() |
#8 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Цитата:
Для первого пишем примеры использования (или хотя-бы представляем их себе). Сразу выявляются все проблемы. Например, для TList есть методы Delete, Insert. Это хорошо. А добавление в конец списка. Не лучше ли добавить еще и метод Add ? То-же с получением объектов из списка. Есть метод getFirst, а как получить остальные элементы ? Может нужен еще и метод items[index:integer] ? А не стоит ли вообще убрать метод getFirst ? Зачем отдельный метод для первого элемента ? Как видишь больше вопросов, чем ответов. И только разработчик класса может на них ответить. То-же самое с реализацией. Можно по-быстрому ее сделать хотя бы в общих чертах. И опять возникнут вопросы. Причем, как правило, вопросы о том какого типа должна быть переменная не возникают. Вопрос в том какие переменные нужны. Например, те-же Fist, Last. Мне, например, даже в голову не пришло их вводить. То есть если было бы, например 1000 элементов, я бы так и сделал, но 10 элементов можно просто переместить и очередь всегда будет начинаться с 1-го элемента. Что касается реализации динамического списка связанным списком элементов. Представь себе список из 100000 элементов. Единственный способ получить элемент с номером 100000 - пройти по всему списку. Поэтому я и написал о неэффективности выбранной реализации. С другой стороны, накладные расходы не так уж и велики. Особенно если учесть трудности с альтернативной реализацией. Как пример можно посмотреть реализацию TList в VCL. Кстати, из этого класса можно взять интерфейсную часть. Все эти методы Insert, Delete, Add. Как вариант можно написать класс динамического списка как обертку вокруг класса classes.TList, если это не противоречит ТЗ. ИМХО нельзя просто сесть и правильно написать объявления всех методов класса. Нужно писать реализацию, пробовать разные варианты, посмотреть на использование этого класса. ЗЫ. FFirst, FLast:integer объявлены правильно |
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 06.12.2006
Сообщений: 31
|
![]()
Привет всем. Это еще раз я вас беспокою.
![]() Информационный класс: type InfoClass = class // Информационный класс Private // закрытые переменные члены Name : String[20]; // инфо поле Public Constructor Create(aName : string); // конструктор Procedure SetName(aName : string); // методы доступа Function GetName:string; end; Класс статического очереди на базе массива: QueueClass = class // Класс очереди private Queue: array[1..10] of InfoClass ; Count:integer; // число элементов в очереди(массиве) First: QueueClass; Last : QueueClass; public Constructor CreateA(); // конструктор вызывается при создании элемента списка Function GetFirst: QueueClass; Function GetCount:integer; Procedure SetCount(aCount:integer); Procedure AddItem(aName : string); // процедура добавления элемента Procedure SetFirst(aFirst : QueueClass); Function GetLast: QueueClass; // Function DeleteItem:InfoClass; // процедура удаления Procedure SetLast(aLast : QueueClass); // устанавл. последний элемент end; И здесь мне препод сказал что не правильно объявлены First и Last. Для реализации статического очереди надо объявить массив и две переменные – указатель начала очереди First и указатель конца очереди Last. И при каждом добавлении нового элемента переменная Last увеличивается на 1, а при удалении на 1 увеличивается указатель First. Еще удобно ввести переменную-счетчик(Count) числа элементов в очереди, с помощью которой легко отслеживаются состояния пустой и заполненной очереди. Если отсюда сделать вывод то они должны быть объявлены как в маем коде то есть QueueClass . А препод говорит неправильно. А как правильно их объявить то не можете подсказать мне люди добрые объявить как integer что ли? |
![]() |
![]() |
![]() |
#10 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Вообще-то преподы частенько гнут свою линию не в тему. QueueClass в принципе можно считать указателем.
Ну если ему так хочется поставь примерно так: Код:
I'm learning to live...
|
![]() |
![]() |