Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Romantikkk
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 144
#1

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

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

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

Я знаю, что это надо делать с помощью Union, но как реализовать в коде, я не знаю(
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2013, 23:23     вариативная часть струкуры
Посмотрите здесь:

часть программы.. - C++
помогите с фрагментом в котором находится минимальный элемент второй строки матрицы(6x6)(можно без указания местоположения),делаю даже по...

Описательная часть - C++
Здравствуйте, меня тут озадачили вопросом: для чего нужна описательная часть програмного блока с++ и что это такое? Может кто-нибудь даст...

Дробная часть - C++
Подскажите, как перевести в языке Си дробное число из 16-ой в 8-ую систему счисления? Наример: 8.А получаем: 10.12. Целою часть (8) я...

Учебная часть - C++
Учебная часть

Не работает часть функции в C++ - C++
Добрый день. Возникла проблема: в функции int main() не выполняется кусок программы(цикл for). Описание программы в комментарии функции....

Объяснить часть кода - C++
Программка заполняет матрицу случайными числами и отображает правую половину матрицы на левую зеркально симметрично относительно...

Сократить часть программы - C++
Ребят нужна помощь в данном задании, программа написана, но часть программы(смотрите на фото, обведено красным) нужно сократить, а я не...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
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 отличается от структуры тем, что значение может быть присвоено только одному элементу в каждый момент времени.
Romantikkk
0 / 0 / 0
Регистрация: 19.10.2012
Сообщений: 144
08.03.2013, 01:04  [ТС]     вариативная часть струкуры #3
спасибо) а можете ещё подсказать, как, например, задавать переменные, которые принадлежать только одному или другому объеденению? (например, для мужчин - зарплата, а для женщин - пособие)... и как сделать, чтобы можно было добавлять нового мужчину или девушку с некиими параметрами?
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
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;
Каждому и присваивай параметры которые укажеш в структуре, возраст вес рост и т.д.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
08.03.2013, 02:19     вариативная часть струкуры #5
Цитата Сообщение от egor2116 Посмотреть сообщение
Union отличается от структуры тем, что значение может быть присвоено только одному элементу в каждый момент времени.
бред
Цитата Сообщение от egor2116 Посмотреть сообщение
union{
* * char man;
* * * char woman;
}
вот какой смысл такого юниона??? man всегда будет равен woman!!!

Не по теме:

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


Ты хоть раз юнионы до этого использовал?
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
08.03.2013, 02:35     вариативная часть струкуры #6
Выдержка из Wiki
Объединение (англ. union) в программировании — структура данных, члены которой расположены по одному и тому же адресу. Поэтому размер объединения равен размеру его наибольшего члена. В любой момент времени объединение хранит значение только одного из членов.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
08.03.2013, 02:37     вариативная часть струкуры #7
вот я и спрашиваю, использовал ли ты в своих программах объединения?
какой смысл такого юниона. У него поля всегда равны!
egor2116
339 / 370 / 42
Регистрация: 20.01.2013
Сообщений: 1,123
08.03.2013, 02:39     вариативная часть струкуры #8
Покажи как правильно для данной задачи
OhMyGodSoLong
08.03.2013, 02:41
  #9

Не по теме:

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

Croessmah
08.03.2013, 09:16
  #10

Не по теме:

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

alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 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;
}
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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]);
 
}
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
08.03.2013, 14:40     вариативная часть струкуры #13
Kuzia domovenok, мсье, с чего вы взяли, что union'ы ограничиваются только битовыми операциями? Это как раз естесственная вариативность в с
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
08.03.2013, 15:13     вариативная часть струкуры #14
Цитата Сообщение от alex_x_x Посмотреть сообщение
Kuzia domovenok, мсье, с чего вы взяли, что union'ы ограничиваются только битовыми операциями?
Во-первых, я привёл 2 примера. Второй не на битовые операции.
Во-вторых, таки да, жонглирование байтами/битами на некотором участке памяти - основное назначение юнионов.
В-третьих, это у тебя как раз бессмысленный пример использования union,
т.к. все эти юнионы в нём можно заменить одной строчкой
C++
1
2
3
struct Human {
   SEX sex;
};
зачем тут юнион?!?!?!
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2013, 16:36     вариативная часть струкуры #15
Kuzia domovenok, а если структура должна иметь разные поля в зависимости от типа (в данном случае пола)?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.03.2013, 17:21     вариативная часть струкуры #16
Тогда применяется наследование!
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
09.03.2013, 18:29     вариативная часть струкуры #17
~OhMyGodSoLong~, а в си?
кроме того иногда структуре достаточно оставаться структурой
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
09.03.2013, 19:24     вариативная часть струкуры #18
А что в Си? Там можно тоже наворотить наследование с dynamic_cast. Естественно, в массив такие штуки значениями не засунуть, только указатели. Да и для данного случая не особо подходит, так как разница в размерах вряд ли будет столь велика, чтобы использование юниона было нерациональным с точки зрения неиспользуемой памяти. Вот если бы у одного класса значений было гораздо больше полей, чем у другого, то возможно бы и имело смысл.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2013, 20:57     вариативная часть струкуры
Еще ссылки по теме:

ООП часть программы - C++
Доброго времени суток. Может кто поможет разобраться с частью программы? void Input() // ввод { double Ch; ...

Получить часть строки - C++
Есть строка: char *Text = &quot;&lt;sender&gt;ник_отправителя&lt;/sender&gt;&quot;; как получить ник отправителя в char *SenderNick?

Удалить часть строки - C++
В заданной строке нужно заменить все пары &quot;АВ&quot; на &quot;С&quot;. Я вот не знаю что написать после if. #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; ...

Скопировать часть строки - C++
Как мне скопировать часть строки с элемента a по элемент b?

WinApi часть языка C/C++ - C++
Просто стало интересно WinApi это часть языка C/C++ или WinApi с С/С++ не связан ваше?


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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 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 там нету, наследование везде воротить? зачем?
Yandex
Объявления
09.03.2013, 20:57     вариативная часть струкуры
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru