University: simple version
Материал из Вики ИТ мехмата ЮФУ
(перенаправлено с «Unit University»)
Назначение
Использован в конспекте лекций по основам программирования в теме «наследование».
Текст модуля
unit University;
interface
uses System;
const
/// Минимальный допустимый возраст студента
MIN_AGE = 1;
/// Максимальный допустимый возраст студента
MAX_AGE = 120;
/// Первый курс
FIRST_COURSE = 1;
// -------------------------------------------- Student -------------------------------------------
const
/// Максимальный курс для студентов младших курсов
LAST_UNDERGRADUATE_COURSE = 4;
type
/// Студент
Student = class
private
/// Имя
fName: string;
/// Возраст
fAge: integer;
/// Курс
fCourse: integer;
/// Группа
fGroup: integer;
public
/// Имя — только на чтение
property Name: string read fName;
/// Возраст — только на чтение
property Age: integer read fAge;
/// Курс — только на чтение
property Course: integer read fCourse;
/// Группа — только на чтение
property Group: integer read fGroup;
/// <summary>
/// Создает нового студента
/// </summary>
/// <param name="Name">Имя (пустое недопустимо)</param>
/// <param name="Age">Возраст (отрицательный или больший MAX_AGE недопустим)</param>
/// <param name="Course">Курс (отрицательный или больший LAST_UNDERGRADUATE_COURSE недопустим)</param>
/// <param name="Group">Группа (отрицательная недопустима)</param>
constructor Create(Name: string; Age, Course, Group: integer);
/// Устанавливает возраст студента равным Age,
/// если он неотрицателен и не больше MAX_AGE
procedure SetAge(Age: integer);
/// Устанавливает номер группы равным Group,
/// если он неотрицателен
procedure SetGroup(Group: integer);
/// Переводит студента на следующий курс, если он меньше LAST_UNDERGRADUATE_COURSE
procedure NextCourse;
/// Выводит данные по студенту
procedure Print;
/// Выводит данные по студенту с переходом на новую строку
procedure Println;
end;
// ------------------------------------------- DegreeType -----------------------------------------
type
/// Академическая степень (Бакалавр, Специалист, Магистр)
DegreeType = (Bachelor, Specialist, Magister);
// -------------------------------------------- Teacher -------------------------------------------
type
SeniorStudent = class; // предописание класса
/// Преподаватель
Teacher = class
private
/// Имя
fName: string;
public
/// Имя — только на чтение
property Name: string read fName;
/// <summary>
/// Создает нового преподавателя
/// </summary>
/// <param name="Name">Имя (пустое недопустимо)</param>
constructor Create(Name: string);
/// Возвращает тему курсовой работы для студента MyStudent
function SayCourseWorkTheme(MyStudent: SeniorStudent): string;
/// Выводит данные по преподавателю
procedure Print;
end;
// ----------------------------------------- SeniorStudent ----------------------------------------
/// Студент старших курсов
SeniorStudent = class (Student)
private
/// Научный руководитель
fAdvisor: Teacher;
/// Образовательная степень
fDegree: DegreeType;
public
/// Научный руководитель — только на чтение
property Advisor: Teacher read fAdvisor;
/// Образовательная степень — только на чтение
property Degree: DegreeType read fDegree;
/// <summary>
/// Создает нового студента старших курсов
/// </summary>
/// <param name="Name">Имя (пустое недопустимо)</param>
/// <param name="Age">Возраст (отрицательный или больший MAX_AGE недопустим)</param>
/// <param name="Course">Курс (отрицательный или больший MAX_COURSE недопустим)</param>
/// <param name="Group">Группа (отрицательная недопустима)</param>
/// <param name="Advisor">Научный руководитель</param>
/// <param name="EduModel">Академическая степень (бакалавр, специалист, магистр)</param>
constructor Create(Name: string; Age, Course, Group: integer;
Advisor: Teacher; Degree: DegreeType);
/// Возвращает тему курсовой работы
function CourseWorkTheme: string;
/// Переводит студента на следующий курс
procedure NextCourse;
/// Выводит данные по студенту старших курсов
procedure Print;
/// Выводит данные по студенту старших курсов с переходом на новую строку
procedure Println;
end;
implementation
// -------------------------------------------- Student -------------------------------------------
constructor Student.Create(Name: string; Age, Course, Group: integer);
begin
if Name <> '' then
fName := Name
else
raise new Exception(
'Попытка присвоить студенту пустое имя!');
SetAge(Age);
if (Course >= FIRST_COURSE) and (Course <= LAST_UNDERGRADUATE_COURSE) then
fCourse := Course
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
FIRST_COURSE.ToString + '..' + LAST_UNDERGRADUATE_COURSE.ToString + ']!');
SetGroup(Group);
end;
procedure Student.SetAge(Age: integer);
begin
if (Age >= MIN_AGE) and (Age <= MAX_AGE) then
fAge := Age
else
raise new Exception(
'Выход за границы диапазона допустимого возраста [' +
MIN_AGE.ToString + '..' + MAX_AGE.ToString + ']!');
end;
procedure Student.SetGroup(Group: integer);
begin
if (Group > 0) then
fGroup := Group
else
raise new Exception(
'Попытка присвоить группе отрицательный номер!');
end;
procedure Student.NextCourse;
begin
if fCourse < LAST_UNDERGRADUATE_COURSE then
fCourse += 1
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
FIRST_COURSE.ToString + '..' + LAST_UNDERGRADUATE_COURSE.ToString + ']!');
end;
procedure Student.Print;
begin
WriteFormat(
'Имя: {0} Возраст: {1} Курс: {2} Группа: {3} ',
fName, fAge, fCourse, fGroup);
end;
procedure Student.Println;
begin
Print;
writeln();
end;
// -------------------------------------------- Teacher -------------------------------------------
constructor Teacher.Create(Name: string);
begin
if Name <> '' then
fName := Name
else
raise new Exception(
'Попытка присвоить преподавателю пустое имя!');
end;
function Teacher.SayCourseWorkTheme(MyStudent: SeniorStudent): string;
begin
result := 'Тема курсовой работы';
end;
procedure Teacher.Print;
begin
WriteFormat(
'Имя: {0} ',
fName);
end;
// ----------------------------------------- SeniorStudent ----------------------------------------
constructor SeniorStudent.Create(Name: string; Age, Course, Group: integer;
Advisor: Teacher; Degree: DegreeType);
begin
inherited Create(Name, Age, Course, Group);
if Advisor <> nil then
fAdvisor := Advisor
else
raise new Exception(
'Параметр «Advisor» конструктора является нулевой ссылкой!');
fDegree := Degree;
end;
function SeniorStudent.CourseWorkTheme: string;
begin
Result := fAdvisor.SayCourseWorkTheme(self);
end;
procedure SeniorStudent.NextCourse;
begin
var lastCourse: integer;
case fDegree of
Bachelor: lastCourse := 4;
Specialist: lastCourse := 5;
Magister: lastCourse := 6;
end;
if fCourse < lastCourse then
fCourse += 1
else
raise new Exception(
'Выход за границы диапазона допустимых курсов [' +
FIRST_COURSE.ToString + '..' + lastCourse.ToString + ']!');
end;
procedure SeniorStudent.Print;
begin
inherited Print;
write('Преподаватель: '); fAdvisor.Print;
write('Академическая степень: ');
case degree of
Bachelor: write('Бакалавр');
Specialist: write('Специалист');
Magister: write('Магистр');
end;
end;
procedure SeniorStudent.Println;
begin
Print;
writeln();
end;
end.