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

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

06.12.2013, 23:33. Показов 3662. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru