#include "StdAfx.h"
#include <string.h>
#include <iostream>
#include <conio.h>
using namespace std;
struct Item{
int busy; /*признак занятости элемента*/
int key; /*ключ элемента*/
int release;/*номер версии элемента*/
char *info; /*указатель на информацию*/
Item () :busy (false), info(NULL){};
Item (const Item& i) {
busy = i.busy; key = i.key; release = i.release;
if (i.info) {info = new char [strlen(i.info)+1]; strcpy (info, i.info);}
else info = NULL;
}
~Item () {if (info) delete [] info;}
};
/*-включение нового элемента в таблицу при условии, что в таблице могут находиться несколько элементов с одинаковыми ключами и разными
номерами версий (номер версии элемента формирует как порядковый номер элемента в последовательности элементов с одинаковыми ключами,
определяемый при включении элемента в таблицу);
-удаление из таблицы всех версий элемента, заданного ключом, или конкретной (заданной) версии элемента, также заданного своим ключом,
без реорганизации таблицы;
-поиск в таблице всех версий элемента, заданного ключом, или конкретной(заданной) версии элемента, также заданного своим ключом.
Результатом поиска должна быть новая таблица, содержащая найденные элементы;
-вывод содержимого таблицы на экран.*/
class Table {
static const int size = 10;
Item table [size];
int n;
public:
Table () : n(0){};
bool Add (int key, char* info);
void Del (int key, int release = -1);
Table Search (int key, int release = -1);
void Print();
void Save (const char* fname);
void Load (const char* fname);
private:
int Find (int key);
int Empty ();
};
void Table::Save (const char* fname)
{
FILE* f = fopen (fname, "wb");
if (f == NULL) return;
fwrite (&n, sizeof(int), 1, f);
int len;
for (int i=0; i<size; i++) {
if (table[i].busy) {
fwrite (&table[i].key, sizeof(int), 1, f);
fwrite (&table[i].release, sizeof(int), 1, f);
len = strlen (table[i].info) + 1;
fwrite (&len, sizeof(int), 1, f);
fwrite (table[i].info, sizeof(char), len, f);
}
}
fclose (f);
}
void Table::Load (const char* fname)
{
FILE* f = fopen (fname, "rb");
if (f == NULL) return;
fread (&n, sizeof(int), 1, f);
int len;
for (int i=0; i<n; i++) {
table[i].busy = true;
fread (&table[i].key, sizeof(int), 1, f);
fread (&table[i].release, sizeof(int), 1, f);
fread (&len, sizeof(int), 1, f);
table[i].info = new char [len];
fread (table[i].info, sizeof(char), len, f);
}
fclose (f);
}
bool Table::Add (int key, char* info)
{
if (n<size) {
int k = Empty();
table[k].busy = true;
table[k].info = new char [strlen(info)+1];
strcpy (table[k].info, info);
table[k].key = key;
table[k].release = Find (key)+1;
n++;
return true;
}
return false;
}
int Table::Find (int key)
{
int k = -1;
for (int i=0; i<size; i++)
if (table[i].busy && table[i].key==key) k++;
return k;
}
void Table::Del (int key, int release)
{
if (release == -1) {
for (int i=0; i<size; i++)
if (table[i].key == key) table[i].busy = false;
} else {
for (int i=0; i<size; i++)
if (table[i].key == key && table[i].release == release) {table[i].busy = false; break;}
}
}
Table Table::Search (int key, int release)
{
Table tmp;
if (release == -1) {
for (int i=0; i<size; i++)
if (table[i].busy && table[i].key == key) tmp.Add (table[i].key, table[i].info);
} else {
for (int i=0; i<size; i++)
if (table[i].busy && table[i].key == key && table[i].release == release) { tmp.Add (table[i].key, table[i].info); break;}
}
return tmp;
}
int Table::Empty ()
{
for (int i=0; i<size; i++)
if (!table[i].busy) return i;
return -1;
}
void Table::Print()
{
cout << "\nTable:\n";
for (int i=0; i<size; i++)
if (table[i].busy)
cout << table[i].key << " " << table[i].release << " " << table[i].info << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
Table table;
bool exit = false;
int key, rel; char info [256];
table.Load ("save.bin");
while (!exit) {
system ("cls");
cout << "1. Add element.\n2. Print table.\n3.Delete element by key.\n4. Delete element by key & release.\n5. Find element by key.\n6.Find element by key & release.\n7. Exit.\nYour choice: ";
int k;
cin >> k;
switch (k) {
case 1:
cin >> key;
cin.ignore (1);
cin >> info;
if (table.Add (key, info)) {
cout << "Record added, press any key to continue...";
_getch();
} else {
cout << "Error while adding, press any key to continue...";
_getch();
}
break;
case 2:
table.Print();
cout << "Press any key to continue...";
_getch();
break;
case 3:
cin >> key;
table.Del (key);
cout << "Record deleted, press any key to continue...";
_getch();
break;
case 4:
cin >> key;
cin >> rel;
table.Del (key, rel);
cout << "Record deleted, press any key to continue...";
_getch();
break;
case 5: {
cin >> key;
Table t = table.Search (key);
t.Print();
cout << "Press any key to continue...";
_getch();
break;}
case 6: {
cin >> key;
cin >> rel;
Table t = table.Search (key, rel);
t.Print();
cout << "Press any key to continue...";
_getch();
break;}
case 7:
table.Save ("save.bin");
exit = true;
break;
}
}
return 0;
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.