Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование массив и хранение данных, ООП, задача третьего курса института 
V
    Опции темы
PriZraK
Дата 16.5.2010, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Здравствуйте.
Попросили решить задачу, третьего курса института.
С ООП до этого в Delphi не приходилось сталкиваться, сейчас же хочется разобраться на примере, а так же помочь другу с решением.
Задача:
Цитата
Разработать приложение «Библиотека». Описать следующие классы: Книга с полями: Автор, Название. Год издания, издательство; Учебник - производный класс от класса Книга с добавлением полей Предмет и Класс. Художественная книга - производный класс от класса Книга с добавлением поля - Жанр. Описать класс Читатель с полями: Фамилия, Имя, Год рождения, Адрес места жительства, Название взятой книги и Дата ее возвращения. 
У каждого класса реализовать методы - конструктор, деструктор, заполнение карточки читателя.

В данный момент код выглядит так (возможно код не верен, писал по аналогии с каким-то примеров найденным в Интернете):
Код

// класс «книга»
type
  TBook=class
    private
      Author     : String;  // автор
      Name       : String;  // название книги
      Year       : Integer; // год
      Publishing : String;  // издание
    public
      constructor Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String);
      destructor Destroy;
  end;


// класс «учебник»
type
  TTextBook=class(TBook)
    private
      Subject    : String;  // предмет
      ClassNum   : Integer; // класс
    public
      constructor Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aSubject:String; aClassNum:Integer);
      destructor Destroy;
  end;


// класс «художественная книга»
type
  TArtBook=class(TBook)
    private
      Genre      : String;  // жанр
    public
      constructor Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aGenre:String);
      destructor Destroy;
  end;


// класс «читатель»
type
  TReader=class
    private
      FirstName  : String;  // имя
      SecondName : String;  // фамилия
      Year       : Integer; // год рождения
      Address    : String;  // адрес проживания
      Name       : String;  // название взятой книги
      Date       : TDateTime; // дата возвращения взятой книги
    public
      constructor Create(aFirstName:String; aSecondName:String; aYear:Integer; aAddress:String; aName:String; aDate:TDateTime);
      destructor Destroy;
  end;

Код

// конструктор класса «книга»
constructor TBook.Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String);
begin
  Author      := aAuthor;
  Name        := aName;
  Year        := aYear;
  Publishing  := aPublishing;
end;

// деструктор класса «книга»
destructor TBook.Destroy;
begin
  inherited;
end;


// конструктор класса «учебник»
constructor TTextBook.Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aSubject:String; aClassNum:Integer);
begin
  inherited Create(aAuthor,aName,aYear,aPublishing);
  Subject     := aSubject;
  ClassNum    := aClassNum;
end;

// деструктор класса «учебник»
destructor TTextBook.Destroy;
begin
  inherited;
end;


// конструктор класса «художественная книга»
constructor TArtBook.Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aGenre:String);
begin
  inherited Create(aAuthor,aName,aYear,aPublishing);
  Genre       := aGenre;
end;

// деструктор класса «художественная книга»
destructor TArtBook.Destroy;
begin
  inherited;
end;


// конструктор класса «читатель»
constructor TReader.Create;
begin
  FirstName   := aFirstName;
  SecondName  := aSecondName;
  Year        := aYear;
  Address     := aAddress;
  Name        := aName;
  Date        := aDate;
end;

// деструктор класса «читатель»
destructor TReader.Destroy;
begin
  inherited;
end;


Хочется понять, каким образом можно хранить и извлекать данные, используя эти классы.
PM MAIL ICQ Skype GTalk   Вверх
DarkProg
Дата 17.5.2010, 07:50 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 4
Всего: 19



Цитата(PriZraK @  16.5.2010,  21:10 Найти цитируемый пост)
Хочется понять, каким образом можно хранить и извлекать данные, используя эти классы. 


Класс - это Объект с обределённым набором параметром и с методами для этого класса.(ну это вроде моего опреедления, на самом деле всё сложнее)

Чтобы сохранять данные какого-то определённого класса, нужно объявить переменную этого класса(массив переменных)

