Создать объекты «студент» и «преподаватель».Создать массивы объектов. Для каждого из объектов определить методы инициализации и вывода. Определить максимальный размер стипендии, который встречается в массиве студентов. Создадим следующую иерархию классов:
Каждый из этих классов содержит конструктор Create и метод отображения полей класса Info. Класс TStud содержит ещё метод info_stip, который возвращает размер стипендии. Результат этой функции используется при обработке события , состоящем в нажатии кнопки Button3 – определении максимального размера стипендии. Назначение остальных кнопок следующее:
Button1 – добавить;
Button2 – список студентов;
Button4 –сброс;
Button5 –список преподавателей.
Выбор типа объекта (преподаватель или студент) производится соответствующими радиокнопками, объединенными в группу .
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Edit2: TEdit;
Label1: TLabel;
Panel1: TPanel;
RadioGroup1: TRadioGroup;
Button3: TButton;
Label2: TLabel;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
Tperson=class
fname:string;
Constructor Create(name:string);
Function info:string;virtual;
end;
Tstud=class(TPerson)
fstip:integer;
constructor Create(name:string;stip:integer);
Function info:string; override;
Function info_stip:integer;
end;
TProf = class(TPerson)
fkaf:string;
constructor Create(name:string;kaf:string);
Function info:string; override;
end;
const n:integer=0;
var
Form1: TForm1;
stud:array [1..5] of TStud;
prof:array [1..5] of Tprof;
implementation
{$R *.DFM}
Constructor Tperson.Create(name:string);
begin
fname:=name;
end;
Constructor TStud.Create(name:string;stip:integer);
begin
inherited create(name);
fstip:=stip;
end;
Constructor TProf.Create(name:string;kaf:string);
begin
inherited create(name);
Fkaf:=kaf;
end;
Function Tperson.info:string;
begin
info:=fname;
end;
Function Tstud.info:string;
begin
info:=fname +' стипендия '+IntTostr(fstip);
end;
Function TProf.info:string;
begin
info:=fname +' кафедра '+fkaf;
end;
Function Tstud.info_stip:integer;
begin
info_stip:=fstip;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if n<5 then
begin n:=n+1;
if RadioGroup1.ItemIndex=0
then
Stud[n]:=Tstud.create(Edit1.Text,
StrToInt(Edit2.Text))
else
prof[n]:=TProf.create(Edit1.Text,
Edit2.Text);
end
else ShowMessage('Список заполнен');
edit1.Clear;
edit2.clear;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
st:string;
begin
st:='';
for i:=1 to n do
st:=st+stud[i].info+#13;
Label1.caption:='Студенты'+#13+st;
end;
procedure TForm1.Button3Click(Sender: TObject);
var i:integer; max_st:integer;
begin
if RadioGroup1.ItemIndex=0 then
begin
max_st:=0;
For i:=1 to n do
if stud[i].info_stip > max_st
then max_st:=stud[i].info_stip;
label2.caption:='максимальная стипендия-'+Inttostr(max_st); end
else
ShowMessage('возможно определить только для студентов');
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
N:=0;
label2.caption:='';
label1.caption:='';
end;
procedure TForm1.Button5Click(Sender: TObject);
var i:integer;
st:string;
begin
st:='';
for i:=1 to n do
st:=st+prof[i].info+#13;
Label1.caption:='преподаватели'+#13+st;
end;
end.
Нужно помнить о том, что объект – это указатель. А в Object Pascal указателю на родительский класс можно присвоить значение указателя на дочерний класс. Поэтому вместо двух массивов stud и prof будем использовать один массив объектов класса TPerson:
List: array[1..5] of TPerson;
В этом массиве можно хранить как информацию о студентах, так и данные о преподавателях. Вывод списка производится применением метода info к элементам массива. Это возможно, так как в базовом классе при помощи директивы Virtual метод Info объявлен виртуальным. Объявление метода виртуальным дает возможность дочернему классу произвести замену виртуального метода своим собственным. Концепция полиморфизма обеспечивает применение объекту именно того метода, который соответствует типу объекта.
Описания методов добавления элемента в массив List и вывода списка приведены ниже. Методы Create и Info остаются такими же, как и в предыдущем примере
var
Form1: TForm1;
List:array[1..5] of Tperson;
implementation
{ описания объектов}
{описания методов}
. . .
procedure TForm1.Button1Click(Sender: TObject);
begin
if n<5 then
begin n:=n+1;
if RadioGroup1.ItemIndex=0
then
list[n]:=TStud.Create(Edit1.Text,
StrToInt(Edit2.Text))
else
list[n]:=TProf.create(Edit1.Text, Edit2.Text);
end
else ShowMessage('Список заполнен');
end;
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
st:string;
begin st:='';
for i:=1 to n do
st:=st+list[i].info+#13;
Label1.caption:='Список'+#13+st;
end;