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

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


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

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

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

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

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

Номер выпуска:1743
Дата выхода:16.05.2012, 19:30
Администратор рассылки:Киселёва Алёна aka Verena (Академик)
Подписчиков / экспертов:138 / 93
Вопросов / ответов:1 / 1

Консультация # 185990: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Проблема в следующем, вот код который я прилогаю ниже (ОС -Win, система разработки - Microsoft Visual C++ 2010 Express edition, таблица просматриваемая) Структуру каждого элемента таблицы можно увидеть в коде, предусматриваю следующие операции: = включение новог...


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

Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Проблема в следующем, вот код который я прилогаю ниже (ОС -Win, система разработки - Microsoft Visual C++ 2010 Express edition, таблица просматриваемая)

Структуру каждого элемента таблицы можно увидеть в коде, предусматриваю следующие операции:
= включение нового элемента в таблицу при условии, что в таблице могут находиться несколько элементов с одинаковыми ключами и разными номерами версий(номер версии элемента формируется как порядковый номер элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в таблицу); с этим небольшая проблема понимания, а точнее переложения в код, опять же в коде она эта функция есть но она не так работает(добавляет корректно, некоретно версии изменяются).
=поиск в таблице я сделал!
=чистка таблицы сжатием - удаление из таблицы путем ее сжатия всех версий элементов, кроме последних; сделал но не понимаю как уже удалить этот элемент точнее поле или структуру, опять же в коде это представлено, но не доделано(
= ну и вывод я сделал
Сам код

Код :
#include "stdafx.h"
#include <iostream>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <conio.h>

using namespace std;
 const int SIZE = 5;  
struct item{
	int key;
	int release;
	char info[256];
}itemi[SIZE];
int len = SIZE;
void enter(), init_list(), display(), proverka(),del();
void input(int i);
int menu();

void init_list()     //инициализация
{
	int t;
	for(t=0;t<SIZE;t++) *itemi[t].info = '\0';
}
int menu()//менюшка
{
	char ch;

	cout << '\n';
	do{
		cout << "(E)nter\n";
		cout << "(D)isplay\n";
		cout << "(K)ey\n";
		cout << "(R)elease\n";
		cout << "(U)dalenie\n";
		cout << "(Q)uit\n\n";
		cout << "Viberite komandu: ";
		cin >> ch;
	}while(!strchr("edkruq", tolower(ch)));
	return tolower(ch);
}

void enter()//ввод
{
	int i;
	for(i=0; i < SIZE; i++)
		if(!*itemi[i].info) break;

	if(i == SIZE)
	{
		cout << "Spisok polon.\n";
		return;
	}

	input(i);
	proverka();
}

void proverka()//проверка ключей
{

	int i,j; 
	for(i=0; i < SIZE; i++)
		if(itemi[i].key == itemi[i+1].key) itemi[i+1].release++;

	if(i == SIZE)
		return;
}

void input(int i)//продолжение ввода
{
	cout << "Key: ";
	cin >> itemi[i].key;
	
	
	
	cout << "info: ";
	cin >> itemi[i].info; 
	itemi[i].release=1;
	
}

void display()//вывод на екран
{
	int t;
	
	for(t=0; t < SIZE; t++)
	{
		if(*itemi[t].info)
		{

			cout << "Key: ";
			cout << itemi[t].key << '\n';
			cout << "Release: ";
			cout << itemi[t].release << '\n';
			cout << "info: ";
			cout << itemi[t].info << '\n';
		}
	}
}

void key()//поиск по ключу
{
	int i,n;
	cout << "Key: ";
	cin >> n;

	for(i = 0; i < SIZE; i++)
	{
		if(itemi[i].key == n)
		{
			cout << "Key: ";
			cout << itemi[i].key << '\n';
			cout << "Release: ";
			cout << itemi[i].release << '\n';
			cout << "info: ";
			cout << itemi[i].info << '\n';
		}
	}
}

void release()//поиск по ключу и версии
{
	int i,n,r;
	cout << "Key: ";
	cin >> n;
	cout << "Release: ";
	cin >> r;

	for(i = 0; i < SIZE; i++)
	{
		if(itemi[i].key == n && itemi[i].release == r)
		{
			cout << "Key: ";
			cout << itemi[i].key << '\n';
			cout << "Release: ";
			cout << itemi[i].release << '\n';
			cout << "info: ";
			cout << itemi[i].info << '\n';
		}
	}
}
void del()//удаление элемента указываемого по ключу и версии
{
	int i,k,r,j;
	cout << "Key: ";
	cin >> k;
	cout << "Release: ";
	cin >> r;
	for(i = 0; i < SIZE; i++)
	{
		if(itemi[i].key == k && itemi[i].release == r)
		{
			itemi[i].key = itemi[i+1].key;
			for(j = 0; j < SIZE; j++)
			{
				itemi[i].info[j] = itemi[i+1].info[j];
			}
			itemi[i].release = itemi[i+1].release;
		}
	}
}
int _tmain(int argc, _TCHAR* argv[]){
	
	char choice;

	init_list();
	
	for(;;){
		choice = menu();
		switch(choice)
		{
		case 'e': enter();
			break;
		case 'd': display();
			break;
		case 'k': key();
			break;
		case 'r': release();
			break;
		case 'u': del();
			break;
		case 'q': return 0;
		}
	}
	return 0;
}


помогите сделать корректное изменение версии ключа, то есть, если ключи 1 1 1 1 1, тогда версии, как я понял 1 2 3 4 5, или если 1 1 2 3 4, тогда версии 1 2 1 1 1
и помогите пожалуйсто сделать корректное удаление или уничтожение элемента как видите тут замещение сделано а как избавиться от поля или от элемента, так называемого, я не понял немного. Большое спасибо!
Нельзя использовать СТЛ, ООП. Все стандартно как написано у меня пожалуйсто

Дата отправки: 08.05.2012, 18:55
Вопрос задал: Посетитель - 392815 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Бизин Михаил Анатольевич (6-й класс):

Здравствуйте, Посетитель - 392815!
Весь код не предоставляю, т.к. задача стояла в помощи написания функций. Их и обсудим.
Судя по Вашему коду - есть таблица фиксированного размера, где элемент таблицы признаётся пустой, если поле info пустое, т.е. первый байт имеет значение нуля. Поэтому удаление элемента выглядит просто:

Код :
void del_item(int index) //Удаление элемента с номером index
{
  itemi[index].info[0]=0;
  cout << "Element " << index <<" deleted" << '\n';
}

void del()//удаление элемента указываемого по ключу и версии
{
   int i,k,r,j;
   cout << "Key: ";
   cin >> k;
   cout << "Release: ";
   cin >> r;
   for(i = 0; i < SIZE; i++) //Пробежимся по всем элементам в поисках указанного
      if(itemi[i].key == k && itemi[i].release == r) del_item(i); //При совпадении удалить
}
Заметьте, тут добавлена функция стирания элемента по индексу: del_item(int index). Она ещё понадобится.

Заполняется таблица в первый найденный свободный элемент с пустым info, сортировка не предусмотрена. Проверка на совпадение ключа и увеличение версии происходит так:
Код :
void proverka(int i)//проверка ключей
{
   int j,k;
   int MaxRelease=0;
   for(j=0; j < SIZE; j++) //Сравним со всеми ключами
      if((i!=j && *itemi[j].info && itemi[i].key == itemi[j].key && itemi[j].release>MaxRelease))
         MaxRelease=itemi[j].release; //Если ключи совпали и версия выше, то запомним версию
   itemi[i].release=MaxRelease+1;     //Новая версия ключа
}
Изменилось объявление функции. Появился аргумент - индекс добавленного элемента. Вызов функции, надеюсь, сами сможете поправить.

Теперь новая функция, отсутствующая в Вашем коде, но я счёл необходимым её присутствие. Это сжатие (компрессия) как я её понял. Её работа заключается в удалении всех ключей с меньшими версиями:
Код :
void compress() //Сжатие версий (удаление всех версий кроме последней)
{
  cout << "Compress" << '\n';
  int i,j;
  for(i=0; i<SIZE; i++) { //Пробежимся в таблице по ключам
    if (*itemi[i].info) { //Если элемент не пуст
      int MaxRelease=i;           //Номер ключа с максимальной версией
      for(j=i+1; j<SIZE; j++) {   //Пробежимся по таблице в поиске таких же ключей
        if (*itemi[j].info && itemi[MaxRelease].key==itemi[j].key) { //Совпадение ключей
          if (itemi[MaxRelease].release<itemi[j].release) { //Попался ключ с большей версией
            del_item(MaxRelease);      //Удалим меньшую версию
            MaxRelease=j;         //Запомним бОльшую версию
          } else {
            del_item(j);           //Удалим меньшую версию
          }
        }
      }
    }
  }
}


Дополнительные комментарии присутствуют в коде.
Если Вы нуждаетесь и модераторы и другие эксперты сочтут необходимым выложить весь код, то выложу минифоруме. Но если код, размещённый в вопросе Вы писали сами, то Вам не составит труда интегрировать мои исправления в него.

Консультировал: Бизин Михаил Анатольевич (6-й класс)
Дата отправки: 10.05.2012, 23:13
Рейтинг ответа:

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


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

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

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



В избранное