Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 02:42   #1
kibrycker
 
Регистрация: 05.09.2010
Сообщений: 3
По умолчанию Нужна подсказка по ООП - реализация класса "Книга" и методов обработки на Delphi

Создан класс в отдельном модуле. В нем есть поля: Автор, Название книги, Издательство, Дата издания, Количество страниц. Есть методы заполнения каждого поля в отдельности.

Задание: Нужно: Метод проверки двух книг на одного автора, Метод определения принадлежности книги конкретному автору.

Прошу подсказать, как делать, не код, а просто в каком направлении двигаться. Заранее благодарен.
kibrycker вне форума Ответить с цитированием
Старый 11.04.2013, 02:46   #2
viks1
человек
Форумчанин
 
Аватар для viks1
 
Регистрация: 11.05.2009
Сообщений: 517
По умолчанию

Цитата:
Сообщение от kibrycker Посмотреть сообщение
Создан класс в отдельном модуле. В нем есть поля: Автор, Название книги, Издательство, Дата издания, Количество страниц. Есть методы заполнения каждого поля в отдельности.

Задание: Нужно: Метод проверки двух книг на одного автора, Метод определения принадлежности книги конкретному автору.

Прошу подсказать, как делать, не код, а просто в каком направлении двигаться. Заранее благодарен.
Можно сделать через БД , SQL запросы
viks1 вне форума Ответить с цитированием
Старый 11.04.2013, 06:50   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Да не, если речь идет о ООП, то, ИМХО, нужно начинать с создания класса.
БД - могут помочь хранить данные. Но вот SQL для решения самой задачи здесь не нужен. На основе запросов можно всю эту работу провернуть не прибегая к ООП вообще. А нужно именно ООП.
------------------------------------------------------------------------------------------------------------
kibrycker, опиши класс TBook, в нем свойства Author, Title, Publisher, PublicationDate, PagesNumber. Потом добавь метод function AuthorIs (AAuthor: stirng): boolean. Ну и, наконец, создай процедуру, которая проверяет 'одинаковость' авторов:
Код:
function SameAuthor (ABook1, ABook2: TBook): boolean;
begin
  Result := ABook1.AuthorIs (ABook2.Author);
end;
------------------------------------------------------------------------------------------------------------
Цитата:
Метод проверки двух книг на одного автора
Это в виде метода делать не гоже. Нужна отдельная процедура. Ибо метод должен работать с данными одного экземпляря (самого себя), а тут нужно обработать сразу два. Привязывать это действие к какому-то одному объекту не логично.

Последний раз редактировалось Sibedir; 11.04.2013 в 06:54.
Sibedir вне форума Ответить с цитированием
Старый 11.04.2013, 09:02   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sibedir
Это в виде метода делать не гоже. Нужна отдельная процедура. Ибо метод должен работать с данными одного экземпляря (самого себя), а тут нужно обработать сразу два. Привязывать это действие к какому-то одному объекту не логично.
В приниципе, согласен.
Но, в учебной задаче такое вполне себе логично и допустимо:
метод книги
TBook.IsAuthorEqual( OtherBook : TBook) : boolean;
который проверит, переданный в неё объект имеет такого же автора или нет...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.04.2013, 09:36   #5
kibrycker
 
Регистрация: 05.09.2010
Сообщений: 3
По умолчанию

Надо именно через ООП
Вот созданный класс
Код:
type
  TBook = class
  private
    fAuthor: String;
    fNameBook: String;
    fPublishers: String;
    fDate: TDateTime;
    fCountPage: Word;
  public
    Constructor Create;
    Function Info: String;
    Procedure SetAuthor (Author: String);
    Procedure SetNameBook (NameBook: String);
    Procedure SetPublishers (Publishers: String);
    Procedure SetDate (Date: TDateTime);
    Procedure SetCountPage (CountPage: Word);
    Function GetAuthor: String;
    Function GetNameBook: String;
    Function GetPublishers: String;
    Function GetDate: TDateTime;
    Function GetCountPage: Word;
    Property Author: String read fAuthor;
    Property NameBook: String read fNameBook;
    Property Publishers: String read fPublishers;
    Property Date: TDateTime read fDate;
    Property CountPage: Word read fCountPage;
  end;

var
  iBook: TBook;

implementation

Constructor TBook.Create;
begin
  fAuthor:= '';
  fNameBook:= '';
  fPublishers:= '';
  fDate:= 0;
  fCountPage:= 0;
end;

Procedure TBook.SetAuthor (Author: String);
begin
  fAuthor:= Author;
end;

Procedure TBook.SetNameBook (NameBook: String);
begin
  fNameBook:= NameBook;
end;

Procedure TBook.SetPublishers (Publishers: String);
begin
  fPublishers:= Publishers;
end;

Procedure TBook.SetDate (Date: TDateTime);
begin
  fDate:= Date;
end;

Procedure TBook.SetCountPage (CountPage: Word);
begin
  fCountPage:= CountPage;
end;

Function TBook.GetAuthor: String;
begin
  Result:= fAuthor;
end;

Function TBook.GetNameBook: String;
begin
  Result:= fNameBook;
end;

Function TBook.GetPublishers: String;
begin
  Result:= fPublishers;
end;

Function TBook.GetDate: TDateTime;
begin
  Result:= fDate;
end;

Function TBook.GetCountPage: Word;
begin
  Result:= fCountPage;
end;

Function TBook.Info: String;
begin
  Result:= fAuthor + ' ' + fNameBook + ' ' + fPublishers + ' ' +
            DateToStr (fDate) + ' ' + IntToStr (fCountPage);
end;

end.

