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

Как заменить алгоритм телефонного справочника на эквивалентный?

06.12.2013, 23:33. Показов 3676. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
мне нужно чуть изменить программу.
но нет особых знаний(
Программу написал. работает.
но учитель сказал изменить ее.. но как это сделать уже не знаю.

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
# -*- coding: cp1251 -*-
print('Телефонный справочник')
names=open('phone.txt','r')
a=names.readlines()
surname={}
for i in a:
            person = i.split(' ')
            surname[person[0]]=[person[1], person[2]]
number={}
for i in a:
            person=i.split(' ')
            number[person[2]]=[person[0], person[1]]
while 1:
    print('1 – Поиск по фамилии')
    print('2 - Поиск по номеру телефона')
    print('3 – Добавить абонента')
    print('4 – Отобразить список всех людей в алфавитном порядке')
    print('5 – Выход из программы')
    data = raw_input('Выберете пункт меню. Введите его номер: ')
    if data == '1':    
        for o in a:
            o = raw_input('Введите фамилию: ')
            if o in surname:
                print('Имя: %s Номер: %s' % (surname[o][0], surname[o][1]))
                break
            else:
                print('Абонент с такой фамилией не найден')
                break       
    if data == '2':
        for x in a:
            x = raw_input('Введите телефон: ')
            if x in number:
                print('Фамилия: %s Имя: %s' % (number[o][0], number[o][1]))
                break
            else:
                print('Абонент с таким телефоном не найден')
                break
    if data == '3':
        f = raw_input('Фамилия: ')
        n = raw_input('Имя: ')
        p = raw_input('Телефон: ')
        with open("phone.txt", "r+") as Phone:
            Phone.write(f + " " + n + " " + p)
        print('Абонент добавлен')
    if data == '4':
        alph = surname.keys()
        alph.sort()
        for i in alph:
            print(i)
    if data == '5':
        print('Выход из программы')
        break
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.12.2013, 23:33
Ответы с готовыми решениями:

Создание телефонного справочника: как искать в БД?
Всем привет! Помогите пожалуйста с решением вопроса.. Я хочу создать телефонный справочник на языке С# в Windows Forms Я создал базу в...

Создание телефонного справочника
В общем возникла такая задача, нужно создать телефонный справочник предприятия. Должен хранить: телефон, кабинет, ФИО пользователя. ...

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

22
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
06.12.2013, 23:40
Цитата Сообщение от aktivion Посмотреть сообщение
но учитель сказал изменить ее
конкретно напиши
0
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 8
06.12.2013, 23:50  [ТС]
изменить(заменить) строки.
но чтобы работала по такому же принципу.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.12.2013, 02:16
Цитата Сообщение от aktivion Посмотреть сообщение
изменить(заменить) строки.
но чтобы работала по такому же принципу.
Вам не кажется, что это мягко говоря не тянет на описание проблемы? Объясни чётко и внятно, что нужно, поможем.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.12.2013, 06:20
Цитата Сообщение от aktivion Посмотреть сообщение
изменить(заменить) строки
напиши задание

Цитата Сообщение от aktivion Посмотреть сообщение
но чтобы работала по такому же принципу.
ниоткуда не следует, что эта программа правильная
например, если файла изначально нет, то её запуск приведёт к отказу

ещё
Цитата Сообщение от aktivion Посмотреть сообщение
Python
1
2
3
4
5
    if data == '4':
        alph = surname.keys()
        alph.sort()
        for i in alph:
            print(i)
Python
1
2
3
4
5
6
7
>>> d = {1: 2, 3: 4}
>>> k = d.keys()
>>> k.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict_keys' object has no attribute 'sort'
>>>
print используется со скобками, которые не нужны во втором питоне, но нужны в третьем, но в третьем dict.keys() возвращает не список, а специальный объект (вид), у которого нет метода sort()

так что тот, кто это писал, не знает этой разницы
следовательно, его программа может быть неправильно написана и по заданию

поэтому по коду выводов не делают

и телефонных справочников может быть десяток самых разных
0
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 8
07.12.2013, 10:42  [ТС]
Задание: Файл phone.txt содержит в каждой строке фамилию, имя и номер телефона. Все три поля отделяются друг от друга пробелами. Телефон записывается слитно, без пробелов. При запуске программы выводится меню для работы со справочником: 1 – поиск по фамилии, 2 – поиск по телефону, 3 – добавить человека, 4 – отобразить список всех людей в алфавитном порядке, 5 – выход. Изначально наполнить файл 20 любыми записями из справочника.Реализовать все указанные действия из меню. После выполнения заданного действия программа заново выводит меню.

Ссылка на справочник: ссылка

Писал программу на Python 2.7.6

 Комментарий модератора 
правила
5.19. Запрещено размещать ссылки на задания и коды программ, расположенные на других сайтах. Вопросы и коды программ должны размещаться на форуме.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
07.12.2013, 12:56
aktivion, Как я понял программа уже написана, что изменить надо?
0
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 8
07.12.2013, 13:02  [ТС]
Цитата Сообщение от tsar925 Посмотреть сообщение
aktivion, Как я понял программа уже написана, что изменить надо?
да, она работает.
Нужно написать программу с теми же функциями, но использовать другой алгоритм.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.12.2013, 15:58
во-во, например, добавил абонента, а затем его ищешь, и она его не находит
искать надо в файле каждый раз

Добавлено через 1 минуту
Цитата Сообщение от tsar925 Посмотреть сообщение
что изменить надо?
походу, он хочет её сдать второй раз, поэтому изменить всё надо так, чтобы она не была похожа на исходную
1
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 8
09.12.2013, 17:30  [ТС]
Так понимаю. все? безысходность?)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.12.2013, 19:37
Ну вот как-то так:
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
#!/usr/bin/python2.7
#coding:utf-8
 
import os
 
class Phone_book(object):
    def __init__(self, ):
        self.contacts = open('phone.txt').readlines()
        if self.contacts[-1][-1] != '\n':
            self.contacts[-1] = self.contacts[-1] + '\n'
 
    def add_contact(self):
        name = raw_input('Введите имя и фамилию:')
        number = raw_input('Введите номер телефона:')
        self.contacts.append(name + ' ' + number + '\n')
        f = open('phone.txt', 'w')
        for i in self.contacts:
            f.write(i)
        f.close()
        raw_input('Контакт успешно добавлен \n \
                  Нажмите Enter, чтобы вернуться в меню')
 
    def find(self):
        name = raw_input('Введите данные для поиска: ')
        temp = 0
        for i in self.contacts:
            if i.find(name) != -1:
                print(i)
                temp += 1
        if not temp:
            print 'Контакт не найден'
        raw_input('Нажмите Enter, чтобы вернуться в меню')
 
    def print_contacts(self):
        for i in sorted(self.contacts):
            print(i)
        raw_input('Нажмите Enter, чтобы вернуться в меню')
 
 
if __name__ == '__main__':
    contacts = Phone_book()
    dict_items = {1:contacts.find,
                  2:contacts.find,
                  3:contacts.add_contact,
                  4:contacts.print_contacts,
                  5:exit}
    while True:
        print '1 – поиск по фамилии \n' \
              '2 – поиск по телефону \n' \
              '3 – добавить человека \n' \
              '4 – отобразить список контактов \n' \
              '5 – выход \n'
        choice = int(raw_input('Введите номер нужного пункта: '))
        dict_items[choice]()
        os.system('clear')
1
Z3JheSBoYXQ=
 Аватар для fanatdebian
342 / 237 / 83
Регистрация: 08.07.2012
Сообщений: 577
12.12.2013, 19:45
Цитата Сообщение от tsar925 Посмотреть сообщение
Ну вот как-то так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    dict_items = {1:contacts.find,
                  2:contacts.find,
                  3:contacts.add_contact,
                  4:contacts.print_contacts,
                  5:exit}
    while True:
        print '1 – поиск по фамилии \n' \
              '2 – поиск по телефону \n' \
              '3 – добавить человека \n' \
              '4 – отобразить список контактов \n' \
              '5 – выход \n'
        choice = int(raw_input('Введите номер нужного пункта: '))
        dict_items[choice]()
        os.system('clear')
Либо смени тип ключа(что оптимально), либо добавь проверку на валидность int(), и конвертируй согласно типу ключа

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
>>> def hello():
...     print "Hello1"
...     
... 
>>> def hello2():
...     print "hello2"
...     
... 
>>> book = {1:hello, 2:hello2}
>>> book[1]
<function hello at 0x1c65488>
>>> book[1]()
Hello1
>>> book[raw_input()]()
1
Traceback (most recent call last):
  File "<input>", line 1, in <module>
KeyError: '1'
>>> book[int(raw_input())]()
 
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''
>>> book[int(raw_input())]()
1
Hello1
>>>
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.12.2013, 20:07
Ну вообще согласен, просто программка простейшая и была написана за 5 минут. Думаю для того, чтобы просто показать преподу пойдёт =) Ну, а если нет, то aktivion сам добавит проверку.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.12.2013, 21:01
Цитата Сообщение от fanatdebian Посмотреть сообщение
Либо смени тип ключа(что оптимально)
согласен, лучше иметь строки, так как там больше пунктов можно задать (они могут быть буквенные, типа q для выхода)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.12.2013, 21:04
Цитата Сообщение от accept Посмотреть сообщение
при добавлении контакта его нельзя искать
В смысле? Не совсем понял, что ты имеешь ввиду?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
12.12.2013, 21:09
там из косяков - то, что после загрузки данные хранятся в виде строк
и это всплыло при поиске: там ты будешь при каждом поиске сплитить строки
и первый со вторым пункты у тебя слиты в один, хотя в задании говорится, что они разные

Добавлено через 1 минуту
Цитата Сообщение от tsar925 Посмотреть сообщение
В смысле? Не совсем понял, что ты имеешь ввиду?
это я не заметил
он обычно после занесения в файл должен добавляться в динамический список, потому что занесение в файл может не состояться, поэтому я его там и искал
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.12.2013, 21:14
Цитата Сообщение от accept Посмотреть сообщение
там из косяков - то, что после загрузки данные хранятся в виде строк
и это всплыло при поиске: там ты будешь при каждом поиске сплитить строки
и первый со вторым пункты у тебя слиты в один, хотя в задании говорится, что они разные
Я не смотрел, как у него написана та программа, просто по заданию сделал и все.
0
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 8
14.12.2013, 19:23  [ТС]
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
#!/usr/bin/python2.7
#coding:utf-8
 
import os
 
class Phone_book(object):
    def __init__(self, ):
        self.contacts = open('phone.txt').readlines()
        if self.contacts[-1][-1] != '\n':
            self.contacts[-1] = self.contacts[-1] + '\n'
 
    def add_contact(self):
        name = raw_input('Введите имя и фамилию:')
        number = raw_input('Введите номер телефона:')
        self.contacts.append(name + ' ' + number + '\n')
        f = open('phone.txt', 'w')
        for i in self.contacts:
            f.write(i)
        f.close()
        raw_input('Контакт успешно добавлен \n \
                  Нажмите Enter, чтобы вернуться в меню')
 
    def find(self):
        name = raw_input('Введите данные для поиска: ')
        temp = 0
        for i in self.contacts:
            if i.find(name) != -1:
                print(i)
                temp += 1
        if not temp:
            print 'Контакт не найден'
        raw_input('Нажмите Enter, чтобы вернуться в меню')
 
    def print_contacts(self):
        for i in sorted(self.contacts):
            print(i)
        raw_input('Нажмите Enter, чтобы вернуться в меню')
 
 
if __name__ == '__main__':
    contacts = Phone_book()
    dict_items = {1:contacts.find,
                  2:contacts.find,
                  3:contacts.add_contact,
                  4:contacts.print_contacts,
                  5:exit}
    while True:
        print '1 – поиск по фамилии \n' \
              '2 – поиск по телефону \n' \
              '3 – добавить человека \n' \
              '4 – отобразить список контактов \n' \
              '5 – выход \n'
        choice = int(raw_input('Введите номер нужного пункта: '))
        dict_items[choice]()
        os.system('clear')
Можете (краткое) пояснение этой программы дать.
Что бы было легче разобраться.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.12.2013, 19:36
Есть класс в котом есть 4 метода, при создании экземпляра класса запускается __init__ там происходит считывание файла с контактами. Остальные три метода реализуют 1. добавление контактов (add_contact), поиск контактов (find) и вывод всех контактов (print_contacts).
В основной части программы создается экземпляр класса Phone_book, выводится меню и запрашивается какое действие нужно выполнить, пользователь вводит нужный номер меню и запускается соответствующий этому действию метод класса.

Вроде как все, если есть вопросы по конкретной части, пиши.
1
0 / 0 / 0
Регистрация: 06.12.2013
Сообщений: 8
14.12.2013, 20:02  [ТС]
Цитата Сообщение от tsar925 Посмотреть сообщение
Python
7
8
9
10
    def __init__(self, ):
        self.contacts = open('phone.txt').readlines()
        if self.contacts[-1][-1] != '\n':
            self.contacts[-1] = self.contacts[-1] + '\n'
что означают эти строки
И "!=" что это?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2013, 20:02
Помогаю со студенческими работами здесь

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

Создание телефонного справочника
Летняя сессия, курсовая. Ниже задание Создать класс: «Запись в справочнике» (абстрактный, имеет список телефонов, среди которых первый...

Сортировка телефонного справочника
В файле содержатся данные телефонной книги: имя, фамилия, отчество и номер абонента. В новый файл переписать данные обо всех абонентах,...

Создание телефонного справочника
Здравствуйте, Господа.Скажите пожалуйста, как создать Телефонный справочник с полями ФИО,Номер телефона, адрес почты на 1 с Битрикс?

Форматирование телефонного справочника
Имеется некий список телефонных номеров, которые записаны по-разному. Например: 89006548005, 79260472489, +77017109088, 246-73-32,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru