Консультация № 187359
21.05.2013, 12:35
96.95 руб.
0 1 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Есть вот такой код(смотри ниже) нужно: сделать чтобы, и сама таблица, и информация, относящаяся к элементу таблицы, хранятся во внешней памяти(используется двоичной файл произвольного доступа).Все операции выполняются с таблицей, размещенной в основной памяти. Таблица считывается из файла(или создается в первый раз) в начале сеанса работы и записывается в файл в конце сеанса работы. Информация, относящаяся к элементу таблицы, записывается в файл сразу же при выполнении операции включения в таблицу. Имя файла вводится по запросу из программы.

все условие:
Написать программу для работы с просматриваемой таблицей по запросам оператора.
Просматриваемая таблица организована вектором; каждый элемент таблицы имеет следующую структуру:
struct Item{
int busy; /*признак занятости элемента*/
int key; /*ключ элемента*/
int release;/*номер версии элемента*/
char *info; /*указатель на информацию*/
};
Максимальный размер таблицы ограничен (для задания максимального размера таблицы использовать константу - например, const int SIZE = ...;)
Предусмотреть следующие операции:
-включение нового элемента в таблицу при условии, что в таблице могут находиться несколько элементов с одинаковыми ключами и разными номерами версий (номер версии элемента формирует как порядковый номер элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в таблицу);
-удаление из таблицы всех версий элемента, заданного ключом, или конкретной (заданной) версии элемента, также заданного своим ключом, без реорганизации таблицы;
-поиск в таблице всех версий элемента, заданного ключом, или конкретной(заданной) версии элемента, также заданного своим ключом. Результатом поиска должна быть новая таблица, содержащая найденные элементы;
-вывод содержимого таблицы на экран.
Примечания:
1. Программа должна содержать несколько функций; функция main должна выполнять: вывод меню, ввод и анализ ответа, вызов на исполнение требуемой функции;
2. В программе нужно предусмотреть проверку правильности ввода данных;
3 следует модифицировать структуру, определяющую элемент таблицы, включив в нее длину информации и ее смещение в файле;
4. для работы с файлом использовать функции пакета stdio.h; чтение и запись выполнять с помощью fread() и fwrite(), в которых должна быть указана реальная длина информации.

Приложение:
#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();
private:
int Find (int key);
int Empty ();
};
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];
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:
exit = true;
break;
}
}
return 0;
}

Обсуждение

Неизвестный
23.05.2013, 16:40
общий
это ответ
Здравствуйте, Посетитель - 396844!
Модифицированный код. Добавлены функции Save и Load в класс таблицы.
Код:
#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;
}
Форма ответа