Система учёта регистрации и размещения клиентов отеля

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    19,15 Кб
  • Опубликовано:
    2017-05-14
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Система учёта регистрации и размещения клиентов отеля















КУРСОВАЯ РАБОТА

Система учёта регистрации и размещения клиентов отеля

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

. Объектно-ориентированное программирование

.1 Основные понятия ООП

.2 Принципы ООП

.3 Язык программирования Python

. Практическая часть

.1 Описание предметной области

.2 Диаграмма классов

.3 Реализация на языке Python

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ


ВВЕДЕНИЕ

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

Цель данной работы: используя методы объектно-ориентированного программирование (ООП), создать модель информационной системы регистрации и размещения клиентов отеля.

Задачи работы: анализ теоретических основ ООП, изучение языка программирования Python, применение полученных знаний на практике для реализации предметной области.

Данная работа состоит из двух глав. В первой глава состоит из трех частей. В первой и второй частях говорится об объектно-ориентированном подходе. Здесь подробно освещается основная информация о понятиях и принципах ООП. Третья часть посвящена самому языку программирования Python, истории его создания и развития, основных алгоритмических конструкциях и типах данных. Во второй главе глава разделена на трети части: в первой производится описание предметной области, во второй создаётся диаграмма классов в соответствии с выбранной предметной областью и описание основных классов, и в третьей представлена реализация на языке Python.

1. Объектно-ориентированное программирование

.1Основные понятия ООП

Объектно-ориентированное программирование (ООП) - это способ организации кода в программе путем его группировки в виде объектов, то есть отдельных элементов, которые включают информацию (значения данных) и функции. Объектно-ориентированный подход к организации программы позволяет группировать определенные фрагменты информации (например, информацию об отеле, такую как ФИО клиента или характеристику номера) вместе с часто используемыми функциями или действиями, связанными с этой информацией (например, «удалить клиента из поселения» или «добавить новый номер отеля»).

По определению авторитета в области объектно-ориентированных методов разработки программ Гради Буча «объектно-ориентированное программирование (ООП) - это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определенного класса (типа особого вида), а классы образуют иерархию на принципах наследуемости».

Объектно-ориентированная методология так же, как и структурная методология, была создана с целью дисциплинировать процесс разработки больших программных комплексов и тем самым снизить их сложность и стоимость.

Объектно-ориентированная методология преследует те же цели, что и структурная, но решает их с другой отправной точки и в большинстве случаев позволяет управлять более сложными проектами, чем структурная методология.

Сейчас объектно-ориентированное программирование стало настолько распространенным подходом в мире, что понимание его основных концепций стало необходимо для всех, кто собирается заняться программированием.

Объектно-ориентированное программирование - это парадигма программирования (совокупность идей и понятий, определяющая стиль написания программ). В нем основными концепциями являются понятия объектов и классов.

Класс - это тип данных, определяющий схожие объекты. Объект же является экземпляром некоторого класса.

Первичным понятием объектно-ориентированного подхода к программированию является понятие класса как совокупности объектов. Заметим, что класс при объектно-ориентированном подходе является аналогом понятия типа в том смысле, что к нему относят лишь объекты, отобранные по определенному правилу. Это правило возможно формализовать математически посредством предикатной функции, т.е. функции, область значений которой совпадает со значениями истинности: «истина» и «ложь». При этом, тот или иной объект относится к классу, если значение аппликации функции к данному объекту истинно, и не относится в противном случае.

Объект - синтаксически обособленная часть программы для имитации определенного ориентира из реального мира. Объект - упрощенное, идеализированное описание сущности предметной области, которая способна сохранять свое состояние (информацию) и обеспечивающая набор операций (поведение) для проверки и изменения этого состояния. Неотъемлемые характеристики объекта:

·состояние

·поведение

·идентифицируемость

Состояние объекта объединяет все его поля данных (статический компонент, т.е. неизменный) и текущие значения каждого из этих полей (динамический компонент, т.е. обычно изменяющийся).

Поведение выражает динамику изменения состояний объекта и его реакцию на поступающие сообщения, т.е. как объект изменяет свои состояния и взаимодействует с другими объектами.

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

Предмет моделирования при построении объекта в ООП может быть различным. Например, могут существовать следующие типы абстракции, используемые при построении объекта:

·абстракция понятия: объект - это модель какого-то понятия предметной области;

·абстракция действия: объект объединяет набор операций для выполнения какой-либо функции;

·абстракция виртуальной машины: объект объединяет операции, которые используются другими, более высокими уровнями абстракции;

·случайная абстракция: объект объединяет не связанные между собой операции.

Иногда нужно идентифицировать объекты в ООП, т.е., если имеются два объекта, как можно определить что эти объекты разные. На самом деле существует два вопроса: равны ли два объекта или тождественны. Обычно для идентификации применяются специальные атрибуты объектов - идентификаторы. В свою очередь, зная идентификаторы объектов можно точно определить, являются ли они тождественными или нет. Поэтому в объектно-ориентированном методе каждый модуль должен самостоятельно инициализировать свои структуры данных [1].

Индивидуальные объекты называются экземплярами класса, а класс в ООП - это шаблон по которому строятся объекты.

Класс - это конструкция, которая позволяет создавать собственные настраиваемые типы путем группирования переменных других типов, методов и событий. В некотором смысле классы объединяют в себе записи и программы, обрабатывающие эти записи, - методы реализуют логику интерпретации и изменения данных (этот стиль программирования потому и называется объектно-ориентированным, что при таком подходе всегда обрабатываются данные объектов) [2].

Класс похож на проект. Он определяет данные и поведение типа. Если класс не объявлен как статический, клиентский код может использовать его, создавая объекты или экземпляры, назначенные переменной. Переменная остается в памяти до тех пор, пока все ссылки на нее не выйдут из области. В этот момент среда CLR помечает ее пригодной для сборки мусора. Если класс объявляется как статический, то в памяти существует только одна копия, и клиентский код может получать к ней доступ только через сам класс, а не переменную экземпляра. Объект, созданный на основе некоторого класса, называется экземпляром класса. Все объекты определенных пользователем классов являются экземплярами класса. Тем не менее, объекты даже с одним и тем же состоянием могут быть разными объектами. Поэтому и говорят, что они имеют разную индивидуальность.

В отличие от структур, классы поддерживают наследование, фундаментальную характеристику объектно-ориентированного программирования.

Классы, объекты и методы имеют разные вариации, что позволяет сделать процесс реализации и сами программы достаточно удобными, гибкими и универсальными.

1.2Концепции ООП

Объектно-ориентированное программирование требует понимания его основных концепций, на которых оно построено. Во всех объектно-ориентированных языках программирования реализованы следующие основные «постулаты» ООП:

·Инкапсуляция

·Наследование

·Полиморфизм

Все эти механизмы важны для разработки и использования абстракций.

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

Наследование - механизм, с помощью которого один объект (производного класса) приобретает свойства другого объекта (родительского, базового класса). При использовании наследования новый объект не обязательно описывать, начиная с нуля, что существенно упрощает работу программиста. Наследование позволяет какому-либо объекту наследовать от своего родителя общие атрибуты, а для себя определять только те характеристики, которые делают его уникальным внутри класса. Наследование есть очень важное понятие, поддерживающее концепцию иерархической классификации.

Полиморфизм - механизм, позволяющий использовать один и тот же интерфейс для общего класса действий [3]. Язык программирования поддерживает полиморфизм, если классы с одинаковой спецификацией могут иметь различную реализацию - например, реализация класса может быть изменена в процессе наследования. Кратко смысл полиморфизма можно выразить фразой: «Один интерфейс, множество реализаций». Полиморфизм - один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием). Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода.

.3 Язык программирования Python

Язык программирования Python начал свою историю ещё в конце 80-x годов XX века. Нидерландский программист Гвидо ван Россум является автором Python. В декабре 1989 года Россум приступил к его созданию в центре математики и информатики в Нидерландах. Ему был необходим расширяемый язык, который бы обеспечил поддержку системных вызовов. Python создавался под влиянием множества языков программирования: С, C++, Java, Smalltalk, Модула-3 и ABC. Хоть многие считали, что назван язык в честь змеи, но всё-таки свое название язык получил в честь популярного британского комедийного телешоу 1970-х Летающий цирк Монти-Питона на канале BBC. С тех пор Python развивался при поддержке тех организаций, в которых Гвидо работал.

Сам Россум говорит о своем языке так: Python - интерпретируемый, объектно-ориентированный высокоуровневый язык программирования с динамической семантикой. Встроенные высокоуровневые структуры данных в сочетании с динамической типизацией и связыванием делают язык привлекательным для быстрой разработки приложений (RAD, Rapid Application Development). Кроме того, его можно использовать в качестве сценарного языка для связи программных компонентов. Синтаксис Python прост в изучении, в нем придается особое значение читаемости кода, а это сокращает затраты на сопровождение программных продуктов. Python поддерживает модули и пакеты, поощряя модульность и повторное использование кода. Интерпретатор Python и большая стандартная библиотека доступны бесплатно в виде исходных и исполняемых кодов для всех основных платформ и могут свободно распространяться.

Python - это высокоуровневый универсальный язык программирования, ориентированный на повышение производительности разработчика и читаемости кода. Python проектировался как объектно-ориентированный язык программирования, и поэтому он построен с учетом следующих принципов:

·все данные в нем представляются объектами.

·все объекты одного типа могут принимать одни и те же сообщения (и выполнять одни и те же действия).

·программу можно составить как набор посылающих друг другу сообщения взаимодействующих объектов.

·каждый объект имеет тип.

·каждый объект имеет собственную часть памяти и может состоять из других объектов.

Для решения широкого круга задач в поставку Python входит достаточно обширная стандартная библиотека. Для ещё большего расширения возможностей языка в интернете доступны другие разнообразные качественные библиотеки по различным предметным областям: инструменты для создания приложений, средства обработки текстов и изображений, механизмы работы с базами данных, библиотеки построения графического интерфейса, пакеты для научных вычислений, и т.п. Python портирован и работает практически на большинстве известных платформ - от КПК до мейнфреймов. Существуют порты под Microsoft Windows, Mac OS и Mac OS X, практически все вариации UNIX (включая FreeBSD и Linux), Plan 9, Palm OS, OS/2, Amiga, HaikuOS, AS/400 и OS/390, Windows Mobile, iPhone OS 2.0 и выше, Symbian и Android. Так же Python имеет достаточно простые средства для интеграции с языками C, C++ и Java, как путем встраивания (embedding) интерпретатора в программы на этих языках, так и наоборот, посредством использования библиотек, написанных на этих языках, в Python-программах. Язык Python поддерживает некоторые виды парадигм программирования: функциональное, императивное и объектно-ориентированное программирование. Язык Python используется в самых разных областях, от администрирования систем, разработки веб-сайтов, создания сценариев для мобильных устройств и обучения, до тестирования аппаратуры, анализа капиталовложений, компьютерных игр и управления космическими кораблями [4].

В настоящее время язык совершенствуется особенно активно, так как теперь над ним работает не только команда создателей, но и целое сообщество программистов со всего мира. Но даже сейчас Гвидо ван Россум остается ведущим специалистом языка и за ним всегда стоит последнее слово о направлении его развития.

2. Практическая часть

.1 Описание предметной области

Задачей является фиксирование информационной работы отеля. Деятельность организована следующим образом: отель предоставляет номера клиентам на определенный срок. Каждый номер характеризуется вместимостью, комфортностью (люкс, полулюкс, обычный), ценой и некоторым комментарием. Клиентами являются различные лица, о которых собирается определенная информация (фамилия, имя, отчество, паспортные данные (серия паспорта, номер паспорта), пол и некоторый комментарий). Сдача номера производится по подходящим клиенту критериям из указанных выше параметров. При поселении фиксируется дата поселения. При выезде из гостиницы для каждого места запоминается дата освобождения.

Клиенты (Клиент, Фамилия, Имя, Отчество, Серия, Номер, Комментарий).

Номера (Номер, Количество человек, Комфортность, Цена, Комментарий).

Поселение (Клиент, Номер, Дата поселения, Дата освобождения, Комментарий).

2.2 Диаграмма классов

Рисунок 1 - Диаграмма классов.

Большинство основных классов имеют сходные атрибуты - code и comment. В этом случае их можно выделить в отдельный класс, от которого будут унаследованы остальные классы. Подобное выделение общих свойств классов в общий класс-предок называется обобщением (generalization). Назовем этот класс general.

Класс general имеет атрибуты:

code - уникальный код для однозначной идентификации объекта;

comment - комментарий.

Вначале описывается конструктор класса __init__ - функция, размещающая объект в памяти и возвращающая ссылку на него, кроме того конструктор может выполнять некоторые действия, необходимые при создании объекта, в данном случае это задание начальных значений атрибутов.

Двойной символ подчёркивания в названии атрибута означает, что атрибут является приватный, недоступный для использования вне класса. Это позволяет использовать одинаковые имена атрибутов в разных классах. Доступ к атрибуту осуществляется через специальные функции:

setcode, setcomment

getcode, getcomment

set - позволяет задать или изменить значение атрибута;

get - возвращает в качестве результата значения атрибута;

Через general.__init__(self,code,comment) остальные классы смогут унаследовать атрибуты класса general.

Далее будут подробно описаны только основные классы и их атрибуты.

Клиенты представлены классом client, который имеет атрибуты:

code - код клиента;

"surname - фамилия;

name - имя;

secname - отчество;

series - серия;

number - номер;

sex - пол.

comment - комментарий.

Специальные функции:

setsurname, setname, setsecname, setseries, setnumber, setsex;

getsurname, getname, getsecname, getseries, getnumber, getsex;

Комнаты представлены классом room, который имеет атрибуты:

code - код номера;

number - номер;

occupancy - вместимость;

comfort - комфорт;

price - цена;

comment - комментарий.

Специальные функции:

setnumber, setoccupancy, setcomfort, setprice;

getnumber, getoccupancy, getcomfort, getprice.

Поселения представлены классом settlement, который имеет атрибуты:

code - код поселения;

room - комната, представлена классом room;

date_in - дата поселения;

date_out - дата освобождения;

comment - комментарий.

Специальные функции:

setroom, setdate_in, setdate_out;

getdate_in, getdate_out, getroomcode;

getroomnumber, getroomoccupancy, getroomcomfort, getroomprice, getroomcomment;

appendclient - позволяет добавить клиента в поселение,

removeclient - позволяет удалить клиента из поселения,

clearclients - позволяет удалить всех клиентов из поселения;

getclientcodes, getclientsurname, getclientname, getclientsecname, getclientseries, getclientnumber, getclientsex, getclientcomment;

getclientshotelstr- позволяет получить: ФИО клиента,

gethotelstr - позволяет получить: ФИО клиента, номер комнаты клиента, дата поселения, дата освобождения.

2.3 Реализация на языке Python

Рассмотрим реализацию модели информационной системы регистрации и размещения клиентов отеля.

# -*- coding: utf-8 -*-

В первой строке задаётся кодировка файла программы, если вдруг в тексте программы понадобиться использовать символы кириллицы. Воспользуемся кодировкой utf-8.

Далее следует описание класса general.

#-*- coding: utf-8 -*-

class general:__init__(self,code=1,comment=''):.setcode(code).setcomment(comment)setcode(self,code):not(isinstance(code, int)):Exception("Znachenie polja *cod* dolzhno byt' celym chislom")(code < 0):Exception("Znachenie polja kod dolzhno byt' polozhitel'nym. Peredano %i" % code).__code=codesetcomment(self,comment):.__comment=commentgetcode(self):self.__codegetcomment(self):self.__comment

Далее следует описание класса generalistedit.

# -*- coding: utf-8 -*-general import general

generallistedit():__init__(self):self.__list=[]clear(self):self.__list=[]findByCode(self,code):h in self.__list:h.getcode()==code:hgetcodes(self):return [s.getcode() for s in self.__list]getnewcode(self):=0c in self.getcodes():c>m:m=cm+1appendlist(self,value):self.__list.append(value)removelist(self,code):s in self.__list:s.getcode()==code:self.__list.remove(s)getcomment(self,code):return self.findByCode(code).getcomment()

Далее следует описание класса client.

# -*- coding: utf-8 -*-general import general = {"man", "woman", "мужской", "женский"}

class client(general):__init__(self,code,surname,name,secname,series,number,sex,comment=""):.__init__(self,code,comment).setsurname(surname).setname(name).setsecname(secname).setseries(series).setnumber(number).setsex(sex)setsurname(self,surname):not(isinstance(surname, str)):Exception("Znachenie polja *familia* dolzhno byt' strokoj").__surname=surnamesetname(self,name):not(isinstance(name, str)):Exception("Znachenie polja *imya* dolzhno byt' strokoj").__name=namesetsecname(self,secname):not(isinstance(secname, str)):Exception("Znachenie polja *otchestvo* dolzhno byt' strokoj").__secname=secnamesetseries(self,series):not(isinstance(series, int)):Exception("Znachenie polja *serija* dolzhno byt' celym chislom")(series < 1000 or series > 9999):Exception("Znachenie polja *serija* dolzhno byt' polozhitel'nym i v predele ot 1000 do 9999").__series=seriessetnumber(self,number):not(isinstance(number, int)):Exception("Znachenie polja *nomer* dolzhno byt' celym chislom")(number < 100000 or number > 999999):Exception("Znachenie polja *nomer* dolzhno byt' polozhitel'nym i v predele ot 100000 do 999999").__number=numbersetsex(self,sex):not(isinstance(sex, str)):Exception("Znachenie polja *pol* dolzhno byt' strokoj")not(sex in sextypes):Exception("Pol dolzhen byt' muzhskoj ili zheskij").__sex=sexgetsurname(self):self.__surnamegetname(self):self.__namegetsecname(self):self.__secnamegetseries(self):self.__seriesgetnumber(self):self.__numbergetsex(self):self.__sexgetperson(self):self.__surname + " " + self.__name[0] + "." + " " + self.__secname[0] + "."

Далее следует описание класса сlientlistedit - список клиентов.

# -*- coding: utf-8 -*-client import clientgenerallistedit import generallistedit

getsurname(self,code):return self.findByCode(code).getsurname()getname(self,code):return self.findByCode(code).getname()getsecname(self,code):return self.findByCode(code).getsecname()getseries(self,code):return self.findByCode(code).getseries()getnumber(self,code):return self.findByCode(code).getnumber()getsex(self,code):return self.findByCode(code).getsex()

getpersonstr(self,code):self.findByCode(code).getperson()

getlistpersonstr(self):=''code in self.getcodes():+=self.getpersonstr(code)+=', ' s[:-2]

Далее следует описание класса room.

# -*- coding: utf-8 -*-general import general= {1,2,3,4,6,10}

room(general):__init__(self,code,number,occupancy,comfort,price,comment=""):.__init__(self,code,comment).setnumber(number).setoccupancy(occupancy).setcomfort(comfort).setprice(price)setnumber(self,number):not(isinstance(number, int)):Exception("Znachenie polja *nomer* dolzhno byt' celym chislom")(number < 1):Exception("Znachenie polja *nomer* za den' dolzhno byt' polozhitel'nym").__number=numbersetoccupancy(self,occupancy):not(isinstance(occupancy, int)):Exception("Znachenie polja *kolichestvo mest* dolzhno byt' celym chislom")not(occupancy in occupancytypes):Exception("Znachenie polja *kolichestvo mest* dolzhno byt': 1/2/3/4/6/10").__occupancy=occupancysetcomfort(self,comfort):not(isinstance(comfort, str)):Exception("Znachenie polja *komfortnost'* dolzhno byt' strokoj").__comfort=comfortsetprice(self,price):not(isinstance(price, int)):Exception("Znachenie polja *tsena* dolzhno byt' celym chislom")(price < 1):Exception("Znachenie polja *tsena* za den' dolzhno byt' polozhitel'nym").__price=pricegetnumber(self):self.__numbergetoccupancy(self):self.__occupancygetcomfort(self):self.__comfortgetprice(self): self.__price

Далее следует описание класса roomlistedit - список комнат.

# -*- coding: utf-8 -*-room import roomgenerallistedit import generallistedit

roomlistedit(generallistedit):newrec(self,code,number,occupancy,comfort,price,comment=""):.appendlist(room(code,number,occupancy,comfort,price,comment))setnumber(self,code,value):self.findByCode(code).setnumber(value)setoccupancy(self,code,value):self.findByCode(code).setoccupancy(value)setcomfort(self,code,value):self.findByCode(code).setcomfort(value)setprice(self,code,value):self.findByCode(code).setprice(value)setcomment(self,code,value):self.findByCode(code).setcomment(value)

getcode(self,code):return self.findByCode(code).getcode()getnumber(self,code):return self.findByCode(code).getnumber()getoccupancy(self,code):return self.findByCode(code).getoccupancy()getcomfort(self,code):return self.findByCode(code).getcomfort()getprice(self,code):return self.findByCode(code).getprice()getcomment(self,code):return self.findByCode(code).getcomment()

Далее следует описание класса settlement.

# -*- coding: utf-8 -*-general import generalroom import roomclientlistedit import clientlistedit

settlement(general,room):__init__(self,code,date_in,date_out,room=None,comment=""):.__init__(self,code,comment).__clients=clientlistedit().setroom(room).setdate_in(date_in).setdate_out(date_out)setroom(self, room):.__room = roomsetdate_in(self,di):not(isinstance(di, str)):ValueError("Znachenie *data zaezda* dolzhno byt' strokoj").__date_in=disetdate_out(self,do):not(isinstance(do, str)):ValueError("Znachenie *data vyezda* dolzhno byt' strokoj").__date_out=dogetdate_in(self):self.__date_ingetdate_out(self):self.__date_outgetroomcode(self):return self.__room.getcode()getroomnumber(self):return self.__room.getnumber()getroomoccupancy(self):return self.__room.getoccupancy()getroomcomfort(self):return self.__room.getcomfort()getroomprice(self):return self.__room.getprice()getroomcomment(self):return self.__room.getcomment()

appendclient(self,value):self.__clients.appendlist(value)removeclient(self,code):self.__clients.removelist(code)clearclients(self):self.__clients.clear()

getclientcodes(self):return self.__clients.getcodes()getclientsurname(self,code):return self.__clients.findByCode(code).getsurname()getclientname(self,code):return self.__clients.findByCode(code).getname()getclientsecname(self,code):return self.__clients.findByCode(code).getsecname()getclientseries(self,code):return self.__clients.findByCode(code).getseries()getclientnumber(self,code):return self.__clients.findByCode(code).getnumber()getclientsex(self,code):return self.__clients.findByCode(code).getsex()getclientcomment(self,code):return self.__clients.findByCode(code).getcomment()

getclientshotelstr(self):self.__clients.getlistpersonstr()gethotelstr(self):=self.getclientshotelstr()self.__room:sroom=self.getroomnumber():sroom=""+=': room %s, %s - %s'%(sroom,self.getdate_in(),self.getdate_out()) s

Далее следует описание класса settlementlistedit - список поселений.

# -*- coding: utf-8 -*-generallistedit import generallisteditsettlement import settlementsettlementlistedit(generallistedit):newrec(self,code,date_in,date_out,room=None,comment=""):.appendlist(settlement(code,date_in,date_out,room,comment))setdate_in(self,code,value):self.findByCode(code).setdate_in(value)setdate_out(self,code,value):self.findByCode(code).setdate_out(value)setroom(self,code,value):self.findByCode(code).setroom(value)setcomment(self,code,value):self.findByCode(code).setcomment(value)

инкапсуляция программирование рython

def appendclient(self,code,value):self.findByCode(code).appendclient(value)removeclient(self,scode,ccode):self.findByCode(scode).removeclient(ccode)clearclients(self,code):self.findByCode(code).clearclients()

getdate_in(self,code):return self.findByCode(code).getdate_in()getdate_out(self,code):return self.findByCode(code).getdate_out()getcomment(self,code):return self.findByCode(code).getcomment()

getroomcode(self,code):return self.findByCode(code).getroomcode()getroomnumber(self,code):return self.findByCode(code).getroomnumber()getroomoccupancy(self,code):return self.findByCode(code).getroomoccupancy()getroomcomfort(self,code):return self.findByCode(code).getroomcomfort()getroomprice(self,code):return self.findByCode(code).getroomprice()getroomcomment(self,code):return self.findByCode(code).getroomcomment()

getclientsurname(self,scode,ccode):return self.findByCode(scode).getclientsurname(ccode)getclientname(self,scode,ccode):return self.findByCode(scode).getclientname(ccode)getclientsecname(self,scode,ccode):return self.findByCode(scode).getclientsecname(ccode)getclientseries(self,scode,ccode):return self.findByCode(scode).getclientseries(ccode)getclientnumber(self,scode,ccode):return self.findByCode(scode).getclientnumber(ccode)getclientsex(self,scode,ccode):return self.findByCode(scode).getclientsex(ccode)getclientcomment(self,scode,ccode):return self.findByCode(scode).getclientcomment(ccode)

getclientcodes(self,code):return self.findByCode(code).getclientcodes()getclientshotelstr(self,code):return self.findByCode(code).getclientshotelstr()gethotelstr(self,code):return self.findByCode(code).gethotelstr()

Теперь напишем программу в файле «main1.py», которая будет создавать объекты по описанным классам. В качестве примера добавим новое поселение. Информация о работе программы будет выведена на экран.

#-*- coding:utf-8 -*-settlement import settlementclient import clientroom import room

=settlement(1,"01.01.17","10.01.17").appendclient(client(1, "Rinder", "Andrew", "Aleksandrovich", 7123, 129033, "man")).appendclient(client(2, "Rinder", "Olivia", "Maksimovna", 7156, 528745, "woman")).appendclient(client(3, "Rinder", "Alex", "Andreevich", 7156, 528745, "woman")).setroom(room(12,12,3,"standart",5000))h1.gethotelstr().removeclient(2)h1.gethotelstr().clearclients()"No clients", h1.gethotelstr().appendclient(client(1, "Rinder", "Andrew", "Aleksandrovich", 7123, 129033, "man")).appendclient(client(2, "Rinder", "Olivia", "Maksimovna", 7136, 528745, "woman")).appendclient(client(3, "Rinder", "Alex", "Andreevich", 7182, 288744, "man")) h1.gethotelstr()

После активации программы в файле «main1.py» получаем информацию о добавленном поселении:

Rinder A. A., Rinder O. M., Rinder A. A.: room 12, 01.01.17 - 10.01.17A. A., Rinder A. A.: room 12, 01.01.17 - 10.01.17clients : room 12, 01.01.17 - 10.01.17A. A., Rinder O. M., Rinder A. A.: room 12, 01.01.17 - 10.01.17

Данные строки показывает работоспособность программы и правильное функционирование описанных нами классов. В первой строке добавлены два клиента в поселение. Во второй строке удален клиент один из данного поселения. В третьей строке полностью очищен весь список клиентов поселения. В четвертой строке все клиенты успешно восстановлены.

Далее следует описание класса hotel.

# -*- coding: utf-8 -*-clientlistedit import clientlisteditroomlistedit import roomlisteditsettlementlistedit import settlementlistedit

hotel(clientlistedit,roomlistedit,settlementlistedit):__init__(self):.__clients=clientlistedit().__rooms=roomlistedit().__settlements=settlementlistedit()removeclient(self,code):.__clients.removelist(code)c in self.__settlements.getcodes():.__settlements.removeclient(c,code)removeroom(self, code):.__rooms.removelist(code)c in self.__settlements.getcodes():.__settlements.setroom(c,None)removesettlement(self,code):.__settlements.removelist(code)

clear(self):.__settlements.clear().__clients.clear().__rooms.clear()

newclient(self,code,surname,name,secname,series,number,sex,comment=""):.__clients.newrec(code,surname,name,secname,series,number,sex,comment)findClientByCode(self,code):return self.__clients.findByCode(code)getclientnewcode(self):return self.__clients.getnewcode()getclientcodes(self):return self.__clients.getcodes()

getclientsurname(self,code):return self.__clients.getsurname(code)getclientname(self,code):return self.__clients.getname(code)getclientsecname(self,code):return self.__clients.getsecname(code)getclientseries(self,code):return self.__clients.getseries(code)getclientnumber(self,code):return self.__clients.getnumber(code)getclientsex(self,code):return self.__clients.getsex(code)getclientcomment(self,code):return self.__clients.getcomment(code)

getclientshotelstr(self,code):self.__clients.getlistpersonstr(code)getclienthotelstr(self,code):self.__clients.getpersonstr(code)

setclientsurname(self,code,value): self.__clients.setsurname(code,value)setclientname(self,code,value): self.__clients.setname(code,value)setclientsecname(self,code,value): self.__clients.setsecname(code,value)setclientseries(self,code,value): self.__clients.setseries(code,value)setclientnumber(self,code,value): self.__clients.setnumber(code,value)setclientsex(self,code,value): self.__clients.setsex(code,value)setclientcomment(self,code,value): self.__clients.setcomment(code,value)

newroom(self,code,number,occupancy,comfort,price,comment=""):.__rooms.newrec(code,number,occupancy,comfort,price,comment)findRoomByCode(self,code):return self.__rooms.findByCode(code)getroomnewcode(self):return self.__rooms.getnewcode()getroomcodes(self):return self.__rooms.getcodes()

getroomcode(self,code):return self.__rooms.getcode(code)getroomnumber(self,code):return self.__rooms.getnumber(code)getroomoccupancy(self,code):return self.__rooms.getoccupancy(code)getroomcomfort(self,code):return self.__rooms.getcomfort(code)getroomprice(self,code):return self.__rooms.getprice(code)getroomcomment(self,code):return self.__rooms.getcomment(code)

setroomnumber(self,code,value):self.__rooms.setnumber(code,value)setroomoccupancy(self,code,value):self.__rooms.setoccupancy(code,value)setroomcomfort(self,code,value):self.__rooms.setcomfort(code,value)setroomprice(self,code,value):self.__rooms.setprice(code,value)setroomcomment(self,code,value):self.__rooms.setcomment(code,value)

newsettlement(self,code,date_in,date_out,room=None,comment=""):.__settlements.newrec(code,date_in,date_out,room,comment)findSettlementByCode(self,code):return self.__settlements.findByCode(code)appendsettlementclient(self,scode,value):self.__settlements.appendclient(scode,value)removesettlementclient(self,scode,ccode): self.__settlements.removeclient(scode,ccode)clearsettlementclients(self,scode):self.__settlements.clearclients(scode)

setsettlementdate_in(self,code,value):self.__settlements.setdate_in(code,value)setsettlementdate_out(self,code,value):self.__settlements.setdate_out(code,value)setsettlementroom(self,code,rcode):self.__settlements.setroom(code,self.findRoomByCode(rcode))setsettlementcomment(self,code,value):self.__settlements.setcomment(code,value)

getsettlementcodes(self):return self.__settlements.getcodes()getsettlementnewcode(self):return self.__settlements.getnewcode()getsettlements(self):return self.__settlements

getsettlementdate_in(self,code):return self.__settlements.getdate_in(code)getsettlementdate_out(self,code):return self.__settlements.getdate_out(code)

getsettlementroomcode(self,code):return self.__settlements.getroomcode(code)getsettlementroomnumber(self,code):return self.__settlements.getroomnumber(code)getsettlementroomoccupancy(self,code):return self.__settlements.getroomoccupancy(code)getsettlementroomcomfort(self,code):return self.__settlements.getroomcomfort(code)getsettlementroomprice(self,code):return self.__settlements.getroomprice(code)getsettlementroomcomment(self,code):return self.__settlements.getroomcomment(code)

getsettlementcomment(self,code):return self.__settlements.getcomment(code)

getsettlementclientsurname(self,scode,ccode):return self.__settlements.getclientsurname(scode,ccode)getsettlementclientname(self,scode,ccode):return self.__settlements.getclientname(scode,ccode)getsettlementclientsecname(self,scode,ccode):return self.__settlements.getclientsecname(scode,ccode)getsettlementclientseries(self,scode,ccode):return self.__settlements.getclientseries(scode,ccode)getsettlementclientnumber(self,scode,ccode):return self.__settlements.getclientnumber(scode,ccode)getsettlementclientsex(self,scode,ccode):return self.__settlements.getclientsex(scode,ccode)getsettlementclientcomment(self,scode,ccode):self.__settlements.getclientcomment(scode,ccode)

getsettlementclientcodes(self,code):return self.__settlements.getclientcodes(code)

getsettlementclientshotelstr(self,code):return self.__settlements.getclientshotelstr(code)

getsettlementhotelstr(self,code):return self.__settlements.gethotelstr(code)

getsettlementhotelstrs(self):[self.getsettlementhotelstr(s) for s in self.getsettlementcodes()]

Класс hotel - главный модуль при последующей работе с базами данных xml и sql, в котором вызываются основные функции для работы с программой. Все данные и операции проходят через него.

Далее следует описание класса dataxml.

# -*- coding: utf-8 -*-xml.dom.minidom import parse, Document

dataxml:read(self,inp,hot):=parse(inp).normalize()node in dom.childNodes[0].childNodes:(node.nodeType==node.ELEMENT_NODE)and(node.nodeName=="client"):,surname,name,secname,series,number,sex,comment=1,"","","","","","",""t in node.attributes.items():t[0]=="code":code=int(t[1])t[0]=="surname":surname=str(t[1])t[0]=="name":name=str(t[1])t[0]=="secname":secname=str(t[1])t[0]=="series":series=int(t[1])t[0]=="number":number=int(t[1])t[0]=="sex":sex=str(t[1])t[0]=="comment":comment=str(t[1]).newclient(code,surname,name,secname,series,number,sex,comment)(node.nodeType==node.ELEMENT_NODE)and(node.nodeName=="room"):,number,occupancy,comfort,price,comment=1,"","","","",""t in node.attributes.items():t[0]=="code":code=int(t[1])t[0]=="number":number=int(t[1])t[0]=="occupancy":occupancy=int(t[1])t[0]=="comfort":comfort=str(t[1])t[0]=="price":price=int(t[1])t[0]=="comment":comment=str(t[1]).newroom(code,number,occupancy,comfort,price,comment)(node.nodeType==node.ELEMENT_NODE)and(node.nodeName=="settlement"):,date_in,date_out,room,comment=1,"","",None,""t in node.attributes.items():t[0]=="code":code=int(t[1])t[0]=="date_in":date_in=str(t[1])t[0]=="date_out":date_out=str(t[1])t[0]=="room":room=hot.findRoomByCode(int(t[1]))t[0]=="comment":comment=str(t[1]).newsettlement(code,date_in,date_out,room,comment)n in node.childNodes:(n.nodeType==n.ELEMENT_NODE)and(n.nodeName=="client"):t in n.attributes.items():t[0]=="code":client=hot.findClientByCode (int(t[1])).appendsettlementclient(code,client)write(self,out,hot):=Document()=dom.createElement("hotel").appendChild(root)c in hot.getclientcodes():=dom.createElement("client").setAttribute("code",str(c)).setAttribute("surname",hot.getclientsurname(c)).setAttribute("name",hot.getclientname(c)).setAttribute("secname",hot.getclientsecname(c)).setAttribute("series",str(hot.getclientseries(c))).setAttribute("number",str(hot.getclientnumber(c))).setAttribute("sex",hot.getclientsex(c)).setAttribute("comment",hot.getclientcomment(c)).appendChild(cli)c in hot.getroomcodes():=dom.createElement("room").setAttribute("code",str(c)).setAttribute("number",str(hot.getroomnumber(c))).setAttribute("occupancy",str(hot.getroomoccupancy(c))).setAttribute("comfort",hot.getroomcomfort(c)).setAttribute("price",str(hot.getroomprice(c))).setAttribute("comment",hot.getroomcomment(c)).appendChild(roo)c in hot.getsettlementcodes():=dom.createElement("settlement").setAttribute("code",str(c)).setAttribute("date_in",str(hot.getsettlementdate_in(c))).setAttribute("date_out",str(hot.getsettlementdate_out(c))).setAttribute("room",str(hot.getsettlementroomcode(c))).setAttribute("comment",hot.getsettlementcomment(c))ac in hot.getsettlementclientcodes(c):=dom.createElement("client").setAttribute("code",str(ac)).appendChild(cli).appendChild(stl)= open(out,"w").write(dom.toprettyxml(encoding='utf-8'))

Данный класс содержит методы как прочтения данных из базы данных в формате xml, так и записи в нее.

Далее в текстовом редакторе создадим файл, назовем его «old.xml». Запишем в него следующие данные в формате XML:

<?xml version="1.0" encoding="utf-8"?>

<hotel>

<client code="1" comment="---" name="Oleg" number="754334" secname="Mihajlovich" series="6513" sex="man" surname="Antonov"/>

<client code="2" comment="---" name="Lidija" number="382018" secname="Makarovna" series="6515" sex="woman" surname="Antonova"/>

<client code="3" comment="---" name="Aleksej" number="345545" secname="Fedorovich" series="5712" sex="man" surname="Mirin"/>

<client code="4" comment="---" name="Jella" number="442893" secname="Radimovna" series="2328" sex="woman" surname="Volentaj"/>

<client code="5" comment="---" name="Dmitrij" number="354676" secname="Valerevich" series="4567" sex="man" surname="Volkov"/>

<client code="6" comment="---" name="Oksana" number="847573" secname="Vasilevna" series="9472" sex="woman" surname="Lorina"/>

<client code="7" comment="---" name="Aleksandr" number="277197" secname="Viktorovich" series="5640" sex="man" surname="Bromov"/>

<client code="8" comment="---" name="Larisa" number="273974" secname="Lvovna" series="5645" sex="woman" surname="Bromova"/>

<client code="9" comment="---" name="Mihail" number="103849" secname="Pavlovich" series="3748" sex="man" surname="Luzhin"/>

<room code="1" comfort="standard" comment="---" number="1" occupancy="1" price="2000"/>

<room code="3" comfort="standard" comment="---" number="3" occupancy="1" price="2000"/>

<room code="4" comfort="double" comment="---" number="4" occupancy="1" price="3000"/>

<room code="5" comfort="double" comment="---" number="5" occupancy="1" price="3000"/>

<room code="6" comfort="luxury" comment="---" number="6" occupancy="1" price="4000"/>

<room code="7" comfort="standard" comment="---" number="7" occupancy="2" price="3500"/>

<room code="8" comfort="standard" comment="---" number="8" occupancy="2" price="3500"/>

<room code="9" comfort="standard" comment="---" number="9" occupancy="2" price="3500"/>

<room code="10" comfort="double" comment="---" number="10" occupancy="2" price="5000"/>

<room code="11" comfort="luxury" comment="---" number="11" occupancy="2" price="7000"/>

<room code="12" comfort="standard" comment="---" number="12" occupancy="3" price="5000"/>

<room code="13" comfort="standard" comment="---" number="13" occupancy="3" price="5000"/>

<room code="14" comfort="double" comment="---" number="14" occupancy="3" price="7000"/>

<room code="15" comfort="luxury" comment="---" number="15" occupancy="3" price="10000"/>

<room code="16" comfort="double" comment="---" number="16" occupancy="4" price="9000"/>

<room code="17" comfort="double" comment="---" number="17" occupancy="4" price="9000"/>

<room code="18" comfort="luxury" comment="---" number="18" occupancy="4" price="13000"/>

<room code="19" comfort="family" comment="---" number="19" occupancy="6" price="16000"/>

<room code="20" comfort="family" comment="---" number="20" occupancy="6" price="16000"/>

<room code="21" comfort="luxury" comment="---" number="21" occupancy="10" price="30000"/>

<room code="22" comfort="luxury" comment="---" number="22" occupancy="10" price="30000"/>

<room code="23" comfort="luxury" comment="---" number="23" occupancy="10" price="30000"/>

<settlement code="1" comment="---" date_in="13.02.17" date_out="19.02.17" room="7">

<client code="1"/>

<client code="2"/>

</settlement>

<settlement code="2" comment="---" date_in="31.01.17" date_out="03.02.17" room="1">

<client code="3"/>

</settlement>

<settlement code="3" comment="---" date_in="27.01.17" date_out="11.02.17" room="16">

<client code="4"/>

<client code="5"/>

<client code="6"/>

<client code="9"/>

</settlement>

</hotel>

В качестве примера напишем программу в файле «main2.py» для проверки работоспособности к прочтению и записи данных xml. Программа считает данные из файла «old.xml» и запишет их в новый файл «new.xml». В конце программа для демонстрации работы будет выводить на экран информацию обо всех поселениях отеля в виде списка информационных строк:

#-*- coding:utf-8 -*-hotel import hoteldataxml import dataxml as datax

=hotel()=datax().read('old.xml',hot).write('new.xml',hot)x in hot.getsettlementhotelstrs(): x

После активации программы в файле «main2.py» получаем информацию обо всех поселениях в базе данных xml:

Antonov O. M., Antonova L. M.: room 7, 13.02.17 - 19.02.17A. F.: room 1, 31.01.17 - 03.02.17J. R., Volkov D. V., Lorina O. V., Luzhin M. P.: room 16, 27.01.17 - 11.02.17

Далее следует описание класса datasql.

import ossqlite3 as db

emptydb = """foreign_keys = ON;

table client

(code integer primary key,text,text,text,integer,integer,text,text);

table room

(code integer primary key,integer,integer,text,integer,text);

table settlement

(code integer primary key,_in text,_out text,integer references room(code) on update cascade on delete set null,text);

table settlement_client

(code integer primary key autoincrement,integer references settlement(code) on update cascade on delete cascade,integer references client(code) on update cascade on delete cascade,(settlement,client));

"""datasql:read(self,inp,hot):= db.connect(inp)= conn.cursor().execute("select code,surname,name,secname,series,number,sex,comment from client")=curs.fetchall()r in data:hot.newclient(r[0],str(r[1]),str(r[2]),str(r[3]),r[4],r[5],str(r[6]),str(r[7])).execute("select code,number,occupancy,comfort,price,comment from room")=curs.fetchall()r in data:hot.newroom(r[0],r[1],r[2],str(r[3]),r[4],str(r[5])).execute("select code,date_in,date_out,room,comment from settlement")=curs.fetchall()r in data:hot.newsettlement(r[0],str(r[1]),str(r[2]),hot.findRoomByCode(int(r[3])),r[4]).execute("select settlement,client from settlement_client")=curs.fetchall()r in data:.appendsettlementclient(r[0],hot.findClientByCode(r[1])).close()

