Составить программу выводящую на экран телефонный справочник фио адрес номер телефона

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
Const
 n = 5; //кол-во абонентов
Type
 phonebook = record
  number:integer;
  fam,name,otch:string;
  adress: record
   street:string;
   house:integer;
   flat:integer;
  End;
 End;
Var
 a:array [1..n] of phonebook;
 numtorequest:integer;
 i,j:integer;
Begin
 For i:=1 to n do //Ввод данных
  With a[i] do
   Begin
    Write('Введите номер телефона: ');
    Readln(number);
    Write('Введите фамилию: ');
    Readln(fam);
    Write('Введите имя: ');
    Readln(name);
    Write('Введите отчество: ');
    Readln(otch);
    Writeln('Введите адрес абонента');
    With adress do
     Begin
      Write('Улица: ');
      Readln(street);
      Write('Дом: ');
      Readln(house);
      Write('Квартира: ');
      Readln(flat);
     End;
    writeln;
   End;
 writeln;
 Writeln('Номер телефона -- Фамилия -- Имя -- Отчество -- Улица -- Дом -- Квартира');
 For i:=1 to n do
  With a[i] do
   writeln(number,' -- ',fam,' -- ',name,' -- ',otch,' -- ',adress.street,' -- ',adress.house,' -- ',adress.flat);
 writeln;
 Writeln('Первый запрос: ');
 Write('Введите номер телефона: ');
 Readln(numtorequest);
 For i:=1 to n do
  With a[i] do
   if number = numtorequest then writeln(fam,' ',name,' ',otch,' ',adress.street,' ',adress.house,' ',adress.flat);
 Writeln;
 Writeln('Второй запрос: ');
 For i:=1 to n do
  For j:=1 to n do
   if (a[i].adress.street = a[j].adress.street) and (a[i].adress.house = a[j].adress.house) and (a[i].number <> a[j].number) then 
    writeln(a[i].number,' ',a[i].fam,' живет в доме ',a[i].adress.house,', что на улице ',a[i].adress.street,', вместе с ',a[j].number,' ',a[j].fam);
End.
uses crt;
const max=50;
      b=['A'..'Z','a'..'z'];{допустимые буквы}
      cf=['0'..'9'];{цифры}
type
TPhoneRecord=record
             name:string;
             surname:string;
             phone:string;{сделаем строкой, вдруг в номере, с учетом например кода
                            цифр больше 10, или первая из 10 цифр болше 2}
             end;
mas=array[1..max] of TPhoneRecord;
 
procedure ProvNam(st:string;var f:byte);{проверка букв}
var i:byte;
begin
f:=0;
for i:=1 to length(st)do
if not(st[i] in b) then{если не буква}
 begin
  writeln('Error!');
  f:=1;
  break;
 end;
end;
 
procedure ProvNom(st:string;var f:byte);{проверка цифр}
var i:byte;
begin
f:=0;
for i:=1 to length(st)do
if not(st[i] in cf) then{если не цифра}
 begin
  writeln('Error!');
  f:=1;
  break;
 end;
end;
 
procedure Add(var t:mas;var n:byte);
var i,f:byte;
begin
clrscr;
writeln('Добавить запись.');
n:=n+1;
repeat
write('Name: ');readln(t[n].name);
ProvNam(t[n].name,f);{проверка}
until f=0;{пока не введем правильно}
repeat
write('Surname: ');readln(t[n].surname);
ProvNam(t[n].surname,f);
until f=0;
repeat
write('Phone: ');readln(t[n].phone);
ProvNom(t[n].phone,f);
until f=0;
write('Press Enter...');
readln;
end;
 
procedure Del(var t:mas;var n:byte;k:byte);
var i:byte;
begin
clrscr;
repeat
write('Удалить запись № ');
readln(k);
if k>n then writeln('В массиве нет ',k,' записей. Повторите ввод.');
if k<1 then writeln('Некорректное число. Повторите ввод.');
until k in [1..max];
for i:=k to n-1 do
t[i]:=t[i+1];
n:=n-1;
write('Press Enter...');
readln;
end;
 
procedure Change(var t:mas;n:byte;k:byte);
var f:byte;
begin
clrscr;
repeat
write('Заменить запись № ');
readln(k);
if k>n then writeln('В массиве нет ',k,' записей. Повторите ввод.');
if k<1 then writeln('Некорректное число. Повторите ввод.');
until k in [1..max];
writeln('Введите новые данные:');
repeat
write('Name: ');readln(t[k].name);
ProvNam(t[k].name,f);
until f=0;
repeat
write('Surname: ');readln(t[k].surname);
ProvNam(t[k].surname,f);
until f=0;
repeat
write('Phone: ');readln(t[k].phone);
ProvNom(t[k].phone,f);
until f=0;
write('Press Enter...');
readln;
end;
 
procedure Print(var t:mas;n:byte);
var i:byte;
begin
clrscr;
writeln('Список абонентов:':30);
writeln;
writeln('-----------------------------------------');
writeln('|    Фамилия    |    Имя    |  Телефон  |');
writeln('-----------------------------------------');
for i:=1 to n  do
 begin
  gotoXY(1,whereY);  write('| ',t[i].name);
  gotoXY(17,whereY); write('| ',t[i].surname);
  gotoXY(29,whereY); write('| ',t[i].phone);
  gotoXY(41,whereY); write('| ');
  writeln;
 end;
writeln('-----------------------------------------');
write('Press Enter...');
readln
end;
var a:mas;
    n,i,k,f:byte;
    w:char;
begin
clrscr;
n:=10;
writeln('Введите данные:');
for i:=1 to n do
 begin
  writeln('Запись ',i);
  repeat
  write(' Name: ');readln(a[i].name);
  ProvNam(a[i].name,f);
  until f=0;
  repeat
  write(' Surname: ');readln(a[i].surname);
  ProvNam(a[i].surname,f);
  until f=0;
  repeat
  write(' Phone: ');readln(a[i].phone);
  ProvNom(a[i].phone,f);
  until f=0;
 end;
write('Press Enter...');
readln;
clrscr;
repeat
clrscr;
writeln('Выберите действие:');
writeln;
writeln('1-Добавить запись');
writeln('2-Удалить запись');
writeln('3-Изменить запись');
writeln('4-Вывести записи на экран');
writeln('другие-Выход');
writeln;
w:=readkey;
case w of
'1':Add(a,n);
'2':Del(a,n,k);
'3':Change(a,n,k);
'4':Print(a,n);
else exit;
end;
until not(w in ['1'..'4']);
end.

Добавил:

Upload

Опубликованный материал нарушает ваши авторские права? Сообщите нам.

Вуз:

Северный (Арктический) федеральный университет им. М. В. Ломоносова

Предмет:

[НЕСОРТИРОВАННОЕ]

Файл:

Работа с текстовыми файлами с помощью файловых.…doc

Скачиваний:

0

Добавлен:

22.07.2019

Размер:

135.17 Кб

Скачать

►Содержание►

<< < < Предыдущая 1 2 / 2 2

  1. Ввести информацию по 4 перевозкам (n рейса, пункт назначения, наименование, вес). Найти суммарный вес всех перевозок.

  2. Составить программу, выводящую на экран из файла «Телефонный справочник» (ф. И. О., адрес, номер телефона). Произвести поиск по фио – выдать адрес и телефон.

<< < < Предыдущая 1 2 / 2 2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #

    25.08.2019130.56 Кб0РАБ ТЕТРАДЬ по эклог микроорганизмов.doc

  • #

    19.12.2018141.31 Кб0Раб.пр.ран.возр..doc

  • #

    13.02.201576.29 Кб146Работа 5.doc

  • #

    28.07.20191 Mб1РАБОТА ПО ВФП.doc

  • #

    03.05.20151.14 Mб7Работа с датчиками.pdf

  • #

    22.07.2019135.17 Кб0Работа с текстовыми файлами с помощью файловых….doc

  • #

    13.02.2015334.85 Кб18Рабочая программа Демография 2012.doc

  • #

    22.04.2019378.88 Кб1Рабочая программа курса иогп.doc

  • #

    13.02.2015328.31 Кб5Рабочая программа ПСД.rtf

  • #

    13.02.201535.16 Кб5рабочая программа.docx

  • #

    17.07.2019732.67 Кб2рабочая тетрадь 8 и 9.doc

Программа ‘Телефонный справочник’

Содержание

Техническое задание

Введение

.        Теоретический
материал

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

.1 Структура для хранения
справочника

.2 Структура для хранения
номеров телефонов

.3 Структура файла телефонной
книги

. Описание процедур и функций

. Описание структуры
приложения и интерфейса пользователя

. Системные требования и
имеющиеся ограничения

. Результаты тестирования
приложения

. Анализ временных
характеристик и выводы

Заключение

Список литературы

Приложение. Текст программы

Техническое
задание

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

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

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

2.       Корректировка данных: добавление данных, причем на одного
абонента может приходиться несколько номеров телефона как мобильных, так и
домашних; редактирование данных абонента; удаление абонента из справочника.

.        Сортировка телефонной книги должна быть в алфавитном порядке.
Алгоритм реализации сортировки должен давать результат за максимально короткий
промежуток времени.

.        В справочнике реализуется динамический поиск. Поиск должен
проходить по нескольким параметрам: фамилии, номеру телефону, оператору.

.        Вывод данных об абоненте на печать.

Введение

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

1.
Теоретический материал

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

Сортировка один из наиболее распространенных процессов обработки данных.
Сортировка к тому же еще достаточно хороший пример задачи, которую можно решать
с помощью многих различных алгоритмов. Каждый из них имеет и свои достоинства,
и свои недостатки, и выбирать алгоритмы нужно, исходя из конкретной постановки
задачи. Рассмотрим несколько примеров сортировок и сравним их с алгоритмом,
выбранным для реализации телефонной книги [1].

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

Рис.1.1 Схема алгоритма прямого выбора

Сортировка с помощью прямого включения. В сортировке включениями элементы
разделяются на уже упорядоченную и неупорядоченную последовательности. В начале
упорядоченная часть содержит только один элемент. Очередной элемент из начала
неупорядоченной части вставляется на подходящее место в упорядоченную часть.
При этом упорядоченная часть удлиняется на один элемент, а неупорядоченная —
укорачивается. Сортировка заканчивается при исчезновении неупорядоченной части
[4].

Рис 1.2 Схема алгоритма прямых включений

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

Рис 1.3 Схема алгоритма прямого обмена

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

Важным алгоритмом для данной курсовой работы является алгоритм поиска
подстроки в строке. Рассмотрим некоторые алгоритмы.

Алгоритм основанный на методе последовательного поиска. Обозначим S —
слово, в котором ищется образец X. Пусть m и n — длины слов S и X
соответственно. Можно сравнить со словом X все подслова S, которые начинаются с
позиций 1,2,…,m-n+1 в слове S; в случае равенства выводится соответствующая
позиция. Алгоритм прост в реализации. Количество сравнений будет равно O
((m-n+1)*n+1) [3].

Алгоритм Рабина. В слове A, длина которого равна m, мы ищем образец X
длины n. Вырежем «окошечко» размером n и будем двигать его по
входному слову. Нас интересует, не совпадает ли слово в «окошечке» с
заданным образцом. Сравнивать по буквам долго. Вместо этого фиксируем некоторую
числовую функцию на словах длины n, тогда задача сведется к сравнению чисел,
что, несомненно, быстрее. Если значения этой функции на слове в
«окошечке» и на образце различны, то совпадения нет. Только если
значения одинаковы, необходимо проверять последовательно совпадение по буквам.
Общее время работы есть O(n+m). Данный метод накладывает некоторые ограничения
на текст и искомую строку [2].

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

2.
Описание использованных структур данных

 

.1
Структура для хранения справочника

На практике (в зависимости от требуемой задачи) используются различные
способы представления данных в памяти компьютера: 1) список 2) массив 3)
битовые поля 4) деревья и т.д.

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

Графически структура списка выглядит следующим образом:

Рис. 2.1 Структура двусвязного списка

В программе список реализован в следующем виде:

= ^Abonent; //ссылка на запись абонент

Abonent = record //абонент:AnsiString; // имяабонента:AnsiString;// фамилия:AnsiString; // отчество:LinkTel; //списоктелефоновабонента:AnsiString; // адресабонента:AnsiString;// почта: LinkAbonent; //следующийабонентвспискеабонентов: LinkAbonent; //предыдущий:Integer; //порядковыйномеротображаемогоабонента

show:Integer; //отображается или нет абонент;

Достоинство этой структуры данных, помимо возможности изменять размер, —
это простота реализации. Также, благодаря наличию ссылок, каждый элемент в
списке, в отличие от массива, может занимать разный объем памяти. Адрес первого
элемента в линейном списке однозначно определяется адресом самого
списка.Лёгкость добавления и удаления элементов так же является одним из
достоинств данной структуры.

 

.2
Структура для хранения номеров телефонов

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

Графическое представление данной структуры:

Рис. 2.2 Структура односвязного списка

Структура хранения номеров телефона в программе представлена в следующем
виде:

Telephone = record // телефон: AnsiString; // номертелефона

typeTel: TypeTelephone; //тип телефона (мобильный или домашний ):
LinkTel; // указатель на следующий номер телефона;

Односвязный список оказался наиболее подходящей структурой для хранения
номеров телефона. Эта структура легка в применении и эффективна для данной
задачи.

 

.3
Структура файла телефонной книги

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

3.
Описание процедур и функций

Данная программа состоит из большого числа процедур и функций. Опишем
их.Abonent (SurName, Name, SecondName, Adress, Mail: AnsiString; Tel: LinkTel)
— процедура добавления нового абонента в телефонный справочник.

Входные данные: фамилия, имя, отчество, адрес, почта и номера телефона. В
этой процедуре вызывается процедура Add Abonent.(cur, new: AnsiString): Step —
функция определяющая направление движения при сортировки абонентов в
справочнике. Входные данные: текущий и новый элемент. Возвращает положение
элемента при сортировки.Abonent (Abonent: Link Abonent) — процедура добавления
абонента и сортировки списка абонентов. Входные данные: абонент телефонного
справочника. Из этой процедуры идет вызов функции nextStep.

Add Telephone (TelList: LinkTel; Telephone: AnsiString;
TypeTel: TypeTelephone) — процедура добавления номера
телефона. Входные данные: список телефонов
текущего абонента, новый номер телефона, тип нового номера.(fileName:
AnsiString) — процедура, производящая загрузку или импорт телефонной книги.
Входные данные: телефонная книга.(fileName: AnsiString): Integer — функция
сохранения телефонного справочника. Входные данные: телефонный справочник.() —
процедура освобождения памяти телефонного справочника.(listBox: TListBox) —
процедура отображения списков абонентов.(abonent: LinkAbonent; SG1,SG2:
TStringGrid) — процедура отображения информации об абоненте .Входные данные:
абонент. Из данной процедуры вызывается процедура showAllTel.(telList: LinkTel;
SG: TStringGrid) -процедура отображения телефонов абонента. Входные данные:
список телефонов текущего абонента.(findStr: AnsiString; typeS:TypeSearch) —
процедура, реализующая живой поиск в телефонном справочнике. Входные данные:
искомая подстрока, тип искомого элемента.Telephone Book(): Integer — процедура
создание новой телефонной книги. Функция возвращает единицу, если создан
телефонный справочник.

Иерархия вызова функций имеет следующий вид (рис.3.1):

Рис.3.1
Иерархия вызовов функций

 

4.
Описание структуры приложения и интерфейсапользователя

Программа имеет простой интерфейс для пользователя. Рассмотрим возможные
операции данной программы.

Рис. 4.1 Главное окно программы

Рис. 4.2 Главное окно программы

1. Файл. Позволяет создать новую телефонную книгу, сохранить справочник,
открыть или закрыть телефонный справочник.

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

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

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

.        Отображает данные абонента: фамилию, имя, отчество, адрес,
электронную почту, номера телефонов и тип соответствующего телефона.

.        Выводит данные о каком-либо абоненты на печать.

Для открытия телефонной книге щелкните левой кнопкой мыши на поле «файл»,
выберите необходимое действие «открыть», появится новое окно, предлагающее
выбрать телефонный справочник из ранее сохраненных (рис.7).

Рис. 7 Открытие телефонной книги

Рис. 8. Выводимые данные на печать

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

Рис. 9. Выбор принтера

Приложение имеет модульную структуру. В ее состав входит один модуль,
который состоит из всех процедур и функций программы.

5.
Системные требования и имеющиеся ограничения

Для работы программы требуются персональные компьютеры со следующими
характеристиками:

.   Операционная система: Windows 98/NT/XP/VISTA/7 с установленным.
Память: 108 Кбайт свободного места на жёстком диске. Клавиатура, мышь.

2. Программа не имеет ограничений по количеству записей в телефонную
книгу. Ограничения по объёму записей будет только оперативной памяти.

3. Программа работает с файлами формата *.tlb, созданный данной
программой. Она не предохранена от некорректного ввода данных из файла, поэтому
если файл поврежден, поведение программы при открытии такого файла является
непредвиденным. Программа не требует защиты и может свободно распространяться.

6.
Результаты тестирования приложения

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

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

Результаты теста показаны ниже:

Рис. 6.1 Кол-во перестановок сортировки при 1000 записей

Рис. 6.2 Кол-во перестановок поиска при 1000 записей

Рис. 6.3 Кол-во перестановок сортировки при 5000 записей

Рис. 6.4 Кол-во перестановок сортировки при 5000 записей

7.Анализ
временных характеристик и выводы

Результаты тестирования для десяти различных объемов данных представлены
ниже в таблице и на графиках:

Таблица 1

Зависимость перестановок при сортировке и поиске от объёма

Количество записей

1000

2000

3000

4000

5000

6000

7000

8000

9000

10000

Количество перестановок при сортировке

1309

3031

3088

3971

4726

6543

8159

10447

11085

12705

Количество перестановок при поиске

2000

4000

6044

8020

10086

12091

14110

16109

18130

19901

Рис. 7.1 Зависимость перестановок при сортировки от объёма записей

Рис. 7.2 Зависимость перестановок при поиске от объёма записей

Взглянув на графики, можно убедиться, что как и ожидалось из теории
количество перестановок при сортировки и при поиске линейно растёт от общего
количества записей в телефонной книге. При увеличения объема записей возрастает
количество перестановок.

Рис. 7.3 Зависимость времени работы справочника от объёма входных данных

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

 

Заключение

В соответствии с заданием была разработана программа, имеющая удобный
интерфейс, и предоставляющая возможность создания и редактирования телефонного
справочника и поиск по различным параметрам. В ходе работы были рассмотрены
алгоритм живого поиска, поиска подстроки в строке и сортировка, и проведен
анализ их временной сложности. Задача была реализована в интегрированной среде
разработки Borland Delphi 7.0.

Список
литературы

1. Гагарина
Л.Г. Алгоритмы и структуры данных: учеб. пособие/Л.Г. Гагарина, В.Д. Колдаев. —
М.: , 2009. — 304 с.

2.       Ахо
А. Структуры данных и алгоритмы: учеб. пособие/ А. Ахо, Хопкрофт Д.Э., Ульман
Д.Д.- М.:,2003. — 384с.

3.       Поиск подстроки //
Википедия — свободная энциклопедияURL:
<http://ru.wikipedia.org/wik/Поиск_подстроки>(дата обращения 03.05.2012)

.        Сортировка списка //
Википедия — свободная энциклопедия URL: (дата обращения 28.04.2012)

.        Динамический поиск
// Википедия — свободная энциклопедия URL: <http://ru.wikipedia.org/wik/Динамический_поиск>
(дата обращения 17.05.2012)

телефонный
справочник программа алгоритм

Приложение

 

Текст
программы

unitUnit1;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, Menus, ExtCtrls, StdCtrls, Grids, Buttons, Mask;= class(TForm):
TListBox;: TPanel;: TMainMenu;: TMenuItem;: TPanel;: TStringGrid;:
TStringGrid;: TPanel;: TMenuItem;: TOpenDialog;: TMenuItem;: TMenuItem;:
TPanel;: TButton;: TComboBox;: TButton;: TPanel;: TButton;: TButton;: TButton;:
TButton;: TButton;: TButton;: TEdit;: TRadioGroup;: TBitBtn;: TButton;:
TLabel;: TButton;: TMenuItem;: TSaveDialog;: TMenuItem;: TLabel;: TMaskEdit;:
TMaskEdit;: TComboBox;: TTimer;: TLabel;FormCreate(Sender:
TObject);N2Click(Sender: TObject);N3Click(Sender: TObject);N4Click(Sender:
TObject);ListBox1Click(Sender: TObject);Button1Click(Sender:
TObject);Button5Click(Sender: TObject);Button6Click(Sender:
TObject);Button2Click(Sender: TObject);Button4Click(Sender:
TObject);Button7Click(Sender: TObject);Button3Click(Sender: TObject);Button8Click(Sender:
TObject);Edit2KeyUp(Sender: TObject; var Key: Word;:
TShiftState);RadioGroup1Click(Sender: TObject);BitBtn1Click(Sender:
TObject);Button9Click(Sender: TObject);Button10Click(Sender:
TObject);N5Click(Sender: TObject);N6Click(Sender: TObject);FormClose(Sender:
TObject; var Action: TCloseAction);MaskEdit2Change(Sender:
TObject);MaskEdit1Change(Sender: TObject);ComboBox1Change(Sender:
TObject);ComboBox2Change(Sender: TObject);Timer1Timer(Sender: TObject);

// procedure StringGrid2Click(Sender: TObject);

{ Private declarations }

{ Public declarations };= ^Telephone;= (Mobile, Home);=
(YesSaved, NoSaved);= (Equal,less,more);= (Add, Edit);= (SurName,Name);=
record: AnsiString;: TypeTelephone;

nextTelephone: LinkTel; // указатель на следующий номер телнфона

end;tmas=array [1..10] of
string;:tmas=(‘920’,»,»,»,»,»,»,»,»,»);:tmas=(‘908′,’904′,’950′,’951’,»,»,»,»,»,»);:tmas=(‘910′,’915’,»,»,»,»,»,»,»,»);:tmas=(‘903′,’906′,’960’,»,»,»,»,»,»,»);=
^Abonent; //ссылка на запись абонент=
record //абонент:AnsiString;:AnsiString;:AnsiString;:LinkTel;
//списоктелефоновабонента:AnsiString;:AnsiString;:
LinkAbonent; //следующийобнентвспискеабонентов: LinkAbonent; //предыдущий

index:Integer; //порядковыйномеротображаемогоабонента:Integer;
//отображается или нет абонент

end;: TForm1;:real;

TelephoneBook,curAbonent: LinkAbonent; //ссылка на начало списка

абонентов и на текущий абонент: Saved = YesSaved; //сохранена или нет
тел. книга:AnsiString; //имя файла телефонной книги,editTel:LinkTel; //список
телефонов текущего абонента и ссылка

на редактируемый телефон,telAction:Action; //события: добавлять или
удалять абонента;

добавлять или удалять телефонCreateTelephoneBook():Integer;

procedure (varTelList:LinkTel;Telephone:AnsiString;TypeTel:TypeTele);(SurName,Name,SecondName,Adress,Mail:AnsiString;Tel:Lin);AddAbonent(Abonent:LinkAbonent);openTelBook(fileName:AnsiString);saveTelBook(fileName:AnsiString):Integer;freeMemBook();showListAbonent(listBox:TListBox);showAllTel(telList:LinkTel;SG:TStringGrid);liveSearch(findStr:AnsiString;typeS:TypeSearch);vykl();proverka(mas:tmas;
str:string):boolean;PrintForm, ComCtrls;

{$R
*.dfm}(SurName,Name,SecondName,Adress,Mail:AnsiString;Tel:Lin); //добавлениеновогоабонента:LinkAbonent;(newAbonent);.Name:=Name;.SurName:=SurName;.SecondName:=SecondName;.Adress:=Adress;.Tel:=Tel;.Mail:=Mail;(newAbonent);;nextStep(cur,new:AnsiString):Step;

//направлениедвиженияприсортировкеабонентов:Integer;i:=1 to
Length(cur) doi<=Length(new) then(cur [i]=new [i]) then;cur [i]<new [i]
then:=Less;;:=More;;;:=More;;;;(i-1)=Length(new)
then:=Equal:=Less;;AddAbonent(Abonent:LinkAbonent);

//добавлениеабонентаисортировкаспискаабонентов:LinkAbonent;:Step;TelephoneBook.nextAbonent=nil
then.backAbonent:=TelephoneBook;.nextAbonent:=TelephoneBook.nextAbonent;.nextAbonent:=Abonent;.show:=1;;;.Timer1.Enabled:=true;:=TelephoneBook.nextAbonent;(curAbonent<>nil)
do:=nextStep(curAbonent.SurName,Abonent.SurName);next<>Equal
thennext=Less then(curAbonent.nextAbonent=nil) then;:=curAbonent.nextAbonent;:=curAbonent.backAbonent;;:=nextStep(curAbonent.Name,Abonent.Name);next<>Equal
thennext=Less then(curAbonent.nextAbonent=nil)
then;:=curAbonent.nextAbonent;:=curAbonent.backAbonent;;:=nextStep(curAbonent.SecondName,Abonent.SecondName);(next=Equal)
then(curAbonent.nextAbonent=nil) then;:=curAbonent.nextAbonent;(next=Less)
then(curAbonent.nextAbonent=nil)
then;:=curAbonent.nextAbonent;:=curAbonent.backAbonent;;;;;;.Timer1.Enabled:=false;.backAbonent:=curAbonent;.nextAbonent:=curAbonent.nextAbonent;(curAbonent.nextAbonent<>nil)
then.nextAbonent.backAbonent:=Abonent;.nextAbonent:=Abonent;.nextAbonent.show:=1;;(varTelList:LinkTel;Telephone:AnsiString;TypeTel:TypeTele);
//добавлениетелефона:LinkTel;Telephone=»
then;TelList=nil then(TelList);.telephone:=Telephone;.typeTel:=TypeTel;.nextTelephone:=nil;;;:=TelList;(curTel.nextTelephone<>nil)
do:=curTel.nextTelephone;(curTel.nextTelephone);.nextTelephone.telephone:=Telephone;.nextTelephone.typeTel:=TypeTel;.nextTelephone.nextTelephone:=nil;;openTelBook(fileName:AnsiString);

//загрузкаилиимпорттелефоннойкниги: TextFile;:AnsiString;:
LinkAbonent;:Integer;(fileBook,fileName);(fileBook);not Eof(fileBook)
do(fileBook,buffer);buffer=’$’
then(Abonent);.Tel:=nil;(fileBook,Abonent.SurName);(fileBook,Abonent.Name);(fileBook,Abonent.SecondName);(fileBook,Abonent.Adress);(fileBook,buffer);buffer=’%’
then(fileBook,buffer);:=StrToInt(buffer
[Length(buffer)]);(buffer,Length(buffer)-1,2);(typeT=Integer(Mobile))
then(Abonent.Tel,buffer,Mobile)(Abonent.Tel,buffer,Home);(fileBook,buffer);buffer=’%’;;(fileBook,Abonent.mail);(Abonent);;;(fileBook);;saveTelBook(fileName:AnsiString):Integer;

//сохранениетелефоннойкниги:TextFile;:LinkAbonent;:LinkTel;(fileBook,fileName);(fileBook);:=TelephoneBook.nextAbonent;curAbonent<>nil
do(fileBook,’$’);(fileBook,curAbonent.SurName);(fileBook,curAbonent.Name);(fileBook,curAbonent.SecondName);(fileBook,curAbonent.Adress);:=curAbonent.Tel;curTel<>nil
then(fileBook,’%’);curTel<>nil
do(fileBook,curTel.telephone+’|’+IntTostr(Integer(curTel.TypeTel)));:=curTel.nextTelephone;;(fileBook,’%’);;(fileBook,curAbonent.mail);:=curAbonent.nextAbonent;;(fileBook);:=1;;();
//освобождение памяти
телефонной книги:LinkAbonent;:LinkTel;:=TelephoneBook.nextAbonent;curAb<>nil
docurAb.Tel<>nil do:=curAb.Tel.nextTelephone;(curAb.Tel);.Tel:=nextTel;;.nextAbonent:=curAb.nextAbonent;(curAb);:=TelephoneBook.nextAbonent;;;showListAbonent(listBox:TListBox);

//отображениеспискаабонентов:LinkAbonent;:Integer;:=0;.Clear;:=TelephoneBook.nextAbonent;abonent<>
nil do(abonent.show=1)then.Items.Add(abonent.SurName+’ ‘+abonent.Name+’

‘+abonent.SecondName);.index:=numAb;(numAb);.index:=-1;:=abonent.nextAbonent;;;showAbonent(abonent:LinkAbonent;SG1,SG2:TStringGrid);

//отображениеинформацииобабоненте:LinkTel;SG1
do[1].Clear;[1,0]:=abonent.SurName;[1,1]:=abonent.Name;[1,2]:=abonent.SecondName;[1,3]:=abonent.Adress;[1,4]:=abonent.Mail;;:=abonent.Tel;(tel,SG2);;showAllTel(telList:LinkTel;SG:TStringGrid);

//отображениетелефоновабонента:Integer;:LinkTel;:=0;:=telList;.RowCount:=2;.Rows
[1].Clear;(curTel<>nil)docolTel>0 then.RowCount:=SG.RowCount+1;.Cells
[0,SG.RowCount-1]:=curTel.telephone;(curTel.typeTel=Mobile)then.Cells
[1,SG.RowCount-1]:=’Мобильный’.Cells
[1,SG.RowCount-1]:=’Домашний’;(colTel);:=curTel.nextTelephone;;;liveSearch(findStr:AnsiString;typeS:TypeSearch);
//живойпоиск:LinkAbonent;:AnsiString;,show:Integer;:LinkTel;findStr=»
thenelse:=TelephoneBook.nextAbonent;curAb<>nil dotypeS=SurName
then:=curAb.SurName:=curAb.Tel;tel<>nil
do.show:=0;:=tel.telephone;Length(findTemp)>=Length(findStr) theni:=1 to
Length(findStr) do(findStr [i]<>findTemp [i])
then.show:=0;;;.show:=1;;curAb.show=0
then:=tel.nextTelephonebreak;;:=curAb.nextAbonent;;;(Length(findTemp)<Length(findStr))then.show:=0:=1;i:=1
to Length(findStr) dofindStr [i]<>findTemp [i] then:=0;;;show=0
then.show:=0.show:=1;;:=curAb.nextAbonent;; end;;CreateTelephoneBook():Integer;
//созданиеновойкниги: Integer;save=NoSaved
then:=Application.MessageBox(‘Файлнесохранён.

Сохранитьизменения?’,’Сообщение’,MB_YESNOCANCEL+

MB_ICONINFORMATION);(otvet=IDCANCEL)then:=0;;;(otvet=IDYES)then(fileName);;;(TelephoneBook<>nil)then();(TelephoneBook);.nextAbonent
:= nil;.backAbonent := nil;:=1;;

//——————————————————————————-TForm1.FormCreate(Sender:
TObject);.Cells [0,0]:=’Фамилия’;.Cells [0,1]:=’Имя’;.Cells [0,2]:=’Отчество’;.Cells [0,3]:=’Адрес’;.Cells [0,4]:=’Электроннаяпочта’;.Cells [0,0]:=’Телефон’;.Cells [1,0]:=’Типтелефона’;.Visible:=true;.Visible:=False;;TForm1.N2Click(Sender:
TObject); //созданиеновойкниги;:=»;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Clear;.Cols
[1].Clear;.RowCount:=2;.Rows
[1].Clear;.Text:=»;.ItemIndex:=0;;TForm1.N3Click(Sender: TObject); //открытиекниги:=0;.Enabled:=true;OpenDialog1.Execute
then();:=OpenDialog1.FileName;(fileName);(ListBox1);.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;;.Enabled:=false;.Caption:=FloatToStr(time)+’
msec.’;;TForm1.N4Click(Sender: TObject); //сохранениекниги(fileName=»)thenSaveDialog1.Execute
then:=SaveDialog1.FileName;saveTelBook(fileName)=1
then:=YesSaved;.Enabled:=False;;;TForm1.ListBox1Click(Sender: TObject);

//отображениеинформацииобабоненте:=TelephoneBook.nextAbonent;((curAbonent.index<>ListBox1.ItemIndex)
and (curAbonent<>nil))
:=curAbonent.nextAbonent;(curAbonent,StringGrid1,StringGrid2);;TForm1.Button1Click(Sender:
TObject);

//добавлениеновогоабонента.Enabled:=False;.Visible:=True;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=True;.Cols
[1].Clear;.RowCount:=2;.Cells [0,1]:=»;.Cells
[1,1]:=»;:=Add;:=nil;;TForm1.Button5Click(Sender: TObject);

//сохранениеизмененийданныхабонентаabAction=Add
thenStringGrid1 do(Cells [1,0]<>»)or(Cells [1,1]<>»)or(Cells
[1,2]<>»)then(Cells [1,0],Cells [1,1],Cells [1,2],Cells [1,3],Cells

[1,4],telList).MessageBox(‘Заполните хотя бы одно
из полей:

Фамилия,Имя или

Отчество!’,’Недостаточноданных’,MB_OK+MB_ICONINFORMATION);

exit;;StringGrid1 do.SurName:=Cells [1,0];.Name:=Cells
[1,1];.SecondName:=Cells [1,2];.Adress:=Cells [1,3];.Mail:=Cells
[1,4];;.Tel:=telList;.backAbonent.nextAbonent:=curAbonent.nextAbonent;(curAbonent.nextAbonent<>nil)
then.nextAbonent.backAbonent:=curAbonent.backAbonent;(curAbonent);;.Enabled:=True;.Visible:=False;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=False;.Enabled:=True;.Enabled:=True;.Enabled:=True;(ListBox1);.ItemIndex:=0;Click(Sender);:=NoSaved;.Enabled:=True;;TForm1.Button6Click(Sender:
TObject); //отменаизменений.Enabled:=True;.Visible:=False;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=False;.Enabled:=True;.Enabled:=True;.Enabled:=True;.ItemIndex:=0;Click(Sender);;TForm1.Button2Click(Sender:
TObject); //добавление или

сохранение изменений телефонов абонента.Visible:=False;

Button7.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;(telAction=Add)then(MaskEdit1.Text<>»)or
(MaskEdit2.Text<>») then(ComboBox1.ItemIndex=0)
then(telList,MaskEdit1.Text,Mobile)(telList,MaskEdit2.Text,Home);

//begin(ComboBox1.ItemIndex=0)
then.telephone:=MaskEdit1.Text;.typeTel:=TypeTelephone(ComboBox1.ItemIndex);else.telephone:=MaskEdit2.Text;.typeTel:=TypeTelephone(ComboBox1.ItemIndex);;(telList,StringGrid2);:=NoSaved;.Enabled:=True;;TForm1.Button4Click(Sender:
TObject);

//отменаобавленияилиизменениятелефонаабонента.Visible:=False;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;.Enabled:=True;;TForm1.Button7Click(Sender:
TObject); //добавлениетелефона.Visible:=True;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Text:=»;.Text:=»;;TForm1.Button3Click(Sender:
TObject);

//редактированиеданныхабонента(ListBox1.ItemIndex<0)then.MessageBox(‘Выбиритеабонентадляредактирования!’,’Невыб

ранабонент’,MB_OK+MB_ICONINFORMATION);;;.Enabled:=False;.Visible:=True;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=True;:=curAbonent.Tel;:=Edit;(curAbonent,StringGrid1,StringGrid2);;TForm1.Button8Click(Sender:
TObject);

//редактированиетелефона:Integer;(StringGrid2.Row<1)then.MessageBox(‘Выбиритетелефондляредактирования!’,’Невыб

рантелефон’,MB_OK+MB_ICONINFORMATION);;;(telList=nil)then;StringGrid2.Row<0
then.Row:=0;:=1;:=telList;((index<>StringGrid2.Row) and
(editTel<>nil)) do:=editTel.nextTelephone;(index);;editTel.typeTel=Home
then.Text:=editTel.telephone;.Visible:=false;.Visible:=true;else.Text:=editTel.telephone;.Visible:=false;.Visible:=true;;.ItemIndex:=Integer(editTel.typeTel);:=Edit;.Visible:=True;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;;TForm1.Edit2KeyUp(Sender:
TObject; var Key: Word;

//живойпоиск, отображениесписканайденных:
TShiftState);:=0;.Enabled:=true;(Edit2.Text,TypeSearch(RadioGroup1.ItemIndex));(ListBox1);.Enabled:=false;.Caption:=FloatToStr(time)+’
msec.’;;TForm1.RadioGroup1Click(Sender: TObject);();RadioGroup1.ItemIndex=1
then.Visible:=false;.Visible:=true;.Visible:=false;.Visible:=true;;;TForm1.BitBtn1Click(Sender:
TObject);

//выводнапечатьданныхабонента:LinkTel;ListBox1.ItemIndex<0
then.MessageBox(‘Невыбранабонентдлявыводанапечать’,’Сообще

ние’,MB_OK+MB_ICONINFORMATION);;;Form2.RichEdit1
do;.FirstIndent:=30;.Size:=14;.Alignment:=taCenter;.Add(‘Данныеабонента’);.Alignment:=taLeftJustify;.Add(‘Фамилия — ‘+curAbonent.SurName);.Add(‘Имя — ‘+curAbonent.Name);.Add(‘Отчество — ‘+curAbonent.SecondName);.Add(‘Адрес: ‘+curAbonent.Adress);.Add(‘Почта:
‘+curAbonent.Mail);:=curAbonent.Tel;tel<>nil
then.Alignment:=taCenter;.Add(‘Телефоныабонента’);.Alignment:=taLeftJustify;;tel<>nil
do(tel.typeTel=Mobile)then.Add(‘Мобильный: ‘+tel.telephone).Add(‘Домашний:
‘+tel.telephone);:=tel.nextTelephone;;.Add(»);;.Enabled:=False;.Visible:=True;;TForm1.Button9Click(Sender:
TObject); //удалениеабонента(ListBox1.ItemIndex<0)then.MessageBox(‘Выбиритеабонентадляудаления’,’Невыбранабо

нент’,MB_OK+MB_ICONINFORMATION);;;(Application.MessageBox(‘Выдействительнохотитеудалитьконтакт?’,’У

далениеконтакта’,MB_YESNO+
_ICONINFORMATION)=IDYES)then.backAbonent.nextAbonent:=curAbonent.nextAbonent;curAbonent.nextAbonent<>nil
then.nextAbonent.backAbonent:=curAbonent.backAbonent;(curAbonent);(ListBox1);.ItemIndex:=0;Click(Sender);:=NoSaved;;;TForm1.Button10Click(Sender:
TObject); //удалениетелефона,backTel:LinkTel;:Integer;(StringGrid2.Row<1)then.MessageBox(‘Выбиритетелефондляудаления!’,’Невыбрантел

ефон’,MB_OK+MB_ICONINFORMATION);;;(telList=nil)then;StringGrid2.Row<0
then.Row:=0;

if(Application.MessageBox(‘Выдействительнохотитеудалитьтелефон?’,’У

далениетелефона’,MB_YESNO+
_ICONINFORMATION)=IDYES)then:=1;:=telList;:=nil;((index<>StringGrid2.Row)
and (delTel<>nil))
do:=delTel;:=delTel.nextTelephone;(index);;backTel<>nil
then.nextTelephone:=delTel.nextTelephone;(delTel=telList)then:=nil;(delTel);:=NoSaved;;(telList,StringGrid2);;TForm1.N5Click(Sender:
TObject); //импорткниги(OpenDialog1.Execute)then(OpenDialog1.FileName);(ListBox1);;;TForm1.N6Click(Sender:
TObject); //закрытиекниги;:=»;.Enabled:=False;.Enabled:=False;.Clear;.Cols
[1].Clear;.RowCount:=2;.Rows
[1].Clear;.Text:=»;.ItemIndex:=0;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;.Enabled:=False;:=YesSaved;;TForm1.FormClose(Sender:
TObject; var Action: TCloseAction);;;TForm1.MaskEdit2Change(Sender:
TObject);(ComboBox1.ItemIndex=0)
then.Visible:=true;.Visible:=false;.Visible:=false;.Visible:=true;;;TForm1.MaskEdit1Change(Sender:
TObject);(ComboBox1.ItemIndex=0)
then.Visible:=true;.Visible:=false;.Visible:=false;.Visible:=true;;;TForm1.ComboBox1Change(Sender:
TObject);(ComboBox1.ItemIndex=0)
then.Visible:=true;.Visible:=false;.Visible:=false;.Visible:=true;;;PoiskOperator(findStrAr:tmas);:LinkAbonent;,findStr:AnsiString;,show,j:Integer;:LinkTel;:=TelephoneBook.nextAbonent;curAb<>nil
do:=curAb.Tel;tel<>nil do.show:=0;tel.typeTel=Mobile
then:=tel.telephone;proverka(findStrAr,findTemp) then.show:=1;;curAb.show=0
then:=tel.nextTelephonebreak;.show:=0;:=tel.nextTelephone;;;;:=curAb.nextAbonent;;;;TForm1.ComboBox2Change(Sender:
TObject);:=0;.Enabled:=true;Combobox2.ItemIndex=1
then(beeline)Combobox2.ItemIndex=2 then(megafon)Combobox2.ItemIndex=3
then(mtc)Combobox2.ItemIndex=4 then(tele2);Combobox2.ItemIndex=0
then();(ListBox1);.Enabled:=false;.Caption:=FloatToStr(time)+’
msec.’;;vykl();:LinkAbonent;:=TelephoneBook.nextAbonent;curAb<>nil
do.show:=1;:=curAb.nextAbonent;;;proverka(mas:tmas; str:string):boolean;s:string;:integer;:=false;:=
copy(str,1,3);i:=0 to 9 domas [i]=s then:=true;;;;TForm1.Timer1Timer(Sender:
TObject);:=time+1;;.

Код программы тестирования:;, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,, StdCtrls;= class(TForm): TEdit;: TLabel;:
TButton;Button1Click(Sender: TObject);

{ Private declarations }

{ Public declarations
};Nam():string;Tel():string;Teld():string;tmas=array [1..33] of string;:
TForm1;:integer;:TextFile;:tmas=(‘а’,’б’,’в’,’г’,’д’,’е’,’ё’,’ж’,’з’,’и’,’й’,’к’,’л’,’м’,’н’,’о’,’п’,’р’,’с’,’т’,’у’,’ф’,’х’,’ц’,’

ч’,’ш’,’щ’,’ъ’,’ы’,’ь’,’э’,’ю’,’я’);

{$R *.dfm}TForm1.Button1Click(Sender: TObject);i:integer;
Ne:string;(fileBook,’c:test.tlb’);(fileBook);:=StrToInt(Edit1.Text);:=0;i<n
do(fileBook,’$’);(fileBook,Nam());(fileBook,Nam());(fileBook,Nam());(fileBook,»);(fileBook,’%’);(fileBook,Tel());(fileBook,Teld());(fileBook,’%’);(fileBook,»);(i);;(fileBook);;Nam():string;,k:integer;:string;:=»;i:=1
to 3+random(10) do:=round(random(33));:=s+c [k+1];;:=s;;Tel():string;i:integer;:string;:=1;:=»;i<10
do:=s+IntToStr(random(10));(i);;:=s+’|1′;;Teld():string;i:integer;:string;:=»;:=1;i<10
do:=s+IntToStr(random(10));(i);;:=s+’|0′;

end;.

package lab5; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; //На базе подходящего контейнерного класса разработать класс «Телефонный справочник», который бы содержал // произвольное количество абонентов. Для каждого абонента известна фамилия и один номер телефона. Фамилии // разных абонентов могут быть одинаковыми, номера телефонов — нет. Справочник должен иметь методы поиска // номеров телефонов по фамилии и поиска фамилии по номеру телефона. Базовый контейнерный класс выбрать самостоятельно. // 1. Добавить в класс «Телефонный справочник» методы сохранения справочника в файле и загрузки справочника из файла. // 2. Добавить возможность пополнения справочника новыми абонентами с клавиатуры. //Класс Phonebook реализует базу данный «Телефонный справочник» //БД постоена на основе контейнера HashMap<String, String> //в качестве ключа используется номер телефона в виде строку, а в качестве значения — фамилия //класс включает в себя метод main который запускает работу с БД //также включены методы //addPB — добавляет запись по заданным номеру телефона и фамилии //delPB — удаляет запись по номеру телефона //savePB — сохраняет БД в текстовом файле phone.txt //loadPB — загружает БД из текстового файла phone.txt //PrintPhonebook — выводит на екран все записи БД //FindSurname — производит поиск фамилии по номеру телефона //FindNumberPhone — производит поиск списка номеров по фамилии public class Phonebook { private static HashMap<String, String> pb = new HashMap<String, String>(); //addPB — добавляет запись по заданным номеру телефона и фамилии private static void addPB(String phone, String name) { pb.put(phone, name); } //delPB — удаляет запись по номеру телефона private static void delPB(String phone) { pb.remove(phone); } //savePB — сохраняет БД в текстовом файле phone.txt private static void savePB() throws IOException { BufferedWriter writer = new BufferedWriter(new FileWriter(new File(«phone.txt»))); for(Map.Entry<String,String> k: pb.entrySet()){ writer.write(k.getKey() + » « + k.getValue()+System.lineSeparator()); } writer.close(); } //loadPB — загружает БД из текстового файла phone.txt //производит проверку на наличие файла public static void loadPB() throws IOException { File file = new File(«phone.txt»); if (file.exists()){ BufferedReader reader = new BufferedReader(new FileReader(new File(«phone.txt»))); String act; while ((act=reader.readLine())!=null) { String[] dat = act.split(» «); pb.put(dat[0], dat[1]); } reader.close(); } } //PrintPhonebook — выводит на екран все записи БД public static void PrintPhonebook(){ System.out.println(«Телефонный справочник: «); for(Map.Entry<String,String> k: pb.entrySet()){ System.out.println(k.getValue()+«: «+ k.getKey()); } } //FindSurname — производит поиск фамилии по номеру телефона заданому в качестве аргумента //возвращает строку public static String FindSurname(String number){ String result = pb.get(number); if (result == null) return «абонент с таким номером не найдей»; return result; } //FindNumberPhone — производит поиск списка номеров по фамилии заданой в качестве аргумента //возвращает массив строк public static String[] FindNumberPhone(String surname){ List <String> result = new ArrayList<String>(); for (Map.Entry entry : pb.entrySet()) { if (surname.equalsIgnoreCase((String)entry.getValue())){ result.add((String)entry.getKey()); } } if (result.size() == 0) result.add(«абонент с такой фамилией не найден»); return result.toArray(new String[0]); } public static void main(String[] args) throws IOException { //переменная описывает вызываемое действие String act; //загрузка БД loadPB(); //вывод записей на екран PrintPhonebook(); //вывод на екран описания возможных действий с указанием команд System.out.println(«выбор действия: (add)добавить данные, (del)удалить данные, (num) найти номера по фамилии, (sur)найти фамилию, « + «(save)сохранить, (exit)выход»); BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); act = bf.readLine(); while(!act.equals(«exit»)){ //добавление записи if(act.equals(«add»)){ System.out.println(«Введите фамилию:»); String name = bf.readLine(); System.out.println(«Введите телефон:»); String phone = bf.readLine(); addPB(phone, name); }else{ //удаление записи if(act.equals(«del»)){ System.out.println(«Введите телефон:»); String phone = bf.readLine(); delPB(phone); }else{ //поиск номеров по фамилии if (act.equals(«num»)){ System.out.println(«Введите фамилию:»); String surname = bf.readLine(); String[] numbers = FindNumberPhone(surname); for (String number : numbers) { System.out.println(number); } } else { //поиск фамилии по номеру if (act.equals(«sur»)) { System.out.println(«Введите номер:»); String number = bf.readLine(); System.out.println(FindSurname(number)); } else { //сохранение БД в файл if(act.equals(«save»)){ savePB(); } } } } } //запрос на следующее действие System.out.println(«выбор действия: (add)добавить данные, (del)удалить данные, (num) найти номера по фамилии, (sur)найти фамилию, (save)сохранить, (exit)выход»); act=bf.readLine(); } } }

Условие задачи

У Вас в наличии есть телефонный справочник с информацией о номерах телефонов и адресов абонентов.

Требуется реализовать эффективную структуру данных, реализующую поиск информации об абонентах по номерам телефонов.

Входные данные
Первая строка входного файла INPUT.TXT содержит два натуральных числа N и M (N,M ≤ 30 000) – количество абонентов и количество запросов по номеру телефона соответственно.

Далее в 3∙N строках следует содержание телефонного справочника, где информация о каждом из абонентов занимает 3 строки и имеет вид:

<номер телефона>

<фамилия> <имя> <отчество>

<улица> <дом>-<квартира>

Где «номер телефона» – целое число, состоящее из 6 цифр. Здесь «дом» и «квартира» – натуральные числа, не превосходящие 100. Все строки во входных данных состоят не более, чем из 50 символов.

Далее следует M строк с информацией о номерах телефонов абонентов, информацию о которых необходимо получить. Гарантируется, что все номера телефонов присутствуют в телефонном справочнике.

Выходные данные
В выходной файл OUTPUT.TXT для каждого номера телефона в запросе выведите информацию об абоненте в следующем формате:

<фамилия> <имя> <отчество> (<улица> <дом>-<квартира>)


#include<iostream>
#include<string>
using namespace std;
struct abon{ int nom; string fio; string adr;
};
void Quick(abon a[],int n){
if(n<2)return;
int L=0,R=n-1,m=a[n/2].nom;
do{while(a[L].nom<m)L++; while(a[R].nom>m)R--;
if(L<=R){swap(a[L],a[R]);L++;R--;}
}while(L<=R);
Quick(a,R+1); Quick(a+L,n-L);
}
main(){
abon a[30000]; int n,m,i,k,j,L,R;string c;
cin>>n>>m;
for (i=0;i<n;++i){
cin>>a[i].nom;
getline(cin,c);
getline(cin,a[i].fio);
getline(cin,a[i].adr);
}
Quick(a,n);
for(j=0;j<m;++j){
cin>>k;
L=0; R=n;
do{ i=(L+R)/2;
if(a[i].nom>k)R=i; else L=i;
}while(a[i].nom!=k);
cout<<a[i].fio<<" ("<<a[i].adr<<')'<<endl;
}

}

Условия задач взяты с сайта acmp.ru

166. Разработать программу, которая вводит в массив записей информацию о студентах учебной группы: фамилию и дату рождения. Организовать поиск информации о студенте, фамилия которого вводится с клавиатуры

167. Составить программу, выводящую на экран список книг домашней библиотеки (автор, название книги, издательство, год издания, стоимость). Провести поиск по автору книги.

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

169. Создать каталог из книг и журналов. Выдавать информацию о материалах каталога, год издания которых позже года, введенного с клавиатуры.

170. Вывести на экран фамилии студентов, чей балл выше среднего по группе.

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

172. Составить программу, выводящую на экран «Телефонный справочник» (Ф.И.О., адрес, номер телефона). Произвести поиск по ФИО – выдать адрес и телефон.

Это тоже интересно:

  • Сосо павлиашвили номер телефона
  • Сосногорск црб регистратура номер телефона
  • Сосногорск рано номер телефона
  • Сосногорск почта маяковского номер телефона
  • Сосногорск номер телефона полиции

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии