Страница 1 из 4

Объединения

Добавлено: 25 мар 2016, 21:18
Kazanove
Подскажите пожалуйста как с помощью объедения массивов создать таблицу (пример: ФИО, дата рождения) и как в нее записать данные и вывести
можно пример кода (хотябы простенький)

Re: Объединения

Добавлено: 26 мар 2016, 04:16
Absurd
Чтобы создать таблицу не нужно объединять массивы. Таблица это массив структур. Или список структур.

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

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

Record theTable[256];


Re: Объединения

Добавлено: 26 мар 2016, 07:20
Kazanove
задачу нужно решить с помощью объединений (вот в этом вся и загвоздка :(

Re: Объединения

Добавлено: 27 мар 2016, 06:27
Absurd
Это невозможно. Объединения нужны для того чтобы сделать структуру данных вида вида "поле1 ИЛИ поле 2 ИЛИ поле3 ... ИЛИ полеN", где ситуация когда ты записал полеX, а прочитал полеY считается ошибкой если X<>Y. Тебе нужна структура данных вида "поле1 И поле 2 И поле3 ... И полеN".

Re: Объединения

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

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

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;
}


Re: Объединения

Добавлено: 27 мар 2016, 22:37
Romeo
Только при чём тут были объединения - не понятно :)

Re: Объединения

Добавлено: 27 мар 2016, 23:31
WinMain
Как я понимаю, речь шла не о типе данных union из языка С/С++, а об альтернативном способе структуризации данных. Т.е. вместо массива одной структуры для каждой записи у нас получается совокупность массивов для каждого поля таблицы.

Re: Объединения

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


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

------------------------------------------------------------------------------------------
№|НАИМЕНОВАНИЕ|МАССА|НОМЕР ПО КАТАЛОГУ|ЦЕНА|ДАТА ВЫПУСКА|
------------------------------------------------------------------------------------------

Re: Объединения

Добавлено: 28 мар 2016, 00:06
Absurd
Вероятно, автор задания неправильно перевел с английского слово structure. Тебе нужна structure. Объединение (union) тебе не нужно. Оно используется для совсем других вещей, даже близко не похожих.

Re: Объединения

Добавлено: 28 мар 2016, 00:20
Romeo
Absurd писал(а):Вероятно, автор задания неправильно перевел с английского слово structure. Тебе нужна structure. Объединение (union) тебе не нужно. Оно используется для совсем других вещей, даже близко не похожих.
Да, скорее всего так и есть. Подразумевалось использования struct.