Структура проекта и его описание.




Институт вычислительной математики и информационных технологий

Отчет по семестровому заданию №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");

}

}

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

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-11-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: