Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/190: Рейтинг темы: голосов - 190, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 22.11.2019
Сообщений: 7

Телефонный справочник

22.11.2019, 15:49. Показов 41377. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите, пожалуйста, написать программу. Я запуталась в ее написании(

Требования к программе:
1) При запуске программы (скрипта), она должна считывать содержимое
телефонного справочника из файла, хранящего на жестком диске. Файл может как
содержать записи (в корректном виде), так и быть пустым.
2) При завершении работы программы и/или при завершении выполнении команды,
изменяющей справочник, все изменения в справочнике должны быть сохранены в
файл (тот, из которого справочник считывается в начале).
3) Минимальный набор поддерживаемых команд для работы со справочником:
 Просмотр всех записей справочника: вывод всего справочника так, чтобы
было читабельно.
 Поиск по справочнику.
Поиск может осуществляться по любому из полей, а также по нескольким
полям одновременно (например, найти запись с именем «А» и фамилией
«Б»).
В результате поиска должны быть выведены найденные записи со
значением полей.
 Добавление новой записи.
NB: Обязательна проверка на то, что такая запись не содержится в
справочнике (по уникальному идентификатору).
Если такая запись уже содержится в справочнике, сообщить об этом
пользователю и предложить: изменить существующую запись, изменить
(Имя, Фамилия) новой записи или вернуться к выбору команды.
NB: При вводе Имени и Фамилии обязательна автозамена первой буквы на
заглавную.
 Удаление записи из справочника по Имени и Фамилии
 Изменение любого поля в определенной записи справочника
 Вывод возраста человека (записи) по Имени и Фамилии
4) Если пользователь неправильно ввел команду, программа должна
проинформировать его о некорректном вводе и вернуться в состояние ожидания
ввода команды.
5) Ни одна операция не должна заканчиваться ошибкой или вылетом программы при
поступлении любых входных данных – либо операция должна быть корректно
обработана, либо должно быть выведено сообщение об ошибке (желательно
информативное), и программа возвращена в состояние ожидания ввода.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2019, 15:49
Ответы с готовыми решениями:

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

Телефонный справочник
Помогите пожалуйста решить задачу! Напишите программу, которая имитировала бы работу простого телефонного справочника. В первой строке...

Телефонный справочник
Здравствуйте! Столкнулся с некоторыми проблемами реализации телефонного справочника. Условия: Для меня не понятно как лучше...

