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

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


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

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

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

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

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

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

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


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

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

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

Дата отправки: 21.05.2013, 12:35
Вопрос задал: Посетитель - 396844 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


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

Здравствуйте, Посетитель - 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;
}

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

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


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

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

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



В избранное