Объединения

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

Подскажите пожалуйста как с помощью объедения массивов создать таблицу (пример: ФИО, дата рождения) и как в нее записать данные и вывести
можно пример кода (хотябы простенький)
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Чтобы создать таблицу не нужно объединять массивы. Таблица это массив структур. Или список структур.

Код: Выделить всё

struct Record {
  char firstname[64];
  char midname[64];
  char lastname[64];
  time_t birth;
};

Record theTable[256];

2B OR NOT(2B) = FF
Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

задачу нужно решить с помощью объединений (вот в этом вся и загвоздка :(
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Это невозможно. Объединения нужны для того чтобы сделать структуру данных вида вида "поле1 ИЛИ поле 2 ИЛИ поле3 ... ИЛИ полеN", где ситуация когда ты записал полеX, а прочитал полеY считается ошибкой если X<>Y. Тебе нужна структура данных вида "поле1 И поле 2 И поле3 ... И полеN".
2B OR NOT(2B) = FF
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

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

Код: Выделить всё

typedef struct FULL_NAME_STRUCT
{
	char Text[80];
} FULL_NAME;

typedef struct BIRTHDAY_STRUCT
{
	unsigned char Day;
	unsigned char Month;
	unsigned short Year;
} BIRTHDAY;

typedef unsigned short data_size;

template <data_size Size>
class BirthdayTable
{
public:
	BirthdayTable() : count(0)
	{
		names = new FULL_NAME[Size];
		dates = new BIRTHDAY[Size];
	}
	~BirthdayTable()
	{
		delete[] names;
		delete[] dates;
	}
	bool AddRecord(FULL_NAME& name, const BIRTHDAY& date)
	{
		if (count < Size)
		{
			names[count] = name;
			dates[count] = date;
			count++;
		} else
		{
			return false;
		}
		return true;
	}
	data_size GetCount()
	{
		return count;
	}
private:
	data_size count;
	FULL_NAME* names;
	BIRTHDAY* dates;
};

int main(int argc, char* argv[])
{
	BirthdayTable<1024> table;
	FULL_NAME myname = {"Сидоров Пётр Иванович"};
	BIRTHDAY birth = {22, 11, 1977};
	table.AddRecord(myname, birth);

	return 0;
}

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Только при чём тут были объединения - не понятно :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Как я понимаю, речь шла не о типе данных union из языка С/С++, а об альтернативном способе структуризации данных. Т.е. вместо массива одной структуры для каждой записи у нас получается совокупность массивов для каждого поля таблицы.
Kazanove
Сообщения: 41
Зарегистрирован: 24 фев 2016, 14:55

наверное я не правильно объяснил вот условие задачи
Данные о продукции, выпускаемой машиностроительным предприятием, оформлены в виде массива объединений. Написать программу, которая вводит данные в память машины в диалоге, выводит данные в виде таблицы и выполняет указанное задание. Вывод данных осуществлять на экран дисплея.
Предусмотреть два варианта решения задачи:
1 без использования указателя на объединение;
2 с использованием указателя на объединение.


таблица такого типа

------------------------------------------------------------------------------------------
№|НАИМЕНОВАНИЕ|МАССА|НОМЕР ПО КАТАЛОГУ|ЦЕНА|ДАТА ВЫПУСКА|
------------------------------------------------------------------------------------------
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Вероятно, автор задания неправильно перевел с английского слово structure. Тебе нужна structure. Объединение (union) тебе не нужно. Оно используется для совсем других вещей, даже близко не похожих.
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Absurd писал(а):Вероятно, автор задания неправильно перевел с английского слово structure. Тебе нужна structure. Объединение (union) тебе не нужно. Оно используется для совсем других вещей, даже близко не похожих.
Да, скорее всего так и есть. Подразумевалось использования struct.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить