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

Обсуждение

Неизвестный
20.05.2013, 12:30
общий
это ответ
Здравствуйте, Посетитель - 396844!
Код:
#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;
}
Неизвестный
20.05.2013, 12:40
общий
А сделать функцию main и чтобы меню было, можно сделать? и еще это относится к а?
Неизвестный
20.05.2013, 12:48
общий
Да, это вариант А. Функцию main набросаю сейчас.
Неизвестный
20.05.2013, 14:14
общий
Добавила.
Форма ответа