27
0 / 0 / 0
Регистрация: 22.11.2019
Сообщений: 7
28.11.2019, 19:39  [ТС]
Студворк — интернет-сервис помощи студентам
Создала меню из 6 пунктов, прописала их, ограничила ввод данных...
НО программа падает потому что не видит текстовый файл( он создан лежит в нужной папке, но не находит его.. Что сделать?
0
 Аватар для codcw
815 / 527 / 214
Регистрация: 22.12.2017
Сообщений: 1,495
28.11.2019, 19:45
показать код
0
 Аватар для Semen-Semenich
5239 / 3483 / 1176
Регистрация: 21.03.2016
Сообщений: 8,314
28.11.2019, 19:47
Ekaterina56, не может такого быть. путь правильно прописан?. попробуйте положите в папку с скриптом и просто пропишите имя файла и попробуйте запустить
0
0 / 0 / 0
Регистрация: 22.11.2019
Сообщений: 7
28.11.2019, 20:08  [ТС]
да. исправила.
что надо написать, где "?", объясните, пожалуйста

f.write('{0:10} | {1:10} | {?} | {?}'.format(m.surname, m.name, m.age, m.phone_number)
0
 Аватар для Semen-Semenich
5239 / 3483 / 1176
Регистрация: 21.03.2016
Сообщений: 8,314
01.12.2019, 17:23
Ekaterina56, ну читайте же что вам пишут. вот вам функция получения данных и создание пользователя. теперь ваша задача написать цикл с условиями какую функцию вызывать при таком то условии сами эти функции которые уже будут работать с объектом member. вот вам так сказать черновой вариант на коленке. что то можно улучшить что то изменить но главное сама суть работы с объектом, сохранение списка объектов в файл, поиск совпадений.
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
import pickle # модуль для сохранения обьектов в файл
 
################ создание обьекта Member и его методов  #####################
 
class Member:
    
    def __init__(self, listfields, arg):
        
        ''' создаем словарь пользователя где ключи - имя поля а в значениях - значение этого поля
            мне кажется с словарем будет проще при поиске или изменения любого поля
            чем список где нужно будет помнить индексы да и поле проще добавить в словарь'''
 
        self.data = dict(zip(listfields,arg))
 
    def identifier(self):
        '''' возвращает Имя Фамилию одной строкой'''
        return ' '.join([self.data['имя'],self.data['фамилия']]).lower()
 
    def paramchan(self,key, values):
        '''принимает ключ и новое значение. изменяет значение по ключу
            или создает новую запись если ключа еще нет'''
        self.data[key] = values
 
    def years(self):
        ''' вернет значение поля возраст'''
        return self.data['возраст']
 
    def show(self):
        ''' возвращает множество значений словаря в нижнем регистре'''
        return set(map(str.lower, list(self.data.values())))
 
    def change(self):
        ''' возвращает список ключей'''
        return list(self.data.keys())
 
    def __str__(self):
        ''' возвращает строку значений'''
        return ' '.join(list(self.data.values()))
 
######################## часть чтения и записи в файл #############################
 
def readfile(name):
    try:
        with open(name, 'rb') as f:
            return  pickle.load(f)
    except:
        print('\t\tданных еще не сохранено!\n ')
        return []
        
def savedata(obj,name):
    file = open(name,'wb')
    pickle.dump(obj , file)
 
################## часть ввода и проверки данных ########################3
 
def correct_input(text):
    ''' проверка на ввод только букв'''
    name = input(f'{text} > ')
    if name == '*':
        return name 
    while not name.isalpha():
        print('не корректный ввод')
        name = input(f'{text} > ')
    return name.capitalize()
    
 
def correct_number(text):
    ''' проверка номера'''
    print('номер +7 код номер без пробелов -> ')
    number = input(f'{text} > ')
    while True:
        if number[0] == '+' and number[1:].isdigit() and len(number) == 12:
            return number
        print('не корректный ввод')
        number = input(f'{text} > ')
        
def correct_age(text):
    '''проверка возраста'''
    age = input(f'{text} > ')
    while True:
        if age.isdigit() or age == '*':
            return age
        print('введите цифры !')
        age = input(f'{text} > ')
    
        
def data_input(listfields):
    ''' функция получения данных'''
    list_fun = [correct_input, correct_input, correct_number, correct_age, correct_input]
    return [fun(text) for text, fun in zip(listfields, list_fun)]
        
                
 
################ функции для работы со справочником ##################
def look(data):
    ''' Просмотр всех записей справочника '''
    for obj in data:
        print(obj)
 
def search(data,line):
    ''' Поиск по справочнику'''
    trigger = 1 
    for obj in data:
        if line.issubset(obj.show() ):
            trigger = 0
            print(f'\t результат - {obj}')
    if trigger:
        print('совпадений не найдено')
 
def search_age(data,member):
    for obj in data:
        if obj.identifier().lower() == member.lower():
            print( obj.years())
            return
   
 
def addmember(listfields, data, name):
    ''' Добавление новой записи '''
    database = data_input(listfields)
    client = ' '.join(database[:2])
    for obj in data:
        client == obj.identifier()
        print('имя и фамилия существуют. выберите другие.')
        return
                      
    memb = Member(listfields, database) # создаем обьект экземпляр класса
    print( 'пользователь добавлен')
    data.append(memb) # добавляем обьект в список
    savedata(data,name) # перезаписываем файл c новыми данными
    
 
def del_memb(data):
    ''' удаление по имени и фамилии'''
    member = ' '.join(map(str.lower, [input('имя > '), input('фамилия > ')]))
    for i,obj in enumerate(data):
        if obj.identifier() == member:
            data.pop(i)
            savedata(data,name) # перезаписываем файл c новыми данными
            print('удалено')
            return
        
def change(data, member):
    ''' изменение значения по полю  или добавление если еще нет'''
    for obj in data: 
        if  obj.identifier() == member:
            key = input('введите имя поля > ')
            if key not in obj.change():
                print('нет такого поля')
                if input(' создать поле? д > ').lower() == 'д':
                    key = input('введите имя поля > ')
                else:
                    return
            values = input('введите значение > ')
            obj.paramchan(key, values)
            break
 
 
    
    
################ основная часть #################################
 
 
 
name = 'data.pickle' # имя файла данных
data = readfile(name) # при запуске читаем данные из файла получаем список экземпляров класса
listfields = ['имя','фамилия','номер','возраст','город'] # поля ключей и подсказок ввода
 
while True:
    
    print('''\n\t\tКоманды для работы со справочником:
    \t\tПросмотр всех записей справочника:  - 1
    \t\tПоиск по справочнику -2
    \t\tДобавление новой записи - 3
    \t\t Удаление записи из справочника по Имени и Фамилии - 4
    \t\tИзменение любого поля в определенной записи справочника - 5 
    \t\tВывод возраста человека (записи) по Имени и Фамилии - 6
     \t\tВыход - 0 \n''')
    
    command = input('Команда: > ')
    
    if command == '1':
        look(data)
    elif command == '2':
        line = set(input('что искать> ').lower().split())#любая подстрока (имя, имя фамилия, фамилия, номер)
        search(data,line)
    elif command == '3':
        print('Введите данные или * при их отсутствии')
        addmember(listfields, data, name)
    elif command == '4':
        del_memb(data)
    elif command == '5':
        member = input('имя фамилия > ').lower()
        change(data, member)
    elif command == '6':
        member = input('имя фамилия > ').lower()
        search_age(data,member)
        
    elif command == '0':
        savedata(data,name)
        print("Работа завершена") 
        raise SystemExit
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
03.12.2019, 00:37
Semen-Semenich, Потрясающе! Поражаюсь Вашей работоспособностью.
0
 Аватар для Semen-Semenich
5239 / 3483 / 1176
Регистрация: 21.03.2016
Сообщений: 8,314
03.12.2019, 15:48

Не по теме:

Viktorrus, это не работоспособность а категорическое нежелание смотреть голубой украинско сирийский ящик ну и соответственно куча свободного времени в вечернее время. лучше загружать мозг чем тупеть от зомбоящика

0
0 / 0 / 0
Регистрация: 09.03.2023
Сообщений: 1
09.03.2023, 12:11
Ekaterina56, если не сложно, поправьте, пожалуйста часть с добавлением записи в телефонную книгу, в VS коде, при добавлении любой записи, программа выдает, что "запись существует, добавьте другую запись", но очень надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2023, 12:11

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

Класс "Телефонный справочник"
Я только начал изучать Python. Сам себе придумал задание и пытаюсь его сделать. Условие: Создать класс "Телефонный...

Телефонный номер
На различных сайтах часто требуется ввести номер телефона в определённом формате. Напиши программу, которая будет преобразовывать...

Телефонный номер
Здравствуйте, помогите пожалуйста с задачей, не могу понять как решается, спасибо! Дан телефонный номер. Напишите программу которая...

Вывести телефонный номер с необходимыми разделителями
Помогите пожалуйста с задачей: С помощью re.sub написать код, который на вход получает номер телефона, а на выход расписывает этот номер...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru