0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 144
1

вариативная часть струкуры

07.03.2013, 23:23. Показов 3563. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, как разработать структуру с вариативной частью для представления информации о классе (различать девушек и мальчиков) потом сделать так, чтобы можна было вывести список отдельно девушек и отдельно мальчиков, и чтобы можно было добавить новую девочку или мальчика.

Я знаю, что это надо делать с помощью Union, но как реализовать в коде, я не знаю(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2013, 23:23
Ответы с готовыми решениями:

GCC как часть библиотек линковать статически, а часть динамически?
Просто пока лень Qt пересобирать, чтобы возыметь статик-либы. Нужно Qt линковать динамически, а...

Описать структуру «комплексное число» (действительная часть (re), мнимая часть (im)
Описать структуру «комплексное число» (действительная часть (re), мнимая часть (im)). Определить...

Разделить дробное число на 2 части: целая часть числа и его дробная часть
Пользователь вводит с клавиатуры сумму в валюте (дробное число). Вывести по отдельности количество...

Есть ли возможность в char-массив часть данных ввести в буквах, а часть в цифрах?
подскажите пожалуйста, есть ли возможность в char массив часть данных ввести в буквах, а часть в...

18
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.03.2013, 00:58 2
Наверное как то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
 
using namespace std;
 
struct Human{
int age;
int growth;
union{
    char man;
      char woman;
} sex;
};
 
int main() {
 
    Human h1;
    h1.age=20;
    h1.growth=180;
    h1.sex.man='m';
    
    h1.sex.woman='w';
   
    cout<<  h1.sex.woman<<endl;
    cout<<  h1.sex.man<<endl;
    return 0;
}
Вывод
w
w
Т.к. последнее присвоение было
C++
1
h1.sex.woman='w';
Значит данный экземпляр Human женщина. П.С есть еще один способ определения мужчины и женщины но про это смотрите в ночных передачах

Добавлено через 1 минуту
Union отличается от структуры тем, что значение может быть присвоено только одному элементу в каждый момент времени.
0
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 144
08.03.2013, 01:04  [ТС] 3
спасибо) а можете ещё подсказать, как, например, задавать переменные, которые принадлежать только одному или другому объеденению? (например, для мужчин - зарплата, а для женщин - пособие)... и как сделать, чтобы можно было добавлять нового мужчину или девушку с некиими параметрами?
0
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.03.2013, 01:13 4
Добавь еще одно объединение например

C++
1
2
3
4
5
6
7
8
struct Human{
...
union{
   int salary;
   int allowance;
} cash;
...
};
а потом сравнивай

C++
1
2
3
4
if(h1.sex.man='m')
    h1.cash.salary=5000;
else 
    h1.cash.allowance=2000;
Добавлено через 4 минуты
и как сделать, чтобы можно было добавлять нового мужчину или девушку с некиими параметрами?
Создать обьект структуры.

C++
1
Human girl,boy,man,woman,elvisPrasli;
Каждому и присваивай параметры которые укажеш в структуре, возраст вес рост и т.д.
1
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.03.2013, 02:19 5
Цитата Сообщение от egor2116 Посмотреть сообщение
Union отличается от структуры тем, что значение может быть присвоено только одному элементу в каждый момент времени.
бред
Цитата Сообщение от egor2116 Посмотреть сообщение
union{
* * char man;
* * * char woman;
}
вот какой смысл такого юниона??? man всегда будет равен woman!!!

Не по теме:

(по-английски это male и female если что)


Ты хоть раз юнионы до этого использовал?
0
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.03.2013, 02:35 6
Выдержка из Wiki
Объединение (англ. union) в программировании — структура данных, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. В любой момент времени объединение хранит значение только одного из членов.
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.03.2013, 02:37 7
вот я и спрашиваю, использовал ли ты в своих программах объединения?
какой смысл такого юниона. У него поля всегда равны!
0
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
08.03.2013, 02:39 8
Покажи как правильно для данной задачи
0
OhMyGodSoLong
08.03.2013, 02:41
  #9

Не по теме:

C
1
2
3
4
struct person {
    enum { FEMALE, MALE } sex;
    const char *name;
};

1
Croessmah
08.03.2013, 09:16
  #10

Не по теме:

Цитата Сообщение от egor2116 Посмотреть сообщение
Покажи как правильно для данной задачи
Могли бы просто char sex; сделать :) Объединения немного для других целей

0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2013, 09:27 11
с юнионами обычно так делают:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
typedef enum _SEX { MALE, FEMALE } SEX;
 
typedef struct _Human {
   SEX sex;
   union {
       struct Male {
           int a;
       } male;
       struct Female {
           int b;
       } female;
   };
} Human;
 
int main () {
   Human h;
   if (h.sex == MALE) {
       h.male.a = 10;
   }
   return 0;
}
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.03.2013, 12:37 12
Цитата Сообщение от alex_x_x Посмотреть сообщение
с юнионами обычно так делают:
ещё раз бред. Юнионы они для других целей.
Выделение битовых полей в байте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
union device_info{
    struct {
        unsigned enabled:1;//1й бит включён ли(0..1)
        unsigned mode:2;//два бита - режим работы (4 режима)(0..3)
        unsigned clock_rate:2;  //частота работы - один из четырёх вариантов(0..3)
        unsigned channel_selected:2;//выбран канал номер (0..3)
        unsigned locked: 1; //заблокирован или нет (0..1)
    }fields;
    unsigned char data;
};
//void transmit_byte_to_device(unsigned char data){/**/}
int main ()
{
    union device_info BombInfo;
    BombInfo.fields.enabled=1;// BombInfo.byte = 0000 0001
    BombInfo.fields.mode=0;//
    BombInfo.fields.clock_rate=10;//BombInfo.byte = 0001 0001
    BombInfo.fields.channel_selected=11;//32 BombInfo.byte = 0111 0001
    BombInfo.fields.locked=0;//128           BombInfo.byte = 0111 0001
        //присвоение значений битам числа прошло.
    cout<<int(BombInfo.data);//в поле data тут же оказался байт, соответствующий полям
    transmit_byte_to_device(BombInfo.data);
    return 0;
}
выделение байтов в более длинном числе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
union int_to_bytes{
int value;
unsigned char bytes[4];
};
int main(){
  union int_to_bytes sample;
  sample.value=1234;//присвоение значения value
  transmit_byte_to_device(sample.bytes[0]);//в массиве bytes тут же оказались
  transmit_byte_to_device(sample.bytes[1]);// байты этого значения.
  transmit_byte_to_device(sample.bytes[2]);
  transmit_byte_to_device(sample.bytes[3]);
 
}
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2013, 14:40 13
Kuzia domovenok, мсье, с чего вы взяли, что union'ы ограничиваются только битовыми операциями? Это как раз естесственная вариативность в с
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.03.2013, 15:13 14
Цитата Сообщение от alex_x_x Посмотреть сообщение
Kuzia domovenok, мсье, с чего вы взяли, что union'ы ограничиваются только битовыми операциями?
Во-первых, я привёл 2 примера. Второй не на битовые операции.
Во-вторых, таки да, жонглирование байтами/битами на некотором участке памяти - основное назначение юнионов.
В-третьих, это у тебя как раз бессмысленный пример использования union,
т.к. все эти юнионы в нём можно заменить одной строчкой
C++
1
2
3
struct Human {
   SEX sex;
};
зачем тут юнион?!?!?!
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2013, 16:36 15
Kuzia domovenok, а если структура должна иметь разные поля в зависимости от типа (в данном случае пола)?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
09.03.2013, 17:21 16
Тогда применяется наследование!
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2013, 18:29 17
~OhMyGodSoLong~, а в си?
кроме того иногда структуре достаточно оставаться структурой
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
09.03.2013, 19:24 18
А что в Си? Там можно тоже наворотить наследование с dynamic_cast. Естественно, в массив такие штуки значениями не засунуть, только указатели. Да и для данного случая не особо подходит, так как разница в размерах вряд ли будет столь велика, чтобы использование юниона было нерациональным с точки зрения неиспользуемой памяти. Вот если бы у одного класса значений было гораздо больше полей, чем у другого, то возможно бы и имело смысл.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2013, 20:57 19
C
1
2
3
4
5
6
7
8
9
10
11
89 struct ifaddr
90   {                                                                   
91     struct sockaddr ifa_addr;>--/* Address of interface.  */
92     union
93       {
94 >---struct sockaddr>ifu_broadaddr;
95 >---struct sockaddr>ifu_dstaddr;
96       } ifa_ifu;
97     struct iface *ifa_ifp;>-/* Back-pointer to interface.  */
98     struct ifaddr *ifa_next;>---/* Next address for interface.  */
99   };
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127 struct ifreq
128   {
129 # define IFHWADDRLEN>---6
130 # define IFNAMSIZ>--IF_NAMESIZE
131     union                                                          
132       {
133 >---char ifrn_name[IFNAMSIZ];>--/* Interface name, e.g. "en0".  */
134       } ifr_ifrn;
135 
136     union
137       {
138 >---struct sockaddr ifru_addr;
139 >---struct sockaddr ifru_dstaddr;
140 >---struct sockaddr ifru_broadaddr;
141 >---struct sockaddr ifru_netmask;
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
25 struct ip6_hdr
26   {
27     union
28       {
29 >---struct ip6_hdrctl
30 >---  {
31 >---    uint32_t ip6_un1_flow;   /* 4 bits version, 8 bits TC,
32 >--->--->--->--->---20 bits flow-ID */
33 >---    uint16_t ip6_un1_plen;   /* payload length */
34 >---    uint8_t  ip6_un1_nxt;    /* next header */
35 >---    uint8_t  ip6_un1_hlim;   /* hop limit */
36 >---  } ip6_un1;
37 >---uint8_t ip6_un2_vfc;       /* 4 bits version, top 4 bits tclass */
38       } ip6_ctlun;
39     struct in6_addr ip6_src;      /* source address */
40     struct in6_addr ip6_dst;      /* destination address */
41   };
grep /usr/include что называется

Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А что в Си? Там можно тоже наворотить наследование с dynamic_cast
славу богу dynamic_cast там нету, наследование везде воротить? зачем?
0
09.03.2013, 20:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2013, 20:57
Помогаю со студенческими работами здесь

Ошибка в задаче: Найти мин. k, которое будет удовлетворять условию: fabs(правая часть - левая часть) < 10^(-15)
Задача: k изменяется от 0 до бесконечности ((4k+1)! / ^2) * x^2k = =1/2* X принадлежит...

Скопировать часть строки и часть удалить
1. Удалить из строки ее часть с заданной позиции и заданной длины. 2. Скопировать часть строки с...

Вариативная длина числа
Здравствуйте Есть такое понятие Variable-length quantity Вот еще информация на гугле ...

Aser Aspire 3003LC перестала работать часть кнопок и часть оперативки!
Есть у меня Древний ноутбук (Операционка XP, процессор Mobile AMD Semptron Processor 3000+ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru