#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;
}
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); //При совпадении удалить
}
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); //Удалим меньшую версию
}
}
}
}
}
}
void proverka(int i)
{
int j;
for(j=0; j < SIZE; j++)
{
if(j == i) continue;
if(itemi[i].key == itemi[j].key) itemi[i].release++;
}
if(j == SIZE)
return;
}
void zip()
{
int k,r,n,e,p;
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE; j++)
{
if(itemi[i].key == itemi[j].key && itemi[i].release != itemi[j].release)
{
k=itemi[i].key;
r=itemi[i].release;
for(e = 0; e < SIZE; e++)
{
if(itemi[e].key == k && itemi[e].release == r)
{
for(p=e;p < SIZE; p++)
{
itemi[p].key= itemi[p+1].key;
itemi[p].release= itemi[p+1].release;
for(n=0;n<256;n++)
itemi[p].info[n] = itemi[p+1].info[n];
}
}
}
}
}
}
}
void proverka(int i)
{
int j;
for(j=0; j < SIZE; j++)
{
if(j == i) break; \\тут было continue
if(itemi[i].key == itemi[j].key) itemi[i].release++;
}
if(j == SIZE)
return;
}
void zip()
{
int k,r,n,e,p;
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE; j++)
{
if(itemi[i].key == itemi[j].key && itemi[i].release < itemi[j].release) \\тут поменял было !=
{
k=itemi[i].key;
r=itemi[i].release;
for(e = 0; e < SIZE; e++)
{
if(itemi[e].key == k && itemi[e].release == r)
{
for(p=e;p < SIZE; p++)
{
itemi[p].key= itemi[p+1].key;
itemi[p].release= itemi[p+1].release;
for(n=0;n<256;n++)
itemi[p].info[n] = itemi[p+1].info[n];
}
}
}
}
}
}
}
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.