Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР3-С++-13 марта-2012.doc
Скачиваний:
14
Добавлен:
15.09.2019
Размер:
1.26 Mб
Скачать

2.12.3.3. Пример решения задачи для варианта № 30 Решение задачи предполагает создание двух программ: упаковки (см. 2.12.3.3.1) и распаковки (см. 2.12.3.3.2)

2.12.3.3.1. Программа упаковки

2.12.3.3.1.1. Разработка алгоритма решения

Алгоритм программы линейный и состоит из таких шагов.

2.12.3.3.1.1.1. Ввод значений составных частей слова состояния устройства. Для каждой составной части нужно вывести приглашение на ввод и ввести данные.

2.12.3.3.1.1.2. Занесение в слово состояния устройства кода состояния. У переменной, которая хранит значение кода состояния, нужно выделить 5 младших разрядов - это можно сделать, выполнив операцию "побитовое логическое И" между значением переменной и двоичной константой 00011111 (16-ричной константой 1F). Потом полученное значения следует сдвинуть на 11 разрядов влево.

2.12.3.3.1.1.3. Занесение в слово состояния устройства признака ошибки. В переменной - признаке ошибки выделить один младший разряд - операция "побитовое логическое И" с константой 1. Полученное значение сдвинуть на 9 разрядов влево. Чтобы добавит полученный код к тому коду, который уже получен на предыдущем шаге, нужно выполнить операцию "побитовое логическое ИЛИ" между предыдущим значением слова состояния устройства и полученным кодом.

2.12.3.3.1.1.4. Занесение в слово состояния устройства признака занятости. В переменной - признаке занятости выделить один младший разряд. Полученное значение сдвинуть на 8 разрядов влево и добавить к тому коду, который получен на предыдущем шаге (так же как в пп. 2.12.3.3.1.1.3.).

2.12.3.3.1.1.5. Занесение в слово состояния устройства количества байт. В переменной - количестве байт выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение добавить (см. пп. 2.12.3.3.1.1.3.) к тому коду, который уже есть.

Отметим, что если значения составных частей кода, введенные оператором, не выходят за диапазон допустимых для них значений, то операция выделения младших байтов излишня. Но мы предусматриваем ее на случай ошибок оператора.

2.12.3.3.1.2. Определение переменных программы

     Для работы программы нам будут нужны переменные, в которых будут храниться составные части кода. Для сохранения всех составных частей будет достаточно по 1 байту, следовательно, тип этих переменных может быть char или unsigned char. Диапазоны возможных значений этих переменных:

c - код состояния - 0 ...31

 f - признак ошибки - 0, 1

b - признак занятости - 0, 1

n - количество байт - 0 ... 255

     Отметим, что в переменных c, f, b старший разряд байта не используется, так что не имеет значения, будут они типа char или unsigned char. В переменной n используется старший разряд, следовательно, она обязательно должна быть типа unsigned char.

Нужна также переменная для сохранения результирующего кода слова состояния устройства. Это 2-байтная переменная, у которой старший разряд используется как кодовый, а не как знаковый. Так что, эта переменная должна быть типа unsigned int.

2.12.3.3.1.3. Разработка текста программы

Текст программы начинается с включения в программу файла:

#include <stdio.h>

В этом файле содержатся описания стандартных функций ввода-вывода, которые непременно будут использоваться в программе.

Далее идет заголовок функции main():

int main(void) {

и объявления переменных - точно по пп 2.12.3.3.1.2:

char c;

char f;

char b;

unsigned char n;

unsigned int UnitStateWord;

Ввод кода состояния складывается из вывода на экран приглашения:

printf("Введите код состояния (0 - 31) >");

и собственно ввода значения в переменную c:

scanf("%d",&c);

Такие же пары операторов повторяются для ввода значений f, b, n. Все значения вводятся как десятичные числа, используется тип %d в спецификациях формата.

Далее идет формирование упакованного кода, которое точно повторяет шаги алгоритма описанного в пп. 2.12.3.3.1.1:

  • по пп. 2.12.3.3.1.1.2:

UnitStateWord=((unsigned char)c&0x1F)<<11;

Преобразование типа переменной c в unsigned char необходимо, потому что иначе сдвиг 8-разрядного кода на 11 разрядов приведет к потере нужных нам кодов.

  • по пп. 2.12.3.3.1.1.3:

UnitStateWord|=((unsigned char)f&1)<<9;

по пп. 2.12.3.3.1.1.4:

UnitStateWord|=((unsigned char)b&1)<<8;

  • пл пп. 2.12.3.3.1.1.5:

UnitStateWord|=n&0xFF;

     Вывод результата выполняется оператором:

printf("\nСлово состояния устройства = %04x\n",UnitStateWord);

Результат выводится как 16-ричное число из 4 цифр (что соответствует 2 байтам), обязательно выводятся ведущие нули.