С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 29.07.2021
Сообщений: 27

Класс Дом

04.09.2021, 00:11. Показов 3589. Ответов 4

Студворк — интернет-сервис помощи студентам
Создайте class House, экземпляры которого должны иметь такие аттрибуты как тип дома, общая площадь, оставшаяся площадь и список мебели.
Экземпляр класса мебели в свою очередь должен иметь название и площадь, например - кровать: 4 м2, шкаф-купе: 2 м2, стол: 1,5 квадратных метров.
Добавьте вышеуказанную мебель в дом.
При печати информации о доме требуется вывод: тип дома, общая площадь, оставшаяся площадь, список мебели.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2021, 00:11
Ответы с готовыми решениями:

Дом, милый дом
Дом стоял на небольшой возвышенности на самом краю поселка. Он был ничем не примечателен – построенный лет тридцать назад, кирпичный,...

Дом за зеркалом
– Хочешь, расскажу, что я думаю насчёт дома там, за зеркалом? Во-первых, там есть комната, как наша гостиная, только вещи в ней стоят...

Вася строит дом
Здравствуйте! Решаю задачу с Сириус курсов и вроде построил логичный алгоритм, но почему то он где то зацикливается в бесконечность. ...

4
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
04.09.2021, 22:43
Kwan Timur, Начнем с постановки задачи.
Раз нам нужно создать класс домов, значит предполагается рассмотрение не одного дома а их множество.
Это в свою очередь требует сохранение списка домов в базе данных "Дома". Но для базы данных нужен уникальный ключ для каждого дома.
Возможно два варианта, или взять в качестве уникального ключа адрес дома, или порядковый номер (идентификатор ID_h) в списке домов. Для простоты возьмем второе, то есть ключем будет ID_h.
Так как порядковый номер в списке не является свойством реального дома, описывать его как атрибут в классе не будем. ID_h экземпляру класса будем присваивать при формировании списка домов. Список у нас будет в виде словаря, где ключом у каждого элемента будет его ID_h , а значением экземпляр класса House (Дом).
Аналогично создадим список мебели, который будет сохраняться в своей базе данных "Мебель".
Здесь аналогично список будет в виде словаря, где ключом у каждого элемента будет его ID_f , а значением экземпляр класса Furniture (Мебель). Идентификатор из списка мебели не является свойством реального объекта мебели, поэтому в описание класса мебели идентификатор не входит.
Опишем свойства дома, принадлежащие любому дому класса "Дом", и присвоим их абстрактному объекту self, являющимся обобщенным объектом класса "Дом", и имеющем атрибуты, которые есть у любого реального дома.
Напишем код для класса House (программная модель класса "Дом").
Имя файла (модуля) house :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
class House:
    def __init__(self, type_h, total_area, remain_area):
        self.type_h = type_h                      # тип дома
        self.total_area = total_area              # общая площадь
        self.remain_area = remain_area            # оставшаяся площадь
        self.lst_fur = []                         # список мебели
 
    def inform(self):
        print(self.type_h, self.total_area, self.remain_area, sep=' ')
        print(self.lst_fur)
2
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
05.09.2021, 12:56
Теперь опишем класс Furniture (Мебель), поместив его в файл (модуль) furniture.py:
Python
1
2
3
4
class Furniture:
    def __init__(self, name, space):
        self.name = name          # название
        self.space = space        # занимаемое пространство
Добавлено через 5 минут
Замечание. Файл с классом House называется house.py.

Добавлено через 20 минут
Прежде чем приступить к написанию алгоритма, внесем исправление в Постановку задачи.
Использование двух баз данных или одной базы данных с двумя связанными таблицами я хотел применить, что бы показать возможности шаблона, который я буду применять. Но хотя шаблон позволяет использовать одновременно несколько БД , однако это усложняет код. Но главное, если есть необходимость использовать несколько связанных таблиц в реляционной БД, то лучше для таких задач вместо питона использовать стандартные СУБД, которые ориентированны именно на такие задачи. Питон же лучше использовать для хранения данных в простой БД с одной таблицей. Или при необходимости совмещать хранение данных в СУБД и использовать питон по минимуму для работы с таблицами из СУБД, так как СУБД, кроме хранения, обладают большими возможностями для обработки данных из своих таблиц.
Поэтому упростим Постановку задачи и будем хранить данные в одной БД, а именно базе "Дома". Экземпляры класса "Мебель" будем просто помещать в список каждого дома. Мы в отличие от СУБД получим избыточность данных, но для нас важнее простота кода.

Добавлено через 1 час 0 минут
Kwan Timur, Теперь можно перейти к написанию алгоритма решения задачи. Для работы с базой данных нам нужно меню.
1) Создание меню. (для начала используем меню шаблона и модифицируем шаблон под нашу задачу).
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
1 - Вывести список
2 - Найти запись
3 - Редактировать запись
4 - Добавить запись
5 - Удалить запись
6 - Вывести отчет в файл .pdf
Для выхода нажмите Enter
 
Введите число для выбора действия:

Так как шаблон работает только с одной БД, то мы пока будем оставлять список мебели пустым.
2) Создать подменю, для заполнения списка мебели для каждого дома экземплярами мебели.
При добавлении мебели нужно проверять, что для нее есть место (заполнение чисто механическое, без учета удобства размещения).
3) Обеспечить вывод на экран информации о доме с выводом списка принадлежащей ему мебели.
При написании кода, при необходимости в алгоритм будут вносится изменения.
Для удобства проектирования для каждого класса будем использовать свой файл (модуль).
Итак проект будет состоять из 7-ми файлов:
1) example_House.py - сценарий (основной файл). Взят из шаблона.
2) program_Tools.py - программный инструментарий (главный файл агрегированного модуля, с коммутатором). Из шаблона.
3) input_Data.py - входные данные. Из агрегированного модуля шаблона.
4) output_Data.py - выходные данные. Из агрегированного модуля шаблона.
5) journal.py - журнал записей с экземплярами класса "Дом". Из агрегированного модуля шаблона.
6) house.py - содержит класс House (Дом). Из агрегированного модуля шаблона.
7) furniture.py - содержит класс Furniture (Мебель). Будет добавлен в агрегированный модуль.
2
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
05.09.2021, 22:40
Лучший ответ Сообщение было отмечено Kwan Timur как решение

Решение

Kwan Timur, Я в классе House обнаружил ошибку. Вот исправленный код. Это код с проверкой. Он может быть достаточным как решение для Вашей задачи.
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class House:
    def __init__(self, type_h, total_area):
        self.type_h = type_h                   # тип дома
        self.total_area = total_area           # общая площадь
        self.remain_area = total_area          # оставшаяся площадь
        self.lst_fur = []                      # список мебели
 
    def rem_area(self):
        self.remain_area = self.total_area
        for fur in self.lst_fur:
            self.remain_area -= fur.space
 
    def inform(self):
        print(self.type_h, self.total_area, self.remain_area, sep=', ')
        for fur in self.lst_fur:
            print(fur.name)
 
class Furniture:
    def __init__(self, name, space):
        self.name = name          # название
        self.space = space        # занимаемое пространство
 
if __name__ == '__main__':
    f = [Furniture('кравать', 4), Furniture('шкаф-купе', 2), Furniture('стол', 1.5)]
    house1 = House('деревянный', 25)
    house1.lst_fur += [f[0], f[2]]
    house1.rem_area()
    house2 = House('кирпичный', 30)
    house2.lst_fur += [f[0], f[2], f[1]]
    house2.rem_area()
    house3 = House('блочный', 35)
    house3.lst_fur += [f[0], f[0], f[1], f[2]]
    house3.rem_area()
    house4 = House('шлакобетонный', 40)
 
    house1.inform()
    print()
    house2.inform()
    print()
    house3.inform()
    print()
    house4.inform()
    print()
Но проект я продолжу, в качестве примера создания более крупного проекта.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
07.09.2021, 15:15
Kwan Timur, Используя шаблон с агрегированным модулем и модифицировав его под данную задачу получил следующий проект из 7-ми файлов. Код рабочий, позволяет работать с БД Дома, но пока без мебели. 7-ой файл с классом "Мебель" пока не используется, но к коммутатору подключен.
Осталось теперь добавить в код размещение в домах мебели.
Использованная технология позволяет легко работать с большим количеством модулей, объединив их в один агрегированный модуль. Что позволяет из любого места напрямую обращаться к любой переменной, к которой вы могли бы обратится , будь весь код в одном файле.
Все файлы загружаются сразу, поэтому программа работает так же быстро, как и тогда, когда код размещен в одном файле. Но в данном случае код структурирован и с ним очень легко работать используя IDE (среду разработки), как при разработке, так и при модификации кода. Легко переходить от модуля к модулю одним щелчком мыши и разбираться в одной структурной единице, ограниченного объема.
Из за большого количества модулей, размещу их в нескольких комментариях.
Напомню структуру проекта:
1) example_House.py - сценарий (основной файл). Создан на базе шаблона.
2) program_Tools.py - программный инструментарий (главный файл агрегированного модуля, с коммутатором). Из шаблона.
3) input_Data.py - входные данные. Из агрегированного модуля шаблона.
4) output_Data.py - выходные данные. Из агрегированного модуля шаблона.
5) journal.py - журнал записей с экземплярами класса "Дом". Из агрегированного модуля шаблона.
6) house.py - содержит класс House (Дом). Из агрегированного модуля шаблона.
7) furniture.py - содержит класс Furniture (Мебель). Добавлен в агрегированный модуль.
Все файлы должны быть помещены в один каталог.

Файл example_House.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
"""
Журнал записей домов.
Программа для ведения записей в БД "Дома".
"""
# <Вид записей>
 
# (КОММЕНТАРИИ БОЛЬШИМИ БУКВАМИ В СКОБКАХ) являются альтернативным представлением реальных действий,
#                                          которые описываются в алгоритме решения задачи
 
# (ПС) - обозначение кода, относящегося к вспомогательным программным средствам
 
# (М)  - обозначение кода,
#        относящегося непосредственно к созданию программной модели реального мышления
 
# pT - экземпляр инструментария         (экземпляр класса Prog_Tools модуля program_Tools) 
#                                           (СЕАНС РАБОТЫ ПРОГРАММЫ)
# iD_<номер> - экземпляр базы данных (БД)       (из класса модуля input_Data)
#                                           (ОДНА ИЗ БАЗ ДАННЫХ)
# m<Имя> - модуль                           сокращенное имя модуля,
#               одновременно атрибут экземпляра pT, для доступа к модолю (например pT.mID,
#                                                            доступ к модулю input_Data),
# (С ПОМОЩЬЮ КОММУТАТОРА ОБЕСПЕЧИВАЕТСЯ ДОСТУП ИЗ ЛЮБОГО МОДУЛЯ К ЛЮБОМУ ДРУГОМУ МОДУЛЮ ДАННОГО ПРОЕКТА)
#                                           
# <Имя класса><номер экземпляра> - экземпляр класса  (ОБЪЕКТ КЛАССА)
 
# pT - экземпляр класса Prog_Tools (СЕАНС pT РАБОТЫ ПРОГРАММЫ)
# j1 - экземпляр класса Journal (ЖУРНАЛ j1) 
# iD_1 - экземпляр класса входных данных Input_Data, загружается в "журнал" j1
#        (БАЗА ДАННЫХ ВО ВХОДНЫХ ДАННЫХ, В КОТОРУЮ ЗАГРУЖАЕТСЯ ВНЕШНЯЯ БАЗА ДАННЫХ)
# oD_1 - экземпляр класса выходных данных Output_Data, загружается из "журнала" j1
 
 
import program_Tools as mpT        # (ИМПОРТ МОДУЛЯ, СО ВСПОМОГАТЕЛЬНЫМИ ПРОГРАММАМИ
                                   # ВКЛЮЧАЯ КОММУТАТОР )
 
if __name__ == '__main__':
    print(mpT.__doc__)
    pT = mpT.Prog_Tools()              # (ПС) Создание экземпляра pT класса Prog_Tools 
                                       # (СОЗДАНИЕ ЭКЗЕМПЛЯРА (СЕАНСА РАБОТЫ) ВСПОМОГАТЕЛЬНЫХ ПРОГРАММ,
                                       # ВКЛЮЧАЯ КОММУТАТОР,
                                       # АКТИВАЦИЯ ВСПОМОГАТЕЛЬНЫХ ПРОГРАММ)
 
    pT.iD_1.dbName = "Дома"            # (М) Присвоение имени базе данных (журналу) во входных данных
    pT.oD_1.dbName = "Дома"            # (М) Присвоение имени базе данных в выходных данных
    pT.load_DB()                       # (ПС) загрузка записей из внешней БД в словарь dic_recs входных данных
                                       # (ЗАГРУЗКА ВНЕШНЕЙ БД ВО ВХОДНЫЕ ДАННЫЕ)
    
    # здесь вставляется код работы со словарем dic_recs, после создания содержащего его журнала
    j = pT.j1                     # (М) экземпляр j для работы с классом Journal модуля journal
    j.dbName = pT.iD_1.dbName     # (М) имя журнала используется то же, что и в dj.dbName
                                  # первоначально словарь записей копируется из iD_1.dic_recs,
                                  # который загружается из внешней БД
    j.dic_recs = dict(pT.iD_1.dic_recs)     # (ПС) копирование базы данных из входных данных в журнал
 
# (ПС) (ВЫВОДИМ МЕНЮ)
    while True:
        #lst_1 = ["1 - Вывести список", "2 - Найти запись", "3 - Редактировать запись", "4 - Добавить запись", "5 - Удалить запись", "6 - Вывести отчет в файл .pdf", "Для выхода нажмите Enter"]  # меню
        lst_1 = ["1 - Вывести список", "2 - Найти запись", "3 - Редактировать запись", "4 - Добавить запись", "5 - Удалить запись", "Для выхода нажмите Enter"]  # меню
        print(*lst_1, sep='\n')
        print()
        m = input('Введите число для выбора действия: ')           # (М) позиция меню
        print()
        if m == "1":
            pT.print_j1()          # (ИЗ ЖУРНАЛА ВЫВЕСТИ СПИСОК)
            print()
        elif m == "2":
            dic_f  = pT.j1.find_rec()   # (НАЙТИ ЗАПИСЬ)
            if dic_f == None: continue
            pT.print_find(dic_f)
            print()
        elif m == "3":
            key = input('Введите номер идентификатора ID редактируемой записи: ')
            if key in pT.j1.dic_recs.keys():
                record = pT.j1.dic_recs[key]
                pT.print_find({key: record})
                pT.j1.edit_rec(key)
                print()
        elif m == "4":
            pT.j1.add_rec()          # (ДОБАВИТЬ ЗАПИСЬ)
            print()
        elif m == "5":
            key = input('Введите номер идентификатора ID удаляемой записи: ')
            pT.j1.del_rec(key)                     # УДАЛИТЬ ЗАПИСЬ
            print()
        #elif m == "6":
        #    pT.print_pdf()
        #    print()
        elif m == '':
            pT.oD_1.dic_recs = dict(j.dic_recs)     # (ПС) копирование базы данных из журнала в выходные данные
            break                    # (М) (ВЫХОД ИЗ МЕНЮ)
 
    pT.save_DB()             # сохранение записей из словаря dic_recs во внешнюю БД
                             # (СОХРАНЕНИЕ ВЫХОДНЫХ ДАННЫХ ВО ВНЕШНЕЙ БАЗЕ ДАННЫХ)


Добавлено через 4 минуты
Файл program_Tools.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
"""
Модуль program_Tools.
Содержит программные инструменты
(например такие,
  загрузка данных с внешнего носителя и сохранение данных на внешнем носителе, в общем все,
  что относится чисто к работе вспомогательных программ, а не к формируемой модели)
В том числе выполняет роль коммутатора, связывающего все модули конкретного проекта.
Под каждый проект пишется свой уникальный код коммутатора,
          который жестко связан со всеми модулями проекта.
Код коммутатора пишется по шаблону. 
В каждом модуле проекта создается переменная, через которую коммутатор 
          подключает модуль к себе.
(С ПОМОЩЬЮ КОММУТАТОРА ЛЮБОЙ МОДУЛЬ ПРОЕКТА
                              ИМЕЕТ ДОСТУП К ЛЮБОМУ ДРУГОМУ МОДУЛЮ ЭТОГО ПРОЕКТА)
"""
 
# pT - экземпляр инструментария         (из класса модуля program_Tools)
#                                  (ЭКЗЕМПЛЯР КОММУТАТОРА, СОЗДАННЫЙ ДЛЯ ДАННОГО ПРОЕКТА)
# iD_<номер> - экземпляр базы данных (БД)       (из класса Input_Data модуля input_Data)
# oD_<номер> - экземпляр базы данных (БД)       (из класса Output_Data модуля output_Data)
# m<Имя> - модуль
# <Имя класса><номер экземпляра> - экземпляр класса
 
# iD_1 - база данных "Журнал записей", для загрузки в "журнал" j1
 
import shelve
import datetime
import input_Data as miD            # модуль с входными данными
import output_Data as moD           # модуль с выходными данными
import journal as mj                # модуль, описывающий класс Journal и класс Record (запись в журнале)
import house as mh                  # модуль, описывающий класс House (Дом)
import furniture as mf              # модуль, описывающий класс Furniture (Мебель)
 
class Prog_Tools:
    def __init__(self):
        self.iD_1 = miD.Input_Data()  # создание экземпляра iD_1 класса базы данных Input_Data
                                     # БД "Журнал записей"
        self.oD_1 = moD.Output_Data() # создание экземпляра oD_1 класса базы данных Output_Data
                                     # при необходимости можно создать дополнительные экземпляры базы данных
# ************************ КОММУТАТОР ***************************************
        self.miD = miD               # атрибут для работы с модулем input_Data из других модулей
        self.miD.pT = self           # передача в модуль input_Data экземпляра класса Prog_Tools
        self.moD = moD               # атрибут для работы с модулем input_Data из других модулей
        self.moD.pT = self           # передача в модуль input_Data экземпляра класса Prog_Tools
        self.mj = mj                 # атрибут для работы с модулем journal из других модулей
        self.mj.pT = self            # передача в модуль journal экземпляра класса Prog_Tools
        self.mh = mh                 # атрибут для работы с модулем house
        self.mh.pT = self            # передача в модуль house экземпляра класса Prog_Tools
        self.mf = mf                 # атрибут для работы с модулем furniture
        self.mf.pT = self            # передача в модуль furniture экземпляра класса Prog_Tools
 
# *********************** КОНЕЦ коммутатора ***********************************
        self.j1 = mj.Journal()        # создание экземпляра класса
                                      # для работы с классом Journal модуля journal
                                      # имя журнала используется то же, что и в iD_1.dbName
                                      # первоначально словарь записей копируется из iD_1.dic_recs,
                                      # который загружается из внешней БД
 
    def load_DB(self):
        # загрузка записей из базы данных db1, при необходимости добавить дополнительные БД
        db1 = shelve.open(self.iD_1.dbName)     # открытие базы данных "Журнал записей" (имя берется
                                              # из атрибута dbName экземпляра класса Input_Data)
        self.iD_1.dic_recs = dict(db1.items())  # загрузка записей из базы данных в атрибут dic_recs
                                              # экземпляра класса Input_Data (в словарь экземпляра класса)
        db1.close()                           # закрытие базы данных
        self.oD_1.dic_recs = dict(self.iD_1.dic_recs.items())  # копирование базы данных
                                                               # в выходные данные 
 
    def save_DB(self):
 
        # сохранение записей в базе данных db1, при необходимости добавить дополнительные БД
        db1 = shelve.open(self.oD_1.dbName)     # открытие базы данных
        for (key, record) in self.oD_1.dic_recs.items():  # запись содержимого из словаря dic_recs
            db1[key] = record                            # экземпляра oD_1 класса Output_Data
                                                         # во внешнюю базу данных
        db1.close()                           # закрытие базы данных
 
    def print_j1(self):
        # вывод текущего состояния журнала j1
        print(self.j1.dbName.upper())                             # вывод названия журнала
        print('*' * 105)
 
        lst_j = sorted(self.j1.dic_recs.items(), key=lambda item: item[0])   # сортировка записей
                                                                                # по индексам
        print(f"{' ID':^4}|{' Тип дома ':^15}|{' Общая площадь ':^20}|{' Ост. площадь ':^17}|{' Мебель ':^40}")  # шапка таблицы
        print('_' * 105)
        for (key, rec) in lst_j:                    # вывод записей
            print(f"{key:^5} {rec.type_h:21}{rec.total_area:18}   {rec.remain_area:17}")   #  {rec.lst_fur:100}")
 
        print('*' * 105)
 
    def print_find(self, dict_f):
        # вывод найденых записей
        print(self.j1.dbName.upper())                             # вывод названия журнала
        print('*' * 105)
 
        lst_j = sorted(list(dict_f.items()), key=lambda item: item[0]) # сортировка записей
                                                                                # по индексам
        print(f"{' ID':^4}|{' Тип дома ':^15}|{' Общая площадь ':^20}|{' Ост. площадь ':^17}|{' Мебель ':^40}")  # шапка таблицы
        print('_' * 105)
        for (key, rec) in lst_j:                    # вывод записей
            print(f"{key:^5} {rec.type_h:21}{rec.total_area:18}   {rec.remain_area:17}")   #  {rec.lst_fur:100}")
 
        print('*' * 105)
 
    #def print_pdf(self):
    #    # вывод отчета в файл .pdf
    #    from reportlab.pdfgen.canvas import Canvas
    #    from reportlab.lib.pagesizes import A4
    #    from reportlab.pdfbase import pdfmetrics
    #    from reportlab.pdfbase.ttfonts import TTFont
    #    import datetime
 
    #    now = datetime.datetime.now()
    #    now_date = f"{now.day:02}.{now.month:02}.{now.year}"
 
    #    canvas = Canvas("report_2.pdf", pagesize=A4)
    #    pdfmetrics.registerFont(TTFont('FreeSans', 'FreeSans.ttf'))
    #    canvas.setFont('FreeSans', 12)
    #    canvas.setLineWidth(.3)
    #    canvas.drawString(60,750,'СПИСОК СОТРУДНИКОВ')
    #    canvas.drawString(500,770, now_date)
    #    canvas.line(490,767,570,767)
    #    canvas.line(60,740,580,740)
 
    #    canvas.drawString(60, 725,
    #     "    ID    |"+' '*12+"Фамилия И.О."+' '*12+"|"+' '*19+"Отдел"+' '*19+"|"+' '*12+"Должность"+' '*12+"|")
    #    canvas.line(60,717,580,717)
 
    #    lst_j = sorted(self.j1.dic_recs.items(), key=lambda item: item[1].name)   # сортировка записей
                                                                                # по фамилиям
    #    rs = 0               # row step шаг строк
    #    for (key, rec) in lst_j:                    # вывод записей
    #        canvas.drawString(70,695-rs, key + '.')
    #        canvas.drawString(110,695-rs, rec.name)
    #        canvas.drawString(275,695-rs, rec.depart)
    #        canvas.drawString(445,695-rs, rec.job)
    #        rs += 20
 
    #    canvas.save()

