Консультация № 187388
29.05.2013, 23:42
121.43 руб.
0 1 1
Здравствуйте!
Нужна срочная помощь по решению этой лабы! Вся надежда на вас!
У меня возникли сложности с таким вопросом:
Написать программу для работы с просматриваемой таблицей по запросам оператора.
Просматриваемая таблица организована вектором; каждый элемент таблицы имеет следующую структуру:

struct Node{
int key; /*ключ элемента*/
Item *info; /*указатель на информацию*/
};

Максимальный размер таблицы ограничен (для задания максимального размера таблицы использовать константу - например, const int SIZE = ...;)
Указатель на информацию определяет список элементов с одинаковыми значениями ключей.
Элемент списка имеет следующую структуру:

struct Item{
int relese; /* номер версии*/
char *string; /*указатель на строку символов*/
Item *next; /*указатель на следующий элемент */
};

Предусмотреть следующие операции:
-включение нового элемента в таблицу при условии, что в таблице могут находиться несколько элементов с одинаковыми ключами и разными номерами версий (номер версии элемента формирует как порядковый номер элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в таблицу);
-удаление из таблицы всех версий элемента, заданного ключом, или конкретной (заданной) версии элемента, также заданного своим ключом, без реорганизации таблицы;
-поиск в таблице всех версий элемента, заданного ключом, или конкретной(заданной) версии элемента, также заданного своим ключом. Результатом поиска должна быть новая таблица, содержащая найденные элементы;
-вывод содержимого таблицы на экран.
Разработать два варианта программы:
а) и сама таблица, и информация, относящаяся к элементу таблицы, хранятся в основной памяти;
б) и сама таблица, и информация, относящаяся к элементу таблицы, хранятся во внешней памяти(используется двоичной файл произвольного доступа).Все операции выполняются с таблицей, размещенной в основной памяти. Таблица считывается из файла(или создается в первый раз) в начале сеанса работы и записывается в файл в конце сеанса работы. Информация, относящаяся к элементу таблицы, записывается в файл сразу же при выполнении операции включения в таблицу. Имя файла вводится по запросу из программы.
Примечания:
1. Программа должна содержать несколько функций; функция main должна выполнять: вывод меню, ввод и анализ ответа, вызов на исполнение требуемой функции;
2. В программе нужно предусмотреть проверку правильности ввода данных;
3 для варианта б) следует модифицировать структуру, определяющую элемент таблицы, включив в нее длину информации и ее смещение в файле;
4. в варианте б) для работы с файлом использовать функции пакета stdio.h; чтение и запись выполнять с помощью fread() и fwrite(), в которых должна быть указана реальная длина информации.

Обсуждение

Неизвестный
06.06.2013, 17:18
общий
это ответ
Здравствуйте, Антон!
Вот решение по варианту а.
[code h=700]#include <string.h>
#include <iostream>
#include <conio.h>
using namespace std;

struct Item{
int release;/*номер версии элемента*/
char *info; /*указатель на информацию*/
Item* next;
Item () :info(NULL), next(NULL){};
Item (const Item& i) {
release = i.release;
if (i.info) {info = new char [strlen(i.info)+1]; strcpy (info, i.info);}
else info = NULL;
next = NULL;
}
~Item () {if (info) delete [] info;}
};

struct Node{
int key; /*ключ элемента*/
Item *info; /*указатель на информацию*/
Node () : info(NULL) {};
};

/*-включение нового элемента в таблицу при условии, что в таблице могут находиться несколько элементов
с одинаковыми ключами и разными номерами версий (номер версии элемента формирует как порядковый номер
элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в
таблицу);
-удаление из таблицы всех версий элемента, заданного ключом, или конкретной (заданной) версии элемента,
также заданного своим ключом, без реорганизации таблицы;
-поиск в таблице всех версий элемента, заданного ключом, или конкретной(заданной) версии элемента,
также заданного своим ключом. Результатом поиска должна быть новая таблица, содержащая найденные
элементы;
-вывод содержимого таблицы на экран.*/
class Table {
static const int size = 10;
Node 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 (int key);
};


bool Table::Add (int key, char* info)
{
int k = Empty(key);
if (k!=-1) {
table[k].key = key;
Item* newrec = new Item;
newrec->info = new char [strlen(info)+1];
strcpy (newrec->info, info);
newrec->release = 1;
newrec->next = NULL;
if (table[k].info == NULL) table[k].info = newrec;
else {
Item* tmp = table[k].info;
int r = 2;
while (tmp->next!=NULL) {tmp = tmp->next; r++;}
newrec->release = r;
tmp->next = newrec;

}
if (k==n) n++;
return true;
}
return false;
}

int Table::Find (int key)
{
for (int i=0; i<n; i++)
if (table[i].key==key) return i;
return -1;
}

void Table::Del (int key, int release)
{
int k = Find (key);
if (k<0) return;
if (release == -1) {
Item* tmp;
while (table[k].info) {
tmp = table[k].info;
table[k].info = table[k].info->next;
delete tmp;
}
for (int i=k; i<n-1; i++)
table[i] = table[i+1];
n--;
} else {
Item* tmp = table[k].info;
if (tmp->release == release) {
table[k].info = tmp->next;
delete tmp;

} else {
while (tmp->next!=NULL && tmp->next->release!=release) tmp = tmp->next;
if (!tmp->next) return;
Item* del = tmp->next;
tmp->next = del->next;
delete del;
}
}
}

Table Table::Search (int key, int release)
{
Table tmp;
int k = Find (key);
if (release == -1) {
Item* temp = table[k].info;
while (temp) {
tmp.Add (key, temp->info);
temp = temp->next;
}
} else {
Item* temp = table[k].info;
while (temp) {
if (temp->release == release)
tmp.Add (key, temp->info);
temp = temp->next;
}
}
return tmp;
}
int Table::Empty (int key)
{
for (int i=0; i<n; i++)
if (table[i].key == key) return i;
if (n<size) return n;
return -1;
}
void Table::Print()
{
cout << "\nTable:\n";
for (int i=0; i<n; i++) {
cout << table[i].key << endl;
Item* temp = table[i].info;
while (temp) {
cout << '\t' << temp->release << " : " << temp->info << endl;
temp = temp->next;
}
}
}
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;
}[/code]
Форма ответа