Последний раз редактировалось kibrycker; 11.04.2013 в 09:41.
kibrycker вне форума Ответить с цитированием
Старый 11.04.2013, 09:37   #6
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вот никогда за это не любил лабораторные по информатике. Дают задачу и предлагают решить её способом, который для этого не годится (всмысле, решить можно, но так делать не нужно). И главное, понимаешь это уже потом, спустя много лет. А когда делаешь лабораторную нет. Потом нечего удивлятся, что студенты не знают, с какого конца редьку едят.
У обучаемого должно сформироваться чёткое понимание того, для чего что он учит. Некий шаблон. А уж потом можно и творчество подключать.
---------------------------------------------------------------------------------
Цитата:
Надо именно через ООП
Ну дык, вперёд. Код сюда, если что. Поможем, не сомневайтесь. Задачка копеечная.

Последний раз редактировалось Sibedir; 11.04.2013 в 09:41.
Sibedir вне форума Ответить с цитированием
Старый 11.04.2013, 09:43   #7
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Так как задача чисто учебная, то для хранения можно использовать типизированый файл. При запуске работы считать данные из файла в динамический массив и работать уже с ним. При завершении сохранить все в файл.
Цитата:
Метод проверки двух книг на одного автора, Метод определения принадлежности книги конкретному автору.
Как уже сказали, пишите процедуры, для работы с массивом, содержащим элементы данного класса (ИМХО, я бы писал функции).
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 11.04.2013, 09:57   #8
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Вот созданный класс
Ништяк.
-----------------------------------------------------------------
Маленький рефакторинг
Код:
unit Unit2; // Создан класс в отдельном модуле

interface

uses
  System.SysUtils, Vcl.Dialogs;

type
  TBook = class
  private
    fAuthor    : String;
    fNameBook  : String;
    fPublishers: String;
    fDate      : TDateTime;
    fCountPage : Word;
  protected
    Procedure SetAuthor     (aAuthor    : String   ); // Добавил 'a' к имени аргумента, чтобы не совпадало с именем свойства
    Procedure SetNameBook   (aNameBook  : String   );
    Procedure SetPublishers (aPublishers: String   );
    Procedure SetDate       (aDate      : TDateTime);
    Procedure SetCountPage  (aCountPage : Word     );
  public
    Constructor Create (aAuthor, aNameBook, aPublishers: String; aDate: TDateTime; aCountPage: Word); // Пустых книг никогда ниочём нам не нужно.

    Function Info: String;
    function AuthorIs (aAuthor: string): Boolean;
    function IsAuthorEqual (aOtherBook : TBook): boolean;

    Property Author    : String    read fAuthor     write SetAuthor    ; // Get-ы убрал. Лишнее. Set добавил.
    Property NameBook  : String    read fNameBook   write SetNameBook  ; // Вообще Set-ы нужны, если при внесении изменений в экземпляр нужна какая-то реакция на это
    Property Publishers: String    read fPublishers write SetPublishers; // или проверка на правильность ввода данных (см. TBook.SetDate)
    Property Date      : TDateTime read fDate       write SetDate      ;
    Property CountPage : Word      read fCountPage  write SetCountPage ;
  end;

implementation

function TBook.AuthorIs(aAuthor: string): Boolean;
begin
  Result := ************************; // Сам
end;

Constructor TBook.Create (aAuthor, aNameBook, aPublishers: String; aDate: TDateTime; aCountPage: Word);
begin
  inherited Create;

  fAuthor     := aAuthor    ;
  fNameBook   := aNameBook  ;
  fPublishers := aPublishers;
  fDate       := aDate      ;
  fCountPage  := aCountPage ;
end;

Procedure TBook.SetAuthor (aAuthor: String);
begin
  fAuthor:= aAuthor;
end;

Procedure TBook.SetNameBook (aNameBook: String);
begin
  fNameBook:= aNameBook;
end;

Procedure TBook.SetPublishers (aPublishers: String);
begin
  fPublishers:= aPublishers;
end;

Procedure TBook.SetDate (aDate: TDateTime);
begin
  if aDate < Now then fDate:= ADate
  else ShowMessage ('Книга еще не издана');
end;

Procedure TBook.SetCountPage (aCountPage: Word);
begin
  fCountPage:= aCountPage;
end;

Function TBook.Info: String;
begin
  Result:= fAuthor + ' ' + fNameBook + ' ' + fPublishers + ' ' +
           DateToStr (fDate) + ' ' + IntToStr (fCountPage);
end;

function TBook.IsAuthorEqual(aOtherBook: TBook): boolean;
begin
  Result := ************************; // Уже писал
end;

end.

Последний раз редактировалось Sibedir; 11.04.2013 в 10:06.
Sibedir вне форума Ответить с цитированием
Старый 16.04.2013, 00:52   #9
kibrycker
 
Регистрация: 05.09.2010
Сообщений: 3
По умолчанию

Всем спасибо, буду думать, пока занимаюсь другими предметами.
kibrycker вне форума Ответить с цитированием
Старый 16.04.2013, 07:40   #10
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Собственно, о некоторой нелогичности задания уже было сказано.
Но мне кажется, что нелогичность требования сравнения вытекает из неправильно организованного класса.
Класс должен описывать не отдельную книгу, а библиотеку целиком.
Появляется массив структур, уникальный идентификатор книги, процедура AddBook...
И при этом вполне логичной выглядит процедура сравнения двух книг библиотеки.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Создание класса "Число" и методов Alexar Makken Общие вопросы Delphi 3 05.12.2011 13:26
ООП Delphi разработка классов для реализации контейнера на основе структуры"упорядоченный динамический список" naffy Помощь студентам 0 28.06.2011 00:22
Простая реализация собственного класса "vector" Arnezami Общие вопросы .NET 8 27.11.2010 22:51