Міністерство освіти і науки, молоді та спорту України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій.
Розрахункова робота
з дисципліни „ Проблемно-орієнтоване програмування ”
на тему: „ Опрацювання структурованих даних засобами мови Сі ”
Виконав:
ст. гр. КН-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;
}