Код

Var x:TReader;


Чтобы где-то что-то в x засунуть нужно писать так
Код

x.create('Вася', 'Пупкин', 1832, 'тут живу', 'Жизнь пчёл', strtodate('11.11.2012'))


Теперь объект x - создан и если вы всё правильно написали, то при обращении к x.FirstName получите "Вася"


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
PriZraK
Дата 18.5.2010, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 22.10.2006

Репутация: нет
Всего: нет



Вот что получилось в итоге. Код рабочий.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, Grids;

// класс «книга»
type
  TBook=class
    private
      Author     : String;  // автор
      Name       : String;  // название книги
      Year       : Integer; // год
      Publishing : String;  // издание
    public
      constructor Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String);
      destructor Destroy;
  end;


// класс «учебник»
type
  TTextBook=class(TBook)
    private
      Subject    : String;  // предмет
      ClassNum   : Integer; // класс
    public
      constructor Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aSubject:String; aClassNum:Integer);
      destructor Destroy;
      function Info:String;
  end;


// класс «художественная книга»
type
  TArtBook=class(TBook)
    private
      Genre      : String;  // жанр
    public
      constructor Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aGenre:String);
      destructor Destroy;
      function Info:String;
  end;


// класс «читатель»
type
  TReader=class
    private
      FirstName  : String;  // имя
      SecondName : String;  // фамилия
      Year       : Integer; // год рождения
      Address    : String;  // адрес проживания
      Name       : String;  // название взятой книги
      Date       : TDateTime; // дата возвращения взятой книги
    public
      constructor Create(aFirstName:String; aSecondName:String; aYear:Integer; aAddress:String; aName:String; aDate:TDateTime);
      destructor Destroy;
      function Info:String;
  end;


// класс формы
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    BookComboBox: TComboBox;
    FirstNameLabel: TLabel;
    FirstNameEdit: TEdit;
    SecondNameLabel: TLabel;
    SecondNameEdit: TEdit;
    YearComboBox: TComboBox;
    YearLabel: TLabel;
    AddressEdit: TEdit;
    AddressLabel: TLabel;
    BookLabel: TLabel;
    DatePicker: TDateTimePicker;
    DateLabel: TLabel;
    AddReaderButton: TButton;
    TypeBookComboBox: TComboBox;
    TypeBookLabel: TLabel;
    ViewReaderButton: TButton;
    procedure FormShow(Sender: TObject);
    procedure TypeBookComboBoxSelect(Sender: TObject);
    procedure AddReaderButtonClick(Sender: TObject);
    procedure ViewReaderButtonClick(Sender: TObject);
  private
    procedure FormDefault();
    procedure UpdateTypeBook();
  public

  end;

const
  size = 10; // размер списка

var
  Form1     : TForm1;
  TextBook  : array[1..size] of TTextBook;
  ArtBook   : array[1..size] of TArtBook;
  Reader    : array[1..size] of TReader;
  n         : Integer = 0;


implementation

{$R *.dfm}

// конструктор класса «книга»
constructor TBook.Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String);
begin
  Author      := aAuthor;
  Name        := aName;
  Year        := aYear;
  Publishing  := aPublishing;
end;

// деструктор класса «книга»
destructor TBook.Destroy;
begin
  inherited;
end;


// -------------------------- //
// конструктор класса «учебник»
constructor TTextBook.Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aSubject:String; aClassNum:Integer);
begin
  inherited Create(aAuthor,aName,aYear,aPublishing);
  Subject     := aSubject;
  ClassNum    := aClassNum;
end;

// деструктор класса «учебник»
destructor TTextBook.Destroy;
begin
  inherited;
end;

// функция получения выбранного значения
function TTextBook.Info:String;
begin
  result := Name + ', автор: ' + Author + ' год: ' + IntToStr(Year) + ', издание: ' + Publishing + ', предмет: ' + Subject + ', класс: ' + IntToStr(ClassNum);
end;


// -------------------------- //
// конструктор класса «художественная книга»
constructor TArtBook.Create(aAuthor:String; aName:String; aYear:Integer; aPublishing:String; aGenre:String);
begin
  inherited Create(aAuthor,aName,aYear,aPublishing);
  Genre       := aGenre;
end;

// деструктор класса «художественная книга»
destructor TArtBook.Destroy;
begin
  inherited;
end;

// функция получения выбранного значения
function TArtBook.Info:String;
begin
  result := Name + ', автор: ' + Author + ' год: ' + IntToStr(Year) + ', издание: ' + Publishing + ', жанр: ' + Genre;
end;


// -------------------------- //
// конструктор класса «читатель»
constructor TReader.Create(aFirstName:String; aSecondName:String; aYear:Integer; aAddress:String; aName:String; aDate:TDateTime);
begin
  FirstName   := aFirstName;
  SecondName  := aSecondName;
  Year        := aYear;
  Address     := aAddress;
  Name        := aName;
  Date        := aDate;
end;

// деструктор класса «читатель»
destructor TReader.Destroy;
begin
  inherited;
end;

// функция получения выбранного значения
function TReader.Info:String;
begin
  result :=
  'Читатель: ' + FirstName + ' ' + SecondName + ' (' + IntToStr(Year) + ')' + sLineBreak +
  'Адрес: ' + Address + sLineBreak +
  'Книга: ' + Name + sLineBreak +
  'Дата возвращения книги: ' + DateToStr(Date);
end;



// -------------------------------------------------------------------------- //
// ПРОЦЕДУРА ПОКАЗА ФОРМЫ
procedure TForm1.FormShow(Sender: TObject);
var
  i: Integer;
begin
  // добавляем в список года рождения читателя
  for i := 2000 downto 1950 do begin
    YearComboBox.Items.Add(IntToStr(i));
  end;
  // добавляем в массив список учебников
  TextBook[1] := TTextBook.Create('Маранцман В.Г.','Литература',2005,' Просвещение','Литература',9);
  TextBook[2] := TTextBook.Create('Алексеев А.И.','География России: Хозяйство и географические районы.',2007,'Дрофа','География',9);
  TextBook[3] := TTextBook.Create('Каленчук М.Л.','Русский язык',2010,'Академкнига','Русский язык',4);
  TextBook[4] := TTextBook.Create('Чекин А.Л.','Математика',2010,'Академкнига','Математика',1);
  TextBook[5] := TTextBook.Create('Игнатов А.В.','История России. XIX век.',2010,'Дрофа','История',8);
  TextBook[6] := TTextBook.Create('Горячев А.В.','Информатика',2009,'Баласс','Информатика',2);
  // добавляем в массив список художественных книг
  ArtBook[1]  := TArtBook.Create('Николай Гоголь','Мертвые души',2008,'Астрель','Роман');
  ArtBook[2]  := TArtBook.Create('Достоевский Ф.М.','Преступление и наказание',2009,'Сибирское университетское издательство','Роман');
  ArtBook[3]  := TArtBook.Create('Иван Тургенев','Отцы и дети',2007,'Олимп','Роман');
  ArtBook[4]  := TArtBook.Create('Мамин-Сибиряк Д.','Серая шейка',2008,'ТриМаг','Сказка');
  ArtBook[5]  := TArtBook.Create('Джек Лондон','Белый клык',2008,'Астрель','Повесть');
  ArtBook[6]  := TArtBook.Create('Джек Лондон','Сердца трех',2009,'Астрель','Роман');
  ArtBook[7]  := TArtBook.Create('Пришвин М.','Кладовая солнца',2007,'Детская литература','Сказка');
  // устанавливаем значение элементов формы по умолчанию
  FormDefault();
end;


// КНОПКА: ДОБАВИТЬ ЧИТАТЕЛЯ
procedure TForm1.AddReaderButtonClick(Sender: TObject);
begin
  if n < size then begin
    n:=n+1;
    Reader[n]:=TReader.Create(FirstNameEdit.Text,SecondNameEdit.Text,StrToInt(YearComboBox.Text),AddressEdit.Text,BookComboBox.Text,DatePicker.Date);
    // устанавливаем значение элементов формы по умолчанию
    FormDefault();
  end else begin
    MessageDlg('Список заполнен',mtInformation, [mbOK],0);
  end;
end;



// КНОПКА: ПРОСМОТР СПИСКА ЧИТАТЕЛЕЙ
procedure TForm1.ViewReaderButtonClick(Sender: TObject);
var
  i   : Integer;
  st  : String;
begin
  if n > 0 then begin
    for i:=1 to size do begin
      if Reader[i] <> nil then begin
        st:=st + Reader[i].Info + sLineBreak + sLineBreak;
      end;
    end;
    MessageDlg('Cпиcoк:' + sLineBreak + st,mtInformation, [mbOK],0);
  end else begin
    MessageDlg('Список пуст',mtInformation, [mbOK],0);
  end;
end;



// ЭЛЕМЕНТ ВЫБОРА ТИПА КНИГИ
procedure TForm1.TypeBookComboBoxSelect(Sender: TObject);
begin
  UpdateTypeBook();
end;



// -------------------------------------------------------------------------- //
// ПРОЦЕДУРА УСТАНОВКИ ЗНАЧЕНИЙ ЭЛЕМЕНТОВ ФОРМЫ ПО УМОЛЧАНИЮ
procedure TForm1.FormDefault();
begin
  // устанавливаем значение элементов по умолчанию
  FirstNameEdit.Text          := '';
  SecondNameEdit.Text         := '';
  YearComboBox.ItemIndex      := YearComboBox.Items.IndexOf('1987');
  AddressEdit.Text            := '';
  TypeBookComboBox.ItemIndex  := 0;
  BookComboBox.ItemIndex      := -1;
  DatePicker.Date             := Date();
  // обновляем выбранный тип книги
  UpdateTypeBook;
  // устанавливаем курсор в поле по умолчанию
  FirstNameEdit.SetFocus;
end;


// ПРОЦЕДУРА ВЫБОРА ТИПА КНИГИ
procedure TForm1.UpdateTypeBook();
var
  i : Integer;
begin
  // очищаем элемент выбора типа книги
  BookComboBox.Items.Clear;
  // в зависимости от указанного типа производим добавление соответствующих книг
  Case TypeBookComboBox.ItemIndex of
    0 : begin
          for i:=1 to size do begin
            if TextBook[i] <> nil then begin
              BookComboBox.Items.Add(TextBook[i].Info);
            end;
          end;
        end;
    1 : begin
          for i:=1 to size do begin
            if ArtBook[i] <> nil then begin
              BookComboBox.Items.Add(ArtBook[i].Info);
            end;
          end;
        end;
  end;
end;

end.


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  1.zip 15,96 Kb
PM MAIL ICQ Skype GTalk   Вверх
Traum
Дата 22.5.2010, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.1.2004

Репутация: нет
Всего: нет



Можно еще сделать небольшое уточнение:

Если принимаемый параметр (строка или массив или запись) не будут изменяться в процедуре, то перед ними важно поставить атрибут const - это позволит компилятору не копировать большие объекты, затрачивая на это время и память, а передать их по ссылке, проследив при этом за тем, чтобы они в процедуре не изменялись. И вообще это хороший стиль программирования.

PM MAIL   Вверх
RomanEEP
Дата 22.5.2010, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: 1
Всего: 8



Хочу заметить, что если размер переменной не больше 8 байт, то модификатор const наоборот вызовет замедление выполнение такой функции. Это будет хорошо заметно, если небольшая функция вызывается большое кол-во раз..
PM MAIL   Вверх
bems
Дата 22.5.2010, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



RomanEEP:
1) Не 8, а 4 байта, потому что компилятор генерирует 32-х битный код
2) Если размер не больше этого значения, то оно передается как будто const не использовался. Нет никакого увеличения скорости, но откуда возмется замедление? насколько я знаю, медленней не будет. (но компилятор проследит чтобы код не менял это значение, поэтому всё равно есть случаи когда нужно использовать для "маленьких" значений) 


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0796 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.