Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

769

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

343

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

278

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

209

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

158

Беларусь, Гомель


ID: 400815

alexleonsm

6-й класс

130


ID: 400669

epimkin

Профессионал

120


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-15 03:46:17-standard


Создание программ на языках C и C++.

Администратор раздела: CradleA (Мастер-Эксперт)

Консультация онлайн # 200692

Раздел: С / С++
Автор вопроса: Артур (Посетитель)
Дата: 22.04.2021, 02:54 Консультация закрыта
Поступило ответов: 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(), в которых должна быть указана реальная длина информации.

Ответов пока не поступило

Мини-форум консультации # 200692

q_id

CradleA

Мастер-Эксперт

ID: 325460

1

= общий =    22.04.2021, 11:56
Артур:

У Вас довольно объемная задача. Т.к. консультация не имеет платного формата, то, на сегодняшний день, мало вероятно, что кто-то возьмется за работу в полном объеме. Эксперты могут подсказать Вам пути решения исправить ошибки.
Поэтому сформулируйте менее объемный вопрос.

=====
to live is to die

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

2

= общий =    22.04.2021, 12:44
Артур:

Ваш вопрос-минимум курсовая.
Такие вопросы не решаются за один день, и даже за 5-ть(срок жизни вопроса на портале) дней.Для решения таких вопросов - срочно - есть Фриланс.

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

Если до 25.04.2021 не будет ответа, я удаляю Ваш вопрос.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

q_id

Артур

Посетитель

ID: 404975

3

= общий =    22.04.2021, 12:47
Зенченко Константин Николаевич:

Это обычная лаба)))))) Дали срок неделю на первом курсе)

Артур

Зенченко Константин Николаевич

Старший модератор

ID: 31795

4

= общий =    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( т.е. те задачи, которые должна решать программа) .

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Артур

Артур

Посетитель

ID: 404975

5

= общий =    24.04.2021, 10:30
Зенченко Константин Николаевич:

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

P.S. У меня нет цели переубедить. Я столкнулся с такой попенцией и надеюсь только на понимание, сочувствие и помощь.

Артур

Зенченко Константин Николаевич

Старший модератор

ID: 31795

6

= общий =    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(), в которых должна быть указана реальная длина информации.

Артур


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

ps:

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

Артур

Это ЧТО?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Артур

Артур

Посетитель

ID: 404975

7

= общий =    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;
}

А дальше по идее нужны функции. Как там связать работу с двумя ключами? Как их сделать?

Артур

Артур

Посетитель

ID: 404975

8

= общий =    24.04.2021, 20:30
Зенченко Константин Николаевич:

Спасибо)
Как сделать вставку кода?

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

Лучшие эксперты раздела

CradleA

Мастер-Эксперт

Рейтинг: 209

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 74

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 74

Хватов Сергей

Академик

Рейтинг: 5

Степанов Иван /REDDS

4-й класс

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0