Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты по данной тематике

Асмик Гаряка
Статус: Советник
Рейтинг: 10866
∙ повысить рейтинг »
Коцюрбенко Алексей aka Жерар
Статус: Советник
Рейтинг: 3992
∙ повысить рейтинг »
CradleA
Статус: Бакалавр
Рейтинг: 2071
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1791
Дата выхода:07.06.2013, 00:00
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:84 / 57
Вопросов / ответов:1 / 1

Консультация # 187388: Здравствуйте! Нужна срочная помощь по решению этой лабы! Вся надежда на вас! smile У меня возникли сложности с таким вопросом: Написать программу для работы с просматриваемой таблицей по запросам оператора. Просматриваемая таблица организована векторо...


Консультация # 187388:

Здравствуйте!
Нужна срочная помощь по решению этой лабы! Вся надежда на вас! smile
У меня возникли сложности с таким вопросом:
Написать программу для работы с просматриваемой таблицей по запросам оператора.
Просматриваемая таблица организована вектором; каждый элемент таблицы имеет следующую структуру:

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

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

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

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

Дата отправки: 29.05.2013, 23:42
Вопрос задал: Антон (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Киселёва Алёна aka Verena (Академик):

Здравствуйте, Антон!
Вот решение по варианту а.

Код :
#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;
}

Консультировал: Киселёва Алёна aka Verena (Академик)
Дата отправки: 06.06.2013, 17:18
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка  |  восстановить логин/пароль

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!



В избранное