Файл input_Data.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
"""
Оформление модуля в виде класса позволяет создавать сразу несколько баз данных 
и работать с ними одновременно.
Используется для хранения данных.
"""
 
pT = None              # экземпляр класса Prog_Tools (присваивается из модуля program_Tools)
 
class Input_Data:
    def __init__(self, dic_recs={}):             #, dbName, dic_recs={}):
        self.dbName = "Входные данные"
        self.dic_recs = dic_recs         # словарь записей


Добавлено через 5 минут
Файл output_Data.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
"""
Оформление модуля в виде класса позволяет создавать сразу несколько баз данных 
и работать с ними одновременно.
Используется для хранения данных.
"""
 
pT = None               # экземпляр класса Prog_Tools (присваивается из модуля program_Tools)
 
class Output_Data:
    def __init__(self, dic_recs={}):
        self.dbName = "Выходные данные"
        self.dic_recs = dic_recs      # словарь записей

Файл journal.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# файл journal.py - создает динамическую (в оперативной памяти) базу данных в виде словаря,
# определяя уникальный ключ для каждого объекта (экземпляра класса модели), 
# для занесения затем записей из журнала для сохранения во внешнюю базу данных.
 
import shelve                         # импорт модуля для работы с базой данных 
 
pT = None                              # экземпляр класса Prog_Tools (присваивается из модуля program_Tools)
 
