Институт вычислительной математики и информационных технологий
Отчет по семестровому заданию №1 по СД.
Выполнил студент 3 курса:
Тимофеев К.П.
Проверил:
Салимов Ф.И.
Казань 2011.
Содержание.
Постановка задачи………………………………………………………………………………………………………………….3
Обоснование СД …………………………………………………………………………………………………………………….4
Структура проекта и его описание….……………………………………………………………………………………..5
Листинг……………..…………………………………………………………………………………………………………………….8
Постановка задачи.
Телефонная станция отслеживает связи между абонентами в виде списка, содержащего номера телефонов, соединенных в данный момент разговором. В качестве дополнительных компонент выступает время (число) начала разговора, время конца разговора и дата разговора. Завершившиеся разговоры переходят в архивный список. Программа должна содержать следующие процедуры:
– кодирования: создание списка
– декодирования: на текущий момент времени вывод значений элементов списка в текстовый файл
– Удаление списка с освобождением выделенной динамической памяти;
– вставки элемента в список: вставки нового элемента в список(с учетом занят ли в этот момент один из абонентов);
– удаления элемента из списка: удаление элемента из списка;
– Сформировать список абонентов, которые превысили лимит времени разговора
– Выбирая исходные значения из файла изменить список по вновь поступившим звонкам, а по завершившимся звонкам сформировать архивный список
– По архивному списку найти абонента, максимально часто занимающего телефонную линию
Обоснование СД.
Для реализации этой задачи нам необходимо использовать довольно узкоспециализированные средства. То есть операции, которые зависят от положения элемента в некотором множестве, такие как вставка определенного элемента, удаление определенного элемента, добавление значения в элемент, отбор элементов по некоторому признаку и т.д. Поэтому наиболее удобное решение - это использовать линейные двусвязные списки. С одной стороны в данном типе заданий можно было бы обойтись и односвязным линейным списком, но с другой стороны использование двусвязного списка дает определенные преимущества. По двусвязному списку можно передвигаться в любом направлении — как к началу, так и к концу. В таком списке проще производить удаление и перестановку элементов, т.к. всегда известны адреса тех элементов списка, указатели которых направлены на изменяемый элемент. Также двунаправленный список более гибкий, и позволяет расширить при необходимости функционал реализации данной задачи.
Структура проекта и его описание.
Проект состоит из двух.h файлов (Unit.h, Iist.h), а также из четырёх.cpp файлов (Телеф.cpp, IistR.cpp, Project 0.1.cpp, Unit1.cpp).
Описание модуля list.h:
Файл содержит описание структуры, состоящей из тринадцати полей: три имеют тип string (NumberPhone1, NumberPhone2, Date) т.к. с ними не проводится арифметических операций; два имеют тип int (TimeStart, TimeEnd), они складываются и вычитаются в процессе работы программы;
восемь имеют тип указателя на объекты класса List (left, right, head, headA, headN, tail, tailA, tailN)
private:
string NumberPhone1;// хранит имя первого абонента
string NumberPhone2;// хранит имя второго абонента
int TimeStart;// время начала разговора
int TimeEnd;// время конца разговора
string Date;// хранит дату разговора
List *left;// указатель на левый элемент
List *right;// указатель на правый элемент
List *head;// указатель на начало основного списка
List *tail;// указатель на конец основного списка
List *headA;// указатель на начало архивного списка
List *tailA;// указатель на конец архивного списка
List *headN;// указатель на начало списка нарушителей
List *tailN;// указатель на конец списка нарушителей
Данный класс обладает public методами, которые нужны для записи/получения данных полей:
public:
List(); // конструтор
~List(); // деструктор
// set, get реализация
void SetNumberPhone1(string x); // меняет значение NumberPhone1 на x
string GetNumberPhone1(); // берём значение NumberPhone1
void SetNumberPhone2(string x); // меняет значение NumberPhone2 на x
string GetNumberPhone2(); // берём значение NumberPhone2
void SetTimeStart(int s); // меняет значение TimeStart на s
int GetTimeStart(); // берём значение TimeStart
void SetTimeEnd(int s); // меняет значение TimeEnd на s
int GetTimeEnd(); // берём значение TimeEnd
void SetDate(string x); // меняет значение Date на x
string GetDate(); // берём значение Date[]
void SetLeft(List *x); // меняет значение указателя left
List* GetLeft(); // берём указатель left
void SetRight(List *x); // меняет значение указателя right
List* GetRight(); // берём указатель right
void SetHead(List *x); // меняет значение указателя head
List* GetHead(); // берём указатель head
void SetTail(List *x); // меняет значение указателя tail
List* GetTail(); // берём указатель tail
void SetHeadA(List *x); // меняет значение указателя headA
List* GetHeadA(); // берём указатель headA
void SetTailA(List *x); // меняет значение указателя tailA
List* GetTailA(); // берём указатель tailA
void SetHeadN(List *x); // меняет значение указателя headN
List* GetHeadN(); // берём указатель headN
void SetTailN(List *x); // меняет значение указателя tailN
List* GetTailN(); // берём указатель tailN
Кроме этих методов файл содержит public методы необходимые для решения самой задачи
public:
List CreateList(List *U); // создание списка
void Output(List *y); // выведение текущего значения списка
void OutputA(List *y); // выведение текущего значения списка архива
void OutputN(List *y); // выведение текущего значения списка нарушителей
List DestroyerList(List *x); // удаление списка
List DestroyerListA(List *x); // удаление списка архива
List DestroyerListN(List *x); // удаление списка нарушителей
List InsertElementL(List *x); // вставка элемента в список
List RemoveElementL(List *x); // удаление элемента из списка
List ListExcess(List *x);
// создаёт список абонентов, превысивших лимит времени
List СhangeAndArchive(List *x);
/* изменение списка по новым данным и сохранение
старого списка, абонент прекращает разговор только
когда превысит лимит времени */
void SearchMaxInArchive(List *x);
/* поиск абонента в архиве, разговаривающего
чаще остальных */
Описание модуля Unit1.h:
Этот модуль содержит средства IDE C++ Builder для работы с инструментарием текущей задачи.
А именно элементы типа TForm, TButton, TEdit, TLabel, TMemo.
Работа с Form1
Кнопка «CreateList» при нажатии создаёт основной список, но до этого необходимо ввести данные в поле с именем «InputData», после нажатия клавиши «Enter» они считаются и будут готовы для создания списка. Данные для ввода должны иметь такой вид:
896006 - первый абонент
896003 - второй абонент
70 - время начала разговора
120 - время конца разговора
08.10.2012 - дата разговора
08.10.2012
08.10.2012
Без пробелов между элементами каждого разговора.
Кнопки «Output Head, Output HeadA, Output HeadN» выводят списки: основной «Head», архивный «HeadA», список нарушителей «HeadN» в поля с их именами.
Кнопки «DestroyerList Head, DestroyerList HeadA, DestroyerList HeadN» удаляют списки: основной, архивный, список нарушите
Кнопка «InsertElementL Head» при нажатии вставляет элемент в основной список, но до этого необходимо ввести данные в поле с именем «InsertElementLHead», после нажатия клавиши «Enter» они считаются и будут готовы для вставки. Данные имеют вид:
08.10.2012
Кнопка «SearchMaxInArchive HeadA» выведет абонента в поле с именем «SearchMaxInArchive HeadA», который находится в архивном списке и разговаривал чаще остальных.
В поле с именем «InputData2» вводятся новые даны, после нажатия клавиши «Enter» они считаются в файл.
В поле с именем «СhangeAndArchive Head» вводится лимит времени, после нажатия клавиши «Enter»
это значение считывается и создаётся архивный список. Перед этим необходимо построить основной список и ввести данные в поле «InputData2».
В поле с именем «RemoveElementL Head» вводятся номер абонента, которого нужно удалит из основного списка, после нажатия клавиши «Enter» абонент удалиться.
В поле «ListExcess Head» вводятся лимит времени, после нажатия клавиши «Enter» считываются лимит и создаётся список нарушителей в основном списке.
В поле «Сomments» пишутся комментарии еслипользователь делает что- то не правитьно.
Листинг.
list.h:
#include <fstream>
#include <string>
using namespace std;
class List {
private:
string NumberPhone1;// хранит имя первого абонента
string NumberPhone2;// хранит имя второго абонента
int TimeStart;// время начала разговора
int TimeEnd;// время конца разговора
string Date;// хранит дату разговора
List *left;// указатель на левый элемент
List *right;// указатель на правый элемент
List *head;// указатель на начало основного списка
List *tail;// указатель на конец основного списка
List *headA;// указатель на начало архивного списка
List *tailA;// указатель на конец архивного списка
List *headN;// указатель на начало списка нарушителей
List *tailN;// указатель на конец списка нарушителей
public:
List(); // конструтор
~List(); // деструктор
// set, get реализация
void SetNumberPhone1(string x); // меняет значение NumberPhone1 на x
string GetNumberPhone1(); // берём значение NumberPhone1
void SetNumberPhone2(string x); // меняет значение NumberPhone2 на x
string GetNumberPhone2(); // берём значение NumberPhone2
void SetTimeStart(int s); // меняет значение TimeStart на s
int GetTimeStart(); // берём значение TimeStart
void SetTimeEnd(int s); // меняет значение TimeEnd на s
int GetTimeEnd(); // берём значение TimeEnd
void SetDate(string x); // меняет значение Date на x
string GetDate(); // берём значение Date[]
void SetLeft(List *x); // меняет значение указателя left
List* GetLeft(); // берём указатель left
void SetRight(List *x); // меняет значение указателя right
List* GetRight(); // берём указатель right
void SetHead(List *x); // меняет значение указателя head
List* GetHead(); // берём указатель head
void SetTail(List *x); // меняет значение указателя tail
List* GetTail(); // берём указатель tail
void SetHeadA(List *x); // меняет значение указателя headA
List* GetHeadA(); // берём указатель headA
void SetTailA(List *x); // меняет значение указателя tailA
List* GetTailA(); // берём указатель tailA
void SetHeadN(List *x); // меняет значение указателя headN
List* GetHeadN(); // берём указатель headN
void SetTailN(List *x); // меняет значение указателя tailN
List* GetTailN(); // берём указатель tailN
List CreateList(List *U); // создание списка
void Output(List *y); // выведение текущего значения списка
void OutputA(List *y); // выведение текущего значения списка архива
void OutputN(List *y); // выведение текущего значения списка нарушителей
List DestroyerList(List *x); // удаление списка
List DestroyerListA(List *x); // удаление списка архива
List DestroyerListN(List *x); // удаление списка нарушителей
List InsertElementL(List *x); // вставка элемента в список
List RemoveElementL(List *x); // удаление элемента из списка
List ListExcess(List *x);
// создание списка абонентов, превысивших лимит времени
List СhangeAndArchive(List *x);
/* изменение списка по новым данным и сохранение
старого списка, абонент прекращает разговор только
когда превысит лимит времени */
void SearchMaxInArchive(List *x);
/* поиск абонента в архиве, разговаривающего
чаще остальных */
};
listR.cpp: #include "list.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
List::List()// конструктор
{
NumberPhone1 = "0";
NumberPhone2 = "0";
TimeStart = 0;
TimeEnd = 0;
Date = "0";
left = NULL;
right = NULL;
head = NULL; // начало спика абонентов, которые разговаривают
tail = NULL; // конец спика абонентов, которые разговаривают
headA = NULL; // начало архивного спика
tailA = NULL; // конец архивного спика
headN = NULL; // начало спика абонентов, привысивших лимит разговора
tailN = NULL; // конец спика абонентов, привысивших лимит разговора
}
List::~List()// деструктор
{
cout << "Element spiska List ydalen" << '\n';
}
void List::SetNumberPhone1(string x) // меняет значение NumberPhone1 на x
{
this->NumberPhone1 = x;
}
string List::GetNumberPhone1() // берём значение NumberPhone1
{
return this->NumberPhone1;
}
void List::SetNumberPhone2(string x) // меняет значение NumberPhone2 на x
{
this->NumberPhone2 = x;
}
string List::GetNumberPhone2() // берём значение NumberPhone2
{
return this->NumberPhone2;
}
void List::SetTimeStart(int s) // меняет значение TimeStart на s
{
this->TimeStart = s;
}
int List::GetTimeStart() // берём значение TimeStart
{
return this->TimeStart;
}
void List::SetTimeEnd(int s) // меняет значение TimeEnd на s
{
this->TimeEnd = s;
}
int List::GetTimeEnd() // берём значение TimeEnd
{
return this->TimeEnd;
}
void List::SetDate(string x) // меняет значение Date[] на x[]
{
this->Date = x;
}
string List::GetDate() // берём значение Date[]
{
return this->Date;
}
void List::SetLeft(List *x) // меняем указатель на объект слева
{
this->left = x;
}
List* List::GetLeft() //берём указатель на объект слева
{
return this->left;
}
void List::SetRight(List *x) // меняем указатель на объект справа
{
this->right = x;
}
List* List::GetRight() //берём указатель на объект справа
{
return this->right;
}
void List::SetHead(List *x) //меняем указатель на начало основного списка
{
this->head = x;
}
List* List::GetHead() //берём указатель на начало основного списка
{
return this->head;
}
void List::SetTail(List *x)//меняем указатель на конец основного списка
{
this->tail = x;
}
List* List::GetTail()//берём указатель на конец основного списк
{
return this->tail;
}
void List::SetHeadA(List *x)//меняем указатель на начало архивного списка
{
this->headA = x;
}
List* List::GetHeadA()//берём указатель на конец архивного списка
{
return this->headA;
}
void List::SetTailA(List *x)//меняем указатель на конец архивного списка
{
this->tailA = x;
}
List* List::GetTailA()//берём указатель на конец архивного списка
{
return this->tailA;
}
void List::SetHeadN(List *x)//меняем указатель на начало списка нарушителей
{
this->headN = x;
}
List* List::GetHeadN()//берём указатель на конец списка нарушителей
{
return this->headN;
}
void List::SetTailN(List *x)//меняем указатель на конец списка нарушителей
{
this->tailN = x;
}
List* List::GetTailN()//берём указатель на конец списка нарушителей
{
return this->tailN;
}
List List::CreateList(List *U) // создание списка
{
List *Head, *p = new List(), k = List(),*e;
k = *U;
k.SetHead(p);
string str;
ifstream read("InputData.txt");
getline(read, str);
while (!read.eof())
{
getline(read, str); // считываем построчно
p->SetNumberPhone1(str);
getline(read, str);
p->SetNumberPhone2(str);
getline(read, str);
p->SetTimeStart(atoi(str.c_str()));
getline(read, str);
p->SetTimeEnd(atoi(str.c_str()));
getline(read, str);
p->SetDate(str);
List *l2 = new List();
p->SetRight(l2);
l2->SetLeft(p);
p = l2;
}
k.SetTail(p);
p=k.GetTail()->GetLeft();
e=k.GetTail()->GetLeft()->GetLeft();
e->SetRight(k.GetTail());
k.GetTail()->SetLeft(e);
delete p;
read.close();
// болванка завершает список под указателем p
return k;
}
void List::Output(List *U) // выведение текущего значения списка
{
List *p, k = List();
k = *U;
p = k.GetHead();
if(p->GetNumberPhone1()=="0")
{
ofstream write("Comments.txt");
write << "spisok Head pystoi" << '\n';
write.close();
}
if (p == NULL) {
ofstream write("OutputData.txt");
write << "spiska net" << '\n';
write.close();
}
else {
ofstream write("OutputData.txt");
while (p->GetRight()!= NULL) {
write << p->GetNumberPhone1() << '\n';
write << p->GetNumberPhone2() << '\n';
write << p->GetTimeStart() << '\n';
write << p->GetTimeEnd() << '\n';
write << p->GetDate() << '\n';
p = p->GetRight();
}
write.close();
}
}
void List::OutputA(List *U) // выведение текущего значения списка архива
{
List *p, k = List();
k = *U;
p = k.GetHeadA();
if (p == NULL) {
ofstream write("OutputDataA.txt");
write << "spiska net" << '\n';
write.close();
}
else {
ofstream write("OutputDataA.txt");
while (p->GetRight()!= NULL) {
write << p->GetNumberPhone1() << '\n';
write << p->GetNumberPhone2() << '\n';
write << p->GetTimeStart() << '\n';
write << p->GetTimeEnd() << '\n';
write << p->GetDate() << '\n';
p = p->GetRight();
}
write.close();
}
}
void List::OutputN(List *U) // выведение текущего значения списка нарушителей
{
List *p, k = List();
k = *U;
p = k.GetHeadN();
if (p == NULL) {
ofstream write("OutputDataN.txt");
write << "spiska net" << '\n';
write.close();
}
else {
ofstream write("OutputDataN.txt");
while (p->GetRight()!= NULL) {
write << p->GetNumberPhone1() << '\n';
write << p->GetNumberPhone2() << '\n';
write << p->GetTimeStart() << '\n';
write << p->GetTimeEnd() << '\n';
write << p->GetDate() << '\n';
p = p->GetRight();
}
write.close();
}
}
List List::DestroyerList(List *U) // удаление списка
{
List *l1, *l2;
List k = List();
k = *U;
l1 = k.GetHead();
if (l1!= NULL) {
l2 = l1->GetRight();
while (l1->GetRight()!= NULL) {
delete l1;
l1 = l2;
if (l1->GetRight()!= NULL)
l2 = l1->GetRight();
}
}
else {
ofstream write("Comments.txt");
write << "spisok pyst, ydoliat nechego" << '\n';
write.close();
}
delete l1;
k.SetHead(NULL);
k.SetTail(NULL);
return k;
}
List List::DestroyerListA(List *U) // удаление списка архива
{
List *l1, *l2;
List k = List();
k = *U;
l1 = k.GetHeadA();
if (l1!= NULL) {
l2 = l1->GetRight();
while (l1->GetRight()!= NULL) {
delete l1;
l1 = l2;
if (l1->GetRight()!= NULL)
l2 = l1->GetRight();
}
}
else {
ofstream write("Comments.txt");
write << "spisok pyst, ydoliat nechego" << '\n';
write.close();
}
delete l1;
k.SetHeadA(NULL);
k.SetTailA(NULL);
return k;
}
List List::DestroyerListN(List *U) // удаление списка нарушителей
{
List *l1, *l2;
List k = List();
k = *U;
l1 = k.GetHeadN();
if (l1!= NULL) {
l2 = l1->GetRight();
while (l1->GetRight()!= NULL) {
delete l1;
l1 = l2;
if (l1->GetRight()!= NULL)
l2 = l1->GetRight();
}
}
else {
ofstream write("Comments.txt");
write << "spisok pyst, ydoliat nechego" << '\n';
write.close();
}
delete l1;
k.SetHeadN(NULL);
k.SetTailN(NULL);
return k;
}
List List::InsertElementL(List *U) // вставка элемента в список
{
bool flag = true;
int x;
List k = List();
k = *U;
List* e = new List;
List *p;
string str;
ifstream read("ItemToInsert.txt");
getline(read, str);
getline(read, str); // считываем построчно
e->SetNumberPhone1(str);
getline(read, str);
e->SetNumberPhone2(str);
getline(read, str);
e->SetTimeStart(atoi(str.c_str()));
getline(read, str);
e->SetTimeEnd(atoi(str.c_str()));
getline(read, str);
e->SetDate(str);
read.close();
p = k.GetHead();
if (p == NULL) {
p = e;
List *l = new List();
p->SetRight(l);
l->SetLeft(p);
k.SetHead(p);
}
else {
if (p->GetNumberPhone1() == "0") {
e->SetRight(p);
p->SetLeft(e);
k.SetHead(e);
}
else {
while ((p->GetRight()!= NULL) && (flag)) {
if ((e->GetNumberPhone1() == p->GetNumberPhone1()) ||
(e->GetNumberPhone1() == p->GetNumberPhone2())) {
flag = false;
ofstream write("Comments.txt", ios::app);
write << "abonent " + e->GetNumberPhone1() +
" zaniat" << '\n';
write.close();
}
if ((e->GetNumberPhone2() == p->GetNumberPhone1()) ||
(e->GetNumberPhone2() == p->GetNumberPhone2())) {
flag = false;
ofstream write("Comments.txt", ios::app);
write << "abonent " + e->GetNumberPhone1() +
" zaniat" << '\n';
write.close();
}
p = p->GetRight();
}
if (flag) {
p = k.GetHead()->GetRight();
k.GetHead()->SetRight(e);
e->SetLeft(k.GetHead());
e->SetRight(p);
p->SetLeft(e);
cout << "element b spiske" << '\n';
}
}
}
return k;
}
List List::RemoveElementL(List *U) // удаление элемента из списка
{
List k = List();
k = *U;
int i = 0;
string str;
bool flag = true;
List *p, *l, *r;
p = k.GetHead();
if (p == NULL) {
ofstream write("Comments.txt");
write << "spisok pyst, ydoliat nechego" << '\n';
write.close();
}
else {
ifstream read("ItemToDelete.txt");
getline(read, str);
while ((p->GetRight()!= NULL) && (flag)) {
if ((p->GetNumberPhone1() == str) || (p->GetNumberPhone2() == str))
flag = false;
else
p = p->GetRight();
i++;
}
if (flag)
cout << "Element ne naiden";
else {
if (i == 1) {
p = k.GetHead();
k.SetHead(k.GetHead()->GetRight());
k.GetHead()->SetLeft(NULL);
delete p;
}
else {
p->GetLeft()->SetRight(p->GetRight());
p->GetRight()->SetLeft(p->GetLeft());
delete p;
}
}
}
return k;
}
List List::ListExcess(List *U)
// создание списка абонентов, превысивших лимит времени
{
List k = List();
k = *U;
string str;
List *p, *e, *f = new List();
k.SetHeadN(f);
int lim;
ifstream read1("Limit.txt");
getline(read1, str);
lim = atoi(str.c_str());
read1.close();
bool flag;
p = k.GetHead();
while (p->GetRight()!= NULL) {
flag = true;
if (p->TimeEnd - p->TimeStart < lim + 1) {
p = p->GetRight();
}
else {
f->SetNumberPhone1(p->GetNumberPhone1());
f->SetNumberPhone2(p->GetNumberPhone2());
f->SetTimeStart(p->GetTimeStart());
f->SetTimeEnd(p->GetTimeEnd());
f->SetDate(p->GetDate());
List *l = new List();
f->SetRight(l);
l->SetLeft(f);
f = l;
k.SetTailN(f);
p = p->GetRight();
}
}
if(k.GetHeadN()->GetNumberPhone1()=="0")
{
ofstream write("Comments.txt");
write << "Narushitelei net" << '\n';
write.close();
}
return k;
}
List List::СhangeAndArchive(List *U)
// изменение списка по новым данным и сохранение старого писка
{
List *HeadA, *H, *a, *b = new List(), *p = new List(), *m,*e;
List k = List();
List d = List();
k = *U;
if (k.GetHead() == NULL) {
ofstream write("Comments.txt");
write << "spisok pyst, sozdaite spisok" << '\n';
write.close();
}
else {
d.SetHead(p);
bool flag = true, f = true;
string str;
int lim;
ifstream read1("Limit.txt");
getline(read1, str);
lim = atoi(str.c_str());
read1.close();
ifstream read("InputData2.txt");
getline(read, str);
while (!read.eof()) {
getline(read, str); // считываем построчно
p->SetNumberPhone1(str);
getline(read, str);
p->SetNumberPhone2(str);
getline(read, str);
p->SetTimeStart(atoi(str.c_str()));
getline(read, str);
p->SetTimeEnd(atoi(str.c_str()));
getline(read, str);
p->SetDate(str);
List *l2 = new List();
p->SetRight(l2);
l2->SetLeft(p);
p = l2;
}
read.close();
d.SetTail(p);
p=d.GetTail()->GetLeft();
e=d.GetTail()->GetLeft()->GetLeft();
e->SetRight(d.GetTail());
d.GetTail()->SetLeft(e);
delete p;
p = k.GetHead();//р содержит указптель на Head основной список
a = d.GetHead();//а содержит указптель на Head список, которй удаляется
if(k.GetTailA()==NULL)
k.SetHeadA(b); // b создвёт архив
else
{
k.GetTailA()->GetLeft()->SetRight(b);
b->SetLeft(k.GetTailA()->GetLeft());
delete k.GetTailA();
}
while (p->GetRight()!= NULL) {
a = d.GetHead();
flag = true;
while (flag) {
if ((p->GetNumberPhone1() == a->GetNumberPhone1()) &&
(p->GetNumberPhone2() == a->GetNumberPhone2()) &&
(p->GetDate() == a->GetDate()))
// дата должна то же сопадать
{
if (a->GetTimeEnd() - a->GetTimeStart() < lim + 1) {
p->SetTimeEnd(a->GetTimeEnd());
ofstream write("ItemToDelete.txt");
write << a->GetNumberPhone1();
write.close();
m = &d;
d = d.RemoveElementL(m);
}
else {
b->SetNumberPhone1(a->GetNumberPhone1());
b->SetNumberPhone2(a->GetNumberPhone2());
b->SetTimeStart(a->GetTimeStart());
b->SetTimeEnd(a->GetTimeEnd());
b->SetDate(a->GetDate());
List *l = new List();
b->SetRight(l);
l->SetLeft(b);
b = l;
k.SetTailA(b);
ofstream write("ItemToDelete.txt");
write << a->GetNumberPhone1();
write.close();
m = &d;
U = &k;
d = d.RemoveElementL(m);
k = k.RemoveElementL(U);
}
flag = false;
}
else {
if (a->GetRight()->GetNumberPhone1()!= "0")
a = a->GetRight();
else
flag = false;
}
}
if (p->GetRight()!= NULL)
p = p->GetRight();
}
a = d.GetHead();
while (a->GetRight()!= NULL) {
cout << a->GetNumberPhone1() << '\n';
ofstream write("ItemToInsert.txt");
write<<"Zaglyshka"<<'\n';
write << a->GetNumberPhone1() << '\n';
write << a->GetNumberPhone2() << '\n';
write << a->GetTimeStart() << '\n';
write << a->GetTimeEnd() << '\n';
write << a->GetDate() << '\n';
write.close();
U = &k;
k = k.InsertElementL(U);
a = a->GetRight();
}
m = &d;
d = d.DestroyerList(m);
}
return k;
}
void List::SearchMaxInArchive(List *U)
/* поиск абонента в архиве, разговаривающего
чаще остальных */ {
List k = List();
k = *U;
List *HeadL, *HeadP, *e, *x, *z, *p1 = new List(), *p2 = new List();
HeadL = p1;
x = k.GetHeadA();
while (x->GetRight()!= NULL) {
p1->SetNumberPhone1(x->GetNumberPhone1());
p2->SetNumberPhone1(x->GetNumberPhone2());
p1->SetRight(p2);
p2->SetLeft(p1);
List *l1 = new List(), *l2 = new List();
p2->SetRight(l1);
l1->SetLeft(p2);
p1 = l1;
p2 = l2;
x = x->GetRight();
}
HeadP = p2;
p1 = HeadL;
bool flag;
string str;
while (p1->GetRight()!= NULL) {
str = p1->GetNumberPhone1();
e = HeadP;
flag = true;
while (e->GetRight()!= NULL) {
if (str == e->GetNumberPhone1())
flag = false;
e = e->GetRight();
}
if (flag) {
p2->SetNumberPhone1(p1->GetNumberPhone1());
x = HeadL;
while (x->GetRight()!= NULL) {
if (p2->GetNumberPhone1() == x->GetNumberPhone1())
p2->SetTimeStart(p2->GetTimeStart() + 1);
x = x->GetRight();
}
List *l = new List();
p2->SetRight(l);
l->SetLeft(p2);
p2 = l;
}
p1 = p1->GetRight();
}
p2 = HeadP;
int max = p2->GetTimeStart();
while (p2->GetRight()!= NULL) {
if (max < p2->GetTimeStart())
max = p2->GetTimeStart();
p2 = p2->GetRight();
}
ofstream write("OutputDataChasto.txt");
p2 = HeadP;
while (p2->GetRight()!= NULL) {
if (max == p2->GetTimeStart())
write << p2->GetNumberPhone1() << '\n';
p2 = p2->GetRight();
}
}
Project 0.1.cpp:
// добавленный проект
#pragma hdrstop
#pragma argsused
#include <iostream>
#include <tchar.h>
#include <stdio.h>
#include "list.h"
int _tmain(int argc, _TCHAR* argv[]) {
int x;
List w = List();
List *U, *HeadA, *HeadP;
U = &w;
w = w.CreateList(U);
w.Output(U);
w = w.DestroyerList(U);
w = w.InsertElementL(U);
w=w.RemoveElementL(U,s);
w = w.ListExcess(U);
w = w.СhangeAndArchive(U);
w.SearchMaxInArchive(U);
w.Output(U);
w.OutputA(U);
w.OutputN(U);
cin >> x;
return 0;
}
Телеф.cpp:
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
try
{
Application->Initialize();
Application->MainFormOnTaskBar = true;
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------
Unit1.h:
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "list.h"
//---------------------------------------------------------------------------
class TForm1: public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
TButton *Button3;
TButton *Button5;
TButton *Button6;
TButton *Button7;
TButton *Button10;
TButton *Button11;
TButton *Button12;
TListBox *ListBox1;
TLabel *Label1;
TListBox *ListBox2;
TLabel *Label2;
TListBox *ListBox3;
TLabel *Label3;
TLabel *Label4;
TListBox *ListBox4;
TEdit *Edit1;
TLabel *Label5;
TEdit *Edit2;
TLabel *Label6;
TLabel *Label7;
TEdit *Edit3;
TLabel *Label8;
TListBox *ListBox5;
TMemo *InputData;
TMemo *InputData2;
TMemo *InsertElementLHead;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button3Click(TObject *Sender);
void __fastcall Button5Click(TObject *Sender);
void __fastcall Button6Click(TObject *Sender);
void __fastcall Button7Click(TObject *Sender);
void __fastcall Button10Click(TObject *Sender);
void __fastcall Button11Click(TObject *Sender);
void __fastcall Button12Click(TObject *Sender);
void __fastcall Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall Edit2KeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall Edit3KeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall InputDataKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall InputData2KeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
void __fastcall InsertElementLHeadKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <iostream>
#include <cstring.h>
#include <sysmac.h>
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
List w = List();
List *U;
// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) {
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject * Sender)
// при нажатии создаёт основной список
{
U = &w;
w = w.CreateList(U);
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
// при нажатии кнопки выводится основной список в поле с лейблом "Head"
{
U = &w;
w.Output(U);
string s;
ifstream read("OutputData.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox1->Items->Add(str);
}
read.close();
ifstream read1("Comments.txt");
while (!read1.eof()) {
getline(read1, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read1.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
// при нажатии кнопки выводится архивный список в поле с лейблом "HeadА"
{
U = &w;
w.OutputA(U);
string s;
ifstream read("OutputDataA.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox2->Items->Add(str);
}
read.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
// при нажатии кнопки удаляется основной список
{
U = &w;
w = w.DestroyerList(U);
string s;
ifstream read("Comments.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
// при нажатии кнопки удаляется архивный список
{
U = &w;
w = w.DestroyerListA(U);
string s;
ifstream read("Comments.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
// при нажатии кнопки вставляется элемент в основной список
{
U = &w;
w = w.InsertElementL(U);
string s;
ifstream read("Comments.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button10Click(TObject *Sender)
/* при нажатии кнопки выводится намера абонентов в поле с лейблом
"SearchMaxInArchive" разговаривающих чаще остальных */ {
U = &w;
w.SearchMaxInArchive(U);
string s;
ifstream read("OutputDataChasto.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox5->Items->Add(str);
}
read.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button11Click(TObject *Sender)
// при нажатии кнопки выводится список нарушителей в поле с лейблом "HeadN"
{
U = &w;
w.OutputN(U);
string s;
ifstream read("OutputDataN.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox3->Items->Add(str);
}
read.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Button12Click(TObject *Sender)
// при нажатии кнопки удаляется список нарушителей
{
U = &w;
w = w.DestroyerListN(U);
string s;
ifstream read("Comments.txt");
while (!read.eof()) {
getline(read, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyUp(TObject * Sender, WORD & Key,
TShiftState Shift)
/* введите номер абонента и после нажати клавиши Enter этот абонент
удаляется из основного списка */
U = &w;
if (Key == VK_RETURN) {
string s1;
AnsiString s2;
s2 = Edit1->Text;
s1 = s2.c_str();
ofstream write("ItemToDelete.txt");
write << s1;
write.close();
w = w.RemoveElementL(U);
string s;
ifstream read2("Comments.txt");
while (!read2.eof()) {
getline(read2, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read2.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
/* ввите данные нового списка в поле с надписью "InputData2", после
нажатия клавиши Enter они запишутся в файл "InputData2.txt" */ {
U = &w;
if (Key == VK_RETURN) {
string s1;
AnsiString s2;
s2 = Edit2->Text;
s1 = s2.c_str();
ofstream write("Limit.txt");
write << s1;
write.close();
w = w.СhangeAndArchive(U);
string s;
ifstream read2("Comments.txt");
while (!read2.eof()) {
getline(read2, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read2.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
/* введите лимит времени в поле с лейблом "ListExcess", после нажатия клавиши
Enter создастся список нарушителей*/
{
U = &w;
if (Key == VK_RETURN) {
string s1;
AnsiString s2;
s2 = Edit3->Text;
s1 = s2.c_str();
ofstream write("Limit.txt");
write << s1;
write.close();
w = w.ListExcess(U);
string s;
ifstream read2("Comments.txt");
while (!read2.eof()) {
getline(read2, s);
UnicodeString str(s.c_str());
ListBox4->Items->Add(str);
}
read2.close();
ofstream write1("Comments.txt");
write1 << " ";
write1.close();
}
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::InputDataKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
/* считывает данные с поля под именем "InputData" и записывает в файл
"InputData.txt"*/
{
U = &w;
if (Key == VK_RETURN) {
InputData->Lines->SaveToFile("InputData.txt");
}
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::InputData2KeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
/* считывает данные нового списка в поле с надписью "InputData2", после
нажатия клавиши Enter и записывает в файл "InputData2.txt"*/
{
U = &w;
if (Key == VK_RETURN) {
InputData2->Lines->SaveToFile("InputData2.txt");
}
}
// ---------------------------------------------------------------------------
void __fastcall TForm1::InsertElementLHeadKeyUp(TObject *Sender, WORD &Key,
TShiftState Shift)
/* введите данные в поле с именем "InsertElement", полсле нажатия клавиши
Enter и записывает в файл "ItemToInsert.txt" */
{
U = &w;
if (Key == VK_RETURN) {
InsertElementLHead->Lines->SaveToFile("ItemToInsert.txt");
}
}
// ---------------------------------------------------------------------------