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

Создание программы "Телефонный справочник": загрузка телефонной книги; разработка алгоритмов добавления, редактирования, удаления записи; поиск по различным параметрам, вывод данных на печать. Интерфейс пользователя, системные требования и ограничения.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 24.09.2012
Размер файла 1,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Размещено на http://www.allbest.ru/

  • Содержание
  • Техническое задание
  • Введение
  • 1. Теоретический материал
  • 2. Описание использованных структур данных
    • 2.1 Структура для хранения справочника
    • 2.2 Структура для хранения номеров телефонов
    • 2.3 Структура файла телефонной книги
  • 3. Описание процедур и функций
  • 4. Описание структуры приложения и интерфейса пользователя
  • 5. Системные требования и имеющиеся ограничения
  • 6. Результаты тестирования приложения
  • 7. Анализ временных характеристик и выводы
  • Заключение
  • Список литературы
  • Приложение. Текст программы

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

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

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

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

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

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

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

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

Введение

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

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

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

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

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

Размещено на http://www.allbest.ru/

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

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

Размещено на http://www.allbest.ru/

Рис 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. Описание использованных структур данных

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

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

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

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

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

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

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

Abonent = record //абонент

Name:AnsiString; // имяабонента

SurName:AnsiString;// фамилия

SecondName:AnsiString; // отчество

Tel:LinkTel; //списоктелефоновабонента

Adress:AnsiString; // адресабонента

Mail:AnsiString;// почта

nextAbonent: LinkAbonent; //следующийабонентвспискеабонентов

backAbonent: LinkAbonent; //предыдущий

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

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

end;

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

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

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

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

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

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

Telephone = record // телефон

telephone: AnsiString; // номертелефона

typeTel: TypeTelephone; //тип телефона (мобильный или домашний )

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

end;

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

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

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

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

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

New Abonent (SurName, Name, SecondName, Adress, Mail: AnsiString; Tel: LinkTel) - процедура добавления нового абонента в телефонный справочник.

Входные данные: фамилия, имя, отчество, адрес, почта и номера телефона. В этой процедуре вызывается процедура Add Abonent.

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

Add Abonent (Abonent: Link Abonent) - процедура добавления абонента и сортировки списка абонентов. Входные данные: абонент телефонного справочника. Из этой процедуры идет вызов функции nextStep.

Add Telephone (TelList: LinkTel; Telephone: AnsiString; TypeTel: TypeTelephone) - процедура добавления номера телефона. Входные данные: список телефонов текущего абонента, новый номер телефона, тип нового номера.

openTelBook (fileName: AnsiString) - процедура, производящая загрузку или импорт телефонной книги. Входные данные: телефонная книга.

saveTelBook (fileName: AnsiString): Integer - функция сохранения телефонного справочника. Входные данные: телефонный справочник.

freeMemBook () - процедура освобождения памяти телефонного справочника.

showListAbonent (listBox: TListBox) - процедура отображения списков абонентов.

showAbonent (abonent: LinkAbonent; SG1,SG2: TStringGrid) - процедура отображения информации об абоненте .Входные данные: абонент. Из данной процедуры вызывается процедура showAllTel.

showAllTel (telList: LinkTel; SG: TStringGrid) -процедура отображения телефонов абонента. Входные данные: список телефонов текущего абонента.

liveSearch (findStr: AnsiString; typeS:TypeSearch) - процедура, реализующая живой поиск в телефонном справочнике. Входные данные: искомая подстрока, тип искомого элемента.

Create Telephone Book(): Integer - процедура создание новой телефонной книги. Функция возвращает единицу, если создан телефонный справочник.

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

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

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

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

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

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

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

2. В данном окне выводится абоненты занесенные в телефонную книгу.

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

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

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

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

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

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

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

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

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

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

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

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

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

1. Операционная система: 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)

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

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

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

Приложение

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

unitUnit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Menus, ExtCtrls, StdCtrls, Grids, Buttons, Mask;

type

TForm1 = class(TForm)

ListBox1: TListBox;

Panel1: TPanel;

MainMenu1: TMainMenu;

N1: TMenuItem;

Panel3: TPanel;

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

Panel2: TPanel;

N2: TMenuItem;

OpenDialog1: TOpenDialog;

N3: TMenuItem;

N4: TMenuItem;

Panel4: TPanel;

Button1: TButton;

ComboBox1: TComboBox;

Button2: TButton;

Panel5: TPanel;

Button3: TButton;

Button4: TButton;

Button5: TButton;

Button6: TButton;

Button7: TButton;

Button8: TButton;

Edit2: TEdit;

RadioGroup1: TRadioGroup;

BitBtn1: TBitBtn;

Button9: TButton;

Label2: TLabel;

Button10: TButton;

N5: TMenuItem;

SaveDialog1: TSaveDialog;

N6: TMenuItem;

Label1: TLabel;

MaskEdit1: TMaskEdit;

MaskEdit2: TMaskEdit;

ComboBox2: TComboBox;

Timer1: TTimer;

Label3: TLabel;

procedure FormCreate(Sender: TObject);

procedure N2Click(Sender: TObject);

procedure N3Click(Sender: TObject);

procedure N4Click(Sender: TObject);

procedure ListBox1Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

procedure Edit2KeyUp(Sender: TObject; var Key: Word;

Shift: TShiftState);

procedure RadioGroup1Click(Sender: TObject);

procedure BitBtn1Click(Sender: TObject);

procedure Button9Click(Sender: TObject);

procedure Button10Click(Sender: TObject);

procedure N5Click(Sender: TObject);

procedure N6Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure MaskEdit2Change(Sender: TObject);

procedure MaskEdit1Change(Sender: TObject);

procedure ComboBox1Change(Sender: TObject);

procedure ComboBox2Change(Sender: TObject);

procedure Timer1Timer(Sender: TObject);

// procedure StringGrid2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

type

LinkTel = ^Telephone;

TypeTelephone = (Mobile, Home);

Saved = (YesSaved, NoSaved);

Step = (Equal,less,more);

Action = (Add, Edit);

TypeSearch = (SurName,Name);

Telephone = record

telephone: AnsiString;

typeTel: TypeTelephone;

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

end;

type tmas=array [1..10] of string;

constmegafon:tmas=('920','','','','','','','','','');

tele2:tmas=('908','904','950','951','','','','','','');

mtc:tmas=('910','915','','','','','','','','');

beeline:tmas=('903','906','960','','','','','','','');

type

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

Abonent = record //абонент

Name:AnsiString;

SurName:AnsiString;

SecondName:AnsiString;

Tel:LinkTel; //списоктелефоновабонента

Adress:AnsiString;

Mail:AnsiString;

nextAbonent: LinkAbonent; //следующийобнентвспискеабонентов

backAbonent: LinkAbonent; //предыдущий

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

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

end;

var

Form1: TForm1;

time:real;

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

абонентов и на текущий абонент

save: Saved = YesSaved; //сохранена или нет тел. книга

fileName:AnsiString; //имя файла телефонной книги

telList,editTel:LinkTel; //список телефонов текущего абонента и ссылка

на редактируемый телефон

abAction,telAction:Action; //события: добавлять или удалять абонента;

добавлять или удалять телефон

function CreateTelephoneBook():Integer;

procedure

AddTelephone(varTelList:LinkTel;Telephone:AnsiString;TypeTel:TypeTele

phone);

procedure

NewAbonent(SurName,Name,SecondName,Adress,Mail:AnsiString;Tel:Lin

kTel);

procedure AddAbonent(Abonent:LinkAbonent);

procedure openTelBook(fileName:AnsiString);

function saveTelBook(fileName:AnsiString):Integer;

procedure freeMemBook();

procedure showListAbonent(listBox:TListBox);

procedure showAllTel(telList:LinkTel;SG:TStringGrid);

procedure liveSearch(findStr:AnsiString;typeS:TypeSearch);

procedure vykl();

function proverka(mas:tmas; str:string):boolean;

implementation

uses PrintForm, ComCtrls;

{$R *.dfm}

procedure

NewAbonent(SurName,Name,SecondName,Adress,Mail:AnsiString;Tel:Lin

kTel); //добавлениеновогоабонента

var

newAbonent:LinkAbonent;

begin

New(newAbonent);

newAbonent.Name:=Name;

newAbonent.SurName:=SurName;

newAbonent.SecondName:=SecondName;

newAbonent.Adress:=Adress;

newAbonent.Tel:=Tel;

newAbonent.Mail:=Mail;

AddAbonent(newAbonent);

end;

function nextStep(cur,new:AnsiString):Step;

//направлениедвиженияприсортировкеабонентов

var

i:Integer;

begin

for i:=1 to Length(cur) do

begin

if i<=Length(new) then

begin

if(cur [i]=new [i]) then

Continue;

if cur [i]<new [i] then

begin

Result:=Less;

exit;

end

else

begin

Result:=More;

exit;

end;

end

else

begin

Result:=More;

exit;

end;

end;

if (i-1)=Length(new) then

Result:=Equal

else

Result:=Less;

end;

procedure AddAbonent(Abonent:LinkAbonent);

//добавлениеабонентаисортировкаспискаабонентов

var

curAbonent:LinkAbonent;

next:Step;

begin

if TelephoneBook.nextAbonent=nil then

begin

Abonent.backAbonent:=TelephoneBook;

Abonent.nextAbonent:=TelephoneBook.nextAbonent;

TelephoneBook.nextAbonent:=Abonent;

Abonent.show:=1;

exit;

end;

Form1.Timer1.Enabled:=true;

curAbonent:=TelephoneBook.nextAbonent;

while (curAbonent<>nil) do

begin

next:=nextStep(curAbonent.SurName,Abonent.SurName);

if next<>Equal then

if next=Less then

begin

if(curAbonent.nextAbonent=nil) then

break;

curAbonent:=curAbonent.nextAbonent;

end

else

begin

curAbonent:=curAbonent.backAbonent;

break;

end

else

begin

next:=nextStep(curAbonent.Name,Abonent.Name);

if next<>Equal then

if next=Less then

begin

if(curAbonent.nextAbonent=nil) then

break;

curAbonent:=curAbonent.nextAbonent;

end

else

begin

curAbonent:=curAbonent.backAbonent;

break;

end

else

begin

next:=nextStep(curAbonent.SecondName,Abonent.SecondName);

if(next=Equal) then

begin

if(curAbonent.nextAbonent=nil) then

break;

curAbonent:=curAbonent.nextAbonent;

end

else

if (next=Less) then

begin

if(curAbonent.nextAbonent=nil) then

break;

curAbonent:=curAbonent.nextAbonent;

end

else

begin

curAbonent:=curAbonent.backAbonent;

break;

end;

end;

end;

end;

Form1.Timer1.Enabled:=false;

Abonent.backAbonent:=curAbonent;

Abonent.nextAbonent:=curAbonent.nextAbonent;

if(curAbonent.nextAbonent<>nil) then

curAbonent.nextAbonent.backAbonent:=Abonent;

curAbonent.nextAbonent:=Abonent;

curAbonent.nextAbonent.show:=1;

end;

procedure

AddTelephone(varTelList:LinkTel;Telephone:AnsiString;TypeTel:TypeTele

phone); //добавлениетелефона

var

curTel:LinkTel;

begin

if Telephone='' then

exit;

if TelList=nil then

begin

New(TelList);

TelList.telephone:=Telephone;

TelList.typeTel:=TypeTel;

TelList.nextTelephone:=nil;

exit;

end;

curTel:=TelList;

while(curTel.nextTelephone<>nil) do

curTel:=curTel.nextTelephone;

New(curTel.nextTelephone);

curTel.nextTelephone.telephone:=Telephone;

curTel.nextTelephone.typeTel:=TypeTel;

curTel.nextTelephone.nextTelephone:=nil;

end;

procedure openTelBook(fileName:AnsiString);

//загрузкаилиимпорттелефоннойкниги

var

fileBook: TextFile;

buffer:AnsiString;

Abonent: LinkAbonent;

typeT:Integer;

begin

AssignFile(fileBook,fileName);

Reset(fileBook);

while not Eof(fileBook) do

begin

Readln(fileBook,buffer);

if buffer='$' then

begin

New(Abonent);

Abonent.Tel:=nil;

Readln(fileBook,Abonent.SurName);

Readln(fileBook,Abonent.Name);

Readln(fileBook,Abonent.SecondName);

Readln(fileBook,Abonent.Adress);

Readln(fileBook,buffer);

if buffer='%' then

begin

Readln(fileBook,buffer);

repeat

typeT:=StrToInt(buffer [Length(buffer)]);

Delete(buffer,Length(buffer)-1,2);

if(typeT=Integer(Mobile)) then

AddTelephone(Abonent.Tel,buffer,Mobile)

else

AddTelephone(Abonent.Tel,buffer,Home);

Readln(fileBook,buffer);

until buffer='%';

end;

Readln(fileBook,Abonent.mail);

AddAbonent(Abonent);

end;

end;

CloseFile(fileBook);

end;

function saveTelBook(fileName:AnsiString):Integer;

//сохранениетелефоннойкниги

var

fileBook:TextFile;

curAbonent:LinkAbonent;

curTel:LinkTel;

begin

AssignFile(fileBook,fileName);

Rewrite(fileBook);

curAbonent:=TelephoneBook.nextAbonent;

while curAbonent<>nil do

begin

Writeln(fileBook,'$');

Writeln(fileBook,curAbonent.SurName);

Writeln(fileBook,curAbonent.Name);

Writeln(fileBook,curAbonent.SecondName);

Writeln(fileBook,curAbonent.Adress);

curTel:=curAbonent.Tel;

if curTel<>nil then

begin

Writeln(fileBook,'%');

while curTel<>nil do

begin

Writeln(fileBook,curTel.telephone+'|'+IntTostr(Integer(curTel.TypeTel)));

curTel:=curTel.nextTelephone;

end;

Writeln(fileBook,'%');

end;

Writeln(fileBook,curAbonent.mail);

curAbonent:=curAbonent.nextAbonent;

end;

CloseFile(fileBook);

Result:=1;

end;

procedurefreeMemBook(); //освобождение памяти телефонной книги

var

curAb:LinkAbonent;

nextTel:LinkTel;

begin

curAb:=TelephoneBook.nextAbonent;

while curAb<>nil do

begin

while curAb.Tel<>nil do

begin

nextTel:=curAb.Tel.nextTelephone;

Dispose(curAb.Tel);

curAb.Tel:=nextTel;

end;

TelephoneBook.nextAbonent:=curAb.nextAbonent;

Dispose(curAb);

curAb:=TelephoneBook.nextAbonent;

end;

end;

procedure showListAbonent(listBox:TListBox);

//отображениеспискаабонентов

var

abonent:LinkAbonent;

numAb:Integer;

begin

numAb:=0;

listBox.Clear;

abonent:=TelephoneBook.nextAbonent;

while abonent<> nil do

begin

if(abonent.show=1)then

begin

listBox.Items.Add(abonent.SurName+' '+abonent.Name+'

'+abonent.SecondName);

abonent.index:=numAb;

Inc(numAb);

end

else

abonent.index:=-1;

abonent:=abonent.nextAbonent;

end;

end;

procedure showAbonent(abonent:LinkAbonent;SG1,SG2:TStringGrid);

//отображениеинформацииобабоненте

var

tel:LinkTel;

begin

with SG1 do

begin

Cols [1].Clear;

Cells [1,0]:=abonent.SurName;

Cells [1,1]:=abonent.Name;

Cells [1,2]:=abonent.SecondName;

Cells [1,3]:=abonent.Adress;

Cells [1,4]:=abonent.Mail;

end;

tel:=abonent.Tel;

showAllTel(tel,SG2);

end;

procedure showAllTel(telList:LinkTel;SG:TStringGrid);

//отображениетелефоновабонента

var

colTel:Integer;

curTel:LinkTel;

begin

colTel:=0;

curTel:=telList;

SG.RowCount:=2;

SG.Rows [1].Clear;

while(curTel<>nil)do

begin

if colTel>0 then

SG.RowCount:=SG.RowCount+1;

SG.Cells [0,SG.RowCount-1]:=curTel.telephone;

if(curTel.typeTel=Mobile)then

SG.Cells [1,SG.RowCount-1]:='Мобильный'

else

SG.Cells [1,SG.RowCount-1]:='Домашний';

Inc(colTel);

curTel:=curTel.nextTelephone;

end;

end;

procedure liveSearch(findStr:AnsiString;typeS:TypeSearch); //живойпоиск

var

curAb:LinkAbonent;

findTemp:AnsiString;

i,show:Integer;

tel:LinkTel;

begin

if findStr='' then

vykl else

begin

curAb:=TelephoneBook.nextAbonent;

while curAb<>nil do

begin

if typeS=SurName then

findTemp:=curAb.SurName

else

begin

tel:=curAb.Tel;

while tel<>nil do

begin

curAb.show:=0;

findTemp:=tel.telephone;

if Length(findTemp)>=Length(findStr) then

for i:=1 to Length(findStr) do

begin

if (findStr [i]<>findTemp [i]) then

begin

curAb.show:=0;

break;

end;

curAb.show:=1;

end;

if curAb.show=0 then

tel:=tel.nextTelephone

else break;

end;

curAb:=curAb.nextAbonent;

Continue;

end;

if(Length(findTemp)<Length(findStr))then

curAb.show:=0

else

begin

show:=1;

for i:=1 to Length(findStr) do

if findStr [i]<>findTemp [i] then

begin

show:=0;

break;

end;

if show=0 then

curAb.show:=0

else

curAb.show:=1;

end;

curAb:=curAb.nextAbonent;

end; end;

end;

function CreateTelephoneBook():Integer; //созданиеновойкниги

var

otvet: Integer;

begin

if save=NoSaved then

begin

otvet:=Application.MessageBox('Файлнесохранён.

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

MB_ICONINFORMATION);

if(otvet=IDCANCEL)then

begin

Result:=0;

exit;

end;

if(otvet=IDYES)then

begin

saveTelBook(fileName);

end;

end;

if(TelephoneBook<>nil)then

freeMemBook();

New(TelephoneBook);

TelephoneBook.nextAbonent := nil;

TelephoneBook.backAbonent := nil;

Result:=1;

end;

//-------------------------------------------------------------------------------

procedure TForm1.FormCreate(Sender: TObject);

begin

StringGrid1.Cells [0,0]:='Фамилия';

StringGrid1.Cells [0,1]:='Имя';

StringGrid1.Cells [0,2]:='Отчество';

StringGrid1.Cells [0,3]:='Адрес';

StringGrid1.Cells [0,4]:='Электроннаяпочта';

StringGrid2.Cells [0,0]:='Телефон';

StringGrid2.Cells [1,0]:='Типтелефона';

MaskEdit1.Visible:=true;

MaskEdit2.Visible:=False;

end;

procedure TForm1.N2Click(Sender: TObject); //созданиеновойкниги

begin

CreateTelephoneBook;

fileName:='';

ListBox1.Enabled:=True;

Button1.Enabled:=True;

Button3.Enabled:=True;

Button9.Enabled:=True;

BitBtn1.Enabled:=True;

Edit2.Enabled:=True;

RadioGroup1.Enabled:=True;

N5.Enabled:=True;

ListBox1.Clear;

StringGrid1.Cols [1].Clear;

StringGrid2.RowCount:=2;

StringGrid2.Rows [1].Clear;

Edit2.Text:='';

RadioGroup1.ItemIndex:=0;

end;

procedure TForm1.N3Click(Sender: TObject); //открытиекниги

begin

time:=0;

Timer1.Enabled:=true;

if OpenDialog1.Execute then

begin

CreateTelephoneBook();

fileName:=OpenDialog1.FileName;

openTelBook(fileName);

showListAbonent(ListBox1);

ListBox1.Enabled:=True;

Button1.Enabled:=True;

Button3.Enabled:=True;

Button9.Enabled:=True;

BitBtn1.Enabled:=True;

Edit2.Enabled:=True;

RadioGroup1.Enabled:=True;

N5.Enabled:=True;

end;

Timer1.Enabled:=false;

Label3.Caption:=FloatToStr(time)+' msec.';

end;

procedure TForm1.N4Click(Sender: TObject); //сохранениекниги

begin

if(fileName='')then

if SaveDialog1.Execute then

fileName:=SaveDialog1.FileName

else

exit;

if saveTelBook(fileName)=1 then

begin

save:=YesSaved;

N4.Enabled:=False;

end;

end;

procedure TForm1.ListBox1Click(Sender: TObject);

//отображениеинформацииобабоненте

begin

curAbonent:=TelephoneBook.nextAbonent;

while ((curAbonent.index<>ListBox1.ItemIndex) and (curAbonent<>nil))

do

curAbonent:=curAbonent.nextAbonent;

showAbonent(curAbonent,StringGrid1,StringGrid2);

end;

procedure TForm1.Button1Click(Sender: TObject);

//добавлениеновогоабонента

begin

N1.Enabled:=False;

Panel5.Visible:=True;

Button1.Enabled:=False;

Button3.Enabled:=False;

Button9.Enabled:=False;

BitBtn1.Enabled:=False;

ListBox1.Enabled:=False;

Edit2.Enabled:=False;

RadioGroup1.Enabled:=False;

StringGrid1.Enabled:=True;

StringGrid1.Cols [1].Clear;

StringGrid2.RowCount:=2;

StringGrid2.Cells [0,1]:='';

StringGrid2.Cells [1,1]:='';

abAction:=Add;

telList:=nil;

end;

procedure TForm1.Button5Click(Sender: TObject);

//сохранениеизмененийданныхабонента

begin

if abAction=Add then

with StringGrid1 do

begin

if (Cells [1,0]<>'')or(Cells [1,1]<>'')or(Cells [1,2]<>'')then

NewAbonent(Cells [1,0],Cells [1,1],Cells [1,2],Cells [1,3],Cells

[1,4],telList)

else

begin

Application.MessageBox('Заполните хотя бы одно из полей:

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

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

exit;

end;

end

else

begin

with StringGrid1 do

begin

curAbonent.SurName:=Cells [1,0];

curAbonent.Name:=Cells [1,1];

curAbonent.SecondName:=Cells [1,2];

curAbonent.Adress:=Cells [1,3];

curAbonent.Mail:=Cells [1,4];

end;

curAbonent.Tel:=telList;

curAbonent.backAbonent.nextAbonent:=curAbonent.nextAbonent;

if(curAbonent.nextAbonent<>nil) then

curAbonent.nextAbonent.backAbonent:=curAbonent.backAbonent;

AddAbonent(curAbonent);

end;

N1.Enabled:=True;

Panel5.Visible:=False;

Button1.Enabled:=True;

Button3.Enabled:=True;

Button9.Enabled:=True;

ListBox1.Enabled:=True;

StringGrid1.Enabled:=False;

Edit2.Enabled:=True;

RadioGroup1.Enabled:=True;

BitBtn1.Enabled:=True;

showListAbonent(ListBox1);

ListBox1.ItemIndex:=0;

ListBox1Click(Sender);

save:=NoSaved;

N4.Enabled:=True;

end;

procedure TForm1.Button6Click(Sender: TObject); //отменаизменений

begin

N1.Enabled:=True;

Panel5.Visible:=False;

Button1.Enabled:=True;

Button3.Enabled:=True;

Button9.Enabled:=True;

ListBox1.Enabled:=True;

StringGrid1.Enabled:=False;

Edit2.Enabled:=True;

RadioGroup1.Enabled:=True;

BitBtn1.Enabled:=True;

ListBox1.ItemIndex:=0;

ListBox1Click(Sender);

end;

procedure TForm1.Button2Click(Sender: TObject); //добавление или

сохранение изменений телефонов абонента

begin

Panel4.Visible:=False;

Button7.Enabled:=True;

Button6.Enabled:=True;

Button5.Enabled:=True;

Button8.Enabled:=True;

Button10.Enabled:=True;

StringGrid1.Enabled:=True;

if(telAction=Add)then

begin

if(MaskEdit1.Text<>'')or (MaskEdit2.Text<>'') then

if(ComboBox1.ItemIndex=0) then

AddTelephone(telList,MaskEdit1.Text,Mobile)

else

AddTelephone(telList,MaskEdit2.Text,Home);

end

else

//begin

if(ComboBox1.ItemIndex=0) then

begin

editTel.telephone:=MaskEdit1.Text;

editTel.typeTel:=TypeTelephone(ComboBox1.ItemIndex);

end else

begin

editTel.telephone:=MaskEdit2.Text;

editTel.typeTel:=TypeTelephone(ComboBox1.ItemIndex);

end;

showAllTel(telList,StringGrid2);

save:=NoSaved;

N4.Enabled:=True;

end;

procedure TForm1.Button4Click(Sender: TObject);

//отменаобавленияилиизменениятелефонаабонента

begin

Panel4.Visible:=False;

Button7.Enabled:=True;

Button6.Enabled:=True;

Button5.Enabled:=True;

Button8.Enabled:=True;

Button10.Enabled:=True;

StringGrid1.Enabled:=True;

end;

procedure TForm1.Button7Click(Sender: TObject); //добавлениетелефона

begin

Panel4.Visible:=True;

Button7.Enabled:=False;

Button5.Enabled:=False;

Button6.Enabled:=False;

Button8.Enabled:=False;

Button10.Enabled:=False;

StringGrid1.Enabled:=False;

MaskEdit1.Text:='';

MaskEdit2.Text:='';

end;

procedure TForm1.Button3Click(Sender: TObject);

//редактированиеданныхабонента

begin

if(ListBox1.ItemIndex<0)then

begin

Application.MessageBox('Выбиритеабонентадляредактирования!','Невыб

ранабонент',MB_OK+MB_ICONINFORMATION);

exit;

end;

N1.Enabled:=False;

Panel5.Visible:=True;

Button1.Enabled:=False;

Button3.Enabled:=False;

Button9.Enabled:=False;

BitBtn1.Enabled:=False;

ListBox1.Enabled:=False;

Edit2.Enabled:=False;

RadioGroup1.Enabled:=False;

StringGrid1.Enabled:=True;

telList:=curAbonent.Tel;

abAction:=Edit;

showAbonent(curAbonent,StringGrid1,StringGrid2);

end;

procedure TForm1.Button8Click(Sender: TObject);

//редактированиетелефона

var

index:Integer;

begin

if(StringGrid2.Row<1)then

begin

Application.MessageBox('Выбиритетелефондляредактирования!','Невыб

рантелефон',MB_OK+MB_ICONINFORMATION);

exit;

end;

if(telList=nil)then

exit;

if StringGrid2.Row<0 then

StringGrid2.Row:=0;

index:=1;

editTel:=telList;

while ((index<>StringGrid2.Row) and (editTel<>nil)) do

begin

editTel:=editTel.nextTelephone;

Inc(index);

end;

if editTel.typeTel=Home then

begin

MaskEdit2.Text:=editTel.telephone;

MaskEdit1.Visible:=false;

MaskEdit2.Visible:=true;

end else

begin

MaskEdit1.Text:=editTel.telephone;

MaskEdit2.Visible:=false;

MaskEdit1.Visible:=true;

end;

ComboBox1.ItemIndex:=Integer(editTel.typeTel);

telAction:=Edit;

Panel4.Visible:=True;

Button7.Enabled:=False;

Button5.Enabled:=False;

Button6.Enabled:=False;

Button8.Enabled:=False;

Button10.Enabled:=False;

StringGrid1.Enabled:=False;

end;

procedure TForm1.Edit2KeyUp(Sender: TObject; var Key: Word;

//живойпоиск, отображениесписканайденных

Shift: TShiftState);

begin

time:=0;

Timer1.Enabled:=true;

liveSearch(Edit2.Text,TypeSearch(RadioGroup1.ItemIndex));

showListAbonent(ListBox1);

Timer1.Enabled:=false;

label3.Caption:=FloatToStr(time)+' msec.';

end;

procedure TForm1.RadioGroup1Click(Sender: TObject);

begin

vykl();

if RadioGroup1.ItemIndex=1 then

begin

Edit2.Visible:=false;

ComboBox2.Visible:=true;

end

else

begin

ComboBox2.Visible:=false;

Edit2.Visible:=true;

end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);

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

var

tel:LinkTel;

begin

if ListBox1.ItemIndex<0 then

begin

Application.MessageBox('Невыбранабонентдлявыводанапечать','Сообще

ние',MB_OK+MB_ICONINFORMATION);

exit;

end;

with Form2.RichEdit1 do

begin

Clear;

Paragraph.FirstIndent:=30;

Font.Size:=14;

Paragraph.Alignment:=taCenter;

Lines.Add('Данныеабонента');

Paragraph.Alignment:=taLeftJustify;

Lines.Add('Фамилия - '+curAbonent.SurName);

Lines.Add('Имя - '+curAbonent.Name);

Lines.Add('Отчество - '+curAbonent.SecondName);

Lines.Add('Адрес: '+curAbonent.Adress);

Lines.Add('Почта: '+curAbonent.Mail);

tel:=curAbonent.Tel;

if tel<>nil then

begin

Paragraph.Alignment:=taCenter;

Lines.Add('Телефоныабонента');

Paragraph.Alignment:=taLeftJustify;

end;

while tel<>nil do

begin

if(tel.typeTel=Mobile)then

Lines.Add('Мобильный: '+tel.telephone)

else

Lines.Add('Домашний: '+tel.telephone);

tel:=tel.nextTelephone;

end;

Lines.Add('');

end;

Form1.Enabled:=False;

Form2.Visible:=True;

end;

procedure TForm1.Button9Click(Sender: TObject); //удалениеабонента

begin

if(ListBox1.ItemIndex<0)then

begin

Application.MessageBox('Выбиритеабонентадляудаления','Невыбранабо

нент',MB_OK+MB_ICONINFORMATION);

exit;

end;

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

далениеконтакта',MB_YESNO+

MB_ICONINFORMATION)=IDYES)then

begin

curAbonent.backAbonent.nextAbonent:=curAbonent.nextAbonent;

if curAbonent.nextAbonent<>nil then

curAbonent.nextAbonent.backAbonent:=curAbonent.backAbonent;

Dispose(curAbonent);

showListAbonent(ListBox1);

ListBox1.ItemIndex:=0;

ListBox1Click(Sender);

save:=NoSaved;

end;

end;

procedure TForm1.Button10Click(Sender: TObject); //удалениетелефона

var

delTel,backTel:LinkTel;

index:Integer;

begin

if(StringGrid2.Row<1)then

begin

Application.MessageBox('Выбиритетелефондляудаления!','Невыбрантел

ефон',MB_OK+MB_ICONINFORMATION);

exit;

end;

if(telList=nil)then

exit;

if StringGrid2.Row<0 then

StringGrid2.Row:=0;

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

далениетелефона',MB_YESNO+

MB_ICONINFORMATION)=IDYES)then

begin

index:=1;

delTel:=telList;

backTel:=nil;

while ((index<>StringGrid2.Row) and (delTel<>nil)) do

begin

backTel:=delTel;

delTel:=delTel.nextTelephone;

Inc(index);

end;

if backTel<>nil then

backTel.nextTelephone:=delTel.nextTelephone;

if(delTel=telList)then

telList:=nil;

Dispose(delTel);

save:=NoSaved;

end;

showAllTel(telList,StringGrid2);

end;

procedure TForm1.N5Click(Sender: TObject); //импорткниги

begin

if(OpenDialog1.Execute)then

begin

openTelBook(OpenDialog1.FileName);

showListAbonent(ListBox1);

end;

end;

procedure TForm1.N6Click(Sender: TObject); //закрытиекниги

begin

CreateTelephoneBook;

fileName:='';

N4.Enabled:=False;

N5.Enabled:=False;

ListBox1.Clear;

StringGrid1.Cols [1].Clear;

StringGrid2.RowCount:=2;

StringGrid2.Rows [1].Clear;

Edit2.Text:='';

RadioGroup1.ItemIndex:=0;

ListBox1.Enabled:=False;

Button1.Enabled:=False;

Button3.Enabled:=False;

Button9.Enabled:=False;

BitBtn1.Enabled:=False;

Edit2.Enabled:=False;

RadioGroup1.Enabled:=False;

save:=YesSaved;

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

CreateTelephoneBook;

end;

procedure TForm1.MaskEdit2Change(Sender: TObject);

begin

if(ComboBox1.ItemIndex=0) then

begin

MaskEdit1.Visible:=true;

MaskEdit2.Visible:=false;

end

else

begin

MaskEdit1.Visible:=false;

MaskEdit2.Visible:=true;

end;

end;

procedure TForm1.MaskEdit1Change(Sender: TObject);

begin

if(ComboBox1.ItemIndex=0) then

begin

MaskEdit1.Visible:=true;

MaskEdit2.Visible:=false;

end

else

begin

MaskEdit1.Visible:=false;

MaskEdit2.Visible:=true;

end;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);

begin

if(ComboBox1.ItemIndex=0) then

begin

MaskEdit1.Visible:=true;

MaskEdit2.Visible:=false;

end

else

begin

MaskEdit1.Visible:=false;

MaskEdit2.Visible:=true;

end;

end;

procedure PoiskOperator(findStrAr:tmas);

varcurAb:LinkAbonent;

findTemp,findStr:AnsiString;

i,show,j:Integer;

tel:LinkTel;

begin

curAb:=TelephoneBook.nextAbonent;

while curAb<>nil do

begin

tel:=curAb.Tel;

while tel<>nil do

begin

curAb.show:=0;

if tel.typeTel=Mobile then

begin

findTemp:=tel.telephone;

if proverka(findStrAr,findTemp) then

begin

curAb.show:=1;

break;

end

else

if curAb.show=0 then

tel:=tel.nextTelephone

else break;

end

else

begin

curAb.show:=0;

tel:=tel.nextTelephone;

Continue;

end;

end;

curAb:=curAb.nextAbonent;

Continue;

end;

end;

procedure TForm1.ComboBox2Change(Sender: TObject);

begin

time:=0;

Timer1.Enabled:=true;

if Combobox2.ItemIndex=1 then

PoiskOperator(beeline)

else

if Combobox2.ItemIndex=2 then

PoiskOperator(megafon)

else

if Combobox2.ItemIndex=3 then

PoiskOperator(mtc)

else

if Combobox2.ItemIndex=4 then

PoiskOperator(tele2);

if Combobox2.ItemIndex=0 then

vykl();

showListAbonent(ListBox1);

Timer1.Enabled:=false;

Label3.Caption:=FloatToStr(time)+' msec.';

end;

procedure vykl();

varcurAb:LinkAbonent;

begin

curAb:=TelephoneBook.nextAbonent;

while curAb<>nil do

begin

curAb.show:=1;

curAb:=curAb.nextAbonent;

end;

end;

function proverka(mas:tmas; str:string):boolean;

var s:string;

i:integer;

begin

proverka:=false;

s:= copy(str,1,3);

for i:=0 to 9 do

if mas [i]=s then

begin

proverka:=true;

break;

end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

time:=time+1;

end;

end.

Код программы тестирования:

unitUnit1;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Edit1: TEdit;

Label1: TLabel;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

function Nam():string;

function Tel():string;

function Teld():string;

type tmas=array [1..33] of string;

var

Form1: TForm1;

n:integer;

fileBook:TextFile;

const

c:tmas=('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','

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

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var i:integer; Ne:string;

begin

AssignFile(fileBook,'c:\test.tlb');

Rewrite(fileBook);

n:=StrToInt(Edit1.Text);

i:=0;

while i<n do

begin

Writeln(fileBook,'$');

Writeln(fileBook,Nam());

Writeln(fileBook,Nam());

Writeln(fileBook,Nam());

Writeln(fileBook,'');

Writeln(fileBook,'%');

Writeln(fileBook,Tel());

Writeln(fileBook,Teld());

Writeln(fileBook,'%');

Writeln(fileBook,'');

inc(i);

end;

CloseFile(fileBook);

end;

function Nam():string;

vari,k:integer;

s:string;

begin

s:='';

for i:=1 to 3+random(10) do

begin

k:=round(random(33));

s:=s+c [k+1];

end;

Nam:=s;

end;

function Tel():string;

var i:integer;

s:string;

begin

i:=1;

s:='';

while i<10 do

begin

s:=s+IntToStr(random(10));

inc(i);

end;

Tel:=s+'|1';

end;

function Teld():string;

var i:integer;

s:string;

begin

s:='';

i:=1;

while i<10 do

begin

s:=s+IntToStr(random(10));

inc(i);

end;

Teld:=s+'|0';

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Использование электронно-вычислительной техники для сбора, накопления, обработки и передачи информации. Разработка программы "Телефонный справочник" на Паскале: ввод и редактирование теста программы, трансляция и отладка. Блок-схема, листинг программы.

    контрольная работа [61,2 K], добавлен 26.06.2010

  • Проектирование информационной системы "телефонный справочник поликлиники". Программирование на стороне сервера SQL. Типы данных полей таблиц. Создание домена в интернет с использованием утилиты IBExpert. Разработка бизнес-логики на стороне SQL-сервера.

    курсовая работа [2,7 M], добавлен 02.05.2014

  • Разработка компьютерной программы - автоматического телефонного спавочника. Описание алгоритма программы. Описание последовательности действия при составлении и редактировании базы данных. Основные операторы и группы операторов. Анализ программы.

    курсовая работа [21,7 K], добавлен 29.10.2008

  • Разработка эскизного и технического проектов программы, приложения "Телефонный справочник". Организация входных и выходных данных. Выбор состава технических средств. Интегрированная среда разработки Delphi 7. Разработка рабочего проекта, внедрение.

    курсовая работа [427,4 K], добавлен 21.07.2012

  • Характеристика работы Алтайского филиала телекоммуникаций "Сибирьтелеком". Разработка программы для автоматизации работы телефонного справочника. Основные функции программного продукта: хранение, обработка, ввод и редактирование информации об абонентах.

    дипломная работа [6,0 M], добавлен 07.06.2012

  • Разработка программы на языке программирования C++ с функциями считывания словаря в начале работы программы из текстового файла и записи словаря в файл перед завершением работы. Основные элементы программного продукта: данные абонента телефонной сети.

    контрольная работа [12,9 K], добавлен 07.04.2015

  • Описание этапов разработки программы "Справочник покупателя" в среде Turbo Pascal, которая может быть использована, как обычными покупателями, так и организациями. Проектирование интерфейса программы, запросов пользователя, руководства по использованию.

    курсовая работа [237,8 K], добавлен 11.01.2011

  • История развития справочников/баз данных. Основные параметры, необходимые для создания справочника по предприятию. Разработка интерфейса программы в среде CSharp. Детальный просмотр функций программы. Системные требования к ПК и руководство пользователя.

    курсовая работа [3,2 M], добавлен 11.04.2012

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

    курсовая работа [641,7 K], добавлен 17.08.2013

  • Разработка программы для поиска нужных сведений в телефонном справочнике с использованием языка программирования Borland C++, в качестве базы данных которого используется файл (base.txt). Реализация функции сортировки по фамилии в форматах (А-я) и (Я-а).

    курсовая работа [261,8 K], добавлен 22.08.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.