class Journal:
    def __init__(self, currentKey=None):
        self.dbName = pT.iD_1.dbName      # название журнала
        self.currentKey = currentKey      # номер текущей записи в журнале
        self.dic_recs = {}                # словарь записей, который загружается из БД
                                          # и с которым программма динамически работеет,
                                          # чтобы затем измененные данные сохранить в БД
    def add_rec(self):
        # добавление в журнал записи (при этом создается экземпляр класса House из модели)
        field1 = input('Тип дома: ')    # (М) вводятся значения полей записи
        field2 = input('Общая площадь: ')
        if len(pT.j1.dic_recs)>0:                                      # если список не пуст,
            L = sorted(pT.j1.dic_recs.items(), key=lambda item: int(item[0])) # то к максимальному значению
            keyRec = str(int(L[-1][0]) + 1)                # ключа записи прибавляется единица
        else:                                     # иначе записи присваивается ключ равный 1
            keyRec = "1"
        house = pT.mh.House(field1, field2)    # создается экземпляр класса house
        self.dic_recs[keyRec] = house          #  записывается в словарь self.dic_recs
        pT.oD_1.dic_recs[keyRec] = house       # записывается в словарь выходных данных
        db1 = shelve.open(pT.oD_1.dbName)      # открытие базы данных
        db1[keyRec] = house                    # запись во внешнюю базу данных
        db1.close()                            # закрытие базы данных
 
    def del_rec(self, key):
        # удаление записи из журнала
        del self.dic_recs[key]                  # удаление из журнала
        del pT.oD_1.dic_recs[key]               # удаление из выходных данных
        db1 = shelve.open(pT.oD_1.dbName)       # открытие базы данных
        del db1[key]                            # удаление записи из внешней базы данных
        db1.close()                             # закрытие базы данных
 
    def find_rec(self):
        # поиск записи
        dic_find = {}
        s = input('Ведите ID или Тип дома: ')
        if s.isdigit() and s in self.dic_recs.keys():
            record = self.dic_recs[s]
            dic_find[s] = record
        else: 
            for key, record in self.dic_recs.items():
                if record.type_h.find(s) != -1:
                    dic_find[key] = record
        if dic_find:
            return dic_find
        else:
            print("Запись не найдена")
 
    def edit_rec(self, id):
        record = self.dic_recs[id]
        keyRec = id
        field1 = input('Тип дома: ')    # (М) вводятся значения полей записи
        field2 = input('Общая площадь: ')
        house = pT.mh.House(field1, field2)    # создается экземпляр класса house
        self.dic_recs[keyRec] = house          #  записывается в словарь self.dic_recs
        pT.oD_1.dic_recs[keyRec] = house       # записывается в словарь выходных данных
        db1 = shelve.open(pT.oD_1.dbName)      # открытие базы данных
        db1[keyRec] = house                    # запись во внешнюю базу данных
        db1.close()                            # закрытие базы данных


Добавлено через 10 минут
Файл house.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# модель класса "Дом"
 
pT = None                              # экземпляр класса Prog_Tools (присваивается из модуля program_Tools)
 
class House:
    def __init__(self, type_h, total_area):
        self.type_h = type_h                   # тип дома
        self.total_area = total_area           # общая площадь
        self.remain_area = total_area          # оставшаяся площадь
        self.lst_fur = []                      # список мебели
 
    def calc_rem_area(self):
        self.remain_area = self.total_area
        for fur in self.lst_fur:
            self.remain_area -= fur.space
 
    def inform(self):
        print(self.type_h, self.total_area, self.remain_area, sep=', ')
        for fur in self.lst_fur:
            print(fur.name)

Файл furniture.py :
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
# модель класса "Мебель"
 
pT = None                              # экземпляр класса Prog_Tools (присваивается из модуля program_Tools)
 
class Furniture:
    def __init__(self, name, space):
        self.name = name          # название
        self.space = space        # занимаемое пространство
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.09.2021, 15:15
Помогаю со студенческими работами здесь

Бесконечно высокий дом
Существует бесконечно высокий дом, в котором нумерация квартир начинается с единицы. Известен номер квартиры. Определить на каком этаже...

Дом на другой стороне улицы
В некотором городе по генеральному плану все дома строятся по двум сторонам улицы строго друг напротив друга. Как обычно на одной стороне...

Нарисовать дом
Пожалуйста помогите решить задачи. Задача Ч.8. Напишите функцию drawHouse(t, length), в которой черепашка t рисует дом (квадрат со...

Нарисовать дом, солнышко и раскрасить их
Нарисовать дом, солнышко и раскрасить их.Помогите пожалуйста

Задача: Вася строит дом
Здравствуйте, имеется такая задача: Мальчик Вася живёт на координатной прямой. На этой прямой в точке A располагается школа, а в точке B...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru