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

2.12.3.3.1.4. Программа

Полный текст программы приведен ниже.

/*******************************************************/

/* Лабораторная работа № 3 /

/* Задание 3 (часть 1) */

/* Упаковка кода */

/* Пример выполнения. Вариант № 30. */

/*******************************************************/

#include <stdio.h>

# include<conio.h>

int main(void)

{

char c; /* код состояния */

char f; /* признак ошибки */

char b; /* признак занятости */

unsigned char n; /* количество байт */

unsigned int UnitStateWord; /* слово состояния */

/* ввод составных частей */

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

scanf("%d",&c);

printf("Введите признак ошибки (0 / 1) >");

scanf("%d",&f);

printf("Введите признак занятости (0 / 1) >");

scanf("%d",&b);

printf("Введите количество переданных байт (0 - 255) >");

scanf("%d",&n);

/* формирование упакованного кода */

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

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

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

UnitStateWord|=n&0xFF;

/* вывод результата */

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

UnitStateWord);

getch();

return 0;

}

2.12.3.3.1.5. Отладка программы

Отладку программы можно вести в пошаговом режиме с отслеживанием значений переменных - составных частей при их вводе и кода-результата на шагах его формирования. Для последнего может возникнуть неудобство, т.к. в режиме отладки значение переменной UnitStateWord будет представляться как десятичное число, а нам удобнее видеть его как 16-ричное или как 2-ичное. Поэтому для такого отслеживания удобнее будет вставить в соответствующие места текста программы вызовы функции printf, которые будут выводить промежуточные значения кода в 16-ричном формате.

2.12.3.3.1.6. Результаты работы программы

При работе программы на экран были выведены такие результаты:

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

Введите признак ошибки (0 / 1) >1

Введите признак занятости (0 / 1) >1

Введите количество переданных байт (0 - 255) >74

Слово состояния устройства = db4a

2.12.3.3.2. Программа распаковки

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

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

2.12.3.3.2.1.1. Ввод значения слова состояния устройства.

2.12.3.3.2.1.2. Выделение из слова состояния устройства кода состояния. Код слова состояния устройства нужно сдвинуть на 11 разрядов вправо и выделить 5 младших разрядов - "побитовое логическое И" с константой 1F16. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для кода состояния.

2.12.3.3.2.1.3. Выделение из слова состояния устройства признака ошибки. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд - "побитовое логическое И" с константой 1. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака ошибки.

2.12.3.3.2.1.4. Выделение из слова состояния устройства признака занятости. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака занятости.

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

2.12.3.3.2. 2. Определение переменных программы Для работы программы нам будут нужны такие же переменные, что и в пп. 2.12.3.3.1.2.

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

     Начало программы - заголовок и определение переменных - по пп. 2.12.3.3.1.3. Далее идет формирования упакованного кода, которое точно повторяет шаги алгоритма, описанного в пп. 2.12.3.3.2.1:

  • по пп. 2.12.3.3.2.1.2:

c=(UnitStateWord>>11)&0x1F;

  • по пп. 2.12.3.3.2.1.3:

f=(UnitStateWord>>9)&1;

  • по пп. 2.12.3.3.2.1.4:

b=(UnitStateWord>>8)&1;

  • по пп. 2.12.3.3.2.1.5:

n=UnitStateWord&0xFF;

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

printf("Код состояния = %d\n",c);

     Подобными операторами выполняется и вывод остальных результатов