write(self,out,hot):= db.connect(out)= conn.cursor().executescript(emptydb)c in hot.getclientcodes():.execute("insert into client(code,surname,name,secname,series,number,sex,comment) values('%s','%s','%s','%s','%s','%s','%s','%s')"%((c),.getclientsurname(c),.getclientname(c),.getclientsecname(c),(hot.getclientseries(c)),(hot.getclientnumber(c)),.getclientsex(c),.getclientcomment(c)))c in hot.getroomcodes():.execute("insert into room(code,number,occupancy,comfort,price,comment) values('%s','%s','%s','%s','%s','%s')"%((c),(hot.getroomnumber(c)),(hot.getroomoccupancy(c)),.getroomcomfort(c),(hot.getroomprice(c)),.getroomcomment(c)))c in hot.getsettlementcodes():.execute("insert into settlement(code,date_in,date_out,room,comment) values('%s','%s','%s','%s','%s')"%((c),.getsettlementdate_in(c),.getsettlementdate_out(c),.getsettlementroomcode(c),.getsettlementcomment(c)))ac in hot.getsettlementclientcodes(c):.execute("insert into settlement_client(settlement,client) values('%s','%s')"%((c),(ac))).commit().close()

Данный класс содержит методы как прочтения данных из базы данных в формате sqlite, так и записи в нее.

Далее с помощью специальных программ или вручную необходимо создать файл. Чтобы не заполнять базу данных заново напишем программу в файле «mainxs.py». Программа считает данные из файла «old.xml» c готовой базой данных и запишет их в файл «old.sqlite». В конце программа для демонстрации работы будет выводить на экран информацию обо всех поселениях отеля в виде списка информационных строк:

#-*- coding:utf-8 -*-hotel import hoteldataxml import dataxml as dataxdatasql import datasql as datas

=hotel()=datax()=datas().read('old.xml',hot).write('old.sqlite',hot)x in hot.getsettlementhotelstrs():

print x

После активации программы в файле «mainxs.py» получаем информацию обо всех поселениях успешно перенесенных в другую новую базу данных sqlite:

Antonov O. M., Antonova L. M.: room 7, 13.02.17 - 19.02.17A. F.: room 1, 31.01.17 - 03.02.17J. R., Volkov D. V., Lorina O. V., Luzhin M. P.: room 16, 27.01.17 - 11.02.17

Теперь мы имеем готовую базу данных sqlite.

В качестве примера напишем программу в файле «main3.py» для проверки работоспособности к прочтению и записи данных sqlite. Программа считает данные из файла «old. sqlite» и запишет их в новый файл «new.sqlite». В конце программа для демонстрации работы будет выводить на экран информацию обо всех поселениях отеля в виде списка информационных строк:

#-*- coding:utf-8 -*-hotel import hoteldatasql import datasql as datas

=hotel()=datas().read('old. sqlite',hot).write('new. sqlite',hot)x in hot.getsettlementhotelstrs(): x

После активации программы в файле «main3.py» получаем информацию обо всех поселениях в базе данных sqlite:

Antonov O. M., Antonova L. M.: room 7, 13.02.17 - 19.02.17A. F.: room 1, 31.01.17 - 03.02.17J. R., Volkov D. V., Lorina O. V., Luzhin M. P.: room 16, 27.01.17 - 11.02.17

ЗАКЛЮЧЕНИЕ

В данной работе была создана модель информационной системы регистрации и размещения клиентов отеля с использованием объектно-ориентированного программирования (ООП).

Был изучен язык программирования Python и теоретические основы объектно-ориентированного программирования. Полученные знания были применены на практике в процессе реализации предметной области.

Первая глава данной работы была посвящена объектно-ориентированному подходу в программировании и языку программирования Python. В ней были раскрыты основные понятия ООП, его концепции, а также основная информация о языке Python, его истории и основные механизмы. Во второй главе были применены теоретические знания об ООП на практике путем описание классов на языке программирования Python и создана диаграмма классов в соответствии с выбранной предметной областью.

С одной стороны необходимо понимать базовые концепции, такие как классы, наследование и динамическое связывание. Для тех же, кто никогда не использовал инкапсуляцию данных, это может означать изменения мировоззрения и может отнять на изучение значительное количество времени. Проектирование классов - задача куда более сложная, чем их использование. Проектирование класса, как и проектирование языка, требует большого опыта. Это итеративный процесс, где приходится учиться на своих же ошибках. С другой стороны компоненты многоразового использования обычно содержат гораздо меньше ошибок, чем вновь разработанные, ведь они уже не раз подвергались проверке.

Язык программирования Python поддерживает методы объектно-ориентированного программирования. Данный язык был спроектирован на практические нужды и был очень удобен при создании системы учёта регистрации и размещения клиентов отеля.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1.Основы объектно-ориентированного программирования/ Б. Мейер - М.: Интернет-университет информационных технологий - ИНТУИТ.ру, 2005 - C.63

.Марк Лутц. Программирование на Python / Пер. с англ. - 4-е изд. - СПб.: Символ-Плюс, 2011. - Т. II. - C.73.

.Волкова И. А., Иванов А. В., Карпов Л. Е. Основы объектно-ориентированного программирования. Язык программирования С++. Учебное пособие для студентов 2 курса. - М.: Издательский отдел факультета ВМК МГУ, 2011- C.15

.Марк Лутц. Программирование на Python / Пер. с англ. - 4-е изд. - СПб.: Символ-Плюс, 2011. - Т. I. - C.36.

.http://www.pascal.helpov.net/index/object-oriented_programming_pascal_programming

.http://itandlife.ru/programming/object-oriented-programming/obektno-orientirovannoe-programmirovanie-oop-ponyatie-obekta/

Похожие работы на - Система учёта регистрации и размещения клиентов отеля

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!