Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Розрахункова робота.doc
Скачиваний:
5
Добавлен:
27.11.2018
Размер:
424.45 Кб
Скачать

Міністерство освіти і науки, молоді та спорту України

Національний університет «Львівська політехніка»

Інститут комп’ютерних наук та інформаційних технологій.

Розрахункова робота

з дисципліни „ Проблемно-орієнтоване програмування ”

на тему: „ Опрацювання структурованих даних засобами мови Сі ”

Виконав:

ст. гр. КН-25

Гавдьо М.І

Прийняв:

Кравець П. О

Львів 2011

Завдання

Варіант 5

Ввести з клавіатури масив рядків символів з даними про клієнтів банку: прізвище та ін., № рахунку, сума вкладу, дата. Виділити складові частини рядків та записати їх у відповідні поля масиву структур. Переписати масив структур у впорядковане по номерах рахунків бінарне дерево динамічної пам'яті. За допомогою дерева знайти дані про клієнтів з заданими (введеними з клавіатури) номерами рахунків. Переписати дані про цих клієнтів у двійковий файл. Прочитати дані з файлу та вивести їх на екран у формі таблиці. Усі дії оформити у вигляді окремих функцій.

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

TDate.cpp

//Клас, який описує дату вкладу

class TDate

{

public:

int day; //День

int month; //Місяць

int year; //Рік

//Конструктор

TDate()

{

day = 0;

month = 0;

year = 0;

}

};

Client.cpp

#include "TDate.cpp"

#include <string>

using namespace std;

//Клас, який описує клієнта банку

class Client:public TDate

{

public:

string firstName; //Ім'я

string secondName; //Прізвище

long AccountNumber; //Номер рахунку

long Money; //Сума вкладу

//Конструктор

Client()

{

AccountNumber = 0;

Money = 0;

}

};

Bank.cpp

#include "Client.cpp"

#include <iostream>

#include <vector>

#include <string>

#include <iostream>

#include <fstream>

#include <sstream>

using namespace std;

//Клас - опис банку

class Bank

{

public:

vector<Client> clients; //Клієнти банку

//Зчитування даних про нового клієнта з консолі

void AddClient()

{

char c[100];

Client *cl = new Client();

printf("%12s %12s %10s %10s %5s %5s %5s\n", "FirstName", "SecondName", "Account", "Money", "Day", "Month", "Year");

gets(c);gets(c); //Зчитую рядок з даними

stringstream stream(c);

//Записую дані в окремі поля класу

stream>>cl->firstName>>cl->secondName>>cl->AccountNumber>>cl->Money>>cl->day>>cl->month>>cl->year;

//Додаю у вектор клієнта

clients.push_back(*cl);

}

//Додавання існуючого клієнта

void AddClient(Client cl)

{

clients.push_back(cl);

}

//Виведення інформації про всіх клієнтів банку

void PrintClients()

{

//Якщо клієнтів немає, то виведення повідомлення

if (clients.size() == 0)

{

cout<<"Book is empty!!"<<endl;

return;

}

printf("%12s %12s %10s %10s %5s %5s %5s\n", "FirstName", "SecondName", "Account", "Money", "Day", "Month", "Year");

//Виведення інформації про кожного клієнта

for (int i = 0; i<clients.size(); i++)

printf("%12s %12s %10ld %10ld %5d %5d %5d\n", clients[i].firstName.c_str(), clients[i].secondName.c_str(), clients[i].AccountNumber, clients[i].Money, clients[i].day, clients[i].month, clients[i].year);

}

//Виведення інформації одного клієнта

void PrintClient(Client *cl)

{

printf("%12s %12s %10s %10s %5s %5s %5s\n", "FirstName", "SecondName", "Account", "Money", "Day", "Month", "Year");

printf("%12s %12s %10ld %10ld %5d %5d %5d\n", cl->firstName.c_str(), cl->secondName.c_str(), cl->AccountNumber, cl->Money, cl->day, cl->month, cl->year);

}

//Збереження даних про клієнтів у бінарний файл

void SaveToFile()

{

string name;

cout<<"Save all data to file"<<endl;

cout<<"Enter file name : ";

//Зчитування імені файла

cin>>name;

//Створюю файл

ofstream out(name.c_str(), ios::binary);

//Записую дані про кожного з клієнтів

for (int i = 0; i<clients.size(); i++)

out.write((char*)&clients[i],sizeof(Client));

//Закриваю файл

out.close();

}

//Зчитування даних про клієнтів з файлу

bool LoadFromFile()

{

string name;

clients.clear();

cout<<"Load data from file"<<endl;

cout<<"Enter file name : ";

//Зчитування імені файла

cin>>name;

//Відкриваю файл файлу

ifstream in(name.c_str(), ios::binary);

//Перевірка на існування

if (!in)

return false;

//Поки не кінець файлу зчитую,

//та додаю у вектор

while (!in.eof())

{

Client *cl = new Client();

in.read((char*)cl, sizeof(Client));

clients.push_back(*cl);

}

clients.pop_back();

//Закриваю файл

in.close();

return true;

}

};

BinaryTree.cpp

#include <vector>

using namespace std;

//Бінарне дерево

template<class T>

class BinaryTree

{

//Клас, який описує окремий вузол дерева

class node{

public:

long key; //Ключ пошуку

T data; //Дані

node *left;

node *right;

//Конструктор

node()

{

left = NULL;

right = NULL;

}

};

public:

node *root; //Корінь дерева

//Пустий конструктор

BinaryTree(){ root = NULL; }

//Конструктор, який приймає масив клієнтів

BinaryTree(vector<T> cl)

{

root = NULL;

//Добавлення кожного клієнта з вектора в дерево

//з ключем "номер рахунку"

for (int i = 0; i<cl.size(); i++)

Add(cl[i].AccountNumber, cl[i]);

}

//Додавання елемента в дерево

void Add(long key, T data)

{

Add(root, key, data);

}

//Пошук елемента в дереві

T SearchData(long key)

{

return SearchData(root, key);

}

private:

//Додавання елемента в дерево

void Add(node *curr, long key, T data)

{

if (curr == NULL)

{

//Якщо дерево пусте, то ствоюємо корінь

curr = new node();

curr->data = data;

curr->key = key;

root = curr;

return;

}

//Якщо значення шуканого ключа < за поточне

if (curr->key > key)

{

//Якщо лівого сина неіснує, тоді створюю

if (curr->left == NULL)

{

curr->left = new node();

curr = curr->left;

curr->data = data;

curr->key = key;

return;

}

//Продовжую вставку в лівій гілці

Add(curr->left, key, data);

return;

}

//Якщо правого сина неіснує, тоді створюю

if (curr->right == NULL)

{

curr->right = new node();

curr = curr->right;

curr->data = data;

curr->key = key;

return;

}

//Продовжую вставку в правій гілці

Add(curr->right, key, data);

}

//Пошук елемента в дереві

T SearchData(node *curr, long key)

{

//Якщо не знайдено то повертаємо пустий об'єкт

if (curr == NULL)

return *(new T());

//Якщо знайдено то передаю дані

if (curr->key == key)

return curr->data;

//Якщо значення шуканого ключа < за поточне

//продовжую пошук в лівій гілці

if (curr->key > key)

return SearchData(curr->left, key);

//Продовжую пошук в правій гілці

return SearchData(curr->right, key);

}

};

Head.cpp

#include <iostream>

#include "BinaryTree.cpp"

#include "Bank.cpp"

using namespace std;

//оголошення бінарного дерева

BinaryTree<Client> *tree;

void AddConsoleMenu(Bank *bank);

void StartMenu(Bank *bank);

void SaveToFile(Bank *bank);

void SearchData(Bank *from, Bank *to);

void SaveToFile2(Bank *b);

//Початкове меню

void StartMenu(Bank *bank)

{

char c = ' ';

system("cls");

cout<<"1 - Add clients from console"<<endl;

cout<<"2 - Load client from file"<<endl;

cin>>c;

if (c == '1')

AddConsoleMenu(bank);

if (c == '2')

{

//Перевірка на введеність даних

if (bank->LoadFromFile())

{

bank->PrintClients(); //Виведення даних

return;

}

else

StartMenu(bank);

}

}

//Меню додавання нового кліюнта

void AddConsoleMenu(Bank *bank)

{

char c = ' ';

while (c != 'N')

{

//Запит на додавання нового клієнта

cout<<"Add new client?(Y/N) : ";

cin>>c;

if (c == 'Y')

bank->AddClient();

}

//Якщо існують дані, надаємо можливість зберегти їх до файлу

if (bank->clients.size()!=0)

SaveToFile(bank);

}

//Запит на збереження даних

void SaveToFile(Bank *bank)

{

char c = ' ';

cout<<"Save to file?(Y/N) : ";

cin>>c;

if (c == 'Y')

bank->SaveToFile();

}

//Пошук даних у дереві

void SearchData(Bank *from, Bank *to)

{

char c = ' ';

cout<<"Searching clients"<<endl;

while (c != 'N')

{

cout<<"Search new client?(Y/N) : ";

cin>>c;

if (c == 'Y')

{

long a;

cout<<"Enter account number : ";

//Зчитування даних шуканого клієнта

cin>>a;

Client cl = tree->SearchData(a);

//Перевірка резудьтат пошуку

if (cl.firstName != "")

{

//Добавлення клієнта до результату пошуку

to->AddClient(cl);

//Виведення інформації про цього клієнта

to->PrintClient(&cl);

}

else

cout<<"Client not found"<<endl;

}

}

}

//Меню збереження знайдених клієнтів

void SaveToFile2(Bank *b)

{

char c = ' ';

cout<<"Save search data to file?(Y/N) : ";

cin>>c;

if (c == 'Y')

b->SaveToFile();

}

int main()

{

Bank *bank = new Bank(); //Створення банку

StartMenu(bank); //виклик меню

Bank *searchBank = new Bank(); //Місце для збереження результату пошуку

tree = new BinaryTree<Client>(bank->clients); //створення бінарного дерева

SearchData(bank, searchBank); //Пошук клієнтів

if (searchBank->clients.size()!=0)

SaveToFile2(searchBank); //Збереження результату пошуку до файлу

system("pause");

return 0;

}