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

Формирование и вывод на печать упакованной структуры из составляющих - C++

Восстановить пароль Регистрация
 
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
21.11.2014, 22:05     Формирование и вывод на печать упакованной структуры из составляющих #1
Господа, проблема в том, что не совсем понимаю задание. Объясните что от меня требуется!
Задание:

•Ввод составляющих частей структуры данных, диапазон допустимых значений при этом выводите в виде подсказки; формирование и вывод на печать упакованной структуры из составляющих.
•Ввод упакованной структуры данных в виде целого числа, вывод на печать в табличном виде составляющих частей
Элемент профиля пользователя:
Разряд 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение G G G G G G G G S S S S P 0 0 0

G..G -идентификатор группы пользователя
S..S - код системы загружаемой для пользователя
P - Признак привелегии
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 22:05     Формирование и вывод на печать упакованной структуры из составляющих
Посмотрите здесь:

C++ Формирование и вывод матрицы
Динамические структуры данных. Формирование линейного списка. C++
C++ Написать функцию PrnStruct() с одним параметром типа TMyStruct, выводящую на печать значения полей структуры.
C++ Формирование матрицы по шаблону и вывод в файл построчно
Работа с файлами. Формирование, Печать, добавление и удаление элементов оформить в виде функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4297 / 3718 / 1251
Регистрация: 14.04.2014
Сообщений: 14,540
21.11.2014, 22:42     Формирование и вывод на печать упакованной структуры из составляющих #2
Вводишь 16-битное целое, потом выделяешь группы битов, преобразуешь в числа и выводишь.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
21.11.2014, 22:52     Формирование и вывод на печать упакованной структуры из составляющих #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Разряд 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение G G G G G G G G S S S S P 0 0 0
например пришло число 0х1234
C++
1
2
3
4
5
6
7
8
unsigned short a=0x1234;
unsigned short b=a;// копируем число, мы над ним будем издеватся
b>>=3;// сдвигаем на 3 разряда вправо, чтобы P был в младшем разряде
int P=b&0x01;// выделяем привелегию
b>>=1; // сдвигаем на 1 разряд вправо, чтобы в 4 младших был S
int S=b&0x0F;// выделяем 4 разряда кода системы
b>>=4;// сдвигаем на 4 разряда вправо, чтобы в 8 младших разрядах был G
int G=b&0xFF;// выделяем идентификатор
примерно так
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
22.11.2014, 00:41  [ТС]     Формирование и вывод на печать упакованной структуры из составляющих #4
ValeryS, подскажите что не так) Помогите найти ошибки)
Вот код упаковки(не уверенна что работает правильно, но что-то выдает):
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
#include "stdafx.h"
#include <iostream> 
#include <stdio.h>
using namespace std; 
 
void main()
{
    setlocale(LC_ALL, "Russian");
    int G;//идентификатор группы пользователя
    int S;//код системы загружаемой для пользователя
    int P;//признак привелегии
 
    unsigned char n;//количество байт
    int UnitStateWord;//слово состояния
 
    cout << "Введите идентификатор группы(0-31): "<< endl;
    cin >> G;
    cout << "Введите код системы(0-45): " << endl;
    cin >> S;
    cout << "Введите признак привелегии(0/1):" << endl;
    cin >> P;
    cout << "Введите количество переданных байт(0-255): " << endl;
    cin >> n;
 
    UnitStateWord=((unsigned  char)G&0x1F)<<8;
    UnitStateWord|=((unsigned  char)S&0xF)<<4;
    UnitStateWord|=((unsigned  char)P&1)<<3;
    UnitStateWord|=n&0xFF;
 
    cout << "Слово состояния устройства = " << UnitStateWord << endl;
    system("pause");
}
А вот код распаковки, так он вообще не то выдает:
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
#include "stdafx.h"
#include <iostream> 
#include <stdio.h>
using namespace std; 
 
void main()
{
    setlocale(LC_ALL, "Russian");
    int G;//идентификатор группы пользователя
    int S;//код системы загружаемой для пользователя
    int P;//признак привелегии
 
    unsigned char n;//количество байт
    int UnitStateWord;//слово состояния
    cout << "Введите cлово состояния устройства (16-ричное число от 0 до 0xFFFF): " << endl;
    cin >> UnitStateWord;
 
    G = (UnitStateWord<<8)&0x1F;
    S = (UnitStateWord<<4)&0xF;
    P = (UnitStateWord<<3)&1;
    n = UnitStateWord&0xFF;
 
    cout << "идентификатор группы(0-31): "<< G << endl;
    cout << "код системы(0-45): " << S << endl;
    cout << "признак привелегии(0/1):" << P << endl;
    cout << "количество переданных байт(0-255): " << n << endl;
 
    system("pause");
}
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
22.11.2014, 00:55     Формирование и вывод на печать упакованной структуры из составляющих #5
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
int UnitStateWord;//слово состояния
обнулить бы надо, иначе мусор в переменной
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
G = (UnitStateWord<<8)&0x1F;
G знимает 8 бит а не 5
соответственно &0xFF;
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
UnitStateWord|=n&0xFF;
что за n? В первом сообщении не было?
если это младшие 3 бита то
UnitStateWord|=n&0x07;
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
А вот код распаковки, так он вообще не то выдает:
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
C++
1
2
3
4
G = (UnitStateWord<<8)&0x1F;
   S = (UnitStateWord<<4)&0xF;
   P = (UnitStateWord<<3)&1;
   n = UnitStateWord&0xFF;
сдвигать то нужно в другую сторону
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 76
22.11.2014, 01:13  [ТС]     Формирование и вывод на печать упакованной структуры из составляющих #6
ValeryS, Спасибо Вам большое! Если не сложно, ответьте еще на 2 вопроса)
Такие вопросы: почему мы сдвигаем в именно число 8? ну и так в других случаях.
C++
1
G = (UnitStateWord<<8)&0xFF;
И как Вы определяете &0xFF? Где об этом можно почитать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2014, 01:23     Формирование и вывод на печать упакованной структуры из составляющих
Еще ссылки по теме:

Формирование структуры из файла C++
Формирование двоичного кода для целой и дробной части + вывод в файл C++
Структуры. Ввод информации с клавиатуры и печать C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
22.11.2014, 01:23     Формирование и вывод на печать упакованной структуры из составляющих #7
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
И как Вы определяете &0xFF?
по опыту
и знание двоичной/шестнадцатеричной арифметики
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Разряд 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение G G G G G G G G S S S S P 0 0 0
G занимает 8 бит значит маска будет 1111 1111
1111 в двоичной это F в шестнадцатеричной
а 11111111 это соответственно FF
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Где об этом можно почитать?
так, по моему, во всех учебниках есть
потренируйся на бумажке, и начнешь в уме считать
для начала вот таблица
двоичные десятичные шестнадцатеричные
0000 0 0x00
0001 1 0x01
0010 2 0x02
0011 3 0x03
0100 4 0x04
0101 5 0x05
0110 6 0x06
0111 7 0x07
1000 8 0x08
1001 9 0x09
1010 10 0x0A
1011 11 0x0B
1100 12 0x0C
1101 13 0x0D
1110 14 0x0E
1111 15 0x0F
Цитата Сообщение от Yana_Chernobay Посмотреть сообщение
Такие вопросы: почему мы сдвигаем в именно число 8?
не число 8 а на 8 двоичных разрядов влево
посмотри на свою запись и подсчитай насколько G смешено от начала числа
Yandex
Объявления
22.11.2014, 01:23     Формирование и вывод на печать упакованной структуры из составляющих
Ответ Создать тему
Опции темы

Текущее время: 18:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru