Консультация № 200692
22.04.2021, 02:54
0.00 руб.
0 8 0
Здравствуйте! Прошу помощи в следующем вопросе:

Написать программу для работы с таблицей, использующей два пространства ключей, по запросам оператора.
Каждый элемент таблицы имеет следующую структуру:

struct Item{
InfoType *info;
/* указатель на информацию */
RelType release;
/* версия элемента */
Item *next;
/* указатель на следующий элемент с данным составным ключем */

/* а также может содержать опциональные поля, для оптимизации выполнения операций, */
/* при этом их состав и наличие выбираются исходя из целесообразности, */
/* среди данных полей могут быть: */

KeyType1 key1;
/* ключ элемента из 1-го пространства ключей; */
KeyType2 key2;
/* ключ элемента из 2-го пространства ключей; */
IndexType1 ind1;
/* связь с элементом 1-го пространства ключей по индексу; */
IndexType2 ind2;
/* связь с элементом 2-го пространства ключей по индексу; */
PointerType1 *p1;
/* связь с элементом 2-го пространства ключей по указателю; */
PointerType2 *p2;
/* связь с элементом 2-го пространства ключей по указателю; */

};

В таблице могут быть элементы с одинаковым составными ключами (key1, key2) и разными номерами версий (номер версии элемента формируется как порядковый номер элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в таблицу).
Первое пространство ключей организовано как просматриваемая таблица, организованная вектором; каждый элемент таблицы имеет следующую структуру:

struct KeySpace1{
KeyType1 key; /* ключ элемента, не может быть 0 */
KeyType1 par; /* ключ родительского элемента */
Item *info; /* указатель на информацию */
};

Максимальный размер пространства ключей ограничен msize1, определяемый при инициализации таблицы.
В пространстве не может быть двух элементов с одинаковыми ключами и значение ключа родительского элемента для элемента должно совпадать с каким-нибудь значением ключа элемента, существующего в таблице, или быть равным 0. Элементы таблицы упорядочены по значению ключа родительского элемента. Значение ключа родительского элемента может дублироваться в таблице.

В данном пространстве ключей предусмотрены следующие особые операции:
- удаление из таблицы элемента, заданного своим ключом; при этом во всех элементах таблицы, имеющих в поле ключа родительского элемента значение, совпадающее с заданным, это значение должно быть заменено на 0;
- поиск в таблице всех элементов, заданных значением ключа родительского элемента; результатом поиска должна быть новая таблица, содержащая найденные элементы.
Второе пространство ключей организовано как перемешанная таблица, использующая перемешивание сцеплением.
Перемешанная таблица представлена массивом указателей на элементы таблицы, имеющие следующую структуру:

struct KeySpace2{
KeyType2 key; /* ключ элемента */
Node2 *node; /* указатель на информацию */
KeySpace2 *next; /* указатель на следующий элемент */

};

Указатель на информацию определяет список элементов с одинаковыми значениями ключей. Элемент списка имеет следующую структуру:

struct Node2{
RelType2 release; /* номер версии элемента */
InfoType *info; /* указатель на информацию */
Node2 *next; /* указатель на следующий элемент */
};


Максимальный размер массива указателей ограничен msize2, определяемый при инициализации таблицы.
В пространстве могут находиться несколько элементов с одинаковыми ключами и разными номерами версий (номер версии элемента формируется как порядковый номер элемента в последовательности элементов с одинаковыми ключами, определяемый при включении элемента в таблицу).

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

Таблица задается структурой:
struct Table{
KeySpace1 *ks1;
/* указатель на первое пространство ключей */
KeySpace2 *ks2;
/* указатель на второе пространство ключей */
/*также может содержать опциональные поля, ограничивающие размер пространства ключей */
/*при этом их наличие определяется типом организации соответствующего пространства, */
/*(см. предыдущие пункт задания): */

IndexType1 msize1;
/* размер области 1-го пространства ключей */
IndexType2 msize2;
/* размер области 2-го пространства ключей */

/*также может содержать опциональные поля с текущим количеством элементов в пространстве ключей */
/*при этом их наличие определяется типом организации соответствующего пространства, */
/*(см. предыдущие пункт задания): */

IndexType1 сsize1;
/* количество элементов в области 1-го пространства ключей */
IndexType2 сsize2;
/* количество элементов в области 1-го пространства ключей */
};

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

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

a) и сама таблица, и информация, относящаяся к элементу таблицы, хранятся в основной памяти;
b) и сама таблица, и информация, относящаяся к элементу таблицы, хранятся во внешней памяти (используется двоичный файл произвольного доступа). Описатель таблицы и описатели пространств ключей считывается из файла (или создается в первый раз) в начале сеанса работы и записывается в файл в конце сеанса работы. Информация, относящаяся к элементу таблицы, записывается в файл сразу же при выполнении операции включения в таблицу и в основной памяти не хранится, возможно за исключением элемента, с которым производится текущая операция. Все операции выполняются с описателем таблицы и пространств ключей, размещенными в основной памяти. Все структуры данных модифицируются соответствующим образом (замена указателей на смещение в файле и т.п.). Имя файла вводится по запросу из программы и хранится в описателе таблицы.
d) ***(дополнительно) аналогично пункту с, но с реализацией буферизации файловых операций (можно считывать и записывать по несколько записей) и кеширования записей (тип кэша и стратегии управления кэшем выбираются по согласованию с преподавателем)


1. Программа должна содержать несколько функций; функция main должна выполнять: вывод меню, ввод и анализ ответа, вызов на исполнение требуемой функции;
2. В программе нужно предусмотреть проверку правильности ввода данных;
3. Для варианта b, d следует модифицировать структуру, определяющую элемент таблицы, включив в нее длину информации и ее смещение в файле;
4. В варианте b, d для работы с файлом использовать функции пакета stdio.h; чтение и запись выполнять с помощью fread() и fwrite(), в которых должна быть указана реальная длина информации.

Обсуждение

давно
Мастер-Эксперт
325460
1469
22.04.2021, 11:56
общий
Адресаты:
У Вас довольно объемная задача. Т.к. консультация не имеет платного формата, то, на сегодняшний день, мало вероятно, что кто-то возьмется за работу в полном объеме. Эксперты могут подсказать Вам пути решения исправить ошибки.
Поэтому сформулируйте менее объемный вопрос.
Об авторе:
to live is to die
давно
Старший Модератор
31795
6196
22.04.2021, 12:44
общий
Адресаты:
Ваш вопрос-минимум курсовая.
Такие вопросы не решаются за один день, и даже за 5-ть(срок жизни вопроса на портале) дней.Для решения таких вопросов - срочно - есть Фриланс.

Вы можете свой вопрос разбить на подвопросы и задать их каждый отдельно потом собрав их в "кучу" получить решение. Но не все сразу.

Если до 25.04.2021 не будет ответа, я удаляю Ваш вопрос.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404975
4
22.04.2021, 12:47
общий
Адресаты:
Это обычная лаба)))))) Дали срок неделю на первом курсе)
давно
Старший Модератор
31795
6196
24.04.2021, 05:08
общий
Адресаты:
Цитата: Артур
Это обычная лаба)

Цитата: Зенченко Константин Николаевич
Ваш вопрос-минимум курсовая.

Знаете сказку Одисея, которую он озвучил своей жене, когда он вынося пакет с мусором, вернулся через несколько лет.


Спасибо Вам, что медодичку напечатали.

"Конструктор таблиц":
Смотрим struct Item
InfoType *info;/* указатель на информацию*/
т.е. есть некоторый список, к которому можно обратится по индексу.
item *next;/* указатель на следующий элемент с данным составным ключе*/
т.е. ещё один список.
PointerType1 *p1;/* связь с элементом 2-го пространства ключей по указателю;*/
Я понимаю, скажите "очяпятка"

Пропустим пока KeySpace2, займемся struct Node2

Код:
struct Node2{
RelType2 release; /* номер версии элемента */
InfoType *info; /* указатель на информацию */
Node2 *next; /* указатель на следующий элемент */
};

Т.е. имеем указатель на info и на очередной элемент *next списка(уже третий).

Вернемся к KeySpace2
Код:
struct KeySpace2{
KeyType2 key; /* ключ элемента */
Node2 *node; /* указатель на информацию */
KeySpace2 *next; /* указатель на следующий элемент */
};

УПС, список, на списке и списком погоняет(уже 4-й).

При этом они занимаются индексированием и многоуровневым связыванием разных таблиц(ой пардон - списков).

Дальше анализировать не стал(там ещё пару списков. Уж очень много - для первого курса), но и этого достаточно, чтобы понять
Цитата: Артур
обычная лаба

Попытка создать аналог базы данных типа MS Access.

Я еще не говорил о "Конструкторе форм" MS Access( т.е. те задачи, которые должна решать программа) .
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404975
4
24.04.2021, 10:30
общий
Адресаты:
При первом прочтении. Мммм как интересно, но ничего не понятно... Нет, не скажу опечатка, потому что не знаю (PointerType1 *p1;/* связь с элементом 2-го пространства ключей по указателю;*/
Я понимаю, скажите "очяпятка"). Думаю, что раз первый курс, специально добавили эту строчку "/* среди данных полей могут быть: */". Вряд ли это облегчает задачу...
При втором прочтении. Почему мне не повезло с заданием на первом курсе? Почему такая попа?)

P.S. У меня нет цели переубедить. Я столкнулся с такой попенцией и надеюсь только на понимание, сочувствие и помощь.
давно
Старший Модератор
31795
6196
24.04.2021, 14:39
общий
Адресаты:
Цитата: Артур
У меня нет цели переубедить

У Вас не получится - Ну сами смотрите:

Приблизительно такой вид имеют Ваши таблицы(структуры) в MS Access - режим "Relationships" => "Связи".
Без таблицы info. Основная таблица Table.
Теперь соедините одноименные поля стрелочками(по арабски - справо-налево) начиная с табицы Table .

В MS Access, это решается просто, минут за 30-ть, ну еще час на разработку "Форм" :
Цитата: Артур
1. Программа должна содержать несколько функций; функция main должна выполнять: вывод меню, ввод и анализ ответа, вызов на исполнение требуемой функции;
2. В программе нужно предусмотреть проверку правильности ввода данных;
3. Для варианта b, d следует модифицировать структуру, определяющую элемент таблицы, включив в нее длину информации и ее смещение в файле;
4. В варианте b, d для работы с файлом использовать функции пакета stdio.h; чтение и запись выполнять с помощью fread() и fwrite(), в которых должна быть указана реальная длина информации.


Для С/С++ -> это большой объем работы, на пару клавиатур.


ps:
Цитата: Артур
(см. предыдущие пункт задания):

Это ЧТО?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
404975
4
24.04.2021, 20:22
общий
Я искренне не понимаю, зачем мне по алгоритмам и структурам данных на языке си использовать MS Access? Да, я знаю что это такое, и мы даже в школе с ним работали. Да, скорее всего там будет проще сделать. Но задание выполнить на си... Меня хватило только на подобную заготовку:
Код:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <locale.h>


typedef struct InfoType {
float number;
char* stroka;
} InfoType;

typedef struct Item {
InfoType* info;
Item* next;
} Item;

typedef struct KeyType1 {
int key1;
} KeyType1;


typedef struct KeyType2 {
char key2[10];
} KeyType2;

typedef struct KeySpace1 {
KeyType1 key;
KeyType1 par;
Item* info;
} KeySpace1;

typedef struct KeySpace2 {
KeyType2 key;
Node2* node;
KeySpace2* next;
} KeySpace2;

typedef struct Node2 {
InfoType* info;
Node2* next;
} Node2;

typedef struct Table {
KeySpace1* ks1;
KeySpace2* ks2;
} Table;

int main() {
Table* table;
table = (Table*)malloc(sizeof(Table));
do {
//забираем переменную выбора rc
switch (rc)
{
case '1':
Add(*table);
break;
case '2':
Find(*table);
break;
case '3':
Delete(*table);

default:
//Введите заново(Проверка на ввод)
rc = 45;
break;
}
} while (rc == 45);
//Конец, пока пользователь
//очищение памяти
return 0;
}

А дальше по идее нужны функции. Как там связать работу с двумя ключами? Как их сделать?
давно
Посетитель
404975
4
24.04.2021, 20:30
общий
Адресаты:
Спасибо)
Как сделать вставку кода?
Форма ответа