You are on page 1of 20

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»

КАФЕДРА САПР

ЗВІТ
До лабораторної роботи №1
«ПОСЛІДОВНИЙ МЕТОД ДОСТУПУ ДО ФАЙЛІВ
НА ЗОВНІШНІХ ЗАПАМ’ЯТОВУЮЧИХ ПРИСТРОЯХ»
З дисципліни
"Організація баз даних і знань "

Виконав:
Студент групи КН-24
Дикий Н. В.
Перевірив:
Головацький Р. І.

Львів-2015
ТЕМА РОБОТИ
Послідовний метод доступу до файлів на зовнішніх запам’ятовуючих
пристроях .
МЕТА РОБОТИ

Розглянути органiзацiю i ведення файлiв послiдовного доступу; набути


практичнi навички у програмуваннi алгоритмiв роботи з файлами послiдовного
доступу.
ЗАВДАННЯ
Створити програму для підтримки послідовного метода доступу до бази даних
теми «Веломагазин», яка реалізовуватиме наступні функції:
 Створення файлу
 Друк бази даних
 Читання запису за вказаним ключем
 Пошук за вказаним полем
 Вставка і видалення запису
 Модифікація запису
Оптимізувати програму шляхом створення файлу групової обробки з
яким допустимо виконувати наступні операції:
 Створення файлу повідомлень
 Друк файлу повідомлень
 Пошук за вказаним ключем
 Видалення запису за ключем
 Вставка запису у файл повідомлень
 Модифікація запису файлу повідомлень
 Внесення змін до бази даних

ТЕОРЕТИЧНI ВIДОМОСТI
Будь-який обмiн даними передбачає присутнiсть джерела iнформацiї,
каналу передачi та її приймача. У випадку обмiну даними мiж програмою i
периферiйним пристроєм одним кiнцем каналу обмiну даними завжди є
оперативна пам’ять ПЕОМ. Другий кiнець цього каналу у бiльшостi мов
програмування визначений як файл.
Поняття файла достатньо широке. Це може бути комунiкацiйний порт,
пристрiй друку. У данiй роботi розглядається файл даних.
Одним iз головних чинникiв, що впливає на продуктивнiсть програм, якi
взаємодiють iз базою даних, є спосiб зберiгання i доступу до файлiв даних:
послiдовний, iндексно-послiдовний, індексно-довiльний, прямий, хешування.
Усi методи розглядаються за двома критерiями:
1. Ефективнiсть доступу - величина, обернена середнiй кiлькостi
фiзичних звертань, необхiдних для логiчного доступу, тобто запиту
конкретного запису бази даних. Фiзичнi звертання забезпечують задоволення
запиту. Наприклад, якщо для пошуку потрiбного запису система звертається до
двох записiв, то ефективнiсть доступу дорiвнює 0,5.
2. Ефективнiсть зберiгання - величина, обернена середнiй кiлькостi байтiв
поля вторинної пам’ятi, яка необхiдна для зберiгання одного байта вхiдних
даних.
Крiм вхiдних даних, пам’ять займають таблицi, керуюча iнформацiя, вiльна
пам’ять, яка резервується для розширень, i дiлянка, яка не використовується
через фрагментацiю.
2.1. ДОСТУП ДО ЗАПИСІВ

Записи у простому послiдовному файлi доступнi лише послiдовно один за


одним. Наприклад, можна звернутися до n-го запису тiльки пiсля звертання до
1,2,...,n-1 записiв. Для того, щоб видалити запис з файла, необхiдно створити
копiю файла, у якiй цей запис є вiдсутнiм; для того, щоб помiстити запис у
файл, також необхiдно створити копiю файла, у яку цей новий запис входить.
Щоб змiнити хоча б одне з полiв у записi, необхiдно створити копiю файла,
який мiститиме модифiкований запис. При послiдовному методi доступу
значення ключiв фiзичних записiв знаходяться у логiчнiй послiдовностi.

2.1.1. Ефективнiсть доступу. Нехай вибрано один фiзичний запис, i


належить вибрати iнший з бiльшим значенням ключа. У найгiршому випадку
для вибору потрiбного запису необхiдно переглянути всi записи бази даних, а у
кращому достатньо вибрати наступний запис. Для того, щоб виявити
необхiдний запис у послiдовному файлi, який складається з N записiв,
необхiдно переглянути у середньому N/2 записiв. Це пояснюється так. Нехай
здiйснюється достатньо багато випробовувань, пов’язаних iз пошуком у
послiдовному файлi випадково вибраних значень ключа. Причому кожний
пошук починається з першого запису файла. Тодi для виявлення шуканого
запису потрiбно переглянути у середньому половину загальної кiлькостi
записiв.
2.1.2. Ефективнiсть зберiгання. Ефективнiсть використання пам'ятi близька до
100%. Зберiгання фiзичних записiв у логiчнiй послiдовностi можна
використовувати для прискорення доступу, якщо перед звертанням до власне
записiв бази даних перевiряти значення ключiв.
Текст програми:
CDatabase.h #include <iostream> using namespace std;

#include <fstream>
#include "CField.h"
class CDataBase
{ #include <string> CDataBase::CDataBase()

public: #include <vector> {

CDataBase(); HelperAddField("Number: ");

CDataBase(string NameBase); using namespace std; HelperAddField("ID: ");

CDataBase(const CDataBase }
&db);
class CField
~CDataBase();
{ CDataBase::CDataBase(const CDataBase
&db)
public:
void AddField(); {
CField(string NameField);
void DeleteField(); m_sNameBase =
CField(const CField & fld); db.m_sNameBase;

~CField(); m_vBase = db.m_vBase;


void AddItemToDataBase();
}
void
DeleteItemFromDataBase(); void SetNameField(string
NameField);
void WriteToFile(string CDataBase::~CDataBase()
NameFile); string GetNameField();
{
bool RreadFromFile(string
NameFile);
void AddElement(string
CField GetField(int Position); Element); }

int GetCountField(); void DeleteElement(int


Position);
bool EditItem(); void CDataBase::HelperAddField(string
Name)
void clear();
string GetElement(int {
Posititon);
CField Field(Name);
void OutputBase();
m_vBase.push_back(Field);
int GetBaseElementSize();
}
int GetSizeBase();

void SetElement(int posistion,


string NewInformation); void CDataBase::AddField()
void FindID(int ID);
void ClearField(); {
void FindField(int PField,
string FieldElement); string stmp;

private: cout << "Enter name of new


field or -1 to exit: ";
string m_sNameField;
cin >> stmp;
vector<string> m_vsElement;
if (stmp != "-1")
};
private: {
void HelperAddField(string CDatabase.cpp
Name);
#include "CDataBase.h" HelperAddField(stmp);
void HelperOutputItem(int
Position); for (int i = 0; i <
m_vBase[2].GetBaseElementSize(); i++)
CDataBase::CDataBase(string NameBase)
{
{

private: m_sNameBase = NameBase; m_vBase[m_vBase.size() -


string m_sNameBase; 1].AddElement("nothing");
HelperAddField("Number: ");

vector<CField> m_vBase; }
HelperAddField("ID: ");

}; }
}
}
CField.h
for (int i = 2; i < {
m_vBase.size(); i++)
void CDataBase::DeleteField()
{
{ int itmp;
cout << "Enter " <<
int itmp; m_vBase[i].GetNameField() << ":"; while (true)

while (true) cin >> stmp; {

{
OutputBase();
m_vBase[i].AddElement(stmp);
cout <<
} "Enter item`s you want to delete Number:
";
for (int i = 2; i <
m_vBase.size(); i++) cin >>
itmp;
{ m_vBase[0].AddElement(to_string(m_vB if ((itmp
ase[2].GetBaseElementSize()-1));///----баг >= 0) && (itmp <
cout <<
"(" << i - 2 << ")" << m_vBase[0].GetBaseElementSize()))
m_vBase[i].GetNameField() << endl;
{
}
//---------------------------
cout << "(" << Генерація унікального номера for (int i = 1; i <
m_vBase.size()-2 << ")" << "Exit" << m_vBase.size(); i++)
endl; ifstream fin;

cout << "Enter fin.open("ID.txt");


element`s you want to delete Number: " {
<< endl; fin >> stmp;

cin >> itmp;

if (itmp == m_vBase[1].AddElement(stmp);
m_vBase[i].DeleteElement(itmp);
m_vBase.size()-2)
fin.close();
{
}
break;
int counter = atoi(stmp.c_str());
}
counter++;
itmp += 2;
stmp = to_string(counter);
if ((itmp>=2) && m_vBase[0].DeleteElement(m_vBase[0].
(itmp<m_vBase.size())) GetBaseElementSize()-1);
ofstream fout;
{
fout.open("ID.txt"); cout << "Delete is success!!"
<< endl;
fout << stmp;
m_vBase.erase(m_vBase.begin() + itmp);
fout.close();
break;
break;
//------------------------------------
}
} ---------------------
else
else
{
{

cout <<
"Incorrect input!!!\n"; cout << "Incorrect input!!!\n";

} }
cout << "\n Input success!!!\n";
} }
}
} }

else
void
void CDataBase::AddItemToDataBase() CDataBase::DeleteItemFromDataBase() {

{ { cout << "Database


is not created or loaded!!!" << endl;
string stmp; if (m_vBase.size()>2)
}
} cout << "Base '" <<
m_sNameBase << "' is empty."<< endl;
{
}
void CDataBase::WriteToFile(string
NameFile) }

{ m_vBase[i].AddElement(stmp);
if (!m_vBase.empty()) bool CDataBase::RreadFromFile(string
NameFile)
{ }
{

string stmp; else


ofstream fout;
ifstream fin;

fin.open(NameFile); break;
fout.open(NameFile);
if (fin)
fout <<
m_sNameBase << endl; { }

if (stmp
== "/*/")
for (int i = 0; i < fin >>
m_vBase.size(); i++) m_sNameBase;
{ break;

fout << }
fin >> stmp;
m_vBase[i].GetNameField() << " ";
fin >> stmp;
}
fin.close();

return true;
while (true)
fout <<
"/*/";/////////// }
{
else

fout << endl; {


fin >>
stmp; cout << "Can not
for (int i = 0; i <
m_vBase[0].GetBaseElementSize(); i++) open file" << endl;
if (stmp !
= "/*/") return false;
{
{ }
fout <<
endl;
}
for (int j HelperAddField(stmp);
= 0; j < m_vBase.size(); j++)
}
void CDataBase::OutputBase()
{
else

fout << {
m_vBase[j].GetElement(i) << " "; break;
cout << "--------------" <<
} } m_sNameBase << "-----------------" <<
endl;
}
for (int i = 0; i <
fout << while (true)
GetSizeBase(); i++)
"/*/";////////////
{
{
fout.close();
for (int i
= 0; i < m_vBase.size(); i++)
HelperOutputItem(i);
{
}

} }
fin >> stmp;
else

{ if (stmp != "/*/") void CDataBase::HelperOutputItem(int


Position)
{ void CDataBase::FindField(int PField, if
string FieldElement) ((tmp>=0)&&(tmp<m_vBase[0].GetBase
ElementSize()))
{
cout << {
bool btmp = false;
"---------------------------------------" <<
break;
endl; for (int i = 0; i <
m_vBase[PField].GetBaseElementSize(); }
for (int i = 0; i <
i++)
m_vBase.size(); i++) }
{
{ while (true)
if
cout << {
(m_vBase[PField].GetElement(i) ==
m_vBase[i].GetNameField() << " :";
FieldElement)
system("cls");
{

cout<<m_vBase[i].GetElement(Position)<
for (int i = 2; i <
<endl; HelperOutputItem(i); m_vBase.size(); i++)
} btmp = {
true;
cout <<
cout <<
"---------------------------------------" << } "(" << i - 2 << ")" <<
endl;
m_vBase[i].GetNameField() << endl;
}
}
}
if (!btmp)
cout << "(" <<
cout << "Element m_vBase.size()-2 << ")" << "Exit" <<
int CDataBase::GetSizeBase() does not exist!!!" << endl; endl;
{ } cout << "Enter
return element`s you want to delete Number: "
m_vBase[2].GetBaseElementSize(); << endl;
CField CDataBase::GetField(int Position)
} cin >> itmp;
{
if (itmp ==
return m_vBase[Position]; m_vBase.size()-2)
void CDataBase::FindID(int ID)
} return
{ true;

int iID; itmp += 2;


int CDataBase::GetCountField()
bool btmp=false;
{
for (int i = 0; i < if ((itmp >= 2) &&
m_vBase[2].GetBaseElementSize(); i++) return m_vBase.size(); (itmp<m_vBase.size()))

{ } {

iID = cout <<


atoi((m_vBase[1].GetElement(i)).c_str()); "Enter new inphormation: ";
bool CDataBase::EditItem()
if (iID == ID) cin >>
{ stmp;
{
int tmp;

int itmp;
HelperOutputItem(i); m_vBase[itmp].SetElement(tmp, stmp);
string stmp;
btmp = }
true; while (true)
else
} {
{
} system("cls");
cout <<
if (!btmp) OutputBase(); "Incorrect input!!!\n";
cout << "Element cout << "Enter }
with the ID does not exist!!!" << endl; item`s number for edit it: ";
} cin >> tmp;
}
CField::CField(const CField &fld)

{ void CField::DeleteElement(int Position)

m_sNameField = {
} fld.m_sNameField;

m_vsElement =
m_vsElement.erase(m_vsElement.begin()
fld.m_vsElement;
void CDataBase::clear() + Position);
}
{ }

for (int i = 0;
i<m_vBase.size(); i++) CField::~CField()
string CField::GetElement(int Position)
{ {
{

return m_vsElement[Position];
m_vBase[i].ClearField();
}
}
}

int tmp = m_vBase.size()-1;


void CField::SetNameField(string
int CField::GetBaseElementSize()
for (int i = tmp; i>1; i--) NameField)
{
{ {
return m_vsElement.size();
m_sNameField = NameField;
}
m_vBase.erase(m_vBase.begin() + i); }

}
void CField::SetElement(int posistion,
} string CField::GetNameField()
string NewInformation)

CField.cpp {
{
return m_sNameField;
#include "CField.h" m_vsElement[posistion] =
} NewInformation;

}
CField::CField(string NameField)
void CField::AddElement(string Element)
{
{
m_sNameField = NameField;
void CField::ClearField()
}
m_vsElement.push_back(Element); {

} m_vsElement.clear();

Main.cpp
#include "CDataBase.h"

int main()

string sChoose;

string NameBase = "Bicycle";

CDataBase Bicycle;

while (true)

string FileName;

system("cls");

cout << " Menu" << endl;


cout << "(0) Program 1" << endl;

cout << "(1) Program 2" << endl;

cout << "(2) Exit" << endl;

cin >> sChoose;

//------------------------------------------------------Program 1

if (sChoose == "0")

while (true)

system("cls");

cout << "(0) Load base" << endl;

cout << "(1) Output database" << endl;

cout << "(2) Add new field to database" << endl;

cout << "(3) Delete field from database" << endl;

cout << "(4) Add item to database" << endl;

cout << "(5) Delete item from database" << endl;

cout << "(6) Find an item by ID" << endl;

cout << "(7) Find an item by field" << endl;

cout << "(8) Edit item" << endl;

cout << "(9) Write to file" << endl;

cout << "(10) Back" << endl;

cin >> sChoose;

//-----------------------------------------------------------Load Base

if (sChoose == "0")

system("cls");

Bicycle.clear();

//Зберегти попередню базу

while (true)

cout << "Please enter name of file or full way: ";

cin >> FileName;

if (Bicycle.RreadFromFile(FileName))

cout << "Loading base success!!!" << endl;

system("pause");

break;

}
Bicycle.clear();

else

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

//-----------------------------------------------------------Output database

if (sChoose == "1")

system("cls");

Bicycle.RreadFromFile(FileName);

Bicycle.OutputBase();

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

//-----------------------------------------------------------Add new field to database

if (sChoose == "2")

system("cls");

Bicycle.RreadFromFile(FileName);

Bicycle.AddField();

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

//------------------------------------------------------------Delete field from database

if (sChoose == "3")

system("cls");

Bicycle.RreadFromFile(FileName);

Bicycle.DeleteField();

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

//------------------------------------------------------------
//------------------------------------------------------------Add item to database

if (sChoose == "4")

system("cls");

Bicycle.RreadFromFile(FileName);

Bicycle.AddItemToDataBase();

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

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

if (sChoose == "5")

system("cls");

Bicycle.RreadFromFile(FileName);

Bicycle.DeleteItemFromDataBase();

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

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

if (sChoose == "6")

Bicycle.RreadFromFile(FileName);

string sID;

int iID;

system("cls");

while (true)

cout << "Enter ID or if you want exit enter -1: ";

cin >> sID;

cout << endl;

if (sID == "-1")

break;

iID = atoi(sID.c_str());

Bicycle.FindID(iID);

}
Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

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

if (sChoose == "7")

Bicycle.RreadFromFile(FileName);

string sTmp;

int iTmp;

while (true)

system("cls");

cout << "Enter field`s Number for find element" << endl;

for (int i = 0; i < Bicycle.GetCountField(); i++)

cout << "(" << i << ")" << Bicycle.GetField(i).GetNameField() << endl;

cin >> iTmp;

if ((iTmp >= 0) && (iTmp<Bicycle.GetCountField()))

break;

else

cout << "Incorrect input!!!";

system("cls");

cout << "You choose field '" << Bicycle.GetField(iTmp).GetNameField() << "'!!! " << endl;

cout << "Please enter " << Bicycle.GetField(iTmp).GetNameField() << " what you search!!!"
<< endl;;

cin >> sTmp;

Bicycle.FindField(iTmp, sTmp);

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

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

if (sChoose == "8")

{
string tmp;

Bicycle.RreadFromFile(FileName);

Bicycle.EditItem();

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

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

if (sChoose == "9")

Bicycle.RreadFromFile(FileName);

string stmp;

system("cls");

cout << "Enter file name or full way to file: ";

cin >> stmp;

Bicycle.WriteToFile(stmp);

cout << "Database write success" << endl;

Bicycle.WriteToFile(FileName);

Bicycle.clear();

system("pause");

else

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

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

if (sChoose == "10")

Bicycle.clear();

break;

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

else

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

//------------------------------------------------------Program2

if (sChoose == "1")

while (true)

{
system("cls");

cout << "(0) Load base" << endl;

cout << "(1) Output database" << endl;

cout << "(2) Add new field to database" << endl;

cout << "(3) Delete field from database" << endl;

cout << "(4) Add item to database" << endl;

cout << "(5) Delete item from database" << endl;

cout << "(6) Find an item by ID" << endl;

cout << "(7) Find an item by field" << endl;

cout << "(8) Edit item" << endl;

cout << "(9) Write to file" << endl;

cout << "(10) Save" << endl;

cout << "(11) Back" << endl;

cin >> sChoose;

//-----------------------------------------------------------Load Base

if (sChoose == "0")

system("cls");

Bicycle.clear();

//Зберегти попередню базу

while (true)

cout << "Please enter name of file or full way: ";

cin >> FileName;

if (Bicycle.RreadFromFile(FileName))

cout << "Loading base success!!!" << endl;

system("pause");

break;

else

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

//-----------------------------------------------------------Output database

if (sChoose == "1")

system("cls");
Bicycle.OutputBase();

system("pause");

else

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

//-----------------------------------------------------------Add new field to database

if (sChoose == "2")

system("cls");

Bicycle.AddField();

system("pause");

else

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

//------------------------------------------------------------Delete field from database

if (sChoose == "3")

system("cls");

Bicycle.DeleteField();

system("pause");

else

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

//------------------------------------------------------------Add item to database

if (sChoose == "4")

system("cls");

Bicycle.AddItemToDataBase();

system("pause");

else

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

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

if (sChoose == "5")

system("cls");

Bicycle.DeleteItemFromDataBase();

system("pause");

else

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

if (sChoose == "6")

string sID;

int iID;

system("cls");

while (true)

cout << "Enter ID or if you want exit enter -1: ";

cin >> sID;

cout << endl;

if (sID == "-1")

break;

iID = atoi(sID.c_str());

Bicycle.FindID(iID);

system("pause");

else

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

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

if (sChoose == "7")

string sTmp;

int iTmp;

while (true)

system("cls");

cout << "Enter field`s Number for find element" << endl;

for (int i = 0; i < Bicycle.GetCountField(); i++)

cout << "(" << i << ")" << Bicycle.GetField(i).GetNameField() << endl;

cin >> iTmp;

if ((iTmp >= 0) && (iTmp<Bicycle.GetCountField()))

break;

else

cout << "Incorrect input!!!";

}
system("cls");

cout << "You choose field '" << Bicycle.GetField(iTmp).GetNameField() << "'!!! " << endl;

cout << "Please enter " << Bicycle.GetField(iTmp).GetNameField() << " what you search!!!"
<< endl;;

cin >> sTmp;

Bicycle.FindField(iTmp, sTmp);

system("pause");

else

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

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

if (sChoose == "8")

string tmp;

system("cls");

Bicycle.EditItem();

system("pause");

else

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

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

if (sChoose == "9")

string stmp;

system("cls");

cout << "Enter file name or full way to file: ";

cin >> stmp;

Bicycle.WriteToFile(stmp);

cout << "Database write success" << endl;

system("pause");

else

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

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

if (sChoose == "11")

Bicycle.WriteToFile(FileName);

Bicycle.clear();

break;

else
//--------------------------------------------------------------------

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

if (sChoose == "10")

Bicycle.WriteToFile(FileName);

cout << "File has been saved" << endl;

system("pause");

else

if (sChoose == "2")

break;

system("pause");

return 0;

}
5. АНАЛІЗ РЕЗУЛЬТАТІВ ТА ВИСНОВКИ
Я розглянув органiзацiю i ведення файлiв послiдовного доступу; набув
практичнi навички у програмуваннi алгоритмiв роботи з файлами послiдовного
доступу.

You might also like