Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 3
Регистрация: 09.02.2015
Сообщений: 79
1

Задание по union

19.02.2018, 17:09. Показов 1900. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста с объединением(просто наводку или код если не сложно)

1 Часть. Создать объединение, которое хранит четырехбайтовый элемент, старшее и младшее слова четырехбайтового элемента и массив из четырех байт.
2 Часть. Ввести 2 случайных целых числа в диапазоне от 1 до 1000 в старшее и младшее слова четырехбайтового элемента объединения. Вывести четырехбайтовый элемент на экран в десятичном виде. Округлить четырехбайтовый элемент до ближайшего целого, кратного 5. Вывести новое значение четырехбайтового элемента на экран в десятичном виде и в шестнадцатеричном виде, значения всех полей объединения.



Вот часть кода то что есть и то не уверен , что правильно

C++
1
2
3
4
5
6
7
8
    union ob
    {
        long el;
        unsigned short lo;
        unsigned short hi;
        char mass[4];
 
    } w;
Помогите пожалуйста, заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.02.2018, 17:09
Ответы с готовыми решениями:

Union
Человеки привет =) Скажите пожалуйста для чего используются union в С++?

Union
Возник вопрос про объединения. В книгах я встречал лишь случай, когда размер одного из полей больше...

Union и UB
Можно ли каким-либо образом использовать union как основу для легковесного variant? Насколько я...

Union
Здравствуйте! Я уже задавал тут вопрос, как использовать union, и сейчас столкнулся с проблемой:...

16
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
19.02.2018, 19:01 2
C++
1
2
3
4
5
6
7
union ob
    {
        long el;
        unsigned short lo[2];
        char mass[4];
 
    } w;
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
19.02.2018, 19:54 3
В задаче внятно не написано, чего хочет афтор задачи. На всякий случай, может быть он хотел так:

C
    union ob
    {
        unsigned long el;
        struct
        {
          unsigned short lo;
          unsigned short hi;
        } words;
        struct
        {
          unsigned char mass[4];
        } bytes;
    } w;
Принципиальной разницы между моим вариантом и вариантом из поста #2 нету. Всё зависит от того, насколько упоротый ваш преподаватель
2
0 / 0 / 3
Регистрация: 09.02.2015
Сообщений: 79
19.02.2018, 23:36  [ТС] 4
Спасибо за ответы, можно поподробнее объяснить почему тут

C++
1
2
3
4
5
6
7
union ob
    {
        long el;
        unsigned short lo[2];
        char mass[4];
 
    } w;
убирается unsigned short hi , если нужно создать переменные для хранения старшего и младшего слова четырехбайтного элемента.

В задаче нужно изучить работу объединения
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
20.02.2018, 06:54 5
lo[1] - младшее слово,
lo[0] - старшее слово
или воспользуйтесь вариантом Evg
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
20.02.2018, 09:49 6
Цитата Сообщение от invzful Посмотреть сообщение
почему тут убирается unsigned short hi
Там ничего не убирается. Есть два куска - "старшая половина" и "младшая половина". Как их хранить - в виде структуры из двух элементов или в виде массива из двух элементов - принципиальной разницы нет
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,884
20.02.2018, 10:46 7
Evg, существуют же анонимные структуры:
C
1
2
3
4
5
6
7
8
9
10
    union ob{
        uint32_t el; //в данном случае лучше явным образом задать размер
        struct{
          uint16_t lo;
          uint16_t hi;
        };
        struct{
          uint8_t bytes[4];
        };
    } w;
Писать w.lo все-таки быстрее, чем w.word.lo
1
Evg
20.02.2018, 14:39
  #8

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Писать w.lo все-таки быстрее, чем w.word.lo
Большинство проблем растёт от того, что людям всегда хочется быстрее писАть. Но почему-то мало кто задумывается о том, что нужно. чтобы ещё и код было просто читать

А насчёт анонимных структур - я с ходу и не припомню, откуда они взялись. То ли gnu-расширение, то ли начиная с какого-то стандарта. Т.е. не факт, что такой код везде заработает

0
COKPOWEHEU
20.02.2018, 16:05
  #9

Не по теме:

Цитата Сообщение от Evg Посмотреть сообщение
То ли gnu-расширение, то ли начиная с какого-то стандарта. Т.е. не факт, что такой код везде заработает
мне казалось что с С11, но не проверял

0
0 / 0 / 3
Регистрация: 09.02.2015
Сообщений: 79
16.03.2018, 21:26  [ТС] 10
До сих пор не разобрался помогите пожалуйста.

Вывести четырехбайтовый элемент на экран в десятичном виде. (с этим пунктом возникли проблемы) строки 33 и 34
нужно чтобы например я пишу цифры 123 и 321 и мне в четырехбайтовом элементе выдавало 123321

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(0, "Rus");
    union ob {
        
 
        struct {
            unsigned short hi; // стар слово
            unsigned short lo; // млдслово
        }hl;
        long element; // четырехбайтный элемент объединения 
        char mass[4];  // массив из 4 байт
    };
 
    ob uni;
 
 
 
 
    cout << "введите случайное целое число в диапазоне от 1 до 1000 в старшее слово четырехбайтового элемента объединения" << endl;
    cin >> uni.hl.hi;
 
    cout << "введите случайное целое число в диапазоне от 1 до 1000 в младшее слово четырехбайтового элемента объединения" << endl;
    cin >> uni.hl.lo;
 
 
    
    uni.element = uni.hl.hi  uni.hl.lo;
    cout << uni.element << dec << endl;
    
 
 
 
    system("pause");
    return 0;
}
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
16.03.2018, 21:43 11
33-ю убери. И почему hi перед lo?
1
0 / 0 / 3
Регистрация: 09.02.2015
Сообщений: 79
16.03.2018, 22:01  [ТС] 12
теперь выдает такое
Миниатюры
Задание по union  
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
16.03.2018, 22:06 13
А что ты ожидаешь?
0
0 / 0 / 3
Регистрация: 09.02.2015
Сообщений: 79
16.03.2018, 22:14  [ТС] 14
я думал должно получиться что-то вроде, я ввожу младшее слово- 123 , старшее - 321 и получается 123321, сори если туплю
0
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
17.03.2018, 00:38 15
invzful, 33ю строку замените тогда на

C++
1
uni.element = uni.hl.hi * 1000 + uni.hl.lo;
Добавлено через 1 минуту
Только не забывайте, что когда вы запишете element, значения hi и lo затрутся.
0
7791 / 6558 / 2984
Регистрация: 14.04.2014
Сообщений: 28,667
17.03.2018, 08:47 16
Цитата Сообщение от invzful Посмотреть сообщение
ввожу младшее слово- 123 , старшее - 321 и получается 123321
Книжку почитай. Такое работает только для шестнадцатеричной системы.
C++
1
2
3
4
    uni.hl.hi = 0x123;
    uni.hl.lo = 0x321;
    
    cout << hex << uni.element;
1
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
17.03.2018, 09:48 17
del
1
17.03.2018, 09:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.03.2018, 09:48
Помогаю со студенческими работами здесь

Управляемый value union
Добрый вечер. Пытаюсь создать такую структуру: using namespace std; union actiondata{ char...

Union, struct
Здравствуйте! Помогите, пожалуйста, решить проблему. Есть строки: 1 2 3 4 1 2 3 ... ... *...

Union - Объединения
Объясните доходчиво что такое Объединения и для какой работы они нужны. Несколько книг листал а...

Динамический union
Добрый день! Есть небольшие проблемы с использованием union'а. После компиляции этого кода: int...


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

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