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

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

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

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

21.11.2014, 22:05. Просмотров 344. Ответов 6
Метки нет (Все метки)

Господа, проблема в том, что не совсем понимаю задание. Объясните что от меня требуется!
Задание:

•Ввод составляющих частей структуры данных, диапазон допустимых значений при этом выводите в виде подсказки; формирование и вывод на печать упакованной структуры из составляющих.
•Ввод упакованной структуры данных в виде целого числа, вывод на печать в табличном виде составляющих частей
Элемент профиля пользователя:
Разряд 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 - Признак привелегии
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2014, 22:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Формирование и вывод на печать упакованной структуры из составляющих (C++):

Формирование структуры из файла - C++
Помогите, пожалуйста, с формированием структуры из данных в txt файле. На всём форуме ничего подобного не нашел.

Динамические структуры данных. Формирование линейного списка. - C++
Текст помощи для некоторой программы организован в виде линейного списка. Каждая компонента текста помощи содержит термин (слово) и...

Работа с файлами. Формирование, Печать, добавление и удаление элементов оформить в виде функций - C++
Сформировать двоичный файл, распечатать его содержимое. Формирование, печать, добавление и удаление элементов оформить в виде функций....

Вывод структуры, строка как элемент структуры - C++
Описать структуру с именем TRAIN, содержащую следующие поля: □ название пункта назначения; □ номер поезда; □ время отправления. ...

Изменение полей упакованной структуры - C#
Читаю Рихтера CLR via C# В главе про значимые типы на примере структуры рассматривается пример изменения полей упакованной структуры:...

Данные упакованной структуры вывести на экран - PascalABC.NET
По введенному числу (в двоичной системе счисления) представляющего собой упакованную заданную структуру, формирует из нее составные ее...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
nmcf
5319 / 4639 / 1551
Регистрация: 14.04.2014
Сообщений: 18,452
21.11.2014, 22:42 #2
Вводишь 16-битное целое, потом выделяешь группы битов, преобразуешь в числа и выводишь.
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,851
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;// выделяем идентификатор
примерно так
1
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 77
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");
}
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,851
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;
сдвигать то нужно в другую сторону
1
Yana_Chernobay
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 77
22.11.2014, 01:13  [ТС] #6
ValeryS, Спасибо Вам большое! Если не сложно, ответьте еще на 2 вопроса)
Такие вопросы: почему мы сдвигаем в именно число 8? ну и так в других случаях.
C++
1
G = (UnitStateWord<<8)&0xFF;
И как Вы определяете &0xFF? Где об этом можно почитать?
0
ValeryS
Модератор
6633 / 5040 / 466
Регистрация: 14.02.2011
Сообщений: 16,851
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 смешено от начала числа
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.11.2014, 01:23
Привет! Вот еще темы с ответами:

Извлечь данные из упакованной двоичной структуры - PascalABC.NET
Поле управления диспетчером кадра в протоколе управления логическим каналом имеет формат: №...

Как сделать вывод на печать структуры из файла - C Linux
Доброго времени суток! Пишу программу по работе с каталог продукции в IDE Code::Blocks. Клиент находит интересующие его товары и...

Формирование страницы на печать - HTML, CSS
Добрый день. Скажите пожалуйста как можно при распечатке страница убрать лишнюю информацию из колонтитулов и задать поля?

Формирование страницы и печать - C#
Вот нащел в сети пример как отправить на печать одну строку: private void press_button_Click(object sender, EventArgs e) ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.11.2014, 01:23
Ответ Создать тему
Опции темы

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