University: simple version

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск

Назначение

Использован в конспекте лекций по основам программирования в теме «наследование».

Текст модуля

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.